From 6783770a8533dd099b39c51a5c3f7f5f4000b4bc Mon Sep 17 00:00:00 2001 From: Wohlstand Date: Tue, 24 Oct 2017 23:01:01 +0300 Subject: Added working seekability! Testing and stabilizing is needed --- src/adlmidi_private.hpp | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) (limited to 'src/adlmidi_private.hpp') 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 +#include #include #include #include @@ -387,10 +388,10 @@ private: * @brief Sort events in this position */ void sortEvents(); - //! Next event that follows current - MidiTrackPos *next; }; + typedef std::list 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 track; PositionNew(): began(false), wait(0.0), absTimePosition(0.0), track() {} } CurrentPositionNew, LoopBeginPositionNew, trackBeginPositionNew; - std::vector > trackDataNew; + //! Full song length in seconds + double fullSongTimeLength; + //! Delay after song playd before rejecting the output stream requests + double postSongWaitDelay; + + std::vector trackDataNew; std::vector 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) -- cgit v1.2.3