diff --git a/src/AudioIO.cpp b/src/AudioIO.cpp index f713e0b13..622263fa0 100644 --- a/src/AudioIO.cpp +++ b/src/AudioIO.cpp @@ -1210,7 +1210,6 @@ AudioIO::AudioIO() mUpdatingMeters = false; mOwningProject = NULL; - mInputMeter = NULL; mOutputMeter = NULL; PaError err = Pa_Initialize(); @@ -1662,7 +1661,7 @@ bool AudioIO::StartPortAudioStream(double sampleRate, if (!mOwningProject) return false; - mInputMeter = NULL; + mInputMeter.Release(); mOutputMeter = NULL; mLastPaError = paNoError; @@ -1751,7 +1750,7 @@ bool AudioIO::StartPortAudioStream(double sampleRate, else captureParameters.suggestedLatency = latencyDuration/1000.0; - mInputMeter = mOwningProject->GetCaptureMeter(); + SetCaptureMeter( mOwningProject, mOwningProject->GetCaptureMeter() ); } SetMeters(); @@ -2479,11 +2478,13 @@ void AudioIO::SetCaptureMeter(AudacityProject *project, MeterPanel *meter) { if (!mOwningProject || mOwningProject == project) { - mInputMeter = meter; - if (mInputMeter) + if (meter) { + mInputMeter = meter; mInputMeter->Reset(mRate, true); } + else + mInputMeter.Release(); } } @@ -2499,10 +2500,6 @@ void AudioIO::SetPlaybackMeter(AudacityProject *project, MeterPanel *meter) } } -MeterPanel * AudioIO::GetCaptureMeter(){ - return mInputMeter; -} - void AudioIO::SetMeters() { if (mInputMeter) @@ -2817,7 +2814,7 @@ void AudioIO::StopStream() if (pMixerBoard) pMixerBoard->ResetMeters(false); - mInputMeter = NULL; + mInputMeter.Release(); mOutputMeter = NULL; mOwningProject = NULL; @@ -4506,7 +4503,7 @@ double AudioIO::AILAGetLastDecisionTime() { void AudioIO::AILAProcess(double maxPeak) { AudacityProject *proj = GetActiveProject(); if (proj && mAILAActive) { - if (mInputMeter->IsClipping()) { + if (mInputMeter && mInputMeter->IsClipping()) { mAILAClipped = true; wxPrintf("clipped"); } @@ -4515,7 +4512,7 @@ void AudioIO::AILAProcess(double maxPeak) { if ((mAILATotalAnalysis == 0 || mAILAAnalysisCounter < mAILATotalAnalysis) && mTime - mAILALastStartTime >= mAILAAnalysisTime) { putchar('\n'); - mAILAMax = mInputMeter->ToLinearIfDB(mAILAMax); + mAILAMax = mInputMeter ? mInputMeter->ToLinearIfDB(mAILAMax) : 0.0; double iv = (double) Px_GetInputVolume(mPortMixer); unsigned short changetype = 0; //0 - no change, 1 - increase change, 2 - decrease change wxPrintf("mAILAAnalysisCounter:%d\n", mAILAAnalysisCounter); diff --git a/src/AudioIO.h b/src/AudioIO.h index e49a348e6..a878f5df4 100644 --- a/src/AudioIO.h +++ b/src/AudioIO.h @@ -21,6 +21,7 @@ #include #include #include +#include #ifdef USE_MIDI @@ -410,7 +411,6 @@ class AUDACITY_DLL_API AudioIO final { bool IsAvailable(AudacityProject *projecT); void SetCaptureMeter(AudacityProject *project, MeterPanel *meter); void SetPlaybackMeter(AudacityProject *project, MeterPanel *meter); - MeterPanel * GetCaptureMeter(); private: /** \brief Set the current VU meters - this should be done once after @@ -694,7 +694,7 @@ private: PaError mLastPaError; AudacityProject *mOwningProject; - MeterPanel *mInputMeter; + wxWeakRef mInputMeter{}; MeterPanel *mOutputMeter; bool mUpdateMeters; volatile bool mUpdatingMeters; diff --git a/src/widgets/Meter.cpp b/src/widgets/Meter.cpp index 2363b20b6..89747653e 100644 --- a/src/widgets/Meter.cpp +++ b/src/widgets/Meter.cpp @@ -367,12 +367,6 @@ MeterPanel::~MeterPanel() wxCommandEventHandler(MeterPanel::OnMeterPrefsUpdated), NULL, this); - - // LLL: This prevents a crash during termination if monitoring - // is active. - if (gAudioIO && gAudioIO->IsMonitoring()) - if( gAudioIO->GetCaptureMeter() == this ) - gAudioIO->StopStream(); } void MeterPanel::UpdatePrefs()