Separate class RealtimeEffectManager
This commit is contained in:
parent
9935b035c5
commit
04a3ed9d04
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -927,7 +927,7 @@ MenuTable::BaseItemPtr GenerateMenu( AudacityProject & )
|
|||
const ReservedCommandFlag
|
||||
IsRealtimeNotActiveFlag{
|
||||
[](const AudacityProject &){
|
||||
return !EffectManager::Get().RealtimeIsActive();
|
||||
return !RealtimeEffectManager::Get().RealtimeIsActive();
|
||||
}
|
||||
}; //lll
|
||||
|
||||
|
|
|
@ -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();
|
||||
|
|
Loading…
Reference in New Issue