From bec58666535b2183d5d8517180b1ca55bce878a8 Mon Sep 17 00:00:00 2001 From: lllucius Date: Thu, 1 Jan 2015 23:29:08 +0000 Subject: [PATCH] Persist meter state across toolbar resets and fix clipping indicator This will fix the clipping indicator turning on after a toolbar reset and, as a bonus, the timers now only run if playing, capturing, or monitoring. Will (slightly) reduce the CPU consumption. --- src/toolbars/MeterToolBar.cpp | 30 +++++++++++++++++ src/toolbars/MeterToolBar.h | 1 + src/widgets/Meter.cpp | 62 +++++++++++++++++++++++++++-------- src/widgets/Meter.h | 4 +++ 4 files changed, 83 insertions(+), 14 deletions(-) diff --git a/src/toolbars/MeterToolBar.cpp b/src/toolbars/MeterToolBar.cpp index c8c080b8a..35829803c 100644 --- a/src/toolbars/MeterToolBar.cpp +++ b/src/toolbars/MeterToolBar.cpp @@ -81,6 +81,36 @@ void MeterToolBar::Create(wxWindow * parent) OnSize(dummy); } +void MeterToolBar::ReCreateButtons() +{ + void *playState = NULL; + void *recordState = NULL; + + if (mPlayMeter && mProject->GetPlaybackMeter() == mPlayMeter) + { + mProject->SetPlaybackMeter( NULL ); + playState = mPlayMeter->SaveState(); + } + + if (mRecordMeter && mProject->GetCaptureMeter() == mRecordMeter) + { + mProject->SetCaptureMeter( NULL ); + recordState = mRecordMeter->SaveState(); + } + + ToolBar::ReCreateButtons(); + + if (playState) + { + mPlayMeter->RestoreState(playState); + } + + if (recordState) + { + mRecordMeter->RestoreState(recordState); + } +} + void MeterToolBar::Populate() { mSizer = new wxGridBagSizer(); diff --git a/src/toolbars/MeterToolBar.h b/src/toolbars/MeterToolBar.h index cc5822539..e8df3ec10 100644 --- a/src/toolbars/MeterToolBar.h +++ b/src/toolbars/MeterToolBar.h @@ -39,6 +39,7 @@ class MeterToolBar:public ToolBar { void Create(wxWindow *parent); virtual void Populate(); + virtual void ReCreateButtons(); virtual void Repaint(wxDC * WXUNUSED(dc)) {}; virtual void EnableDisableButtons() {}; virtual void UpdatePrefs(); diff --git a/src/widgets/Meter.cpp b/src/widgets/Meter.cpp index b22531186..fdc763a35 100644 --- a/src/widgets/Meter.cpp +++ b/src/widgets/Meter.cpp @@ -248,7 +248,6 @@ Meter::Meter(AudacityProject *project, this); if (mIsInput) { - // Register for AudioIO Monitor events wxTheApp->Connect(EVT_AUDIOIO_MONITOR, wxCommandEventHandler(Meter::OnAudioIOStatus), NULL, @@ -266,6 +265,12 @@ Meter::Meter(AudacityProject *project, // mDarkPen = wxPen( theTheme.Colour( clrMeterInputDarkPen ), 1, wxSOLID); } else { + // Register for AudioIO events + wxTheApp->Connect(EVT_AUDIOIO_PLAYBACK, + wxCommandEventHandler(Meter::OnAudioIOStatus), + NULL, + this); + mPen = wxPen( theTheme.Colour( clrMeterOutputPen ), 1, wxSOLID); mBrush = wxBrush( theTheme.Colour( clrMeterOutputBrush ), wxSOLID); mRMSBrush = wxBrush( theTheme.Colour( clrMeterOutputRMSBrush ), wxSOLID); @@ -313,7 +318,7 @@ Meter::~Meter() { if (mIsInput) { - // Unregister for AudioIO Monitor events + // Unregister for AudioIO events wxTheApp->Disconnect(EVT_AUDIOIO_MONITOR, wxCommandEventHandler(Meter::OnAudioIOStatus), NULL, @@ -323,6 +328,13 @@ Meter::~Meter() NULL, this); } + else + { + wxTheApp->Disconnect(EVT_AUDIOIO_PLAYBACK, + wxCommandEventHandler(Meter::OnAudioIOStatus), + NULL, + this); + } // Unregister for our preference update event wxTheApp->Disconnect(EVT_METER_PREFERENCES_CHANGED, @@ -379,8 +391,6 @@ void Meter::UpdatePrefs() Reset(mRate, false); - mTimer.Start(1000 / mMeterRefreshRate); - mLayoutValid = false; } @@ -674,7 +684,6 @@ void Meter::OnMouse(wxMouseEvent &evt) else { Reset(mRate, true); } - } } @@ -701,14 +710,14 @@ void Meter::Reset(double sampleRate, bool resetClipping) // wxTimers seem to be a little unreliable - sometimes they stop for // no good reason, so this "primes" it every now and then... - mTimer.Stop(); +// mTimer.Stop(); // While it's stopped, empty the queue mQueue.Clear(); mLayoutValid = false; - mTimer.Start(1000 / mMeterRefreshRate); +// mTimer.Start(1000 / mMeterRefreshRate); Refresh(false); } @@ -755,14 +764,8 @@ void Meter::UpdateDisplay(int numChannels, int numFrames, float *sampleData) int num = intmin(numChannels, mNumBars); MeterUpdateMsg msg; + memset(&msg, 0, sizeof(msg)); msg.numFrames = numFrames; - for(j=0; j