diff options
author | Wohlstand <admin@wohlnet.ru> | 2017-10-24 23:01:01 +0300 |
---|---|---|
committer | Wohlstand <admin@wohlnet.ru> | 2017-10-24 23:01:01 +0300 |
commit | 6783770a8533dd099b39c51a5c3f7f5f4000b4bc (patch) | |
tree | 5532ae111fe681d4d410f4f3caa71500dea3b1b4 /src/adlmidi_private.hpp | |
parent | 306ecba785a64fa111c1198b9b986ac3e98db619 (diff) | |
download | libADLMIDI-6783770a8533dd099b39c51a5c3f7f5f4000b4bc.tar.gz libADLMIDI-6783770a8533dd099b39c51a5c3f7f5f4000b4bc.tar.bz2 libADLMIDI-6783770a8533dd099b39c51a5c3f7f5f4000b4bc.zip |
Added working seekability!
Testing and stabilizing is needed
Diffstat (limited to 'src/adlmidi_private.hpp')
-rw-r--r-- | src/adlmidi_private.hpp | 23 |
1 files changed, 17 insertions, 6 deletions
diff --git a/src/adlmidi_private.hpp b/src/adlmidi_private.hpp index 75094d2..451a8e6 100644 --- a/src/adlmidi_private.hpp +++ b/src/adlmidi_private.hpp @@ -50,6 +50,7 @@ #endif #include <vector> +#include <list> #include <string> #include <sstream> #include <map> @@ -387,10 +388,10 @@ private: * @brief Sort events in this position */ void sortEvents(); - //! Next event that follows current - MidiTrackPos *next; }; + typedef std::list<MidiTrackPos> MidiTrackQueue; + // Information about each track struct PositionNew { @@ -404,15 +405,20 @@ private: uint64_t delay; int status; char padding2[4]; - MidiTrackPos *pos; - TrackInfo(): ptr(0), delay(0), status(0), pos(NULL) {} + MidiTrackQueue::iterator pos; + TrackInfo(): ptr(0), delay(0), status(0) {} }; std::vector<TrackInfo> track; PositionNew(): began(false), wait(0.0), absTimePosition(0.0), track() {} } CurrentPositionNew, LoopBeginPositionNew, trackBeginPositionNew; - std::vector<std::vector<MidiTrackPos> > trackDataNew; + //! Full song length in seconds + double fullSongTimeLength; + //! Delay after song playd before rejecting the output stream requests + double postSongWaitDelay; + + std::vector<MidiTrackQueue > trackDataNew; std::vector<int> trackDataNewStatus; void buildTrackData(); MidiEvent parseEvent(uint8_t **ptr, int &status); @@ -609,6 +615,10 @@ public: */ double Tick(double s, double granularity); + void seek(double seconds); + double tell(); + double timeLength(); + void rewind(); /* RealTime event triggers */ @@ -647,7 +657,7 @@ private: unsigned props_mask, int32_t select_adlchn = -1); bool ProcessEvents(); - bool ProcessEventsNew(); + bool ProcessEventsNew(bool isSeek = false); void HandleEvent(size_t tk); void HandleEvent(size_t tk, MidiEvent &evt, int &status); @@ -663,6 +673,7 @@ private: size_t from_channel, AdlChannel::users_t::iterator j, MIDIchannel::activenoteiterator i); + void Panic(); void KillSustainingNotes(int32_t MidCh = -1, int32_t this_adlchn = -1); void SetRPN(unsigned MidCh, unsigned value, bool MSB); //void UpdatePortamento(unsigned MidCh) |