Make monitoring work after a theme change

This commit is contained in:
James Crook 2017-04-05 17:29:24 +01:00
parent c8f58c90af
commit 419b790235
5 changed files with 31 additions and 31 deletions

View File

@ -2237,6 +2237,10 @@ void AudioIO::SetPlaybackMeter(AudacityProject *project, Meter *meter)
}
}
Meter * AudioIO::GetCaptureMeter(){
return mInputMeter;
}
void AudioIO::SetMeters()
{
if (mInputMeter)
@ -2515,6 +2519,7 @@ void AudioIO::StopStream()
if (mInputMeter)
mInputMeter->Reset(mRate, false);
if (mOutputMeter)
mOutputMeter->Reset(mRate, false);

View File

@ -389,6 +389,7 @@ class AUDACITY_DLL_API AudioIO final {
bool IsAvailable(AudacityProject *projecT);
void SetCaptureMeter(AudacityProject *project, Meter *meter);
void SetPlaybackMeter(AudacityProject *project, Meter *meter);
Meter * GetCaptureMeter();
private:
/** \brief Set the current VU meters - this should be done once after

View File

@ -87,20 +87,26 @@ void MeterToolBar::ReCreateButtons()
if (mPlayMeter && mProject->GetPlaybackMeter() == mPlayMeter)
{
mProject->SetPlaybackMeter( NULL );
playState = mPlayMeter->SaveState();
mProject->SetPlaybackMeter( NULL );
}
if (mRecordMeter && mProject->GetCaptureMeter() == mRecordMeter)
{
mProject->SetCaptureMeter( NULL );
recordState = mRecordMeter->SaveState();
mProject->SetCaptureMeter( NULL );
}
ToolBar::ReCreateButtons();
mPlayMeter->RestoreState(playState);
if( playState.mSaved ){
mProject->SetPlaybackMeter( mPlayMeter );
}
mRecordMeter->RestoreState(recordState);
if( recordState.mSaved ){
mProject->SetCaptureMeter( mRecordMeter );
}
}
void MeterToolBar::Populate()

View File

@ -368,7 +368,8 @@ Meter::~Meter()
// LLL: This prevents a crash during termination if monitoring
// is active.
if (gAudioIO && gAudioIO->IsMonitoring())
gAudioIO->StopStream();
if( gAudioIO->GetCaptureMeter() == this )
gAudioIO->StopStream();
}
void Meter::UpdatePrefs()
@ -1824,45 +1825,32 @@ void Meter::StartMonitoring()
}
}
void Meter::StopMonitoring(){
mMonitoring = false;
if (gAudioIO->IsMonitoring()){
gAudioIO->StopStream();
}
}
void Meter::OnAudioIOStatus(wxCommandEvent &evt)
{
evt.Skip();
AudacityProject *p = (AudacityProject *) evt.GetEventObject();
mActive = false;
if (evt.GetInt() != 0)
{
if (p == mProject)
{
mActive = true;
mActive = (evt.GetInt() != 0) && (p == mProject);
mTimer.Start(1000 / mMeterRefreshRate);
if (evt.GetEventType() == EVT_AUDIOIO_MONITOR)
{
mMonitoring = mActive;
}
}
else
{
mTimer.Stop();
mMonitoring = false;
}
}
else
{
if( mActive ){
mTimer.Start(1000 / mMeterRefreshRate);
if (evt.GetEventType() == EVT_AUDIOIO_MONITOR)
mMonitoring = mActive;
} else {
mTimer.Stop();
mMonitoring = false;
}
// Only refresh is we're the active meter
if (IsShownOnScreen())
{
Refresh(false);
}
}
// SaveState() and RestoreState() exist solely for purpose of recreating toolbars
@ -1880,11 +1868,10 @@ void Meter::RestoreState(const State &state)
mMonitoring = state.mMonitoring;
mActive = state.mActive;
wxLogDebug("Restore state for %08X, is %i", (int)this, mActive );
if (mActive)
{
mTimer.Start(1000 / mMeterRefreshRate);
}
}
//

View File

@ -175,6 +175,7 @@ class Meter final : public wxPanelWrapper
bool IsClipping() const;
void StartMonitoring();
void StopMonitoring();
// These exist solely for the purpose of resetting the toolbars
struct State{ bool mSaved, mMonitoring, mActive; };