From 8a78ae280ccd77d98f0a5cfdfcd0b119d8740cf8 Mon Sep 17 00:00:00 2001 From: Paul Licameli Date: Fri, 10 Aug 2018 15:07:08 -0400 Subject: [PATCH] Factor out a piece of the big callback --- src/AudioIO.cpp | 103 +++++++++++++++++++++++++----------------------- src/AudioIO.h | 4 ++ 2 files changed, 58 insertions(+), 49 deletions(-) diff --git a/src/AudioIO.cpp b/src/AudioIO.cpp index ef2886691..e92ea2a6d 100644 --- a/src/AudioIO.cpp +++ b/src/AudioIO.cpp @@ -4746,9 +4746,9 @@ int AudioIO::AudioCallback(const void *inputBuffer, void *outputBuffer, #endif const PaStreamCallbackFlags statusFlags, void * WXUNUSED(userData) ) { - auto numPlaybackChannels = mNumPlaybackChannels; - auto numPlaybackTracks = mPlaybackTracks.size(); - auto numCaptureChannels = mNumCaptureChannels; + const auto numPlaybackChannels = mNumPlaybackChannels; + const auto numPlaybackTracks = mPlaybackTracks.size(); + const auto numCaptureChannels = mNumCaptureChannels; int callbackReturn = paContinue; void *tempBuffer = alloca(framesPerBuffer*sizeof(float)* MAX(numCaptureChannels,numPlaybackChannels)); @@ -4955,52 +4955,7 @@ int AudioIO::AudioCallback(const void *inputBuffer, void *outputBuffer, else #endif if (mSeek) - { - int token = mStreamToken; - wxMutexLocker locker(mSuspendAudioThread); - if (token != mStreamToken) - // This stream got destroyed while we waited for it - return paAbort; - - // Pause audio thread and wait for it to finish - mAudioThreadFillBuffersLoopRunning = false; - while( mAudioThreadFillBuffersLoopActive ) - { - wxMilliSleep( 50 ); - } - - // Calculate the NEW time position - mPlaybackSchedule.mTime += mSeek; - mPlaybackSchedule.mTime = mPlaybackSchedule.LimitStreamTime(); - mSeek = 0.0; - - mPlaybackSchedule.RealTimeInit(); - - // Reset mixer positions and flush buffers for all tracks - for (i = 0; i < numPlaybackTracks; i++) - { - mPlaybackMixers[i]->Reposition( mPlaybackSchedule.mTime ); - const auto toDiscard = - mPlaybackBuffers[i]->AvailForGet(); - const auto discarded = - mPlaybackBuffers[i]->Discard( toDiscard ); - // wxASSERT( discarded == toDiscard ); - // but we can't assert in this thread - wxUnusedVar(discarded); - } - - // Reload the ring buffers - mAudioThreadShouldCallFillBuffersOnce = true; - while( mAudioThreadShouldCallFillBuffersOnce ) - { - wxMilliSleep( 50 ); - } - - // Reenable the audio thread - mAudioThreadFillBuffersLoopRunning = true; - - return paContinue; - } + return CallbackDoSeek(); unsigned numSolo = 0; for(unsigned t = 0; t < numPlaybackTracks; t++ ) @@ -5412,6 +5367,56 @@ int AudioIO::AudioCallback(const void *inputBuffer, void *outputBuffer, return callbackReturn; } +PaStreamCallbackResult AudioIO::CallbackDoSeek() +{ + const int token = mStreamToken; + wxMutexLocker locker(mSuspendAudioThread); + if (token != mStreamToken) + // This stream got destroyed while we waited for it + return paAbort; + + const auto numPlaybackTracks = mPlaybackTracks.size(); + + // Pause audio thread and wait for it to finish + mAudioThreadFillBuffersLoopRunning = false; + while( mAudioThreadFillBuffersLoopActive ) + { + wxMilliSleep( 50 ); + } + + // Calculate the NEW time position + mPlaybackSchedule.mTime += mSeek; + mPlaybackSchedule.mTime = mPlaybackSchedule.LimitStreamTime(); + mSeek = 0.0; + + mPlaybackSchedule.RealTimeInit(); + + // Reset mixer positions and flush buffers for all tracks + for (size_t i = 0; i < numPlaybackTracks; i++) + { + mPlaybackMixers[i]->Reposition( mPlaybackSchedule.mTime ); + const auto toDiscard = + mPlaybackBuffers[i]->AvailForGet(); + const auto discarded = + mPlaybackBuffers[i]->Discard( toDiscard ); + // wxASSERT( discarded == toDiscard ); + // but we can't assert in this thread + wxUnusedVar(discarded); + } + + // Reload the ring buffers + mAudioThreadShouldCallFillBuffersOnce = true; + while( mAudioThreadShouldCallFillBuffersOnce ) + { + wxMilliSleep( 50 ); + } + + // Reenable the audio thread + mAudioThreadFillBuffersLoopRunning = true; + + return paContinue; +} + void AudioIO::CallbackCheckCompletion( int &callbackReturn, unsigned long len) { diff --git a/src/AudioIO.h b/src/AudioIO.h index 7f465e173..22cb33eef 100644 --- a/src/AudioIO.h +++ b/src/AudioIO.h @@ -210,6 +210,10 @@ class AUDACITY_DLL_API AudioIO final { const PaStreamCallbackTimeInfo *timeInfo, const PaStreamCallbackFlags statusFlags, void *userData); + // Part of the callback + PaStreamCallbackResult CallbackDoSeek(); + + // Part of the callback void CallbackCheckCompletion( int &callbackReturn, unsigned long len);