From 04a3ed9d044709f32e312533a5a84ad69da85bfe Mon Sep 17 00:00:00 2001 From: Paul Licameli Date: Sun, 23 Jun 2019 07:10:11 -0400 Subject: [PATCH] Separate class RealtimeEffectManager --- src/AudioIO.cpp | 12 ++-- src/effects/Effect.cpp | 4 +- src/effects/EffectManager.cpp | 45 +++++++++----- src/effects/EffectManager.h | 59 +++++++++++-------- src/effects/EffectRack.cpp | 4 +- src/menus/PluginMenus.cpp | 2 +- .../wavetrack/ui/WaveTrackControls.cpp | 2 +- 7 files changed, 76 insertions(+), 52 deletions(-) diff --git a/src/AudioIO.cpp b/src/AudioIO.cpp index 444503f41..759c6cd8c 100644 --- a/src/AudioIO.cpp +++ b/src/AudioIO.cpp @@ -1634,7 +1634,7 @@ int AudioIO::StartStream(const TransportTracks &tracks, if (mNumPlaybackChannels > 0) { - EffectManager & em = EffectManager::Get(); + auto & em = RealtimeEffectManager::Get(); // Setup for realtime playback at the rate of the realtime // stream, not the rate of the track. em.RealtimeInitialize(mRate); @@ -1987,7 +1987,7 @@ void AudioIO::StartStreamCleanup(bool bOnlyBuffers) { if (mNumPlaybackChannels > 0) { - EffectManager::Get().RealtimeFinalize(); + RealtimeEffectManager::Get().RealtimeFinalize(); } mPlaybackBuffers.reset(); @@ -2164,7 +2164,7 @@ void AudioIO::StopStream() // No longer need effects processing if (mNumPlaybackChannels > 0) { - EffectManager::Get().RealtimeFinalize(); + RealtimeEffectManager::Get().RealtimeFinalize(); } // @@ -2414,11 +2414,11 @@ void AudioIO::SetPaused(bool state) { if (state) { - EffectManager::Get().RealtimeSuspend(); + RealtimeEffectManager::Get().RealtimeSuspend(); } else { - EffectManager::Get().RealtimeResume(); + RealtimeEffectManager::Get().RealtimeResume(); } } @@ -3794,7 +3794,7 @@ bool AudioIoCallback::FillOutputBuffers( tempBufs[c] = (float *) alloca(framesPerBuffer * sizeof(float)); // ------ End of MEMORY ALLOCATION --------------- - EffectManager & em = EffectManager::Get(); + auto & em = RealtimeEffectManager::Get(); em.RealtimeProcessStart(); bool selected = false; diff --git a/src/effects/Effect.cpp b/src/effects/Effect.cpp index 2f06c9db1..09dda6e52 100644 --- a/src/effects/Effect.cpp +++ b/src/effects/Effect.cpp @@ -3905,7 +3905,7 @@ void EffectUIHost::InitializeRealtime() { if (mSupportsRealtime && !mInitialized) { - EffectManager::Get().RealtimeAddEffect(mEffect); + RealtimeEffectManager::Get().RealtimeAddEffect(mEffect); wxTheApp->Bind(EVT_AUDIOIO_PLAYBACK, &EffectUIHost::OnPlayback, @@ -3923,7 +3923,7 @@ void EffectUIHost::CleanupRealtime() { if (mSupportsRealtime && mInitialized) { - EffectManager::Get().RealtimeRemoveEffect(mEffect); + RealtimeEffectManager::Get().RealtimeRemoveEffect(mEffect); mInitialized = false; } diff --git a/src/effects/EffectManager.cpp b/src/effects/EffectManager.cpp index 881ab814f..5c597c885 100644 --- a/src/effects/EffectManager.cpp +++ b/src/effects/EffectManager.cpp @@ -52,15 +52,28 @@ EffectManager & EffectManager::Get() return em; } -EffectManager::EffectManager() +RealtimeEffectManager & RealtimeEffectManager::Get() +{ + static RealtimeEffectManager rem; + return rem; +} + +RealtimeEffectManager::RealtimeEffectManager() { mRealtimeLock.Enter(); mRealtimeActive = false; mRealtimeSuspended = true; mRealtimeLatency = 0; mRealtimeLock.Leave(); - mSkipStateFlag = false; +} +RealtimeEffectManager::~RealtimeEffectManager() +{ +} + +EffectManager::EffectManager() +{ + mSkipStateFlag = false; #if defined(EXPERIMENTAL_EFFECTS_RACK) mRack = NULL; #endif @@ -514,7 +527,7 @@ void EffectManager::ShowRack() GetRack()->Show(!GetRack()->IsShown()); } -void EffectManager::RealtimeSetEffects(const EffectArray & effects) +void RealtimeEffectManager::RealtimeSetEffects(const EffectArray & effects) { // Block RealtimeProcess() RealtimeSuspend(); @@ -570,17 +583,17 @@ void EffectManager::RealtimeSetEffects(const EffectArray & effects) } #endif -bool EffectManager::RealtimeIsActive() +bool RealtimeEffectManager::RealtimeIsActive() { return mRealtimeEffects.size() != 0; } -bool EffectManager::RealtimeIsSuspended() +bool RealtimeEffectManager::RealtimeIsSuspended() { return mRealtimeSuspended; } -void EffectManager::RealtimeAddEffect(Effect *effect) +void RealtimeEffectManager::RealtimeAddEffect(Effect *effect) { // Block RealtimeProcess() RealtimeSuspend(); @@ -605,7 +618,7 @@ void EffectManager::RealtimeAddEffect(Effect *effect) RealtimeResume(); } -void EffectManager::RealtimeRemoveEffect(Effect *effect) +void RealtimeEffectManager::RealtimeRemoveEffect(Effect *effect) { // Block RealtimeProcess() RealtimeSuspend(); @@ -626,7 +639,7 @@ void EffectManager::RealtimeRemoveEffect(Effect *effect) RealtimeResume(); } -void EffectManager::RealtimeInitialize(double rate) +void RealtimeEffectManager::RealtimeInitialize(double rate) { // The audio thread should not be running yet, but protect anyway RealtimeSuspend(); @@ -649,7 +662,7 @@ void EffectManager::RealtimeInitialize(double rate) RealtimeResume(); } -void EffectManager::RealtimeAddProcessor(int group, unsigned chans, float rate) +void RealtimeEffectManager::RealtimeAddProcessor(int group, unsigned chans, float rate) { for (auto e : mRealtimeEffects) e->RealtimeAddProcessor(group, chans, rate); @@ -658,7 +671,7 @@ void EffectManager::RealtimeAddProcessor(int group, unsigned chans, float rate) mRealtimeRates.push_back(rate); } -void EffectManager::RealtimeFinalize() +void RealtimeEffectManager::RealtimeFinalize() { // Make sure nothing is going on RealtimeSuspend(); @@ -678,7 +691,7 @@ void EffectManager::RealtimeFinalize() mRealtimeActive = false; } -void EffectManager::RealtimeSuspend() +void RealtimeEffectManager::RealtimeSuspend() { mRealtimeLock.Enter(); @@ -699,7 +712,7 @@ void EffectManager::RealtimeSuspend() mRealtimeLock.Leave(); } -void EffectManager::RealtimeResume() +void RealtimeEffectManager::RealtimeResume() { mRealtimeLock.Enter(); @@ -723,7 +736,7 @@ void EffectManager::RealtimeResume() // // This will be called in a different thread than the main GUI thread. // -void EffectManager::RealtimeProcessStart() +void RealtimeEffectManager::RealtimeProcessStart() { // Protect ourselves from the main thread mRealtimeLock.Enter(); @@ -745,7 +758,7 @@ void EffectManager::RealtimeProcessStart() // // This will be called in a different thread than the main GUI thread. // -size_t EffectManager::RealtimeProcess(int group, unsigned chans, float **buffers, size_t numSamples) +size_t RealtimeEffectManager::RealtimeProcess(int group, unsigned chans, float **buffers, size_t numSamples) { // Protect ourselves from the main thread mRealtimeLock.Enter(); @@ -820,7 +833,7 @@ size_t EffectManager::RealtimeProcess(int group, unsigned chans, float **buffers // // This will be called in a different thread than the main GUI thread. // -void EffectManager::RealtimeProcessEnd() +void RealtimeEffectManager::RealtimeProcessEnd() { // Protect ourselves from the main thread mRealtimeLock.Enter(); @@ -839,7 +852,7 @@ void EffectManager::RealtimeProcessEnd() mRealtimeLock.Leave(); } -int EffectManager::GetRealtimeLatency() +int RealtimeEffectManager::GetRealtimeLatency() { return mRealtimeLatency; } diff --git a/src/effects/EffectManager.h b/src/effects/EffectManager.h index eea9e3e75..e9c54902b 100644 --- a/src/effects/EffectManager.h +++ b/src/effects/EffectManager.h @@ -129,22 +129,6 @@ public: void SetSkipStateFlag(bool flag); bool GetSkipStateFlag(); - // Realtime effect processing - bool RealtimeIsActive(); - bool RealtimeIsSuspended(); - void RealtimeAddEffect(Effect *effect); - void RealtimeRemoveEffect(Effect *effect); - void RealtimeSetEffects(const EffectArray & mActive); - void RealtimeInitialize(double rate); - void RealtimeAddProcessor(int group, unsigned chans, float rate); - void RealtimeFinalize(); - void RealtimeSuspend(); - void RealtimeResume(); - void RealtimeProcessStart(); - size_t RealtimeProcess(int group, unsigned chans, float **buffers, size_t numSamples); - void RealtimeProcessEnd(); - int GetRealtimeLatency(); - #if defined(EXPERIMENTAL_EFFECTS_RACK) void ShowRack(); #endif @@ -167,14 +151,6 @@ private: int mNumEffects; - wxCriticalSection mRealtimeLock; - EffectArray mRealtimeEffects; - int mRealtimeLatency; - bool mRealtimeSuspended; - bool mRealtimeActive; - std::vector mRealtimeChans; - std::vector mRealtimeRates; - // Set true if we want to skip pushing state // after processing at effect run time. bool mSkipStateFlag; @@ -187,5 +163,40 @@ private: }; +class AUDACITY_DLL_API RealtimeEffectManager final +{ +public: + + /** Get the singleton instance of the RealtimeEffectManager. **/ + static RealtimeEffectManager & Get(); + + // Realtime effect processing + bool RealtimeIsActive(); + bool RealtimeIsSuspended(); + void RealtimeAddEffect(Effect *effect); + void RealtimeRemoveEffect(Effect *effect); + void RealtimeSetEffects(const EffectArray & mActive); + void RealtimeInitialize(double rate); + void RealtimeAddProcessor(int group, unsigned chans, float rate); + void RealtimeFinalize(); + void RealtimeSuspend(); + void RealtimeResume(); + void RealtimeProcessStart(); + size_t RealtimeProcess(int group, unsigned chans, float **buffers, size_t numSamples); + void RealtimeProcessEnd(); + int GetRealtimeLatency(); + +private: + RealtimeEffectManager(); + ~RealtimeEffectManager(); + + wxCriticalSection mRealtimeLock; + EffectArray mRealtimeEffects; + int mRealtimeLatency; + bool mRealtimeSuspended; + bool mRealtimeActive; + std::vector mRealtimeChans; + std::vector mRealtimeRates; +}; #endif diff --git a/src/effects/EffectRack.cpp b/src/effects/EffectRack.cpp index 16cbfe207..7a85213cc 100644 --- a/src/effects/EffectRack.cpp +++ b/src/effects/EffectRack.cpp @@ -285,7 +285,7 @@ void EffectRack::OnClose(wxCloseEvent & evt) void EffectRack::OnTimer(wxTimerEvent & WXUNUSED(evt)) { - int latency = EffectManager::Get().GetRealtimeLatency(); + int latency = RealtimeEffectManager::Get().GetRealtimeLatency(); if (latency != mLastLatency) { mLatency->SetLabel(wxString::Format(_("Latency: %4d"), latency)); @@ -563,7 +563,7 @@ void EffectRack::UpdateActive() } } - EffectManager::Get().RealtimeSetEffects(mActive); + RealtimeEffectManager::Get().RealtimeSetEffects(mActive); } #endif diff --git a/src/menus/PluginMenus.cpp b/src/menus/PluginMenus.cpp index c10bf4098..e34fc1486 100644 --- a/src/menus/PluginMenus.cpp +++ b/src/menus/PluginMenus.cpp @@ -927,7 +927,7 @@ MenuTable::BaseItemPtr GenerateMenu( AudacityProject & ) const ReservedCommandFlag IsRealtimeNotActiveFlag{ [](const AudacityProject &){ - return !EffectManager::Get().RealtimeIsActive(); + return !RealtimeEffectManager::Get().RealtimeIsActive(); } }; //lll diff --git a/src/tracks/playabletrack/wavetrack/ui/WaveTrackControls.cpp b/src/tracks/playabletrack/wavetrack/ui/WaveTrackControls.cpp index f52d805bc..8fe3be65d 100644 --- a/src/tracks/playabletrack/wavetrack/ui/WaveTrackControls.cpp +++ b/src/tracks/playabletrack/wavetrack/ui/WaveTrackControls.cpp @@ -616,7 +616,7 @@ void WaveTrackMenuTable::InitMenu(Menu *pMenu, void *pUserData) AudacityProject *const project = ::GetActiveProject(); auto &tracks = TrackList::Get( *project ); - bool unsafe = EffectManager::Get().RealtimeIsActive() && + bool unsafe = RealtimeEffectManager::Get().RealtimeIsActive() && ProjectAudioIO::Get( *project ).IsAudioActive(); auto nChannels = TrackList::Channels(pTrack).size();