aboutsummaryrefslogtreecommitdiff
path: root/utils
diff options
context:
space:
mode:
authorWohlstand <Wohlstand@users.noreply.github.com>2024-05-27 01:16:38 +0300
committerWohlstand <Wohlstand@users.noreply.github.com>2024-05-27 01:16:38 +0300
commitb174fa2b13027318b164d9112e7754fc6301bdec (patch)
treece2ac985fc51546773103814c8152281b704db17 /utils
parent4bec2559594a50a5891ebbbedd8d67b1998ffada (diff)
downloadlibADLMIDI-b174fa2b13027318b164d9112e7754fc6301bdec.tar.gz
libADLMIDI-b174fa2b13027318b164d9112e7754fc6301bdec.tar.bz2
libADLMIDI-b174fa2b13027318b164d9112e7754fc6301bdec.zip
MidiPlay: Alternative test of MIDI timer
On macOS the problem was found because tempo works much slower than it should go
Diffstat (limited to 'utils')
-rw-r--r--utils/midiplay/adlmidiplay.cpp33
1 files changed, 31 insertions, 2 deletions
diff --git a/utils/midiplay/adlmidiplay.cpp b/utils/midiplay/adlmidiplay.cpp
index 021bf54..40cfa41 100644
--- a/utils/midiplay/adlmidiplay.cpp
+++ b/utils/midiplay/adlmidiplay.cpp
@@ -549,6 +549,7 @@ static struct TimeCounter
char totalHMS[25];
char loopStartHMS[25];
char loopEndHMS[25];
+ char realHMS[25];
bool hasLoop;
uint64_t milliseconds_prev;
@@ -557,6 +558,8 @@ static struct TimeCounter
int complete_prev;
double totalTime;
+ double realTimeStart;
+
#ifdef HARDWARE_OPL3
unsigned newTimerFreq;
unsigned timerPeriod;
@@ -747,6 +750,8 @@ static struct TimeCounter
{
totalTime = total;
secondsToHMSM(total, totalHMS, 25);
+ realTimeStart = s_getTime();
+ secondsToHMSM(s_getTime() - realTimeStart, realHMS, 25);
}
void setLoop(double loopStart, double loopEnd)
@@ -777,8 +782,9 @@ static struct TimeCounter
{
printsCounter = -1;
secondsToHMSM(pos, posHMS, 25);
+ secondsToHMSM(s_getTime() - realTimeStart, realHMS, 25);
std::fprintf(stdout, " \r");
- std::fprintf(stdout, "Time position: %s / %s\r", posHMS, totalHMS);
+ std::fprintf(stdout, "Time position: %s / %s [Real time: %s]\r", posHMS, totalHMS, realHMS);
flushout(stdout);
milliseconds_prev = milliseconds;
}
@@ -817,13 +823,35 @@ static void runHWSerialLoop(ADL_MIDIPlayer *myDevice)
double timeBegL, timeEndL;
const double minDelay = 0.005;
double eat_delay;
- bool tickSkip = true;
+ // bool tickSkip = true;
s_timeCounter.clearLineR();
while(!stop)
{
timeBegL = s_getTime();
+ tick_delay = adl_tickEvents(myDevice, tick_delay < minDelay ? tick_delay : minDelay, minDelay / 10.0);
+ // adl_tickIterators(myDevice, minDelay);
+# ifndef DEBUG_TRACE_ALL_EVENTS
+ s_timeCounter.printTime(adl_positionTell(myDevice));
+# endif
+ timeEndL = s_getTime();
+
+ eat_delay = timeEndL - timeBegL;
+
+ if(tick_delay < minDelay)
+ tick_wait = tick_delay - eat_delay;
+ else
+ tick_wait = minDelay - eat_delay;
+
+ if(adl_atEnd(myDevice) && tick_delay <= 0)
+ stop = true;
+
+ if(tick_wait > 0.0)
+ s_sleepU(tick_wait);
+
+#if 0
+ timeBegL = s_getTime();
tick_delay = adl_tickEventsOnly(myDevice, tick_delay, 0.000000001);
adl_tickIterators(myDevice, tick_delay < minDelay ? tick_delay : minDelay);
@@ -872,6 +900,7 @@ static void runHWSerialLoop(ADL_MIDIPlayer *myDevice)
tick_wait -= minDelay;
}
}
+#endif
}
s_timeCounter.clearLine();