diff --git a/src/AudioIO.cpp b/src/AudioIO.cpp index e4a6f994e..ca6c60de1 100644 --- a/src/AudioIO.cpp +++ b/src/AudioIO.cpp @@ -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); diff --git a/src/AudioIO.h b/src/AudioIO.h index e77cd3559..1c2335da9 100644 --- a/src/AudioIO.h +++ b/src/AudioIO.h @@ -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 diff --git a/src/toolbars/MeterToolBar.cpp b/src/toolbars/MeterToolBar.cpp index 4de781861..a0479eee6 100644 --- a/src/toolbars/MeterToolBar.cpp +++ b/src/toolbars/MeterToolBar.cpp @@ -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() diff --git a/src/widgets/Meter.cpp b/src/widgets/Meter.cpp index 37dd5d38b..cecf6320a 100644 --- a/src/widgets/Meter.cpp +++ b/src/widgets/Meter.cpp @@ -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); - } } // diff --git a/src/widgets/Meter.h b/src/widgets/Meter.h index bb739c920..801a82173 100644 --- a/src/widgets/Meter.h +++ b/src/widgets/Meter.h @@ -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; };