diff options
author | Wohlstand <admin@wohlnet.ru> | 2016-08-06 20:15:34 +0300 |
---|---|---|
committer | Wohlstand <admin@wohlnet.ru> | 2016-08-06 20:15:34 +0300 |
commit | 5c95f7a249771f53cf1bfe3ff919bcae16b33f3b (patch) | |
tree | 10bac84bb495ff1d9775a8535f8a37082421190e /src/adlmidi.cpp | |
parent | 2452400e793d70f4d9d11867d20b87ab967a6916 (diff) | |
download | libADLMIDI-5c95f7a249771f53cf1bfe3ff919bcae16b33f3b.tar.gz libADLMIDI-5c95f7a249771f53cf1bfe3ff919bcae16b33f3b.tar.bz2 libADLMIDI-5c95f7a249771f53cf1bfe3ff919bcae16b33f3b.zip |
Fixed infinite loop caused by attempt to play blank MIDI-file
Diffstat (limited to 'src/adlmidi.cpp')
-rw-r--r-- | src/adlmidi.cpp | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/src/adlmidi.cpp b/src/adlmidi.cpp index 7eca21c..8553cef 100644 --- a/src/adlmidi.cpp +++ b/src/adlmidi.cpp @@ -873,12 +873,19 @@ public: double Tick(double s, double granularity) { if(CurrentPosition.began) CurrentPosition.wait -= s; - while(CurrentPosition.wait <= granularity * 0.5) + int AntiFreezeCounter = 10000;//Limit 10000 loops to avoid freezing + while( (CurrentPosition.wait <= granularity * 0.5) && (AntiFreezeCounter>0) ) { //std::fprintf(stderr, "wait = %g...\n", CurrentPosition.wait); ProcessEvents(); + if(CurrentPosition.wait <= 0.0) + AntiFreezeCounter--; } + if(AntiFreezeCounter <= 0) + CurrentPosition.wait += 1.0;/* Add extra 1 second when over 10000 events + with zero delay are been detected */ + for(unsigned c = 0; c < opl.NumChannels; ++c) ch[c].AddAge(s * 1000); |