mirror of https://github.com/OpenTTD/OpenTTD
Change: Compensate for MIDI transmission time when skipping start of song
parent
276192f714
commit
11a846e3d5
|
@ -693,6 +693,9 @@ static void MidiThreadProc(void *)
|
||||||
current_segment.start_block = bl;
|
current_segment.start_block = bl;
|
||||||
break;
|
break;
|
||||||
} else {
|
} else {
|
||||||
|
/* Skip the transmission delay compensation performed in the Win32 MIDI driver.
|
||||||
|
* The DMusic driver will most likely be used with the MS softsynth, which is not subject to transmission delays.
|
||||||
|
*/
|
||||||
DEBUG(driver, 2, "DMusic: timer: start from block %d (ticktime %d, realtime %.3f, bytes %d)", (int)bl, (int)block.ticktime, ((int)block.realtime) / 1000.0, (int)preload_bytes);
|
DEBUG(driver, 2, "DMusic: timer: start from block %d (ticktime %d, realtime %.3f, bytes %d)", (int)bl, (int)block.ticktime, ((int)block.realtime) / 1000.0, (int)preload_bytes);
|
||||||
playback_start_time -= block.realtime * MIDITIME_TO_REFTIME;
|
playback_start_time -= block.realtime * MIDITIME_TO_REFTIME;
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -184,7 +184,7 @@ void CALLBACK TimerCallback(UINT uTimerID, UINT, DWORD_PTR dwUser, DWORD_PTR, DW
|
||||||
/* find first block after start time and pretend playback started earlier
|
/* find first block after start time and pretend playback started earlier
|
||||||
* this is to allow all blocks prior to the actual start to still affect playback,
|
* this is to allow all blocks prior to the actual start to still affect playback,
|
||||||
* as they may contain important controller and program changes */
|
* as they may contain important controller and program changes */
|
||||||
size_t preload_bytes = 0;
|
uint preload_bytes = 0;
|
||||||
for (size_t bl = 0; bl < _midi.current_file.blocks.size(); bl++) {
|
for (size_t bl = 0; bl < _midi.current_file.blocks.size(); bl++) {
|
||||||
MidiFile::DataBlock &block = _midi.current_file.blocks[bl];
|
MidiFile::DataBlock &block = _midi.current_file.blocks[bl];
|
||||||
preload_bytes += block.data.Length();
|
preload_bytes += block.data.Length();
|
||||||
|
@ -194,8 +194,13 @@ void CALLBACK TimerCallback(UINT uTimerID, UINT, DWORD_PTR dwUser, DWORD_PTR, DW
|
||||||
_midi.current_segment.start_block = bl;
|
_midi.current_segment.start_block = bl;
|
||||||
break;
|
break;
|
||||||
} else {
|
} else {
|
||||||
|
/* Calculate offset start time for playback.
|
||||||
|
* The preload_bytes are used to compensate for delay in transmission over traditional serial MIDI interfaces,
|
||||||
|
* which have a bitrate of 31,250 bits/sec, and transmit 1+8+1 start/data/stop bits per byte.
|
||||||
|
* The delay compensation is needed to avoid time-compression of following messages.
|
||||||
|
*/
|
||||||
DEBUG(driver, 2, "Win32-MIDI: timer: start from block %d (ticktime %d, realtime %.3f, bytes %d)", (int)bl, (int)block.ticktime, ((int)block.realtime) / 1000.0, (int)preload_bytes);
|
DEBUG(driver, 2, "Win32-MIDI: timer: start from block %d (ticktime %d, realtime %.3f, bytes %d)", (int)bl, (int)block.ticktime, ((int)block.realtime) / 1000.0, (int)preload_bytes);
|
||||||
_midi.playback_start_time -= block.realtime / 1000;
|
_midi.playback_start_time -= block.realtime / 1000 - preload_bytes * 1000 / 3125;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue