Audacity 3.2.0
Classes | Public Types | Public Member Functions | Private Member Functions | Private Attributes | Friends | List of all members
MeterPanel Class Referencefinal

MeterPanel is a panel that paints the meter used for monitoring or playback. More...

#include <MeterPanel.h>

Inheritance diagram for MeterPanel:
[legend]
Collaboration diagram for MeterPanel:
[legend]

Classes

struct  State
 

Public Types

enum  Style {
  AutomaticStereo , HorizontalStereo , VerticalStereo , MixerTrackCluster ,
  HorizontalStereoCompact , VerticalStereoCompact
}
 

Public Member Functions

 MeterPanel (AudacityProject *, wxWindow *parent, wxWindowID id, bool isInput, const wxPoint &pos=wxDefaultPosition, const wxSize &size=wxDefaultSize, Style style=HorizontalStereo, float fDecayRate=60.0f)
 
void SetFocusFromKbd () override
 
void Clear () override
 
Style GetStyle () const
 
Style GetDesiredStyle () const
 
void SetStyle (Style newStyle)
 
void Reset (double sampleRate, bool resetClipping) override
 This method is thread-safe! Feel free to call from a different thread (like from an audio I/O callback). More...
 
void UpdateDisplay (unsigned numChannels, int numFrames, const float *sampleData) override
 Update the meters with a block of audio data. More...
 
bool IsMeterDisabled () const override
 Find out if the level meter is disabled or not. More...
 
float GetMaxPeak () const override
 
float GetPeakHold () const
 
bool IsMonitoring () const
 
bool IsActive () const
 
bool IsClipping () const override
 
void StartMonitoring ()
 
void StopMonitoring ()
 
State SaveState ()
 
void RestoreState (const State &state)
 
void SetMixer (wxCommandEvent &event)
 
int GetDBRange () const override
 
bool ShowDialog ()
 
void Increase (float steps)
 
void Decrease (float steps)
 
void UpdateSliderControl ()
 
void ShowMenu (const wxPoint &pos)
 
void SetName (const TranslatableString &name)
 
- Public Member Functions inherited from MeterPanelBase
 ~MeterPanelBase () override
 
template<typename ... Args>
 MeterPanelBase (Args &&...args)
 
std::shared_ptr< MeterGetMeter () const
 
virtual void Clear ()=0
 
virtual void Reset (double sampleRate, bool resetClipping)=0
 
virtual void UpdateDisplay (unsigned numChannels, int numFrames, const float *sampleData)=0
 
virtual bool IsMeterDisabled () const =0
 
virtual float GetMaxPeak () const =0
 
virtual bool IsClipping () const =0
 
virtual int GetDBRange () const =0
 
 wxPanelWrapper ()
 
 wxPanelWrapper (wxWindow *parent, wxWindowID winid=wxID_ANY, const wxPoint &pos=wxDefaultPosition, const wxSize &size=wxDefaultSize, long style=wxTAB_TRAVERSAL|wxNO_BORDER, const TranslatableString &name=XO("Panel"))
 
- Public Member Functions inherited from wxPanelWrapper
 wxPanelWrapper ()
 
 wxPanelWrapper (wxWindow *parent, wxWindowID winid=wxID_ANY, const wxPoint &pos=wxDefaultPosition, const wxSize &size=wxDefaultSize, long style=wxTAB_TRAVERSAL|wxNO_BORDER, const TranslatableString &name=XO("Panel"))
 
bool Create (wxWindow *parent, wxWindowID winid=wxID_ANY, const wxPoint &pos=wxDefaultPosition, const wxSize &size=wxDefaultSize, long style=wxTAB_TRAVERSAL|wxNO_BORDER, const TranslatableString &name=XO("Panel"))
 
void SetLabel (const TranslatableString &label)
 
void SetName (const TranslatableString &name)
 
void SetToolTip (const TranslatableString &toolTip)
 
void SetName ()
 
- Public Member Functions inherited from wxTabTraversalWrapper< wxPanel >
 wxTabTraversalWrapper (Args &&... args)
 
 wxTabTraversalWrapper (const wxTabTraversalWrapper &)=delete
 
 wxTabTraversalWrapper (wxTabTraversalWrapper &&)=delete
 
wxTabTraversalWrapperoperator= (const wxTabTraversalWrapper &)=delete
 
wxTabTraversalWrapperoperator= (wxTabTraversalWrapper &&)=delete
 

Private Member Functions

void UpdatePrefs () override
 
void UpdateSelectedPrefs (int) override
 
void OnErase (wxEraseEvent &evt)
 
void OnPaint (wxPaintEvent &evt)
 
void OnSize (wxSizeEvent &evt)
 
void OnMouse (wxMouseEvent &evt)
 
void OnKeyDown (wxKeyEvent &evt)
 
void OnCharHook (wxKeyEvent &evt)
 
void OnContext (wxContextMenuEvent &evt)
 
void OnSetFocus (wxFocusEvent &evt)
 
void OnKillFocus (wxFocusEvent &evt)
 
void OnAudioIOStatus (AudioIOEvent)
 
void OnAudioCapture (AudioIOEvent)
 
void OnMeterUpdate (wxTimerEvent &evt)
 
void OnTipTimeout (wxTimerEvent &evt)
 
void HandleLayout (wxDC &dc)
 
void SetActiveStyle (Style style)
 
void SetBarAndClip (int iBar, bool vert)
 
void DrawMeterBar (wxDC &dc, MeterBar *meterBar)
 
void ResetBar (MeterBar *bar, bool resetClipping)
 
void RepaintBarsNow ()
 
wxFont GetFont () const
 
void OnMonitor (wxCommandEvent &evt)
 
void OnPreferences (wxCommandEvent &evt)
 
wxString Key (const wxString &key) const
 
- Private Member Functions inherited from PrefsListener
 PrefsListener ()
 
virtual ~PrefsListener ()
 
virtual void UpdatePrefs ()=0
 
virtual void UpdateSelectedPrefs (int id)
 

Private Attributes

Observer::Subscription mAudioIOStatusSubscription
 
Observer::Subscription mAudioCaptureSubscription
 
AudacityProjectmProject
 
MeterUpdateQueue mQueue
 
wxTimer mTimer
 
wxTimer mTipTimer
 
int mWidth
 
int mHeight
 
int mRulerWidth {}
 
int mRulerHeight {}
 
bool mIsInput
 
Style mStyle {}
 
Style mDesiredStyle
 
bool mGradient
 
bool mDB
 
int mDBRange
 
bool mDecay
 
float mDecayRate {}
 
bool mClip
 
int mNumPeakSamplesToClip
 
double mPeakHoldDuration
 
double mT
 
double mRate
 
long mMeterRefreshRate {}
 
long mMeterDisabled {}
 
bool mMonitoring
 
bool mActive
 
unsigned mNumBars
 
MeterBar mBar [kMaxMeterBars] {}
 
bool mLayoutValid
 
std::unique_ptr< wxBitmap > mBitmap
 
wxPoint mLeftTextPos
 
wxPoint mRightTextPos
 
wxSize mLeftSize
 
wxSize mRightSize
 
wxPen mPen
 
wxPen mDisabledPen
 
wxPen mPeakPeakPen
 
wxBrush mBrush
 
wxBrush mRMSBrush
 
wxBrush mClipBrush
 
wxBrush mBkgndBrush
 
wxBrush mDisabledBkgndBrush
 
Ruler mRuler
 
wxString mLeftText
 
wxString mRightText
 
std::unique_ptr< LWSlidermSlider
 
wxPoint mSliderPos
 
wxSize mSliderSize
 
bool mEnabled { true }
 
bool mIsFocused {}
 
wxRect mFocusRect
 

Friends

class MeterAx
 

Additional Inherited Members

- Static Public Member Functions inherited from MeterPanelBase
static TempAllowFocus TemporarilyAllowFocus ()
 
- Static Private Member Functions inherited from PrefsListener
static void Broadcast (int id=0)
 Call this static function to notify all PrefsListener objects. More...
 

Detailed Description

MeterPanel is a panel that paints the meter used for monitoring or playback.

VU Meter, for displaying recording/playback level.

This is a bunch of common code that can display many different forms of VU meters and other displays.

But note that a lot of later code here assumes these are MeterToolBar meters, e.g., MeterPanel::StartMonitoring, so these are not as generic/common as originally intended.

Definition at line 101 of file MeterPanel.h.

Member Enumeration Documentation

◆ Style

Enumerator
AutomaticStereo 
HorizontalStereo 
VerticalStereo 
MixerTrackCluster 
HorizontalStereoCompact 
VerticalStereoCompact 

Definition at line 110 of file MeterPanel.h.

110 {
114 MixerTrackCluster, // Doesn't show menu, icon, or L/R labels, but otherwise like VerticalStereo.
115 HorizontalStereoCompact, // Thinner.
116 VerticalStereoCompact, // Narrower.
117 };
@ HorizontalStereoCompact
Definition: MeterPanel.h:115
@ AutomaticStereo
Definition: MeterPanel.h:111
@ HorizontalStereo
Definition: MeterPanel.h:112
@ VerticalStereo
Definition: MeterPanel.h:113
@ VerticalStereoCompact
Definition: MeterPanel.h:116
@ MixerTrackCluster
Definition: MeterPanel.h:114

Constructor & Destructor Documentation

◆ MeterPanel()

MeterPanel::MeterPanel ( AudacityProject project,
wxWindow *  parent,
wxWindowID  id,
bool  isInput,
const wxPoint &  pos = wxDefaultPosition,
const wxSize &  size = wxDefaultSize,
Style  style = HorizontalStereo,
float  fDecayRate = 60.0f 
)

Definition at line 292 of file MeterPanel.cpp.

299: MeterPanelBase(parent, id, pos, size, wxTAB_TRAVERSAL | wxNO_BORDER | wxWANTS_CHARS),
300 mProject(project),
301 mQueue{ 1024 },
302 mWidth(size.x),
303 mHeight(size.y),
304 mIsInput(isInput),
305 mDesiredStyle(style),
306 mGradient(true),
307 mDB(true),
309 mDecay(true),
310 mDecayRate(fDecayRate),
311 mClip(true),
314 mT(0),
315 mRate(0),
316 mMonitoring(false),
317 mActive(false),
318 mNumBars(0),
319 mLayoutValid(false),
320 mBitmap{},
322{
323 // i18n-hint: Noun (the meter is used for playback or record level monitoring)
324 SetName( XO("Meter") );
325 // Suppress warnings about the header file
326 wxUnusedVar(SpeakerMenu_xpm);
327 wxUnusedVar(MicMenu_xpm);
328 wxUnusedVar(PrefStyles);
329
331
332 mIsFocused = false;
333
334#if wxUSE_ACCESSIBILITY
335 SetAccessible(safenew MeterAx(this));
336#endif
337
338 // Do this BEFORE UpdatePrefs()!
341 mRuler.SetLabelEdges(true);
342 //mRuler.SetTickColour( wxColour( 0,0,255 ) );
343
345 {
346 mSlider = std::make_unique<LWSlider>(this, XO(""),
347 pos,
348 size,
350 false, /* showlabels */
351 false, /* drawticks */
352 false, /* drawtrack */
353 false /* alwayshidetip */
354 );
355 mSlider->SetScroll(0.1f, 2.0f);
356 }
357
359 UpdatePrefs();
360
361 wxColour backgroundColour = theTheme.Colour( clrMedium);
362 mBkgndBrush = wxBrush(backgroundColour, wxBRUSHSTYLE_SOLID);
363 SetBackgroundColour( backgroundColour );
364
365 mPeakPeakPen = wxPen(theTheme.Colour( clrMeterPeak), 1, wxPENSTYLE_SOLID);
366 mDisabledPen = wxPen(theTheme.Colour( clrMeterDisabledPen), 1, wxPENSTYLE_SOLID);
367
370
373
374 if (mIsInput) {
375 mPen = wxPen( theTheme.Colour( clrMeterInputPen ), 1, wxPENSTYLE_SOLID);
376 mBrush = wxBrush( theTheme.Colour( clrMeterInputBrush ), wxBRUSHSTYLE_SOLID);
377 mRMSBrush = wxBrush( theTheme.Colour( clrMeterInputRMSBrush ), wxBRUSHSTYLE_SOLID);
378 mClipBrush = wxBrush( theTheme.Colour( clrMeterInputClipBrush ), wxBRUSHSTYLE_SOLID);
379// mLightPen = wxPen( theTheme.Colour( clrMeterInputLightPen ), 1, wxSOLID);
380// mDarkPen = wxPen( theTheme.Colour( clrMeterInputDarkPen ), 1, wxSOLID);
381 }
382 else {
383 mPen = wxPen( theTheme.Colour( clrMeterOutputPen ), 1, wxPENSTYLE_SOLID);
384 mBrush = wxBrush( theTheme.Colour( clrMeterOutputBrush ), wxBRUSHSTYLE_SOLID);
385 mRMSBrush = wxBrush( theTheme.Colour( clrMeterOutputRMSBrush ), wxBRUSHSTYLE_SOLID);
386 mClipBrush = wxBrush( theTheme.Colour( clrMeterOutputClipBrush ), wxBRUSHSTYLE_SOLID);
387// mLightPen = wxPen( theTheme.Colour( clrMeterOutputLightPen ), 1, wxSOLID);
388// mDarkPen = wxPen( theTheme.Colour( clrMeterOutputDarkPen ), 1, wxSOLID);
389 }
390
391// mDisabledBkgndBrush = wxBrush(theTheme.Colour( clrMeterDisabledBrush), wxSOLID);
392 // No longer show a difference in the background colour when not monitoring.
393 // We have the tip instead.
395
396 mTipTimer.SetOwner(this, OnTipTimeoutID);
397 mTimer.SetOwner(this, OnMeterUpdateID);
398 // TODO: Yikes. Hard coded sample rate.
399 // JKC: I've looked at this, and it's benignish. It just means that the meter
400 // balistics are right for 44KHz and a bit more frisky than they should be
401 // for higher sample rates.
402 Reset(44100.0, true);
403}
#define PERCENT_SLIDER
Definition: ASlider.h:39
IntSetting DecibelScaleCutoff
Negation of this value is the lowest dB level that should be shown in dB scales.
Definition: Decibels.cpp:12
XO("Cut/Copy/Paste")
#define safenew
Definition: MemoryX.h:10
@ OnMeterUpdateID
Definition: MeterPanel.cpp:267
@ OnTipTimeoutID
Definition: MeterPanel.cpp:270
static const wxChar * PrefStyles[]
Definition: MeterPanel.cpp:259
THEME_API Theme theTheme
Definition: Theme.cpp:82
static AudioIO * Get()
Definition: AudioIO.cpp:123
static const LinearDBFormat & Instance()
static const LinearUpdater & Instance()
MeterPanelBase(Args &&...args)
bool mLayoutValid
Definition: MeterPanel.h:288
void UpdatePrefs() override
Definition: MeterPanel.cpp:410
Style mStyle
Definition: MeterPanel.h:266
wxFont GetFont() const
double mRate
Definition: MeterPanel.h:277
Style mDesiredStyle
Definition: MeterPanel.h:267
bool mClip
Definition: MeterPanel.h:273
int mDBRange
Definition: MeterPanel.h:270
bool mIsInput
Definition: MeterPanel.h:264
Ruler mRuler
Definition: MeterPanel.h:303
Observer::Subscription mAudioCaptureSubscription
Definition: MeterPanel.h:251
wxTimer mTimer
Definition: MeterPanel.h:255
float mDecayRate
Definition: MeterPanel.h:272
wxBrush mDisabledBkgndBrush
Definition: MeterPanel.h:302
bool mDecay
Definition: MeterPanel.h:271
double mPeakHoldDuration
Definition: MeterPanel.h:275
std::unique_ptr< LWSlider > mSlider
Definition: MeterPanel.h:307
double mT
Definition: MeterPanel.h:276
AudacityProject * mProject
Definition: MeterPanel.h:253
unsigned mNumBars
Definition: MeterPanel.h:285
wxBrush mBkgndBrush
Definition: MeterPanel.h:301
friend class MeterAx
Definition: MeterPanel.h:316
void OnAudioIOStatus(AudioIOEvent)
bool mMonitoring
Definition: MeterPanel.h:281
bool mGradient
Definition: MeterPanel.h:268
bool mActive
Definition: MeterPanel.h:283
void UpdateSliderControl()
Definition: MeterPanel.cpp:478
wxBrush mBrush
Definition: MeterPanel.h:298
Observer::Subscription mAudioIOStatusSubscription
Definition: MeterPanel.h:250
std::unique_ptr< wxBitmap > mBitmap
Definition: MeterPanel.h:290
wxTimer mTipTimer
Definition: MeterPanel.h:256
wxPen mPeakPeakPen
Definition: MeterPanel.h:297
int mNumPeakSamplesToClip
Definition: MeterPanel.h:274
wxBrush mClipBrush
Definition: MeterPanel.h:300
void Reset(double sampleRate, bool resetClipping) override
This method is thread-safe! Feel free to call from a different thread (like from an audio I/O callbac...
Definition: MeterPanel.cpp:903
void OnAudioCapture(AudioIOEvent)
wxPen mPen
Definition: MeterPanel.h:295
bool mIsFocused
Definition: MeterPanel.h:313
MeterUpdateQueue mQueue
Definition: MeterPanel.h:254
wxBrush mRMSBrush
Definition: MeterPanel.h:299
wxPen mDisabledPen
Definition: MeterPanel.h:296
Subscription Subscribe(Callback callback)
Connect a callback to the Publisher; later-connected are called earlier.
Definition: Observer.h:199
void SetFlip(bool flip)
Definition: Ruler.cpp:191
void SetFonts(const wxFont &minorFont, const wxFont &majorFont, const wxFont &minorMinorFont)
Definition: Ruler.cpp:230
void SetLabelEdges(bool labelEdges)
Definition: Ruler.cpp:178
bool Read(T *pVar) const
overload of Read returning a boolean that is true if the value was previously defined *‍/
Definition: Prefs.h:200
wxColour & Colour(int iIndex)

Member Function Documentation

◆ Clear()

void MeterPanel::Clear ( )
overridevirtual

Implements MeterPanelBase.

Definition at line 405 of file MeterPanel.cpp.

406{
407 mQueue.Clear();
408}

References MeterUpdateQueue::Clear(), and mQueue.

Here is the call graph for this function:

◆ Decrease()

void MeterPanel::Decrease ( float  steps)

Definition at line 892 of file MeterPanel.cpp.

893{
894 if (mSlider)
895 {
896 wxCommandEvent e;
897
898 mSlider->Decrease(steps);
899 SetMixer(e);
900 }
901}
void SetMixer(wxCommandEvent &event)
Definition: MeterPanel.cpp:834

References mSlider, and SetMixer().

Referenced by MeterToolBar::AdjustInputGain(), and MeterToolBar::AdjustOutputGain().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ DrawMeterBar()

void MeterPanel::DrawMeterBar ( wxDC &  dc,
MeterBar meterBar 
)
private

Definition at line 1598 of file MeterPanel.cpp.

1599{
1600 // Cache some metrics
1601 wxCoord x = bar->r.GetLeft();
1602 wxCoord y = bar->r.GetTop();
1603 wxCoord w = bar->r.GetWidth();
1604 wxCoord h = bar->r.GetHeight();
1605 wxCoord ht;
1606 wxCoord wd;
1607
1608 // Setup for erasing the background
1609 dc.SetPen(*wxTRANSPARENT_PEN);
1611
1612 if (mGradient)
1613 {
1614 // Map the predrawn bitmap into the source DC
1615 wxMemoryDC srcDC;
1616 srcDC.SelectObject(*mBitmap);
1617
1618 if (bar->vert)
1619 {
1620 // Copy as much of the predrawn meter bar as is required for the
1621 // current peak.
1622 // (h - 1) corresponds to the mRuler.SetBounds() in HandleLayout()
1623 ht = (int)(bar->peak * (h - 1) + 0.5);
1624
1625 // Blank out the rest
1626 if (h - ht)
1627 {
1628 // ht includes peak value...not really needed but doesn't hurt
1629 dc.DrawRectangle(x, y, w, h - ht);
1630 }
1631
1632 // Copy as much of the predrawn meter bar as is required for the
1633 // current peak.
1634 // +/-1 to include the peak position
1635 if (ht)
1636 {
1637 dc.Blit(x, y + h - ht - 1, w, ht + 1, &srcDC, x, y + h - ht - 1);
1638 }
1639
1640 // Draw the "recent" peak hold line using the predrawn meter bar so that
1641 // it will be the same color as the original level.
1642 // (h - 1) corresponds to the mRuler.SetBounds() in HandleLayout()
1643 ht = (int)(bar->peakHold * (h - 1) + 0.5);
1644 if (ht > 1)
1645 {
1646 dc.Blit(x, y + h - ht - 1, w, 2, &srcDC, x, y + h - ht - 1);
1647 }
1648
1649 // Draw the "maximum" peak hold line
1650 // (h - 1) corresponds to the mRuler.SetBounds() in HandleLayout()
1651 dc.SetPen(mPeakPeakPen);
1652 ht = (int)(bar->peakPeakHold * (h - 1) + 0.5);
1653 if (ht > 0)
1654 {
1655 AColor::Line(dc, x, y + h - ht - 1, x + w - 1, y + h - ht - 1);
1656 if (ht > 1)
1657 {
1658 AColor::Line(dc, x, y + h - ht, x + w - 1, y + h - ht);
1659 }
1660 }
1661 }
1662 else
1663 {
1664 // Calculate the peak position
1665 // (w - 1) corresponds to the mRuler.SetBounds() in HandleLayout()
1666 wd = (int)(bar->peak * (w - 1) + 0.5);
1667
1668 // Blank out the rest
1669 if (w - wd)
1670 {
1671 // wd includes peak value...not really needed but doesn't hurt
1672 dc.DrawRectangle(x + wd, y, w - wd, h);
1673 }
1674
1675 // Copy as much of the predrawn meter bar as is required for the
1676 // current peak. But, only blit() if there's something to copy
1677 // to prevent display corruption.
1678 // +1 to include peak position
1679 if (wd)
1680 {
1681 dc.Blit(x, y, wd + 1, h, &srcDC, x, y);
1682 }
1683
1684 // Draw the "recent" peak hold line using the predrawn meter bar so that
1685 // it will be the same color as the original level.
1686 // -1 to give a 2 pixel width
1687 wd = (int)(bar->peakHold * (w - 1) + 0.5);
1688 if (wd > 1)
1689 {
1690 dc.Blit(x + wd - 1, y, 2, h, &srcDC, x + wd, y);
1691 }
1692
1693 // Draw the "maximum" peak hold line using a themed color
1694 // (w - 1) corresponds to the mRuler.SetBounds() in HandleLayout()
1695 dc.SetPen(mPeakPeakPen);
1696 wd = (int)(bar->peakPeakHold * (w - 1) + 0.5);
1697 if (wd > 0)
1698 {
1699 AColor::Line(dc, x + wd, y, x + wd, y + h - 1);
1700 if (wd > 1)
1701 {
1702 AColor::Line(dc, x + wd - 1, y, x + wd - 1, y + h - 1);
1703 }
1704 }
1705 }
1706
1707 // No longer need the source DC, so unselect the predrawn bitmap
1708 srcDC.SelectObject(wxNullBitmap);
1709 }
1710 else
1711 {
1712 if (bar->vert)
1713 {
1714 // Calculate the peak position
1715 // (h - 1) corresponds to the mRuler.SetBounds() in HandleLayout()
1716 ht = (int)(bar->peak * (h - 1) + 0.5);
1717
1718 // Blank out the rest
1719 if (h - ht)
1720 {
1721 // ht includes peak value...not really needed but doesn't hurt
1722 dc.DrawRectangle(x, y, w, h - ht);
1723 }
1724
1725 // Draw the peak level
1726 // +/-1 to include the peak position
1727 dc.SetPen(*wxTRANSPARENT_PEN);
1728 dc.SetBrush(mMeterDisabled ? mDisabledBkgndBrush : mBrush);
1729 if (ht)
1730 {
1731 dc.DrawRectangle(x, y + h - ht - 1, w, ht + 1);
1732 }
1733
1734 // Draw the "recent" peak hold line
1735 // (h - 1) corresponds to the mRuler.SetBounds() in HandleLayout()
1736 dc.SetPen(mPen);
1737 ht = (int)(bar->peakHold * (h - 1) + 0.5);
1738 if (ht > 0)
1739 {
1740 AColor::Line(dc, x, y + h - ht - 1, x + w - 1, y + h - ht - 1);
1741 if (ht > 1)
1742 {
1743 AColor::Line(dc, x, y + h - ht, x + w - 1, y + h - ht);
1744 }
1745 }
1746
1747 // Calculate the rms position
1748 // (h - 1) corresponds to the mRuler.SetBounds() in HandleLayout()
1749 // +1 to include the rms position
1750 ht = (int)(bar->rms * (h - 1) + 0.5);
1751
1752 // Draw the RMS level
1753 dc.SetPen(*wxTRANSPARENT_PEN);
1755 if (ht)
1756 {
1757 dc.DrawRectangle(x, y + h - ht - 1, w, ht + 1);
1758 }
1759
1760 // Draw the "maximum" peak hold line
1761 // (h - 1) corresponds to the mRuler.SetBounds() in HandleLayout()
1762 dc.SetPen(mPeakPeakPen);
1763 ht = (int)(bar->peakPeakHold * (h - 1) + 0.5);
1764 if (ht > 0)
1765 {
1766 AColor::Line(dc, x, y + h - ht - 1, x + w - 1, y + h - ht - 1);
1767 if (ht > 1)
1768 {
1769 AColor::Line(dc, x, y + h - ht, x + w - 1, y + h - ht);
1770 }
1771 }
1772 }
1773 else
1774 {
1775 // Calculate the peak position
1776 // (w - 1) corresponds to the mRuler.SetBounds() in HandleLayout()
1777 wd = (int)(bar->peak * (w - 1) + 0.5);
1778
1779 // Blank out the rest
1780 if (w - wd)
1781 {
1782 // wd includes peak value...not really needed but doesn't hurt
1783 dc.DrawRectangle(x + wd, y, w - wd, h);
1784 }
1785
1786 // Draw the peak level
1787 // +1 to include peak position
1788 dc.SetPen(*wxTRANSPARENT_PEN);
1789 dc.SetBrush(mMeterDisabled ? mDisabledBkgndBrush : mBrush);
1790 if (wd)
1791 {
1792 dc.DrawRectangle(x, y, wd + 1, h);
1793 }
1794
1795 // Draw the "recent" peak hold line
1796 // (w - 1) corresponds to the mRuler.SetBounds() in HandleLayout()
1797 dc.SetPen(mPen);
1798 wd = (int)(bar->peakHold * (w - 1) + 0.5);
1799 if (wd > 0)
1800 {
1801 AColor::Line(dc, x + wd, y, x + wd, y + h - 1);
1802 if (wd > 1)
1803 {
1804 AColor::Line(dc, x + wd - 1, y, x + wd - 1, y + h - 1);
1805 }
1806 }
1807
1808 // Calculate the rms position
1809 // (w - 1) corresponds to the mRuler.SetBounds() in HandleLayout()
1810 wd = (int)(bar->rms * (w - 1) + 0.5);
1811
1812 // Draw the rms level
1813 // +1 to include the rms position
1814 dc.SetPen(*wxTRANSPARENT_PEN);
1816 if (wd)
1817 {
1818 dc.DrawRectangle(x, y, wd + 1, h);
1819 }
1820
1821 // Draw the "maximum" peak hold line using a themed color
1822 // (w - 1) corresponds to the mRuler.SetBounds() in HandleLayout()
1823 dc.SetPen(mPeakPeakPen);
1824 wd = (int)(bar->peakPeakHold * (w - 1) + 0.5);
1825 if (wd > 0)
1826 {
1827 AColor::Line(dc, x + wd, y, x + wd, y + h - 1);
1828 if (wd > 1)
1829 {
1830 AColor::Line(dc, x + wd - 1, y, x + wd - 1, y + h - 1);
1831 }
1832 }
1833 }
1834 }
1835
1836 // If meter had a clipping indicator, draw or erase it
1837 // LLL: At least I assume that's what "mClip" is supposed to be for as
1838 // it is always "true".
1839 if (mClip)
1840 {
1841 if (bar->clipping)
1842 {
1843 dc.SetBrush(mClipBrush);
1844 }
1845 else
1846 {
1848 }
1849 dc.SetPen(*wxTRANSPARENT_PEN);
1850 wxRect r(bar->rClip.GetX() + 1,
1851 bar->rClip.GetY() + 1,
1852 bar->rClip.GetWidth() - 1,
1853 bar->rClip.GetHeight() - 1);
1854 dc.DrawRectangle(r);
1855 }
1856}
static void Line(wxDC &dc, wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2)
Definition: AColor.cpp:187
long mMeterDisabled
Definition: MeterPanel.h:279

References MeterBar::clipping, AColor::Line(), mBitmap, mBkgndBrush, mBrush, mClip, mClipBrush, mDisabledBkgndBrush, mGradient, mMeterDisabled, mPeakPeakPen, mPen, mRMSBrush, MeterBar::peak, MeterBar::peakHold, MeterBar::peakPeakHold, MeterBar::r, MeterBar::rClip, MeterBar::rms, and MeterBar::vert.

Referenced by OnPaint().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GetDBRange()

int MeterPanel::GetDBRange ( ) const
inlineoverridevirtual

Implements MeterPanelBase.

Definition at line 199 of file MeterPanel.h.

199{ return mDB ? mDBRange : -1; }

◆ GetDesiredStyle()

Style MeterPanel::GetDesiredStyle ( ) const
inline

Definition at line 133 of file MeterPanel.h.

133{ return mDesiredStyle; }

◆ GetFont()

wxFont MeterPanel::GetFont ( ) const
private

Definition at line 1167 of file MeterPanel.cpp.

1168{
1169 int fontSize = 10;
1170#if defined __WXMSW__
1171 fontSize = 8;
1172#endif
1173
1174 return wxFont(fontSize, wxFONTFAMILY_SWISS, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL);
1175}

Referenced by HandleLayout(), and OnPaint().

Here is the caller graph for this function:

◆ GetMaxPeak()

float MeterPanel::GetMaxPeak ( ) const
overridevirtual

Implements MeterPanelBase.

Definition at line 1149 of file MeterPanel.cpp.

1150{
1151 float maxPeak = 0.;
1152
1153 for(unsigned int j=0; j<mNumBars; j++)
1154 maxPeak = mBar[j].peak > maxPeak ? mBar[j].peak : maxPeak;
1155
1156 return(maxPeak);
1157}
MeterBar mBar[kMaxMeterBars]
Definition: MeterPanel.h:286

References mBar, and mNumBars.

◆ GetPeakHold()

float MeterPanel::GetPeakHold ( ) const

Definition at line 1159 of file MeterPanel.cpp.

1160{
1161 auto peakHold = .0f;
1162 for (unsigned int i = 0; i < mNumBars; i++)
1163 peakHold = std::max(peakHold, mBar[i].peakPeakHold);
1164 return peakHold;
1165}

References mBar, and mNumBars.

◆ GetStyle()

Style MeterPanel::GetStyle ( ) const
inline

Definition at line 132 of file MeterPanel.h.

132{ return mStyle; }

◆ HandleLayout()

void MeterPanel::HandleLayout ( wxDC &  dc)
private

Definition at line 1294 of file MeterPanel.cpp.

1295{
1296 // Refresh to reflect any language changes
1297 /* i18n-hint: One-letter abbreviation for Left, in VU Meter */
1298 mLeftText = _("L");
1299 /* i18n-hint: One-letter abbreviation for Right, in VU Meter */
1300 mRightText = _("R");
1301
1302 dc.SetFont(GetFont());
1303 int width = mWidth;
1304 int height = mHeight;
1305 int left = 0;
1306 int top = 0;
1307 int barw;
1308 int barh;
1309 int lside;
1310 int rside;
1311
1312 // MixerTrackCluster has no L/R labels or icon
1314 {
1316 {
1318 }
1319
1321 {
1323 }
1325 {
1327 }
1328
1329 if (mLeftSize.GetWidth() == 0) // Not yet initialized to dc.
1330 {
1331 dc.GetTextExtent(mLeftText, &mLeftSize.x, &mLeftSize.y);
1332 dc.GetTextExtent(mRightText, &mRightSize.x, &mRightSize.y);
1333 }
1334 }
1335
1336 int ltxtWidth = mLeftSize.GetWidth();
1337 int ltxtHeight = mLeftSize.GetHeight();
1338 int rtxtWidth = mRightSize.GetWidth();
1339 int rtxtHeight = mRightSize.GetHeight();
1340
1341 switch (mStyle)
1342 {
1343 default:
1344 wxPrintf(wxT("Style not handled yet!\n"));
1345 break;
1346 case MixerTrackCluster:
1347 // width is now the entire width of the meter canvas
1348 width -= mRulerWidth + left;
1349
1350 // height is now the entire height of the meter canvas
1351 height -= top + gap;
1352
1353 // barw is half of the canvas while allowing for a gap between meters
1354 barw = (width - gap) / 2;
1355
1356 // barh is now the height of the canvas
1357 barh = height;
1358
1359 // We always have 2 bars
1360 mNumBars = 2;
1361
1362 // Save dimensions of the left bevel
1363 mBar[0].b = wxRect(left, top, barw, barh);
1364
1365 // Save dimensions of the right bevel
1366 mBar[1].b = mBar[0].b;
1367 mBar[1].b.SetLeft(mBar[0].b.GetRight() + 1 + gap); // +1 for right edge
1368
1369 // Set bar and clipping indicator dimensions
1370 SetBarAndClip(0, true);
1371 SetBarAndClip(1, true);
1372
1373 mRuler.SetBounds(mBar[1].r.GetRight() + 1, // +1 for the bevel
1374 mBar[1].r.GetTop(),
1375 mWidth,
1376 mBar[1].r.GetBottom());
1377 mRuler.OfflimitsPixels(0, 0);
1378 break;
1379 case VerticalStereo:
1380 // Determine required width of each side;
1381 lside = ltxtWidth + gap;
1382 rside = intmax(mRulerWidth, rtxtWidth);
1383
1384 // left is now the right edge of the icon or L label
1385 left = lside;
1386
1387 // Ensure there's a margin between top edge of window and the meters
1388 top = gap;
1389
1390 // Position the L/R labels
1391 mLeftTextPos = wxPoint(left - ltxtWidth - gap, height - gap - ltxtHeight);
1392 mRightTextPos = wxPoint(width - rside - gap, height - gap - rtxtHeight);
1393
1394 // left is now left edge of left bar
1395 left += gap;
1396
1397 // width is now the entire width of the meter canvas
1398 width -= gap + rside + gap + left;
1399
1400 // height is now the entire height of the meter canvas
1401 height -= top + gap;
1402
1403 mSliderPos = wxPoint{ 0, top - gap };
1404 mSliderSize = wxSize{ width, height + 2 * gap };
1405
1406 // barw is half of the canvas while allowing for a gap between meters
1407 barw = (width - gap) / 2;
1408
1409 // barh is now the height of the canvas
1410 barh = height;
1411
1412 // We always have 2 bars
1413 mNumBars = 2;
1414
1415 // Save dimensions of the left bevel
1416 mBar[0].b = wxRect(left, top, barw, barh);
1417
1418 // Save dimensions of the right bevel
1419 mBar[1].b = mBar[0].b;
1420 mBar[1].b.SetLeft(mBar[0].b.GetRight() + 1 + gap); // +1 for right edge
1421
1422 // Set bar and clipping indicator dimensions
1423 SetBarAndClip(0, true);
1424 SetBarAndClip(1, true);
1425
1426 mRuler.SetBounds(mBar[1].r.GetRight() + 1, // +1 for the bevel
1427 mBar[1].r.GetTop(),
1428 mWidth,
1429 mBar[1].r.GetBottom());
1430 mRuler.OfflimitsPixels(mRightTextPos.y - gap, mBar[1].r.GetBottom());
1431 break;
1433 // Ensure there's a margin between top edge of window and the meters
1434 top = gap;
1435
1436 // height is now the entire height of the meter canvas
1437 height -= top + gap + ltxtHeight + gap;
1438
1439 mSliderPos = wxPoint{ 0, top - gap };
1440 mSliderSize = wxSize{ width, height + 2 * gap };
1441
1442 // barw is half of the canvas while allowing for a gap between meters
1443 barw = (width / 2) - gap;
1444
1445 // barh is now the height of the canvas
1446 barh = height;
1447
1448 // We always have 2 bars
1449 mNumBars = 2;
1450
1451 // Save dimensions of the left bevel
1452 mBar[0].b = wxRect(left, top, barw, barh);
1453
1454 // Save dimensions of the right bevel
1455 mBar[1].b = mBar[0].b;
1456 mBar[1].b.SetLeft(mBar[0].b.GetRight() + 1 + gap); // +1 for right edge
1457
1458 // Set bar and clipping indicator dimensions
1459 SetBarAndClip(0, true);
1460 SetBarAndClip(1, true);
1461
1462 // L/R is centered horizontally under each bar
1463 mLeftTextPos = wxPoint(mBar[0].b.GetLeft() + ((mBar[0].b.GetWidth() - ltxtWidth) / 2), top + barh + gap);
1464 mRightTextPos = wxPoint(mBar[1].b.GetLeft() + ((mBar[1].b.GetWidth() - rtxtWidth) / 2), top + barh + gap);
1465
1467 mBar[1].r.GetTop(),
1468 (mWidth - mRulerWidth) / 2,
1469 mBar[1].r.GetBottom());
1470 mRuler.OfflimitsPixels(0, 0);
1471 break;
1472 case HorizontalStereo:
1473 // Button right next to dragger.
1474 left = 0;
1475
1476 // Add a gap between bottom of icon and bottom of window
1477 height -= gap;
1478
1479 left = gap;
1480
1481 // Make sure there's room for icon and gap between the bottom of the meter and icon
1482 height -= rtxtHeight + gap;
1483
1484 // L/R is centered vertically and to the left of a each bar
1485 mLeftTextPos = wxPoint(left, (height / 4) - ltxtHeight / 2);
1486 mRightTextPos = wxPoint(left, (height * 3 / 4) - rtxtHeight / 2);
1487
1488 // Add width of widest of the L/R characters
1489 left += intmax(ltxtWidth, rtxtWidth); //, iconWidth);
1490
1491 mSliderPos = wxPoint{ left - gap, 0 };
1492
1493 // Add gap between L/R and meter bevel
1494 left += gap;
1495
1496 // width is now the entire width of the meter canvas
1497 width -= left;
1498
1499 mSliderSize = wxSize{ width + 2 * gap, height };
1500
1501 // barw is now the width of the canvas minus gap between canvas and right window edge
1502 barw = width - gap;
1503
1504 // barh is half of the canvas while allowing for a gap between meters
1505 barh = (height - gap) / 2;
1506
1507 // We always have 2 bars
1508 mNumBars = 2;
1509
1510 // Save dimensions of the top bevel
1511 mBar[0].b = wxRect(left, top, barw, barh);
1512
1513 // Save dimensions of the bottom bevel
1514 mBar[1].b = mBar[0].b;
1515 mBar[1].b.SetTop(mBar[0].b.GetBottom() + 1 + gap); // +1 for bottom edge
1516
1517 // Set bar and clipping indicator dimensions
1518 SetBarAndClip(0, false);
1519 SetBarAndClip(1, false);
1520
1521 mRuler.SetBounds(mBar[1].r.GetLeft(),
1522 mBar[1].r.GetBottom() + 1, // +1 to fit below bevel
1523 mBar[1].r.GetRight(),
1524 mHeight - mBar[1].r.GetBottom() + 1);
1525 break;
1527 left = gap;
1528
1529 // L/R is centered vertically and to the left of a each bar
1530 mLeftTextPos = wxPoint(left, (height / 4) - (ltxtHeight / 2));
1531 mRightTextPos = wxPoint(left, (height * 3 / 4) - (ltxtHeight / 2));
1532
1533 // Add width of widest of the L/R characters
1534 left += intmax(ltxtWidth, rtxtWidth);
1535
1536 mSliderPos = wxPoint{ left - gap, 0 };
1537
1538 // Add gap between L/R and meter bevel
1539 left += gap;
1540
1541 // width is now the entire width of the meter canvas
1542 width -= left;
1543
1544 mSliderSize = wxSize{ width + 2 * gap, height };
1545
1546 // barw is now the width of the canvas minus gap between canvas and window edge
1547 barw = width - gap;
1548
1549 // barh is half of the canvas while allowing for a gap between meters
1550 barh = (height - gap) / 2;
1551
1552 // We always have 2 bars
1553 mNumBars = 2;
1554
1555 // Save dimensions of the top bevel
1556 mBar[0].b = wxRect(left, top, barw, barh);
1557
1558 // Save dimensions of the bottom bevel
1559 // Since the bars butt up against the window's top and bottom edges, we need
1560 // to include an extra pixel in the bottom bar when the window height and
1561 // meter height do not exactly match.
1562 mBar[1].b = mBar[0].b;
1563 mBar[1].b.SetTop(mBar[0].b.GetBottom() + 1 + gap); // +1 for bottom bevel
1564 mBar[1].b.SetHeight(mHeight - mBar[1].b.GetTop() - 1); // +1 for bottom bevel
1565
1566 // Add clipping indicators - do after setting bar/bevel dimensions above
1567 SetBarAndClip(0, false);
1568 SetBarAndClip(1, false);
1569
1570 mRuler.SetBounds(mBar[1].r.GetLeft(),
1571 mBar[1].b.GetTop() - (mRulerHeight / 2),
1572 mBar[1].r.GetRight(),
1573 mBar[1].b.GetTop() - (mRulerHeight / 2));
1574 mRuler.OfflimitsPixels(0, 0);
1575 break;
1576 }
1577
1578 mLayoutValid = true;
1579}
wxT("CloseDown"))
#define _(s)
Definition: Internat.h:73
static int intmax(int a, int b)
Definition: MeterPanel.cpp:938
static const int gap
Definition: MeterPanel.cpp:257
wxString mRightText
Definition: MeterPanel.h:305
wxSize mRightSize
Definition: MeterPanel.h:294
wxPoint mSliderPos
Definition: MeterPanel.h:308
int mRulerHeight
Definition: MeterPanel.h:262
int mRulerWidth
Definition: MeterPanel.h:261
wxString mLeftText
Definition: MeterPanel.h:304
void SetBarAndClip(int iBar, bool vert)
wxPoint mLeftTextPos
Definition: MeterPanel.h:291
wxSize mLeftSize
Definition: MeterPanel.h:293
wxPoint mRightTextPos
Definition: MeterPanel.h:292
wxSize mSliderSize
Definition: MeterPanel.h:309
void SetActiveStyle(Style style)
void OfflimitsPixels(int start, int end)
Definition: Ruler.cpp:273
void SetBounds(int left, int top, int right, int bottom)
Definition: Ruler.cpp:303
wxRect b
Definition: MeterPanel.h:41
wxRect r
Definition: MeterPanel.h:42

References _, AutomaticStereo, MeterBar::b, gap, GetFont(), HorizontalStereo, HorizontalStereoCompact, intmax(), mBar, mDesiredStyle, mHeight, MixerTrackCluster, mLayoutValid, mLeftSize, mLeftText, mLeftTextPos, mNumBars, mRightSize, mRightText, mRightTextPos, mRuler, mRulerHeight, mRulerWidth, mSliderPos, mSliderSize, mStyle, mWidth, Ruler::OfflimitsPixels(), MeterBar::r, SetActiveStyle(), SetBarAndClip(), Ruler::SetBounds(), VerticalStereo, VerticalStereoCompact, and wxT().

Referenced by OnPaint().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ Increase()

void MeterPanel::Increase ( float  steps)

Definition at line 881 of file MeterPanel.cpp.

882{
883 if (mSlider)
884 {
885 wxCommandEvent e;
886
887 mSlider->Increase(steps);
888 SetMixer(e);
889 }
890}

References mSlider, and SetMixer().

Referenced by MeterToolBar::AdjustInputGain(), and MeterToolBar::AdjustOutputGain().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ IsActive()

bool MeterPanel::IsActive ( ) const

Definition at line 1192 of file MeterPanel.cpp.

1193{
1194 return mActive;
1195}

References mActive.

◆ IsClipping()

bool MeterPanel::IsClipping ( ) const
overridevirtual

Implements MeterPanelBase.

Definition at line 1202 of file MeterPanel.cpp.

1203{
1204 for (int c = 0; c < mNumBars; c++)
1205 if (mBar[c].clipping)
1206 return true;
1207 return false;
1208}

References mBar, and mNumBars.

◆ IsMeterDisabled()

bool MeterPanel::IsMeterDisabled ( ) const
overridevirtual

Find out if the level meter is disabled or not.

This method is thread-safe! Feel free to call from a different thread (like from an audio I/O callback).

Implements MeterPanelBase.

Definition at line 1858 of file MeterPanel.cpp.

1859{
1860 return mMeterDisabled != 0;
1861}

References mMeterDisabled.

◆ IsMonitoring()

bool MeterPanel::IsMonitoring ( ) const

Definition at line 1197 of file MeterPanel.cpp.

1198{
1199 return mMonitoring;
1200}

References mMonitoring.

◆ Key()

wxString MeterPanel::Key ( const wxString &  key) const
private

Definition at line 2097 of file MeterPanel.cpp.

2098{
2100 {
2101 return wxT("/Meter/Mixerboard/") + key;
2102 }
2103
2104 if (mIsInput)
2105 {
2106 return wxT("/Meter/Input/") + key;
2107 }
2108
2109 return wxT("/Meter/Output/") + key;
2110}
static const AudacityProject::AttachedObjects::RegisteredFactory key

References key, mIsInput, mStyle, and wxT().

Referenced by OnPreferences(), and UpdatePrefs().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ OnAudioCapture()

void MeterPanel::OnAudioCapture ( AudioIOEvent  event)
private

Definition at line 1912 of file MeterPanel.cpp.

1913{
1914 if (event.type == AudioIOEvent::CAPTURE && event.pProject != mProject)
1915 {
1916 mEnabled = !event.on;
1917
1918 if (mSlider)
1919 mSlider->SetEnabled(mEnabled);
1920 }
1921}
bool mEnabled
Definition: MeterPanel.h:311
enum AudioIOEvent::Type type
AudacityProject * pProject
Definition: AudioIO.h:71

References AudioIOEvent::CAPTURE, mEnabled, mProject, mSlider, AudioIOEvent::pProject, and AudioIOEvent::type.

◆ OnAudioIOStatus()

void MeterPanel::OnAudioIOStatus ( AudioIOEvent  evt)
private

Definition at line 1891 of file MeterPanel.cpp.

1892{
1893 if (!mIsInput != (evt.type == AudioIOEvent::PLAYBACK))
1894 return;
1895
1896 AudacityProject *p = evt.pProject;
1897 mActive = evt.on && (p == mProject);
1898 if( mActive ){
1899 mTimer.Start(1000 / mMeterRefreshRate);
1900 if (evt.type == AudioIOEvent::MONITOR)
1902 } else {
1903 mTimer.Stop();
1904 mMonitoring = false;
1905 }
1906
1907 // Only refresh is we're the active meter
1908 if (IsShownOnScreen())
1909 Refresh(false);
1910}
The top-level handle to an Audacity project. It serves as a source of events that other objects can b...
Definition: Project.h:90
long mMeterRefreshRate
Definition: MeterPanel.h:278
bool on
Definition: AudioIO.h:77

References mActive, mIsInput, mMeterRefreshRate, mMonitoring, AudioIOEvent::MONITOR, mProject, mTimer, AudioIOEvent::on, AudioIOEvent::PLAYBACK, AudioIOEvent::pProject, and AudioIOEvent::type.

◆ OnCharHook()

void MeterPanel::OnCharHook ( wxKeyEvent &  evt)
private

Definition at line 756 of file MeterPanel.cpp.

757{
758 switch(evt.GetKeyCode())
759 {
760 // These are handled in the OnCharHook handler because, on Windows at least, the
761 // key up event will be passed on to the menu if we show it here. This causes
762 // the default sound to be heard if assigned.
763 case WXK_RETURN:
764 case WXK_NUMPAD_ENTER:
765 case WXK_WINDOWS_MENU:
766 case WXK_MENU:
768 ShowMenu(GetClientRect().GetBottomLeft());
769 else
770 evt.Skip();
771 break;
772 default:
773 evt.Skip();
774 break;
775 }
776}
void ShowMenu(const wxPoint &pos)

References mStyle, and ShowMenu().

Here is the call graph for this function:

◆ OnContext()

void MeterPanel::OnContext ( wxContextMenuEvent &  evt)
private

Definition at line 778 of file MeterPanel.cpp.

779{
780 if (mStyle != MixerTrackCluster) // MixerTrackCluster style has no menu.
781 {
782 ShowMenu(GetClientRect().GetBottomLeft());
783 }
784 else
785 {
786 evt.Skip();
787 }
788}

References mStyle, and ShowMenu().

Here is the call graph for this function:

◆ OnErase()

void MeterPanel::OnErase ( wxEraseEvent &  evt)
private

Definition at line 500 of file MeterPanel.cpp.

501{
502 // Ignore it to prevent flashing
503}

◆ OnKeyDown()

void MeterPanel::OnKeyDown ( wxKeyEvent &  evt)
private

Definition at line 790 of file MeterPanel.cpp.

791{
792 switch (evt.GetKeyCode())
793 {
794 case WXK_TAB:
795 if (evt.ShiftDown())
796 Navigate(wxNavigationKeyEvent::IsBackward);
797 else
798 Navigate(wxNavigationKeyEvent::IsForward);
799 break;
800 default:
801 mSlider->OnKeyDown(evt);
802 break;
803 }
804}

References mSlider.

◆ OnKillFocus()

void MeterPanel::OnKillFocus ( wxFocusEvent &  evt)
private

Definition at line 812 of file MeterPanel.cpp.

813{
814 if(mSlider)
815 mSlider->OnKillFocus();
816 mTipTimer.Stop();
817
818 mIsFocused = false;
819 Refresh(false);
820}

References mIsFocused, mSlider, and mTipTimer.

◆ OnMeterUpdate()

void MeterPanel::OnMeterUpdate ( wxTimerEvent &  evt)
private

Definition at line 1045 of file MeterPanel.cpp.

1046{
1047 MeterUpdateMsg msg;
1048 int numChanges = 0;
1049#ifdef EXPERIMENTAL_AUTOMATED_INPUT_LEVEL_ADJUSTMENT
1050 double maxPeak = 0.0;
1051 bool discarded = false;
1052#endif
1053
1054 // We shouldn't receive any events if the meter is disabled, but clear it to be safe
1055 if (mMeterDisabled) {
1056 mQueue.Clear();
1057 return;
1058 }
1059
1060
1061 // There may have been several update messages since the last
1062 // time we got to this function. Catch up to real-time by
1063 // popping them off until there are none left. It is necessary
1064 // to process all of them, otherwise we won't handle peaks and
1065 // peak-hold bars correctly.
1066 while(mQueue.Get(msg)) {
1067 numChanges++;
1068 double deltaT = msg.numFrames / mRate;
1069
1070 mT += deltaT;
1071 for(unsigned int j=0; j<mNumBars; j++) {
1072 mBar[j].isclipping = false;
1073
1074 //
1075 if (mDB) {
1076 msg.peak[j] = ToDB(msg.peak[j], mDBRange);
1077 msg.rms[j] = ToDB(msg.rms[j], mDBRange);
1078 }
1079
1080 if (mDecay) {
1081 if (mDB) {
1082 float decayAmount = mDecayRate * deltaT / mDBRange;
1083 mBar[j].peak = floatMax(msg.peak[j],
1084 mBar[j].peak - decayAmount);
1085 }
1086 else {
1087 double decayAmount = mDecayRate * deltaT;
1088 double decayFactor = DB_TO_LINEAR(-decayAmount);
1089 mBar[j].peak = floatMax(msg.peak[j],
1090 mBar[j].peak * decayFactor);
1091 }
1092 }
1093 else
1094 mBar[j].peak = msg.peak[j];
1095
1096 // This smooths out the RMS signal
1097 float smooth = pow(0.9, (double)msg.numFrames/1024.0);
1098 mBar[j].rms = mBar[j].rms * smooth + msg.rms[j] * (1.0 - smooth);
1099
1100 if (mT - mBar[j].peakHoldTime > mPeakHoldDuration ||
1101 mBar[j].peak > mBar[j].peakHold) {
1102 mBar[j].peakHold = mBar[j].peak;
1103 mBar[j].peakHoldTime = mT;
1104 }
1105
1106 if (mBar[j].peak > mBar[j].peakPeakHold )
1107 mBar[j].peakPeakHold = mBar[j].peak;
1108
1109 if (msg.clipping[j] ||
1110 mBar[j].tailPeakCount+msg.headPeakCount[j] >=
1112 mBar[j].clipping = true;
1113 mBar[j].isclipping = true;
1114 }
1115
1116 mBar[j].tailPeakCount = msg.tailPeakCount[j];
1117#ifdef EXPERIMENTAL_AUTOMATED_INPUT_LEVEL_ADJUSTMENT
1118 if (mT > gAudioIO->AILAGetLastDecisionTime()) {
1119 discarded = false;
1120 maxPeak = msg.peak[j] > maxPeak ? msg.peak[j] : maxPeak;
1121 wxPrintf("%[email protected]%f ", msg.peak[j], mT);
1122 }
1123 else {
1124 discarded = true;
1125 wxPrintf("%[email protected]%f discarded\n", msg.peak[j], mT);
1126 }
1127#endif
1128 }
1129 } // while
1130
1131 if (numChanges > 0) {
1132 #ifdef EXPERIMENTAL_AUTOMATED_INPUT_LEVEL_ADJUSTMENT
1133 if (gAudioIO->AILAIsActive() && mIsInput && !discarded) {
1134 gAudioIO->AILAProcess(maxPeak);
1135 putchar('\n');
1136 }
1137 #endif
1139 }
1140}
#define DB_TO_LINEAR(x)
Definition: MemoryX.h:561
static float ToDB(float v, float range)
Definition: MeterPanel.cpp:953
static float floatMax(float a, float b)
Definition: MeterPanel.cpp:926
void RepaintBarsNow()
Message used to update the MeterPanel.
Definition: MeterPanel.h:55
bool clipping[kMaxMeterBars]
Definition: MeterPanel.h:60
float peak[kMaxMeterBars]
Definition: MeterPanel.h:58
int tailPeakCount[kMaxMeterBars]
Definition: MeterPanel.h:62
int headPeakCount[kMaxMeterBars]
Definition: MeterPanel.h:61
float rms[kMaxMeterBars]
Definition: MeterPanel.h:59
bool Get(MeterUpdateMsg &msg)
Definition: MeterPanel.cpp:234
bool isclipping
Definition: MeterPanel.h:49
float peakPeakHold
Definition: MeterPanel.h:51
float peak
Definition: MeterPanel.h:43
int tailPeakCount
Definition: MeterPanel.h:50
float rms
Definition: MeterPanel.h:44
bool clipping
Definition: MeterPanel.h:48
double peakHoldTime
Definition: MeterPanel.h:46
float peakHold
Definition: MeterPanel.h:45

References MeterUpdateQueue::Clear(), MeterBar::clipping, MeterUpdateMsg::clipping, DB_TO_LINEAR, floatMax(), MeterUpdateQueue::Get(), MeterUpdateMsg::headPeakCount, MeterBar::isclipping, mBar, mDB, mDBRange, mDecay, mDecayRate, mIsInput, mMeterDisabled, mNumBars, mNumPeakSamplesToClip, mPeakHoldDuration, mQueue, mRate, mT, MeterUpdateMsg::numFrames, MeterBar::peak, MeterUpdateMsg::peak, MeterBar::peakHold, MeterBar::peakHoldTime, MeterBar::peakPeakHold, RepaintBarsNow(), MeterBar::rms, MeterUpdateMsg::rms, MeterBar::tailPeakCount, MeterUpdateMsg::tailPeakCount, and ToDB().

Here is the call graph for this function:

◆ OnMonitor()

void MeterPanel::OnMonitor ( wxCommandEvent &  evt)
private

Definition at line 1977 of file MeterPanel.cpp.

1978{
1980}
void StartMonitoring()

References StartMonitoring().

Here is the call graph for this function:

◆ OnMouse()

void MeterPanel::OnMouse ( wxMouseEvent &  evt)
private

Definition at line 730 of file MeterPanel.cpp.

731{
732 if ((evt.GetEventType() == wxEVT_MOTION || evt.Entering() || evt.Leaving())) {
733 mLayoutValid = false;
734 Refresh();
735 }
736
737 if (mStyle == MixerTrackCluster) // MixerTrackCluster style has no menu.
738 return;
739
740 if (evt.Entering()) {
741 mTipTimer.StartOnce(500);
742 }
743 else if(evt.Leaving())
744 mTipTimer.Stop();
745
746 if (evt.RightDown())
747 ShowMenu(evt.GetPosition());
748 else
749 {
750
751 if (mSlider)
752 mSlider->OnMouseEvent(evt);
753 }
754}

References mLayoutValid, mSlider, mStyle, mTipTimer, and ShowMenu().

Here is the call graph for this function:

◆ OnPaint()

void MeterPanel::OnPaint ( wxPaintEvent &  evt)
private

Definition at line 505 of file MeterPanel.cpp.

506{
507#if defined(__WXMAC__)
508 auto paintDC = std::make_unique<wxPaintDC>(this);
509#else
510 std::unique_ptr<wxDC> paintDC{ wxAutoBufferedPaintDCFactory(this) };
511#endif
512 wxDC & destDC = *paintDC;
513 wxColour clrText = theTheme.Colour( clrTrackPanelText );
514 wxColour clrBoxFill = theTheme.Colour( clrMedium );
515
516 if (mLayoutValid == false || (mStyle == MixerTrackCluster ))
517 {
518 // Create a NEW one using current size and select into the DC
519 mBitmap = std::make_unique<wxBitmap>();
520 mBitmap->Create(mWidth, mHeight, destDC);
521 wxMemoryDC dc;
522 dc.SelectObject(*mBitmap);
523
524 // Go calculate all of the layout metrics
525 HandleLayout(dc);
526
527 // Start with a clean background
528 // LLL: Should research USE_AQUA_THEME usefulness...
529//#ifndef USE_AQUA_THEME
530#ifdef EXPERIMENTAL_THEMING
531 //if( !mMeterDisabled )
532 //{
533 // mBkgndBrush.SetColour( GetParent()->GetBackgroundColour() );
534 //}
535#endif
536 mBkgndBrush.SetColour( GetBackgroundColour() );
537 dc.SetPen(*wxTRANSPARENT_PEN);
538 dc.SetBrush(mBkgndBrush);
539 dc.DrawRectangle(0, 0, mWidth, mHeight);
540//#endif
541
542 // MixerTrackCluster style has no icon or L/R labels
544 {
545 dc.SetFont(GetFont());
546 dc.SetTextForeground( clrText );
547 dc.SetTextBackground( clrBoxFill );
548 dc.DrawText(mLeftText, mLeftTextPos.x, mLeftTextPos.y);
549 dc.DrawText(mRightText, mRightTextPos.x, mRightTextPos.y);
550 }
551
552 // Setup the colors for the 3 sections of the meter bars
553 wxColor green(117, 215, 112);
554 wxColor yellow(255, 255, 0);
555 wxColor red(255, 0, 0);
556
557 // Bug #2473 - (Sort of) Hack to make text on meters more
558 // visible with darker backgrounds. It would be better to have
559 // different colors entirely and as part of the theme.
560 if (GetBackgroundColour().GetLuminance() < 0.25)
561 {
562 green = wxColor(117-100, 215-100, 112-100);
563 yellow = wxColor(255-100, 255-100, 0);
564 red = wxColor(255-100, 0, 0);
565 }
566 else if (GetBackgroundColour().GetLuminance() < 0.50)
567 {
568 green = wxColor(117-50, 215-50, 112-50);
569 yellow = wxColor(255-50, 255-50, 0);
570 red = wxColor(255-50, 0, 0);
571 }
572
573 // Draw the meter bars at maximum levels
574 for (unsigned int i = 0; i < mNumBars; i++)
575 {
576 // Give it a recessed look
577 AColor::Bevel(dc, false, mBar[i].b);
578
579 // Draw the clip indicator bevel
580 if (mClip)
581 {
582 AColor::Bevel(dc, false, mBar[i].rClip);
583 }
584
585 // Cache bar rect
586 wxRect r = mBar[i].r;
587
588 if (mGradient)
589 {
590 // Calculate the size of the two gradiant segments of the meter
591 double gradw;
592 double gradh;
593 if (mDB)
594 {
595 gradw = (double) r.GetWidth() / mDBRange * 6.0;
596 gradh = (double) r.GetHeight() / mDBRange * 6.0;
597 }
598 else
599 {
600 gradw = (double) r.GetWidth() / 100 * 25;
601 gradh = (double) r.GetHeight() / 100 * 25;
602 }
603
604 if (mBar[i].vert)
605 {
606 // Draw the "critical" segment (starts at top of meter and works down)
607 r.SetHeight(gradh);
608 dc.GradientFillLinear(r, red, yellow, wxSOUTH);
609
610 // Draw the "warning" segment
611 r.SetTop(r.GetBottom());
612 dc.GradientFillLinear(r, yellow, green, wxSOUTH);
613
614 // Draw the "safe" segment
615 r.SetTop(r.GetBottom());
616 r.SetBottom(mBar[i].r.GetBottom());
617 dc.SetPen(*wxTRANSPARENT_PEN);
618 dc.SetBrush(green);
619 dc.DrawRectangle(r);
620 }
621 else
622 {
623 // Draw the "safe" segment
624 r.SetWidth(r.GetWidth() - (int) (gradw + gradw + 0.5));
625 dc.SetPen(*wxTRANSPARENT_PEN);
626 dc.SetBrush(green);
627 dc.DrawRectangle(r);
628
629 // Draw the "warning" segment
630 r.SetLeft(r.GetRight() + 1);
631 r.SetWidth(floor(gradw));
632 dc.GradientFillLinear(r, green, yellow);
633
634 // Draw the "critical" segment
635 r.SetLeft(r.GetRight() + 1);
636 r.SetRight(mBar[i].r.GetRight());
637 dc.GradientFillLinear(r, yellow, red);
638 }
639#ifdef EXPERIMENTAL_METER_LED_STYLE
640 if (!mBar[i].vert)
641 {
642 wxRect r = mBar[i].r;
643 wxPen BackgroundPen;
644 BackgroundPen.SetColour( wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE) );
645 dc.SetPen( BackgroundPen );
646 int i;
647 for(i=0;i<r.width;i++)
648 {
649 // 2 pixel spacing between the LEDs
650 if( (i%7)<2 ){
651 AColor::Line( dc, i+r.x, r.y, i+r.x, r.y+r.height );
652 } else {
653 // The LEDs have triangular ends.
654 // This code shapes the ends.
655 int j = abs( (i%7)-4);
656 AColor::Line( dc, i+r.x, r.y, i+r.x, r.y+j +1);
657 AColor::Line( dc, i+r.x, r.y+r.height-j, i+r.x, r.y+r.height );
658 }
659 }
660 }
661#endif
662 }
663 }
664 mRuler.SetTickColour( clrText );
665 dc.SetTextForeground( clrText );
666 // Draw the ruler
667#ifndef EXPERIMENTAL_DA
668 mRuler.Draw(dc);
669#endif
670
671 // Bitmap created...unselect
672 dc.SelectObject(wxNullBitmap);
673 }
674
675 // Copy predrawn bitmap to the dest DC
676 destDC.DrawBitmap(*mBitmap, 0, 0);
677
678 // Go draw the meter bars, Left & Right channels using current levels
679 for (unsigned int i = 0; i < mNumBars; i++)
680 {
681 DrawMeterBar(destDC, &mBar[i]);
682 }
683
684 destDC.SetTextForeground( clrText );
685
686#ifndef EXPERIMENTAL_DA
687 // We can have numbers over the bars, in which case we have to draw them each time.
689 {
690 mRuler.SetTickColour( clrText );
691 // If the text colour is too similar to the meter colour, then we need a background
692 // for the text. We require a total of at least one full-scale RGB difference.
693 int d = theTheme.ColourDistance( clrText, theTheme.Colour( clrMeterOutputRMSBrush ) );
694 if( d < 256 )
695 {
696 destDC.SetBackgroundMode( wxSOLID );
697 destDC.SetTextBackground( clrBoxFill );
698 }
699 mRuler.Draw(destDC);
700 }
701#endif
702
704 {
705 bool highlighted =
706 wxRect{ mSliderPos, mSliderSize }.Contains(
707 ScreenToClient(
708 ::wxGetMousePosition()));
709
710 mSlider->Move(mSliderPos);
711 mSlider->AdjustSize(mSliderSize);
712 mSlider->OnPaint(destDC, highlighted);
713 }
714
715 if (mIsFocused)
716 {
717 auto r = GetClientRect();
718 AColor::DrawFocus(destDC, r);
719 }
720}
static void Bevel(wxDC &dc, bool up, const wxRect &r)
Definition: AColor.cpp:266
static void DrawFocus(wxDC &dc, wxRect &r)
Definition: AColor.cpp:235
void HandleLayout(wxDC &dc)
void DrawMeterBar(wxDC &dc, MeterBar *meterBar)
void SetTickColour(const wxColour &colour)
Definition: Ruler.h:129
void Draw(wxDC &dc) const
Definition: Ruler.cpp:438
int ColourDistance(wxColour &From, wxColour &To)
Definition: Theme.cpp:307

References AColor::Bevel(), ThemeBase::Colour(), ThemeBase::ColourDistance(), Ruler::Draw(), AColor::DrawFocus(), DrawMeterBar(), GetFont(), HandleLayout(), HorizontalStereoCompact, AColor::Line(), mBar, mBitmap, mBkgndBrush, mClip, mDB, mDBRange, mGradient, mHeight, mIsFocused, mLayoutValid, mLeftText, mLeftTextPos, mNumBars, mRightText, mRightTextPos, mRuler, mSlider, mSliderPos, mSliderSize, mStyle, mWidth, MeterBar::r, Ruler::SetTickColour(), theTheme, and VerticalStereoCompact.

Here is the call graph for this function:

◆ OnPreferences()

void MeterPanel::OnPreferences ( wxCommandEvent &  evt)
private

Definition at line 1982 of file MeterPanel.cpp.

1983{
1984 wxTextCtrl *rate;
1985 wxRadioButton *gradient;
1986 wxRadioButton *rms;
1987 wxRadioButton *db;
1988 wxRadioButton *linear;
1989 wxRadioButton *automatic;
1990 wxRadioButton *horizontal;
1991 wxRadioButton *vertical;
1992 int meterRefreshRate = mMeterRefreshRate;
1993
1994 auto title = mIsInput ? XO("Recording Meter Options") : XO("Playback Meter Options");
1995
1996 // Dialog is a child of the project, rather than of the toolbar.
1997 // This determines where it pops up.
1998
1999 wxDialogWrapper dlg( FindProjectFrame( mProject ), wxID_ANY, title);
2000 dlg.SetName();
2001 ShuttleGui S(&dlg, eIsCreating);
2002 S.StartVerticalLay();
2003 {
2004 S.StartStatic(XO("Refresh Rate"), 0);
2005 {
2006 S.AddFixedText(XO(
2007"Higher refresh rates make the meter show more frequent\nchanges. A rate of 30 per second or less should prevent\nthe meter affecting audio quality on slower machines."));
2008 S.StartHorizontalLay();
2009 {
2010 rate = S.Name(XO("Meter refresh rate per second [1-100]"))
2011 .Validator<IntegerValidator<long>>(
2012 &mMeterRefreshRate, NumValidatorStyle::DEFAULT,
2014 .AddTextBox(XXO("Meter refresh rate per second [1-100]: "),
2015 wxString::Format(wxT("%d"), meterRefreshRate),
2016 10);
2017 }
2018 S.EndHorizontalLay();
2019 }
2020 S.EndStatic();
2021
2022 S.StartHorizontalLay();
2023 {
2024 S.StartStatic(XO("Meter Style"), 0);
2025 {
2026 S.StartVerticalLay();
2027 {
2028 gradient = S.AddRadioButton(XXO("Gradient"), true, mGradient);
2029 rms = S.AddRadioButtonToGroup(XXO("RMS"), false, mGradient);
2030 }
2031 S.EndVerticalLay();
2032 }
2033 S.EndStatic();
2034
2035 S.StartStatic(XO("Meter Type"), 0);
2036 {
2037 S.StartVerticalLay();
2038 {
2039 db = S.AddRadioButton(XXO("dB"), true, mDB);
2040 linear = S.AddRadioButtonToGroup(XXO("Linear"), false, mDB);
2041 }
2042 S.EndVerticalLay();
2043 }
2044 S.EndStatic();
2045
2046 S.StartStatic(XO("Orientation"), 1);
2047 {
2048 S.StartVerticalLay();
2049 {
2050 automatic = S.AddRadioButton(
2051 XXO("Automatic"), AutomaticStereo, mDesiredStyle);
2052 horizontal = S.AddRadioButtonToGroup(
2053 XXO("Horizontal"), HorizontalStereo, mDesiredStyle);
2054 vertical = S.AddRadioButtonToGroup(
2055 XXO("Vertical"), VerticalStereo, mDesiredStyle);
2056 }
2057 S.EndVerticalLay();
2058 }
2059 S.EndStatic();
2060 }
2061 S.EndHorizontalLay();
2062 S.AddStandardButtons();
2063 }
2064 S.EndVerticalLay();
2065 dlg.Layout();
2066 dlg.Fit();
2067
2068 dlg.CenterOnParent();
2069
2070 if (dlg.ShowModal() == wxID_OK)
2071 {
2072 wxArrayStringEx style{
2073 wxT("AutomaticStereo") ,
2074 wxT("HorizontalStereo") ,
2075 wxT("VerticalStereo") ,
2076 };
2077
2078 int s = 0;
2079 s = automatic->GetValue() ? 0 : s;
2080 s = horizontal->GetValue() ? 1 : s;
2081 s = vertical->GetValue() ? 2 : s;
2082
2083 gPrefs->Write(Key(wxT("Style")), style[s]);
2084 gPrefs->Write(Key(wxT("Bars")), gradient->GetValue() ? wxT("Gradient") : wxT("RMS"));
2085 gPrefs->Write(Key(wxT("Type")), db->GetValue() ? wxT("dB") : wxT("Linear"));
2086 gPrefs->Write(Key(wxT("RefreshRate")), rate->GetValue());
2087
2088 gPrefs->Flush();
2089
2090 // Currently, there are 2 playback meters and 2 record meters and any number of
2091 // mixerboard meters, so we have to send out an preferences updated message to
2092 // ensure they all update themselves.
2094 }
2095}
XXO("&Cut/Copy/Paste Toolbar")
static const long MIN_REFRESH_RATE
Definition: MeterPanel.cpp:154
static const long MAX_REFRESH_RATE
Definition: MeterPanel.cpp:155
static int MeterPrefsID()
Definition: MeterPanel.cpp:456
static const auto title
FileConfig * gPrefs
Definition: Prefs.cpp:70
wxFrame * FindProjectFrame(AudacityProject *project)
Get a pointer to the window associated with a project, or null if the given pointer is null,...
@ eIsCreating
Definition: ShuttleGui.h:37
#define S(N)
Definition: ToChars.cpp:64
virtual bool Flush(bool bCurrentOnly=false) wxOVERRIDE
Definition: FileConfig.cpp:143
wxString Key(const wxString &key) const
static void Broadcast(int id=0)
Call this static function to notify all PrefsListener objects.
Definition: Prefs.cpp:97
Derived from ShuttleGuiBase, an Audacity specific class for shuttling data to and from GUI.
Definition: ShuttleGui.h:625
Extend wxArrayString with move operations and construction and insertion fromstd::initializer_list.

References AutomaticStereo, PrefsListener::Broadcast(), eIsCreating, FindProjectFrame(), FileConfig::Flush(), gPrefs, HorizontalStereo, Key(), MAX_REFRESH_RATE, mDB, mDesiredStyle, MeterPrefsID(), mGradient, MIN_REFRESH_RATE, mIsInput, mMeterRefreshRate, mProject, S, wxDialogWrapper::SetName(), title, VerticalStereo, wxT(), XO(), and XXO().

Here is the call graph for this function:

◆ OnSetFocus()

void MeterPanel::OnSetFocus ( wxFocusEvent &  evt)
private

Definition at line 806 of file MeterPanel.cpp.

807{
808 mIsFocused = true;
809 Refresh(false);
810}

References mIsFocused.

◆ OnSize()

void MeterPanel::OnSize ( wxSizeEvent &  evt)
private

Definition at line 722 of file MeterPanel.cpp.

723{
724 GetClientSize(&mWidth, &mHeight);
725
726 mLayoutValid = false;
727 Refresh();
728}

References mHeight, mLayoutValid, and mWidth.

◆ OnTipTimeout()

void MeterPanel::OnTipTimeout ( wxTimerEvent &  evt)
private

Definition at line 1142 of file MeterPanel.cpp.

1143{
1144 if(mSlider)
1145 mSlider->ShowTip(true);
1146}

References mSlider.

◆ RepaintBarsNow()

void MeterPanel::RepaintBarsNow ( )
private

Definition at line 1581 of file MeterPanel.cpp.

1582{
1583 if (mLayoutValid)
1584 {
1585 // Invalidate the bars so they get redrawn
1586 for (unsigned int i = 0; i < mNumBars; i++)
1587 {
1588 Refresh(false);
1589 }
1590
1591 // Immediate redraw (using wxPaintDC)
1592 Update();
1593
1594 return;
1595 }
1596}

References mLayoutValid, and mNumBars.

Referenced by OnMeterUpdate().

Here is the caller graph for this function:

◆ Reset()

void MeterPanel::Reset ( double  sampleRate,
bool  resetClipping 
)
overridevirtual

This method is thread-safe! Feel free to call from a different thread (like from an audio I/O callback).

Implements MeterPanelBase.

Definition at line 903 of file MeterPanel.cpp.

904{
905 mT = 0;
906 mRate = sampleRate;
907 for (int j = 0; j < kMaxMeterBars; j++)
908 {
909 ResetBar(&mBar[j], resetClipping);
910 }
911
912 // wxTimers seem to be a little unreliable - sometimes they stop for
913 // no good reason, so this "primes" it every now and then...
914 mTimer.Stop();
915
916 // While it's stopped, empty the queue
917 mQueue.Clear();
918
919 mLayoutValid = false;
920
921 mTimer.Start(1000 / mMeterRefreshRate);
922
923 Refresh(false);
924}
const int kMaxMeterBars
Definition: MeterPanel.h:37
void ResetBar(MeterBar *bar, bool resetClipping)

References MeterUpdateQueue::Clear(), kMaxMeterBars, mBar, mLayoutValid, mMeterRefreshRate, mQueue, mRate, mT, mTimer, and ResetBar().

Referenced by UpdatePrefs().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ ResetBar()

void MeterPanel::ResetBar ( MeterBar bar,
bool  resetClipping 
)
private

Definition at line 1177 of file MeterPanel.cpp.

1178{
1179 b->peak = 0.0;
1180 b->rms = 0.0;
1181 b->peakHold = 0.0;
1182 b->peakHoldTime = 0.0;
1183 if (resetClipping)
1184 {
1185 b->clipping = false;
1186 b->peakPeakHold = 0.0;
1187 }
1188 b->isclipping = false;
1189 b->tailPeakCount = 0;
1190}

References MeterBar::clipping, MeterBar::isclipping, MeterBar::peak, MeterBar::peakHold, MeterBar::peakHoldTime, MeterBar::peakPeakHold, MeterBar::rms, and MeterBar::tailPeakCount.

Referenced by Reset().

Here is the caller graph for this function:

◆ RestoreState()

void MeterPanel::RestoreState ( const State state)

Definition at line 1931 of file MeterPanel.cpp.

1932{
1933 if (!state.mSaved)
1934 return;
1935
1936 mMonitoring = state.mMonitoring;
1937 mActive = state.mActive;
1938 //wxLogDebug("Restore state for %p, is %i", this, mActive );
1939
1940 if (mActive)
1941 mTimer.Start(1000 / mMeterRefreshRate);
1942}

References MeterPanel::State::mActive, mActive, mMeterRefreshRate, MeterPanel::State::mMonitoring, mMonitoring, MeterPanel::State::mSaved, and mTimer.

Referenced by MeterToolBar::ReCreateButtons().

Here is the caller graph for this function:

◆ SaveState()

auto MeterPanel::SaveState ( )

Definition at line 1926 of file MeterPanel.cpp.

1927{
1928 return { true, mMonitoring, mActive };
1929}

Referenced by MeterToolBar::ReCreateButtons().

Here is the caller graph for this function:

◆ SetActiveStyle()

void MeterPanel::SetActiveStyle ( Style  style)
private

Definition at line 1210 of file MeterPanel.cpp.

1211{
1212 mStyle = newStyle;
1213
1214 // Set dummy ruler bounds so width/height can be retrieved
1215 // NOTE: Make sure the Right and Bottom values are large enough to
1216 // ensure full width/height of digits get calculated.
1217 mRuler.SetBounds(0, 0, 500, 500);
1218
1219 if (mDB)
1220 {
1223 {
1224 mRuler.SetOrientation(wxHORIZONTAL);
1226 }
1227 else
1228 {
1229 mRuler.SetOrientation(wxVERTICAL);
1231 }
1232 }
1233 else
1234 {
1237 {
1238 mRuler.SetOrientation(wxHORIZONTAL);
1239 mRuler.SetRange(0, 1);
1240 }
1241 else
1242 {
1243 mRuler.SetOrientation(wxVERTICAL);
1244 mRuler.SetRange(1, 0);
1245 }
1246 }
1247
1249}
static const RealFormat & LinearInstance()
Definition: RealFormat.cpp:14
void SetOrientation(int orient)
Definition: Ruler.cpp:140
void SetFormat(const RulerFormat *pFormat)
Definition: Ruler.cpp:103
void GetMaxSize(wxCoord *width, wxCoord *height)
Definition: Ruler.cpp:613
void SetRange(double min, double max)
Definition: Ruler.cpp:151

References Ruler::GetMaxSize(), HorizontalStereo, HorizontalStereoCompact, LinearDBFormat::Instance(), RealFormat::LinearInstance(), mDB, mDBRange, mRuler, mRulerHeight, mRulerWidth, mStyle, Ruler::SetBounds(), Ruler::SetFormat(), Ruler::SetOrientation(), and Ruler::SetRange().

Referenced by HandleLayout(), SetStyle(), and UpdatePrefs().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ SetBarAndClip()

void MeterPanel::SetBarAndClip ( int  iBar,
bool  vert 
)
private

Definition at line 1251 of file MeterPanel.cpp.

1252{
1253 // Save the orientation
1254 mBar[iBar].vert = vert;
1255
1256 // Create the bar rectangle and educe to fit inside the bevel
1257 mBar[iBar].r = mBar[iBar].b;
1258 mBar[iBar].r.x += 1;
1259 mBar[iBar].r.width -= 1;
1260 mBar[iBar].r.y += 1;
1261 mBar[iBar].r.height -= 1;
1262
1263 if (vert)
1264 {
1265 if (mClip)
1266 {
1267 // Create the clip rectangle
1268 mBar[iBar].rClip = mBar[iBar].b;
1269 mBar[iBar].rClip.height = 3;
1270
1271 // Make room for the clipping indicator
1272 mBar[iBar].b.y += 3 + gap;
1273 mBar[iBar].b.height -= 3 + gap;
1274 mBar[iBar].r.y += 3 + gap;
1275 mBar[iBar].r.height -= 3 + gap;
1276 }
1277 }
1278 else
1279 {
1280 if (mClip)
1281 {
1282 // Make room for the clipping indicator
1283 mBar[iBar].b.width -= 4;
1284 mBar[iBar].r.width -= 4;
1285
1286 // Create the indicator rectangle
1287 mBar[iBar].rClip = mBar[iBar].b;
1288 mBar[iBar].rClip.x = mBar[iBar].b.GetRight() + 1 + gap; // +1 for bevel
1289 mBar[iBar].rClip.width = 3;
1290 }
1291 }
1292}
wxRect rClip
Definition: MeterPanel.h:47
bool vert
Definition: MeterPanel.h:40

References MeterBar::b, gap, mBar, mClip, MeterBar::r, MeterBar::rClip, and MeterBar::vert.

Referenced by HandleLayout().

Here is the caller graph for this function:

◆ SetFocusFromKbd()

void MeterPanel::SetFocusFromKbd ( )
override

Definition at line 2115 of file MeterPanel.cpp.

2116{
2117 auto temp = TemporarilyAllowFocus();
2118 SetFocus();
2119}
static TempAllowFocus TemporarilyAllowFocus()
void SetFocus(const WindowPlacement &focus)
Set the window that accepts keyboard input.
Definition: BasicUI.h:352

References BasicUI::SetFocus(), and MeterPanelBase::TemporarilyAllowFocus().

Here is the call graph for this function:

◆ SetMixer()

void MeterPanel::SetMixer ( wxCommandEvent &  event)

Definition at line 834 of file MeterPanel.cpp.

835{
836#if USE_PORTMIXER
837 if (mSlider)
838 {
839 float inputVolume;
840 float outputVolume;
841 int inputSource;
842
843 Refresh();
844
845 auto gAudioIO = AudioIO::Get();
846 gAudioIO->GetMixer(&inputSource, &inputVolume, &outputVolume);
847
848 if (mIsInput)
849 inputVolume = mSlider->Get();
850 else
851 outputVolume = mSlider->Get();
852
853 gAudioIO->SetMixer(inputSource, inputVolume, outputVolume);
854
855#if wxUSE_ACCESSIBILITY
856 GetAccessible()->NotifyEvent( wxACC_EVENT_OBJECT_VALUECHANGE,
857 this,
858 wxOBJID_CLIENT,
859 wxACC_SELF );
860#endif
861
862 }
863#endif // USE_PORTMIXER
864}

References AudioIO::Get(), mIsInput, and mSlider.

Referenced by Decrease(), Increase(), and ShowDialog().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ SetName()

void MeterPanel::SetName ( const TranslatableString name)

Definition at line 1969 of file MeterPanel.cpp.

1970{
1972 if(mSlider)
1973 mSlider->SetName(tip);
1974}

References mSlider, and wxPanelWrapper::SetName().

Referenced by MeterToolBar::Populate().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ SetStyle()

void MeterPanel::SetStyle ( Style  newStyle)

Definition at line 822 of file MeterPanel.cpp.

823{
824 if (mStyle != newStyle && mDesiredStyle == AutomaticStereo)
825 {
826 SetActiveStyle(newStyle);
827
828 mLayoutValid = false;
829
830 Refresh(false);
831 }
832}

References AutomaticStereo, mDesiredStyle, mLayoutValid, mStyle, and SetActiveStyle().

Here is the call graph for this function:

◆ ShowDialog()

bool MeterPanel::ShowDialog ( )

Definition at line 866 of file MeterPanel.cpp.

867{
868 if (!mSlider)
869 return false;
870
871 auto changed = mSlider->ShowDialog();
872 if (changed)
873 {
874 wxCommandEvent e;
875 SetMixer(e);
876 }
877
878 return changed;
879}

References mSlider, and SetMixer().

Referenced by MeterToolBar::ShowInputGainDialog(), and MeterToolBar::ShowOutputGainDialog().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ ShowMenu()

void MeterPanel::ShowMenu ( const wxPoint &  pos)

Definition at line 1948 of file MeterPanel.cpp.

1949{
1950 wxMenu menu;
1951 // Note: these should be kept in the same order as the enum
1952 if (mIsInput) {
1953 wxMenuItem *mi;
1954 if (mMonitoring)
1955 mi = menu.Append(OnMonitorID, _("Stop Monitoring"));
1956 else
1957 mi = menu.Append(OnMonitorID, _("Start Monitoring"));
1958 mi->Enable(!mActive || mMonitoring);
1959 }
1960
1961 menu.Append(OnPreferencesID, _("Options..."));
1962
1963 BasicMenu::Handle{ &menu }.Popup(
1965 { pos.x, pos.y }
1966 );
1967}
@ OnPreferencesID
Definition: MeterPanel.cpp:269
@ OnMonitorID
Definition: MeterPanel.cpp:268
void Popup(const BasicUI::WindowPlacement &window, const Point &pos={})
Display the menu at pos, invoke at most one action, then hide it.
Definition: BasicMenu.cpp:209
Window placement information for wxWidgetsBasicUI can be constructed from a wxWindow pointer.

References _, mActive, mIsInput, mMonitoring, OnMonitorID, OnPreferencesID, and BasicMenu::Handle::Popup().

Referenced by OnCharHook(), OnContext(), OnMouse(), and MeterToolBar::Populate().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ StartMonitoring()

void MeterPanel::StartMonitoring ( )

Definition at line 1863 of file MeterPanel.cpp.

1864{
1865 bool start = !mMonitoring;
1866
1867 auto gAudioIO = AudioIO::Get();
1868 if (gAudioIO->IsMonitoring()){
1869 gAudioIO->StopStream();
1870 }
1871
1872 if (start && !gAudioIO->IsBusy()){
1874 if (p)
1875 gAudioIO->StartMonitoring(ProjectAudioIO::GetDefaultOptions(*p));
1876
1877 mLayoutValid = false;
1878
1879 Refresh(false);
1880 }
1881}
static AudioIOStartStreamOptions GetDefaultOptions(AudacityProject &project, bool newDefaults=false)
Invoke the global hook, supplying a default argument.

References AudioIO::Get(), ProjectAudioIO::GetDefaultOptions(), mLayoutValid, mMonitoring, and mProject.

Referenced by OnMonitor().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ StopMonitoring()

void MeterPanel::StopMonitoring ( )

Definition at line 1883 of file MeterPanel.cpp.

1883 {
1884 mMonitoring = false;
1885 auto gAudioIO = AudioIO::Get();
1886 if (gAudioIO->IsMonitoring()){
1887 gAudioIO->StopStream();
1888 }
1889}

References AudioIO::Get(), and mMonitoring.

Here is the call graph for this function:

◆ UpdateDisplay()

void MeterPanel::UpdateDisplay ( unsigned  numChannels,
int  numFrames,
const float *  sampleData 
)
overridevirtual

Update the meters with a block of audio data.

Process the supplied block of audio data, extracting the peak and RMS levels to send to the meter. Also record runs of clipped samples to detect clipping that lies on block boundaries. This method is thread-safe! Feel free to call from a different thread (like from an audio I/O callback).

First overload:

Parameters
numChannelsThe number of channels of audio being played back or recorded.
numFramesThe number of frames (samples) in this data block. It is assumed that there are the same number of frames in each channel.
sampleDataThe audio data itself, as interleaved samples. So indexing through the array we get the first sample of channel, first sample of channel 2 etc up to the first sample of channel (numChannels), then the second sample of channel 1, second sample of channel 2, and so to the second sample of channel (numChannels). The last sample in the array will be the (numFrames) sample for channel (numChannels).

The second overload is for ease of use in MixerBoard.

Implements MeterPanelBase.

Definition at line 963 of file MeterPanel.cpp.

965{
966 auto sptr = sampleData;
967 auto num = std::min(numChannels, mNumBars);
968 MeterUpdateMsg msg;
969
970 memset(&msg, 0, sizeof(msg));
971 msg.numFrames = numFrames;
972
973 for(int i=0; i<numFrames; i++) {
974 for(unsigned int j=0; j<num; j++) {
975 msg.peak[j] = floatMax(msg.peak[j], fabs(sptr[j]));
976 msg.rms[j] += sptr[j]*sptr[j];
977
978 // In addition to looking for mNumPeakSamplesToClip peaked
979 // samples in a row, also send the number of peaked samples
980 // at the head and tail, in case there's a run of peaked samples
981 // that crosses block boundaries
982 if (fabs(sptr[j])>=MAX_AUDIO) {
983 if (msg.headPeakCount[j]==i)
984 msg.headPeakCount[j]++;
985 msg.tailPeakCount[j]++;
987 msg.clipping[j] = true;
988 }
989 else
990 msg.tailPeakCount[j] = 0;
991 }
992 sptr += numChannels;
993 }
994 for(unsigned int j=0; j<mNumBars; j++)
995 msg.rms[j] = sqrt(msg.rms[j]/numFrames);
996
997 mQueue.Put(msg);
998}
int min(int a, int b)
#define MAX_AUDIO
Definition: MemoryX.h:564
bool Put(MeterUpdateMsg &msg)
Definition: MeterPanel.cpp:211
__finl float_x4 __vecc sqrt(const float_x4 &a)

References MeterUpdateMsg::clipping, floatMax(), MeterUpdateMsg::headPeakCount, MAX_AUDIO, min(), mNumBars, mNumPeakSamplesToClip, mQueue, MeterUpdateMsg::numFrames, MeterUpdateMsg::peak, MeterUpdateQueue::Put(), MeterUpdateMsg::rms, staffpad::audio::simd::sqrt(), and MeterUpdateMsg::tailPeakCount.

Here is the call graph for this function:

◆ UpdatePrefs()

void MeterPanel::UpdatePrefs ( )
overrideprivatevirtual

Implements PrefsListener.

Definition at line 410 of file MeterPanel.cpp.

411{
413
416 gPrefs->Read(Key(wxT("RefreshRate")), 30)));
417 mGradient = gPrefs->Read(Key(wxT("Bars")), wxT("Gradient")) == wxT("Gradient");
418 mDB = gPrefs->Read(Key(wxT("Type")), wxT("dB")) == wxT("dB");
419 mMeterDisabled = gPrefs->Read(Key(wxT("Disabled")), (long)0);
420
422 {
423 wxString style = gPrefs->Read(Key(wxT("Style")));
424 if (style == wxT("AutomaticStereo"))
425 {
427 }
428 else if (style == wxT("HorizontalStereo"))
429 {
431 }
432 else if (style == wxT("VerticalStereo"))
433 {
435 }
436 else
437 {
439 }
440 }
441
442 // Set the desired orientation (resets ruler orientation)
444
445 // Reset to ensure NEW size is retrieved when language changes
446 mLeftSize = wxSize(0, 0);
447 mRightSize = wxSize(0, 0);
448
449 Reset(mRate, false);
450
451 mLayoutValid = false;
452
453 Refresh(false);
454}

References AutomaticStereo, DecibelScaleCutoff, gPrefs, HorizontalStereo, Key(), MAX_REFRESH_RATE, mDB, mDBRange, mDesiredStyle, mGradient, min(), MIN_REFRESH_RATE, mLayoutValid, mLeftSize, mMeterDisabled, mMeterRefreshRate, mRate, mRightSize, Setting< T >::Read(), Reset(), SetActiveStyle(), VerticalStereo, and wxT().

Referenced by UpdateSelectedPrefs().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ UpdateSelectedPrefs()

void MeterPanel::UpdateSelectedPrefs ( int  id)
overrideprivatevirtual

Reimplemented from PrefsListener.

Definition at line 462 of file MeterPanel.cpp.

463{
464 if (id == MeterPrefsID())
465 {
466#if USE_PORTMIXER
467 if (mIsInput && mSlider)
468 {
469 // Show or hide the input slider based on whether it works
470 auto gAudioIO = AudioIO::Get();
471 mSlider->SetEnabled(mEnabled && gAudioIO->InputMixerWorks());
472 }
473#endif
474 UpdatePrefs();
475 }
476}

References AudioIO::Get(), mEnabled, MeterPrefsID(), mIsInput, mSlider, and UpdatePrefs().

Here is the call graph for this function:

◆ UpdateSliderControl()

void MeterPanel::UpdateSliderControl ( )

Definition at line 478 of file MeterPanel.cpp.

479{
480#if USE_PORTMIXER
481 float inputVolume;
482 float playbackVolume;
483 int inputSource;
484
485 // Show or hide the input slider based on whether it works
486 auto gAudioIO = AudioIO::Get();
487 if (mIsInput && mSlider)
488 mSlider->SetEnabled(mEnabled && gAudioIO->InputMixerWorks());
489
490 gAudioIO->GetMixer(&inputSource, &inputVolume, &playbackVolume);
491
492 const auto volume = mIsInput ? inputVolume : playbackVolume;
493
494 if (mSlider && (mSlider->Get() != volume))
495 mSlider->Set(volume);
496
497#endif // USE_PORTMIXER
498}

References AudioIO::Get(), mEnabled, mIsInput, and mSlider.

Referenced by MeterToolBar::AdjustInputGain(), MeterToolBar::AdjustOutputGain(), MeterToolBar::ShowInputGainDialog(), MeterToolBar::ShowOutputGainDialog(), and MeterToolBar::UpdateControls().

Here is the call graph for this function:
Here is the caller graph for this function:

Friends And Related Function Documentation

◆ MeterAx

friend class MeterAx
friend

Definition at line 316 of file MeterPanel.h.

Member Data Documentation

◆ mActive

bool MeterPanel::mActive
private

Definition at line 283 of file MeterPanel.h.

Referenced by IsActive(), OnAudioIOStatus(), RestoreState(), and ShowMenu().

◆ mAudioCaptureSubscription

Observer::Subscription MeterPanel::mAudioCaptureSubscription
private

Definition at line 251 of file MeterPanel.h.

◆ mAudioIOStatusSubscription

Observer::Subscription MeterPanel::mAudioIOStatusSubscription
private

Definition at line 250 of file MeterPanel.h.

◆ mBar

MeterBar MeterPanel::mBar[kMaxMeterBars] {}
private

◆ mBitmap

std::unique_ptr<wxBitmap> MeterPanel::mBitmap
private

Definition at line 290 of file MeterPanel.h.

Referenced by DrawMeterBar(), and OnPaint().

◆ mBkgndBrush

wxBrush MeterPanel::mBkgndBrush
private

Definition at line 301 of file MeterPanel.h.

Referenced by DrawMeterBar(), and OnPaint().

◆ mBrush

wxBrush MeterPanel::mBrush
private

Definition at line 298 of file MeterPanel.h.

Referenced by DrawMeterBar().

◆ mClip

bool MeterPanel::mClip
private

Definition at line 273 of file MeterPanel.h.

Referenced by DrawMeterBar(), OnPaint(), and SetBarAndClip().

◆ mClipBrush

wxBrush MeterPanel::mClipBrush
private

Definition at line 300 of file MeterPanel.h.

Referenced by DrawMeterBar().

◆ mDB

bool MeterPanel::mDB
private

Definition at line 269 of file MeterPanel.h.

Referenced by OnMeterUpdate(), OnPaint(), OnPreferences(), SetActiveStyle(), and UpdatePrefs().

◆ mDBRange

int MeterPanel::mDBRange
private

Definition at line 270 of file MeterPanel.h.

Referenced by OnMeterUpdate(), OnPaint(), SetActiveStyle(), and UpdatePrefs().

◆ mDecay

bool MeterPanel::mDecay
private

Definition at line 271 of file MeterPanel.h.

Referenced by OnMeterUpdate().

◆ mDecayRate

float MeterPanel::mDecayRate {}
private

Definition at line 272 of file MeterPanel.h.

Referenced by OnMeterUpdate().

◆ mDesiredStyle

Style MeterPanel::mDesiredStyle
private

Definition at line 267 of file MeterPanel.h.

Referenced by HandleLayout(), OnPreferences(), SetStyle(), and UpdatePrefs().

◆ mDisabledBkgndBrush

wxBrush MeterPanel::mDisabledBkgndBrush
private

Definition at line 302 of file MeterPanel.h.

Referenced by DrawMeterBar().

◆ mDisabledPen

wxPen MeterPanel::mDisabledPen
private

Definition at line 296 of file MeterPanel.h.

◆ mEnabled

bool MeterPanel::mEnabled { true }
private

Definition at line 311 of file MeterPanel.h.

Referenced by OnAudioCapture(), UpdateSelectedPrefs(), and UpdateSliderControl().

◆ mFocusRect

wxRect MeterPanel::mFocusRect
private

Definition at line 314 of file MeterPanel.h.

◆ mGradient

bool MeterPanel::mGradient
private

Definition at line 268 of file MeterPanel.h.

Referenced by DrawMeterBar(), OnPaint(), OnPreferences(), and UpdatePrefs().

◆ mHeight

int MeterPanel::mHeight
private

Definition at line 259 of file MeterPanel.h.

Referenced by HandleLayout(), OnPaint(), and OnSize().

◆ mIsFocused

bool MeterPanel::mIsFocused {}
private

Definition at line 313 of file MeterPanel.h.

Referenced by OnKillFocus(), OnPaint(), and OnSetFocus().

◆ mIsInput

bool MeterPanel::mIsInput
private

◆ mLayoutValid

bool MeterPanel::mLayoutValid
private

◆ mLeftSize

wxSize MeterPanel::mLeftSize
private

Definition at line 293 of file MeterPanel.h.

Referenced by HandleLayout(), and UpdatePrefs().

◆ mLeftText

wxString MeterPanel::mLeftText
private

Definition at line 304 of file MeterPanel.h.

Referenced by HandleLayout(), and OnPaint().

◆ mLeftTextPos

wxPoint MeterPanel::mLeftTextPos
private

Definition at line 291 of file MeterPanel.h.

Referenced by HandleLayout(), and OnPaint().

◆ mMeterDisabled

long MeterPanel::mMeterDisabled {}
private

Definition at line 279 of file MeterPanel.h.

Referenced by DrawMeterBar(), IsMeterDisabled(), OnMeterUpdate(), and UpdatePrefs().

◆ mMeterRefreshRate

long MeterPanel::mMeterRefreshRate {}
private

Definition at line 278 of file MeterPanel.h.

Referenced by OnAudioIOStatus(), OnPreferences(), Reset(), RestoreState(), and UpdatePrefs().

◆ mMonitoring

bool MeterPanel::mMonitoring
private

◆ mNumBars

unsigned MeterPanel::mNumBars
private

◆ mNumPeakSamplesToClip

int MeterPanel::mNumPeakSamplesToClip
private

Definition at line 274 of file MeterPanel.h.

Referenced by OnMeterUpdate(), and UpdateDisplay().

◆ mPeakHoldDuration

double MeterPanel::mPeakHoldDuration
private

Definition at line 275 of file MeterPanel.h.

Referenced by OnMeterUpdate().

◆ mPeakPeakPen

wxPen MeterPanel::mPeakPeakPen
private

Definition at line 297 of file MeterPanel.h.

Referenced by DrawMeterBar().

◆ mPen

wxPen MeterPanel::mPen
private

Definition at line 295 of file MeterPanel.h.

Referenced by DrawMeterBar().

◆ mProject

AudacityProject* MeterPanel::mProject
private

Definition at line 253 of file MeterPanel.h.

Referenced by OnAudioCapture(), OnAudioIOStatus(), OnPreferences(), and StartMonitoring().

◆ mQueue

MeterUpdateQueue MeterPanel::mQueue
private

Definition at line 254 of file MeterPanel.h.

Referenced by Clear(), OnMeterUpdate(), Reset(), and UpdateDisplay().

◆ mRate

double MeterPanel::mRate
private

Definition at line 277 of file MeterPanel.h.

Referenced by OnMeterUpdate(), Reset(), and UpdatePrefs().

◆ mRightSize

wxSize MeterPanel::mRightSize
private

Definition at line 294 of file MeterPanel.h.

Referenced by HandleLayout(), and UpdatePrefs().

◆ mRightText

wxString MeterPanel::mRightText
private

Definition at line 305 of file MeterPanel.h.

Referenced by HandleLayout(), and OnPaint().

◆ mRightTextPos

wxPoint MeterPanel::mRightTextPos
private

Definition at line 292 of file MeterPanel.h.

Referenced by HandleLayout(), and OnPaint().

◆ mRMSBrush

wxBrush MeterPanel::mRMSBrush
private

Definition at line 299 of file MeterPanel.h.

Referenced by DrawMeterBar().

◆ mRuler

Ruler MeterPanel::mRuler
private

Definition at line 303 of file MeterPanel.h.

Referenced by HandleLayout(), OnPaint(), and SetActiveStyle().

◆ mRulerHeight

int MeterPanel::mRulerHeight {}
private

Definition at line 262 of file MeterPanel.h.

Referenced by HandleLayout(), and SetActiveStyle().

◆ mRulerWidth

int MeterPanel::mRulerWidth {}
private

Definition at line 261 of file MeterPanel.h.

Referenced by HandleLayout(), and SetActiveStyle().

◆ mSlider

std::unique_ptr<LWSlider> MeterPanel::mSlider
private

◆ mSliderPos

wxPoint MeterPanel::mSliderPos
private

Definition at line 308 of file MeterPanel.h.

Referenced by HandleLayout(), and OnPaint().

◆ mSliderSize

wxSize MeterPanel::mSliderSize
private

Definition at line 309 of file MeterPanel.h.

Referenced by HandleLayout(), and OnPaint().

◆ mStyle

Style MeterPanel::mStyle {}
private

◆ mT

double MeterPanel::mT
private

Definition at line 276 of file MeterPanel.h.

Referenced by OnMeterUpdate(), and Reset().

◆ mTimer

wxTimer MeterPanel::mTimer
private

Definition at line 255 of file MeterPanel.h.

Referenced by OnAudioIOStatus(), Reset(), and RestoreState().

◆ mTipTimer

wxTimer MeterPanel::mTipTimer
private

Definition at line 256 of file MeterPanel.h.

Referenced by OnKillFocus(), and OnMouse().

◆ mWidth

int MeterPanel::mWidth
private

Definition at line 258 of file MeterPanel.h.

Referenced by HandleLayout(), OnPaint(), and OnSize().


The documentation for this class was generated from the following files: