mirror of
https://github.com/cookiengineer/audacity
synced 2025-10-10 08:33:36 +02:00
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.
This commit is contained in:
@@ -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();
|
||||
|
@@ -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();
|
||||
|
@@ -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<mNumBars; j++) {
|
||||
msg.peak[j] = 0;
|
||||
msg.rms[j] = 0;
|
||||
msg.clipping[j] = false;
|
||||
msg.headPeakCount[j] = 0;
|
||||
msg.tailPeakCount[j] = 0;
|
||||
}
|
||||
|
||||
for(i=0; i<numFrames; i++) {
|
||||
for(j=0; j<num; j++) {
|
||||
@@ -1718,6 +1721,8 @@ void Meter::OnAudioIOStatus(wxCommandEvent &evt)
|
||||
{
|
||||
mActive = true;
|
||||
|
||||
mTimer.Start(1000 / mMeterRefreshRate);
|
||||
|
||||
if (evt.GetEventType() == EVT_AUDIOIO_MONITOR)
|
||||
{
|
||||
mMonitoring = mActive;
|
||||
@@ -1725,11 +1730,15 @@ void Meter::OnAudioIOStatus(wxCommandEvent &evt)
|
||||
}
|
||||
else
|
||||
{
|
||||
mTimer.Stop();
|
||||
|
||||
mMonitoring = false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
mTimer.Stop();
|
||||
|
||||
mMonitoring = false;
|
||||
}
|
||||
|
||||
@@ -1740,6 +1749,31 @@ void Meter::OnAudioIOStatus(wxCommandEvent &evt)
|
||||
}
|
||||
}
|
||||
|
||||
// SaveState() and RestoreState() exist solely for purpose of recreating toolbars
|
||||
// They should really be quering the project for current audio I/O state, but there
|
||||
// isn't a clear way of doing that just yet. (It should NOT query AudioIO.)
|
||||
void *Meter::SaveState()
|
||||
{
|
||||
bool *state = new bool[2];
|
||||
state[0] = mMonitoring;
|
||||
state[1] = mActive;
|
||||
|
||||
return state;
|
||||
}
|
||||
|
||||
void Meter::RestoreState(void *state)
|
||||
{
|
||||
mMonitoring = ((bool *)state)[0];
|
||||
mActive = ((bool *)state)[1];
|
||||
|
||||
if (mActive)
|
||||
{
|
||||
mTimer.Start(1000 / mMeterRefreshRate);
|
||||
}
|
||||
|
||||
delete [] state;
|
||||
}
|
||||
|
||||
//
|
||||
// Pop-up menu handlers
|
||||
//
|
||||
|
@@ -171,6 +171,10 @@ class Meter : public wxPanel
|
||||
|
||||
void StartMonitoring();
|
||||
|
||||
// These exist solely for the purpose of reseting the toolbars
|
||||
void *SaveState();
|
||||
void RestoreState(void *state);
|
||||
|
||||
private:
|
||||
//
|
||||
// Event handlers
|
||||
|
Reference in New Issue
Block a user