ft2-clone

Fasttracker 2 clone
Log | Files | Refs | README | LICENSE

commit e8a29beb7a6ba80b8a6596010bee8cdfd8a24421
parent b8597d3238c967105640024555278aec78a5eae1
Author: Olav Sørensen <olav.sorensen@live.no>
Date:   Fri, 19 Jun 2020 19:35:08 +0200

Reset sample counter when pressing Play Song (reduces tiny delay)

Also some code cleanup (more sensible variable names).

Diffstat:
Msrc/ft2_audio.c | 50++++++++++++++++++++++++--------------------------
Msrc/ft2_audio.h | 3++-
Msrc/ft2_replayer.c | 2++
Mvs2019_project/ft2-clone/ft2-clone.vcxproj.filters | 170++++++++++++++++++++++++++++++++++++++++----------------------------------------
4 files changed, 113 insertions(+), 112 deletions(-)

diff --git a/src/ft2_audio.c b/src/ft2_audio.c @@ -20,7 +20,7 @@ static int8_t pmpCountDiv, pmpChannels = 2; static uint16_t smpBuffSize; -static int32_t masterVol, oldAudioFreq, pmpLeft, randSeed = INITIAL_DITHER_SEED; +static int32_t masterVol, oldAudioFreq, randSeed = INITIAL_DITHER_SEED; static int32_t prngStateL, prngStateR; static uint32_t tickTimeLen, tickTimeLenFrac; static float fAudioAmpMul; @@ -161,7 +161,7 @@ void setSpeed(uint16_t bpm) if (bpm > MAX_BPM) return; - audio.speedVal = audio.speedValTab[bpm]; + audio.samplesPerTick = audio.speedValTab[bpm]; // get tick time length for audio/video sync timestamp const uint64_t tickTimeLen64 = audio.tickTimeLengthTab[bpm]; @@ -261,7 +261,7 @@ static void voiceUpdateVolumes(int32_t i, uint8_t status) } else { - v->SVolIPLen = audio.speedVal; + v->SVolIPLen = audio.samplesPerTick; v->SLVolIP = ((int64_t)destVolL * audio.rampSpeedValMul) >> 32; v->SRVolIP = ((int64_t)destVolR * audio.rampSpeedValMul) >> 32; } @@ -584,8 +584,8 @@ uint32_t mixReplayerTickToBuffer(uint8_t *stream, uint8_t bitDepth) voice_t *v, *r; assert(audio.speedVal <= MAX_WAV_RENDER_SAMPLES_PER_TICK); - memset(audio.mixBufferL, 0, audio.speedVal * sizeof (int32_t)); - memset(audio.mixBufferR, 0, audio.speedVal * sizeof (int32_t)); + memset(audio.mixBufferL, 0, audio.samplesPerTick * sizeof (int32_t)); + memset(audio.mixBufferR, 0, audio.samplesPerTick * sizeof (int32_t)); // mix channels v = voice; // normal voices @@ -594,24 +594,24 @@ uint32_t mixReplayerTickToBuffer(uint8_t *stream, uint8_t bitDepth) for (int32_t i = 0; i < song.antChn; i++, v++, r++) { // call the mixing routine currently set for the voice - if (v->mixRoutine != NULL) v->mixRoutine(v, audio.speedVal); // mix normal voice - if (r->mixRoutine != NULL) r->mixRoutine(r, audio.speedVal); // mix volume ramp voice + if (v->mixRoutine != NULL) v->mixRoutine(v, audio.samplesPerTick); // mix normal voice + if (r->mixRoutine != NULL) r->mixRoutine(r, audio.samplesPerTick); // mix volume ramp voice } // normalize mix buffer and send to audio stream if (bitDepth == 16) { if (config.specialFlags2 & DITHERED_AUDIO) - sendSamples16BitDitherStereo(stream, audio.speedVal, 2); + sendSamples16BitDitherStereo(stream, audio.samplesPerTick, 2); else - sendSamples16BitStereo(stream, audio.speedVal, 2); + sendSamples16BitStereo(stream, audio.samplesPerTick, 2); } else { - sendSamples24BitStereo(stream, audio.speedVal, 2); + sendSamples24BitStereo(stream, audio.samplesPerTick, 2); } - return audio.speedVal; + return audio.samplesPerTick; } int32_t pattQueueReadSize(void) @@ -930,18 +930,16 @@ static void fillVisualsSyncBuffer(void) static void SDLCALL audioCallback(void *userdata, Uint8 *stream, int len) { - int32_t a, b; - assert(len < 65536); // limitation in mixer assert(pmpCountDiv > 0); - a = len / pmpCountDiv; - if (a <= 0) + int32_t samplesLeft = len / pmpCountDiv; + if (samplesLeft <= 0) return; - while (a > 0) + while (samplesLeft > 0) { - if (pmpLeft == 0) + if (audio.tickSampleCounter == 0) { // new replayer tick @@ -954,20 +952,20 @@ static void SDLCALL audioCallback(void *userdata, Uint8 *stream, int len) mix_UpdateChannelVolPanFrq(); fillVisualsSyncBuffer(); - pmpLeft = audio.speedVal; + audio.tickSampleCounter = audio.samplesPerTick; replayerBusy = false; } - b = a; - if (b > pmpLeft) - b = pmpLeft; + int32_t samplesToMix = samplesLeft; + if (samplesToMix > audio.tickSampleCounter) + samplesToMix = audio.tickSampleCounter; - mixAudio(stream, b, pmpChannels); - stream += b * pmpCountDiv; + mixAudio(stream, samplesToMix, pmpChannels); + stream += samplesToMix * pmpCountDiv; - a -= b; - pmpLeft -= b; + samplesLeft -= samplesToMix; + audio.tickSampleCounter -= samplesToMix; } (void)userdata; @@ -1225,7 +1223,7 @@ bool setupAudio(bool showErrorMsg) stopAllScopes(); - pmpLeft = 0; // reset sample counter + audio.tickSampleCounter = 0; // zero tick sample counter so that it will instantly initiate a tick calcReplayRate(audio.freq); diff --git a/src/ft2_audio.h b/src/ft2_audio.h @@ -51,8 +51,9 @@ typedef struct audio_t int32_t inputDeviceNum, outputDeviceNum, lastWorkingAudioFreq, lastWorkingAudioBits; int32_t quickVolSizeVal, *mixBufferL, *mixBufferR, *mixBufferLUnaligned, *mixBufferRUnaligned; int32_t rampQuickVolMul, rampSpeedValMul, speedValTab[MAX_BPM+1], rampSpeedValMulTab[MAX_BPM+1]; + int32_t tickSampleCounter; uint32_t freq; - uint32_t audLatencyPerfValInt, audLatencyPerfValFrac, speedVal, musicTimeSpeedVal; + uint32_t audLatencyPerfValInt, audLatencyPerfValFrac, samplesPerTick, musicTimeSpeedVal; uint64_t tickTime64, tickTime64Frac, tickTimeLengthTab[MAX_BPM+1]; double dAudioLatencyMs; SDL_AudioDeviceID dev; diff --git a/src/ft2_replayer.c b/src/ft2_replayer.c @@ -2780,6 +2780,8 @@ void startPlaying(int8_t mode, int16_t row) if (song.tempo == 0) song.tempo = song.initialTempo; + audio.tickSampleCounter = 0; // zero tick sample counter so that it will instantly initiate a tick + unlockMixerCallback(); ui.updatePosSections = true; diff --git a/vs2019_project/ft2-clone/ft2-clone.vcxproj.filters b/vs2019_project/ft2-clone/ft2-clone.vcxproj.filters @@ -1,57 +1,62 @@ <?xml version="1.0" encoding="utf-8"?> <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <ItemGroup> + <ClCompile Include="..\..\src\ft2_about.c" /> <ClCompile Include="..\..\src\ft2_audio.c" /> + <ClCompile Include="..\..\src\ft2_audioselector.c" /> + <ClCompile Include="..\..\src\ft2_bmp.c" /> + <ClCompile Include="..\..\src\ft2_checkboxes.c" /> <ClCompile Include="..\..\src\ft2_config.c" /> + <ClCompile Include="..\..\src\ft2_diskop.c" /> <ClCompile Include="..\..\src\ft2_edit.c" /> + <ClCompile Include="..\..\src\ft2_events.c" /> <ClCompile Include="..\..\src\ft2_gui.c" /> <ClCompile Include="..\..\src\ft2_help.c" /> <ClCompile Include="..\..\src\ft2_inst_ed.c" /> + <ClCompile Include="..\..\src\ft2_intrp_table.c" /> <ClCompile Include="..\..\src\ft2_keyboard.c" /> <ClCompile Include="..\..\src\ft2_main.c" /> + <ClCompile Include="..\..\src\ft2_midi.c" /> + <ClCompile Include="..\..\src\ft2_mix.c" /> + <ClCompile Include="..\..\src\ft2_module_loader.c" /> + <ClCompile Include="..\..\src\ft2_module_saver.c" /> <ClCompile Include="..\..\src\ft2_mouse.c" /> <ClCompile Include="..\..\src\ft2_nibbles.c" /> + <ClCompile Include="..\..\src\ft2_palette.c" /> + <ClCompile Include="..\..\src\ft2_pattern_draw.c" /> + <ClCompile Include="..\..\src\ft2_pattern_ed.c" /> + <ClCompile Include="..\..\src\ft2_pushbuttons.c" /> + <ClCompile Include="..\..\src\ft2_radiobuttons.c" /> <ClCompile Include="..\..\src\ft2_replayer.c" /> - <ClCompile Include="..\..\src\ft2_scopes.c" /> - <ClCompile Include="..\..\src\ft2_video.c" /> <ClCompile Include="..\..\src\ft2_sample_ed.c" /> - <ClCompile Include="..\..\src\ft2_pattern_ed.c" /> + <ClCompile Include="..\..\src\ft2_sample_ed_features.c" /> <ClCompile Include="..\..\src\ft2_sample_loader.c" /> <ClCompile Include="..\..\src\ft2_sample_saver.c" /> - <ClCompile Include="..\..\src\ft2_diskop.c" /> - <ClCompile Include="..\..\src\ft2_unicode.c" /> - <ClCompile Include="..\..\src\ft2_midi.c" /> - <ClCompile Include="..\..\src\ft2_wav_renderer.c" /> - <ClCompile Include="..\..\src\ft2_trim.c" /> - <ClCompile Include="..\..\src\ft2_checkboxes.c" /> - <ClCompile Include="..\..\src\ft2_pushbuttons.c" /> - <ClCompile Include="..\..\src\ft2_radiobuttons.c" /> + <ClCompile Include="..\..\src\ft2_sampling.c" /> + <ClCompile Include="..\..\src\ft2_scopedraw.c" /> + <ClCompile Include="..\..\src\ft2_scopes.c" /> <ClCompile Include="..\..\src\ft2_scrollbars.c" /> - <ClCompile Include="..\..\src\ft2_textboxes.c" /> + <ClCompile Include="..\..\src\ft2_structs.c" /> <ClCompile Include="..\..\src\ft2_sysreqs.c" /> - <ClCompile Include="..\..\src\ft2_module_loader.c" /> - <ClCompile Include="..\..\src\ft2_module_saver.c" /> - <ClCompile Include="..\..\src\ft2_mix.c" /> - <ClCompile Include="..\..\src\ft2_sampling.c" /> - <ClCompile Include="..\..\src\ft2_audioselector.c" /> - <ClCompile Include="..\..\src\ft2_events.c" /> - <ClCompile Include="..\..\src\ft2_pattern_draw.c" /> - <ClCompile Include="..\..\src\ft2_sample_ed_features.c" /> + <ClCompile Include="..\..\src\ft2_tables.c" /> + <ClCompile Include="..\..\src\ft2_textboxes.c" /> + <ClCompile Include="..\..\src\ft2_trim.c" /> + <ClCompile Include="..\..\src\ft2_unicode.c" /> + <ClCompile Include="..\..\src\ft2_video.c" /> + <ClCompile Include="..\..\src\ft2_wav_renderer.c" /> <ClCompile Include="..\..\src\rtmidi\RtMidi.cpp"> <Filter>rtmidi</Filter> </ClCompile> <ClCompile Include="..\..\src\rtmidi\rtmidi_c.cpp"> <Filter>rtmidi</Filter> </ClCompile> - <ClCompile Include="..\..\src\ft2_palette.c" /> - <ClCompile Include="..\..\src\ft2_scopedraw.c" /> - <ClCompile Include="..\..\src\ft2_tables.c" /> - <ClCompile Include="..\..\src\ft2_intrp_table.c" /> - <ClCompile Include="..\..\src\ft2_bmp.c" /> - <ClCompile Include="..\..\src\gfxdata\ft2_bmp_nibbles.c"> + <ClCompile Include="..\..\src\gfxdata\ft2_bmp_fonts.c"> <Filter>graphics</Filter> </ClCompile> - <ClCompile Include="..\..\src\gfxdata\ft2_bmp_midi.c"> + <ClCompile Include="..\..\src\gfxdata\ft2_bmp_gui.c"> + <Filter>graphics</Filter> + </ClCompile> + <ClCompile Include="..\..\src\gfxdata\ft2_bmp_instr.c"> <Filter>graphics</Filter> </ClCompile> <ClCompile Include="..\..\src\gfxdata\ft2_bmp_logo.c"> @@ -60,164 +65,159 @@ <ClCompile Include="..\..\src\gfxdata\ft2_bmp_looppins.c"> <Filter>graphics</Filter> </ClCompile> - <ClCompile Include="..\..\src\gfxdata\ft2_bmp_mouse.c"> + <ClCompile Include="..\..\src\gfxdata\ft2_bmp_midi.c"> <Filter>graphics</Filter> </ClCompile> - <ClCompile Include="..\..\src\gfxdata\ft2_bmp_fonts.c"> + <ClCompile Include="..\..\src\gfxdata\ft2_bmp_mouse.c"> <Filter>graphics</Filter> </ClCompile> - <ClCompile Include="..\..\src\gfxdata\ft2_bmp_instr.c"> + <ClCompile Include="..\..\src\gfxdata\ft2_bmp_nibbles.c"> <Filter>graphics</Filter> </ClCompile> <ClCompile Include="..\..\src\gfxdata\ft2_bmp_scopes.c"> <Filter>graphics</Filter> </ClCompile> - <ClCompile Include="..\..\src\gfxdata\ft2_bmp_gui.c"> - <Filter>graphics</Filter> - </ClCompile> - <ClCompile Include="..\..\src\ft2_structs.c" /> - <ClCompile Include="..\..\src\ft2_about.c" /> </ItemGroup> <ItemGroup> - <ClInclude Include="..\..\src\ft2_audio.h"> + <ClInclude Include="..\..\src\rtmidi\RtMidi.h"> + <Filter>rtmidi</Filter> + </ClInclude> + <ClInclude Include="..\..\src\rtmidi\rtmidi_c.h"> + <Filter>rtmidi</Filter> + </ClInclude> + <ClInclude Include="..\..\src\ft2_about.h"> <Filter>headers</Filter> </ClInclude> - <ClInclude Include="..\..\src\ft2_config.h"> + <ClInclude Include="..\..\src\ft2_audio.h"> <Filter>headers</Filter> </ClInclude> - <ClInclude Include="..\..\src\ft2_edit.h"> + <ClInclude Include="..\..\src\ft2_audioselector.h"> <Filter>headers</Filter> </ClInclude> - <ClInclude Include="..\..\src\ft2_gui.h"> + <ClInclude Include="..\..\src\ft2_bmp.h"> <Filter>headers</Filter> </ClInclude> - <ClInclude Include="..\..\src\ft2_header.h"> + <ClInclude Include="..\..\src\ft2_checkboxes.h"> <Filter>headers</Filter> </ClInclude> - <ClInclude Include="..\..\src\ft2_help.h"> + <ClInclude Include="..\..\src\ft2_config.h"> <Filter>headers</Filter> </ClInclude> - <ClInclude Include="..\..\src\ft2_inst_ed.h"> + <ClInclude Include="..\..\src\ft2_diskop.h"> <Filter>headers</Filter> </ClInclude> - <ClInclude Include="..\..\src\ft2_keyboard.h"> + <ClInclude Include="..\..\src\ft2_edit.h"> <Filter>headers</Filter> </ClInclude> - <ClInclude Include="..\..\src\ft2_mouse.h"> + <ClInclude Include="..\..\src\ft2_events.h"> <Filter>headers</Filter> </ClInclude> - <ClInclude Include="..\..\src\ft2_nibbles.h"> + <ClInclude Include="..\..\src\ft2_gfxdata.h"> <Filter>headers</Filter> </ClInclude> - <ClInclude Include="..\..\src\ft2_replayer.h"> + <ClInclude Include="..\..\src\ft2_gui.h"> <Filter>headers</Filter> </ClInclude> - <ClInclude Include="..\..\src\ft2_scopes.h"> + <ClInclude Include="..\..\src\ft2_header.h"> <Filter>headers</Filter> </ClInclude> - <ClInclude Include="..\..\src\ft2_sample_ed.h"> + <ClInclude Include="..\..\src\ft2_help.h"> <Filter>headers</Filter> </ClInclude> - <ClInclude Include="..\..\src\ft2_pattern_ed.h"> + <ClInclude Include="..\..\src\ft2_inst_ed.h"> <Filter>headers</Filter> </ClInclude> - <ClInclude Include="..\..\src\ft2_sample_loader.h"> + <ClInclude Include="..\..\src\ft2_intrp_table.h"> <Filter>headers</Filter> </ClInclude> - <ClInclude Include="..\..\src\ft2_sample_saver.h"> + <ClInclude Include="..\..\src\ft2_keyboard.h"> <Filter>headers</Filter> </ClInclude> - <ClInclude Include="..\..\src\ft2_video.h"> + <ClInclude Include="..\..\src\ft2_midi.h"> <Filter>headers</Filter> </ClInclude> - <ClInclude Include="..\..\src\ft2_diskop.h"> + <ClInclude Include="..\..\src\ft2_mix.h"> <Filter>headers</Filter> </ClInclude> - <ClInclude Include="..\..\src\ft2_unicode.h"> + <ClInclude Include="..\..\src\ft2_mix_macros.h"> <Filter>headers</Filter> </ClInclude> - <ClInclude Include="..\..\src\ft2_midi.h"> + <ClInclude Include="..\..\src\ft2_module_loader.h"> <Filter>headers</Filter> </ClInclude> - <ClInclude Include="..\..\src\ft2_wav_renderer.h"> + <ClInclude Include="..\..\src\ft2_module_saver.h"> <Filter>headers</Filter> </ClInclude> - <ClInclude Include="..\..\src\ft2_about.h"> + <ClInclude Include="..\..\src\ft2_mouse.h"> <Filter>headers</Filter> </ClInclude> - <ClInclude Include="..\..\src\ft2_trim.h"> + <ClInclude Include="..\..\src\ft2_nibbles.h"> <Filter>headers</Filter> </ClInclude> - <ClInclude Include="..\..\src\ft2_checkboxes.h"> + <ClInclude Include="..\..\src\ft2_palette.h"> <Filter>headers</Filter> </ClInclude> - <ClInclude Include="..\..\src\ft2_pushbuttons.h"> + <ClInclude Include="..\..\src\ft2_pattern_draw.h"> <Filter>headers</Filter> </ClInclude> - <ClInclude Include="..\..\src\ft2_radiobuttons.h"> + <ClInclude Include="..\..\src\ft2_pattern_ed.h"> <Filter>headers</Filter> </ClInclude> - <ClInclude Include="..\..\src\ft2_scrollbars.h"> + <ClInclude Include="..\..\src\ft2_pushbuttons.h"> <Filter>headers</Filter> </ClInclude> - <ClInclude Include="..\..\src\ft2_textboxes.h"> + <ClInclude Include="..\..\src\ft2_radiobuttons.h"> <Filter>headers</Filter> </ClInclude> - <ClInclude Include="..\..\src\ft2_sysreqs.h"> + <ClInclude Include="..\..\src\ft2_replayer.h"> <Filter>headers</Filter> </ClInclude> - <ClInclude Include="..\..\src\ft2_module_loader.h"> + <ClInclude Include="..\..\src\ft2_sample_ed.h"> <Filter>headers</Filter> </ClInclude> - <ClInclude Include="..\..\src\ft2_module_saver.h"> + <ClInclude Include="..\..\src\ft2_sample_ed_features.h"> <Filter>headers</Filter> </ClInclude> - <ClInclude Include="..\..\src\ft2_gfxdata.h"> + <ClInclude Include="..\..\src\ft2_sample_loader.h"> <Filter>headers</Filter> </ClInclude> - <ClInclude Include="..\..\src\ft2_mix.h"> + <ClInclude Include="..\..\src\ft2_sample_saver.h"> <Filter>headers</Filter> </ClInclude> <ClInclude Include="..\..\src\ft2_sampling.h"> <Filter>headers</Filter> </ClInclude> - <ClInclude Include="..\..\src\ft2_audioselector.h"> + <ClInclude Include="..\..\src\ft2_scopedraw.h"> <Filter>headers</Filter> </ClInclude> - <ClInclude Include="..\..\src\ft2_mix_macros.h"> + <ClInclude Include="..\..\src\ft2_scopes.h"> <Filter>headers</Filter> </ClInclude> - <ClInclude Include="..\..\src\ft2_events.h"> + <ClInclude Include="..\..\src\ft2_scrollbars.h"> <Filter>headers</Filter> </ClInclude> - <ClInclude Include="..\..\src\ft2_pattern_draw.h"> + <ClInclude Include="..\..\src\ft2_structs.h"> <Filter>headers</Filter> </ClInclude> - <ClInclude Include="..\..\src\ft2_palette.h"> + <ClInclude Include="..\..\src\ft2_sysreqs.h"> <Filter>headers</Filter> </ClInclude> - <ClInclude Include="..\..\src\ft2_sample_ed_features.h"> + <ClInclude Include="..\..\src\ft2_tables.h"> <Filter>headers</Filter> </ClInclude> - <ClInclude Include="..\..\src\rtmidi\RtMidi.h"> - <Filter>rtmidi</Filter> - </ClInclude> - <ClInclude Include="..\..\src\rtmidi\rtmidi_c.h"> - <Filter>rtmidi</Filter> - </ClInclude> - <ClInclude Include="..\..\src\ft2_scopedraw.h"> + <ClInclude Include="..\..\src\ft2_textboxes.h"> <Filter>headers</Filter> </ClInclude> - <ClInclude Include="..\..\src\ft2_tables.h"> + <ClInclude Include="..\..\src\ft2_trim.h"> <Filter>headers</Filter> </ClInclude> - <ClInclude Include="..\..\src\ft2_intrp_table.h"> + <ClInclude Include="..\..\src\ft2_unicode.h"> <Filter>headers</Filter> </ClInclude> - <ClInclude Include="..\..\src\ft2_bmp.h"> + <ClInclude Include="..\..\src\ft2_video.h"> <Filter>headers</Filter> </ClInclude> - <ClInclude Include="..\..\src\ft2_structs.h"> + <ClInclude Include="..\..\src\ft2_wav_renderer.h"> <Filter>headers</Filter> </ClInclude> </ItemGroup>