You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

93 lines
1.9KB

  1. #include "MidiLock.h"
  2. #include "MidiSong.h"
  3. #include "MidiTrack.h"
  4. #include <assert.h>
  5. MidiSong::MidiSong() : lock(std::make_shared<MidiLock>())
  6. {
  7. ++_mdb;
  8. }
  9. MidiSong::~MidiSong()
  10. {
  11. --_mdb;
  12. }
  13. int MidiSong::getHighestTrackNumber() const
  14. {
  15. int numTracks = int(tracks.size());
  16. return numTracks - 1;
  17. }
  18. void MidiSong::addTrack(int index, std::shared_ptr<MidiTrack> track)
  19. {
  20. if (index >= (int) tracks.size()) {
  21. tracks.resize(index + 1);
  22. }
  23. assert(!tracks[index]); // can only create at empty loc
  24. tracks[index] = track;
  25. }
  26. void MidiSong::createTrack(int index)
  27. {
  28. assert(lock);
  29. addTrack(index, std::make_shared<MidiTrack>(lock));
  30. }
  31. MidiTrackPtr MidiSong::getTrack(int index)
  32. {
  33. assert(index < (int) tracks.size());
  34. assert(index >= 0);
  35. assert(tracks[index]);
  36. return tracks[index];
  37. }
  38. MidiTrackConstPtr MidiSong::getTrackConst(int index) const
  39. {
  40. assert(index < (int) tracks.size());
  41. assert(index >= 0);
  42. assert(tracks[index]);
  43. return tracks[index];
  44. }
  45. MidiSongPtr MidiSong::makeTest(MidiTrack::TestContent content, int trackNumber)
  46. {
  47. MidiSongPtr song = std::make_shared<MidiSong>();
  48. MidiLocker l(song->lock);
  49. auto track = MidiTrack::makeTest(content, song->lock);
  50. song->addTrack(trackNumber, track);
  51. song->assertValid();
  52. return song;
  53. }
  54. #if 0
  55. MidiSongPtr MidiSong::makeTest1()
  56. {
  57. MidiSongPtr song = std::make_shared<MidiSong>();
  58. auto track = MidiTrack::makeTest1();
  59. song->addTrack(0, track);
  60. song->assertValid();
  61. return song;
  62. }
  63. MidiSongPtr MidiSong::makeTestEmpty()
  64. {
  65. MidiSongPtr song = std::make_shared<MidiSong>();
  66. auto track = MidiTrack::makeTestEmpty();
  67. song->addTrack(0, track);
  68. song->assertValid();
  69. return song;
  70. }
  71. #endif
  72. void MidiSong::assertValid() const
  73. {
  74. for (auto track : tracks) {
  75. if (track) {
  76. track->assertValid();
  77. }
  78. }
  79. }