Separate class RealtimeEffectManager

This commit is contained in:
Paul Licameli 2019-06-23 07:10:11 -04:00
parent 9935b035c5
commit 04a3ed9d04
7 changed files with 76 additions and 52 deletions

View File

@ -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;

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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<unsigned> mRealtimeChans;
std::vector<double> 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<unsigned> mRealtimeChans;
std::vector<double> mRealtimeRates;
};
#endif

View File

@ -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

View File

@ -927,7 +927,7 @@ MenuTable::BaseItemPtr GenerateMenu( AudacityProject & )
const ReservedCommandFlag
IsRealtimeNotActiveFlag{
[](const AudacityProject &){
return !EffectManager::Get().RealtimeIsActive();
return !RealtimeEffectManager::Get().RealtimeIsActive();
}
}; //lll

View File

@ -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();