Audacity 3.2.0
Classes | Public Member Functions | Static Public Attributes | Private Member Functions | Private Attributes | List of all members
DynamicRangeProcessorHistoryPanel Class Referencefinal

#include <DynamicRangeProcessorHistoryPanel.h>

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

Classes

struct  ClockSynchronization
 

Public Member Functions

 DynamicRangeProcessorHistoryPanel (wxWindow *parent, wxWindowID winid, CompressorInstance &instance, std::function< void(float)> onDbRangeChanged)
 
void ShowInput (bool show)
 
void ShowOutput (bool show)
 
void ShowActual (bool show)
 
void ShowTarget (bool show)
 
 DECLARE_EVENT_TABLE ()
 
- 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
 

Static Public Attributes

static constexpr auto minWidth = 600
 

Private Member Functions

void OnPaint (wxPaintEvent &evt)
 
void OnSize (wxSizeEvent &evt)
 
void OnTimer (wxTimerEvent &evt)
 
void InitializeForPlayback (CompressorInstance &instance, double sampleRate)
 
bool AcceptsFocus () const override
 
bool AcceptsFocusFromKeyboard () const override
 

Private Attributes

CompressorInstancemCompressorInstance
 
std::shared_ptr< DynamicRangeProcessorOutputPacketQueuemOutputQueue
 
std::vector< DynamicRangeProcessorOutputPacketmPacketBuffer
 
std::optional< DynamicRangeProcessorHistorymHistory
 
DynamicRangeProcessorClock mClock
 
const std::function< void(float)> mOnDbRangeChanged
 
const Observer::Subscription mInitializeProcessingSettingsSubscription
 
const Observer::Subscription mRealtimeResumeSubscription
 
const Observer::Subscription mPlaybackEventSubscription
 
wxTimer mTimer
 
std::optional< ClockSynchronizationmSync
 
std::vector< double > mX
 
std::vector< wxPoint2DDouble > mTarget
 
std::vector< wxPoint2DDouble > mActual
 
std::vector< wxPoint2DDouble > mInput
 
std::vector< wxPoint2DDouble > mOutput
 
bool mPlaybackAboutToStart = false
 
bool mShowInput = true
 
bool mShowOutput = true
 
bool mShowActual = true
 
bool mShowTarget = true
 

Detailed Description

Definition at line 27 of file DynamicRangeProcessorHistoryPanel.h.

Constructor & Destructor Documentation

◆ DynamicRangeProcessorHistoryPanel()

DynamicRangeProcessorHistoryPanel::DynamicRangeProcessorHistoryPanel ( wxWindow *  parent,
wxWindowID  winid,
CompressorInstance instance,
std::function< void(float)>  onDbRangeChanged 
)

Definition at line 57 of file DynamicRangeProcessorHistoryPanel.cpp.

60 : wxPanelWrapper { parent, winid }
61 , mCompressorInstance { instance }
62 , mOnDbRangeChanged { std::move(onDbRangeChanged) }
65 instance)
66 .Subscribe(
67 [&](const std::optional<
69 evt) {
70 if (evt)
72 instance,
73 evt->sampleRate);
74 else
75 // Stop the
76 // timer-based
77 // update but keep
78 // the history
79 // until playback
80 // is resumed.
81 mTimer.Stop();
82 }) }
84 instance)
85 .Subscribe([this](auto) {
86 if (mHistory)
87 mHistory->BeginNewSegment();
88 }) }
90 [this](const AudioIOEvent& evt) {
91 if (evt.type != AudioIOEvent::PAUSE)
92 return;
93 if (evt.on)
94 {
95 mTimer.Stop();
96 mClock.Pause();
97 }
98 else
99 {
100 mClock.Resume();
101 mTimer.Start(timerPeriodMs);
102 }
103 }) }
104{
105 if (const auto& sampleRate = instance.GetSampleRate();
106 sampleRate.has_value())
107 // Playback is ongoing, and so the `InitializeProcessingSettings` event
108 // was already fired.
110
111 SetDoubleBuffered(true);
112 mTimer.SetOwner(this, timerId);
114}
static AudioIO * Get()
Definition: AudioIO.cpp:126
const std::optional< double > & GetSampleRate() const
const Observer::Subscription mPlaybackEventSubscription
std::optional< DynamicRangeProcessorHistory > mHistory
const Observer::Subscription mInitializeProcessingSettingsSubscription
const Observer::Subscription mRealtimeResumeSubscription
void InitializeForPlayback(CompressorInstance &instance, double sampleRate)
const std::function< void(float)> mOnDbRangeChanged
An object that sends messages to an open-ended list of subscribed callbacks.
Definition: Observer.h:108
Subscription Subscribe(Callback callback)
Connect a callback to the Publisher; later-connected are called earlier.
Definition: Observer.h:199
bool on
Definition: AudioIO.h:68
enum AudioIOEvent::Type type

Member Function Documentation

◆ AcceptsFocus()

bool DynamicRangeProcessorHistoryPanel::AcceptsFocus ( ) const
overrideprivate

Definition at line 558 of file DynamicRangeProcessorHistoryPanel.cpp.

559{
560 return false;
561}

◆ AcceptsFocusFromKeyboard()

bool DynamicRangeProcessorHistoryPanel::AcceptsFocusFromKeyboard ( ) const
overrideprivate

Definition at line 563 of file DynamicRangeProcessorHistoryPanel.cpp.

564{
565 return false;
566}

◆ DECLARE_EVENT_TABLE()

DynamicRangeProcessorHistoryPanel::DECLARE_EVENT_TABLE ( )

◆ InitializeForPlayback()

void DynamicRangeProcessorHistoryPanel::InitializeForPlayback ( CompressorInstance instance,
double  sampleRate 
)
private

Definition at line 532 of file DynamicRangeProcessorHistoryPanel.cpp.

534{
535 mSync.reset();
536 mHistory.emplace(sampleRate);
537 // We don't know for sure the least packet size (which is variable). 100
538 // samples per packet at a rate of 8kHz is 12.5ms, which is quite low
539 // latency. For higher sample rates that will be less.
540 constexpr auto leastPacketSize = 100;
541 const size_t maxQueueSize = DynamicRangeProcessorHistory::maxTimeSeconds *
542 sampleRate / leastPacketSize;
543 mPacketBuffer.reserve(maxQueueSize);
544 // Although `mOutputQueue` is a shared_ptr, we construct a unique_ptr and
545 // invoke the shared_ptr ctor overload that takes a unique_ptr.
546 // This way, we avoid the `error: aligned deallocation function of type
547 // 'void (void *, std::align_val_t) noexcept' is only available on
548 // macOS 10.13 or newer` compilation error.
550 std::make_unique<DynamicRangeProcessorOutputPacketQueue>(maxQueueSize);
552 mTimer.Start(timerPeriodMs);
554 Refresh(false);
555 wxPanelWrapper::Update();
556}
void SetOutputQueue(std::weak_ptr< DynamicRangeProcessorOutputPacketQueue >)
std::optional< ClockSynchronization > mSync
std::shared_ptr< DynamicRangeProcessorOutputPacketQueue > mOutputQueue
std::vector< DynamicRangeProcessorOutputPacket > mPacketBuffer

References DynamicRangeProcessorHistory::maxTimeSeconds, mHistory, mOutputQueue, mPacketBuffer, mPlaybackAboutToStart, mSync, mTimer, anonymous_namespace{ClipSegmentTest.cpp}::sampleRate, CompressorInstance::SetOutputQueue(), and anonymous_namespace{DynamicRangeProcessorHistoryPanel.cpp}::timerPeriodMs.

Here is the call graph for this function:

◆ OnPaint()

void DynamicRangeProcessorHistoryPanel::OnPaint ( wxPaintEvent &  evt)
private

Definition at line 329 of file DynamicRangeProcessorHistoryPanel.cpp.

330{
331 wxPaintDC dc(this);
332
333 using namespace DynamicRangeProcessorPanel;
334
335 const auto gc = MakeGraphicsContext(dc);
336 const auto rect = DynamicRangeProcessorPanel::GetPanelRect(*this);
337 const auto x = rect.GetX();
338 const auto y = rect.GetY();
339 const auto width = rect.GetWidth();
340 const auto height = rect.GetHeight();
341
342 gc->SetBrush(GetGraphBackgroundBrush(*gc, height));
343 gc->SetPen(wxTransparentColor);
344 gc->DrawRectangle(x, y, width, height);
345
346 Finally Do { [&] {
347 // The legend is causing problems color-wise, and in the end it may not be
348 // so useful since the different elements of the graph can be toggled.
349 // Keep it up our sleeve for now, though. (Anyone still sees this in the
350 // not-so-near future, feel free to clean up.)
351 constexpr auto drawLegend = false;
352 if (drawLegend)
353 DrawLegend(height, dc, *gc);
354 gc->SetBrush(*wxTRANSPARENT_BRUSH);
355 gc->SetPen(lineColor);
356 gc->DrawRectangle(x, y, width, height);
357 } };
358
359 if (!mHistory || !mSync)
360 {
362 {
363 const auto text = XO("awaiting playback");
364 const wxDCFontChanger changer { dc,
365 { 16, wxFONTFAMILY_DEFAULT,
366 wxFONTSTYLE_NORMAL,
367 wxFONTWEIGHT_NORMAL } };
368 const auto textWidth = dc.GetTextExtent(text.Translation()).GetWidth();
369 const auto textHeight =
370 dc.GetTextExtent(text.Translation()).GetHeight();
371 dc.SetTextForeground(wxColor { 128, 128, 128 });
372 dc.DrawText(
373 text.Translation(), (width - textWidth) / 2,
374 (height - textHeight) / 2);
375 }
376 return;
377 }
378
379 const auto& segments = mHistory->GetSegments();
380 const auto elapsedTimeSinceFirstPacket =
381 std::chrono::duration<float>(mSync->now - mSync->start).count();
382 const auto rangeDb = DynamicRangeProcessorPanel::GetGraphDbRange(height);
383 const auto dbPerPixel = rangeDb / height;
384
385 for (const auto& segment : segments)
386 {
387 mX.clear();
388 mTarget.clear();
389 mActual.clear();
390 mInput.clear();
391 mOutput.clear();
392
393 mX.resize(segment.size());
394 auto lastInvisibleLeft = 0;
395 auto firstInvisibleRight = 0;
396 std::transform(
397 segment.begin(), segment.end(), mX.begin(), [&](const auto& packet) {
398 const auto x = GetDisplayPixel(
399 elapsedTimeSinceFirstPacket -
400 (packet.time - mSync->firstPacketTime),
401 width);
402 if (x < 0)
403 ++lastInvisibleLeft;
404 if (x < width)
405 ++firstInvisibleRight;
406 return x;
407 });
408 lastInvisibleLeft = std::max<int>(--lastInvisibleLeft, 0);
409 firstInvisibleRight = std::min<int>(++firstInvisibleRight, mX.size());
410
411 mX.erase(mX.begin() + firstInvisibleRight, mX.end());
412 mX.erase(mX.begin(), mX.begin() + lastInvisibleLeft);
413
414 if (mX.size() < 2)
415 continue;
416
417 auto segmentIndex = lastInvisibleLeft;
418 mTarget.reserve(mX.size());
419 mActual.reserve(mX.size());
420 mInput.reserve(mX.size());
421 mOutput.reserve(mX.size());
422 std::for_each(mX.begin(), mX.end(), [&](auto x) {
423 const auto& packet = segment[segmentIndex++];
424 const auto elapsedSincePacket = elapsedTimeSinceFirstPacket -
425 (packet.time - mSync->firstPacketTime);
426 mTarget.emplace_back(x, -packet.target / dbPerPixel);
427 mActual.emplace_back(x, -packet.follower / dbPerPixel);
428 mInput.emplace_back(x, -packet.input / dbPerPixel);
429 mOutput.emplace_back(x, -packet.output / dbPerPixel);
430 });
431
432 if (mShowInput)
433 FillUpTo(mInput, inputColor, *gc, rect);
434
435 if (mShowOutput)
436 {
437 FillUpTo(mOutput, outputColor, *gc, rect);
438 const auto outputGc = MakeGraphicsContext(dc);
439 outputGc->SetPen({ wxColor { outputColor.GetRGB() }, 2 });
440 outputGc->DrawLines(mOutput.size(), mOutput.data());
441 }
442
443 if (mShowActual)
444 {
445 // First draw a thick line, and then the thinner line in its center
446 // with colors indicating overshoot and undershoot.
447 const auto actualGc = MakeGraphicsContext(dc);
448
449 actualGc->SetPen(
451 actualGc->DrawLines(mActual.size(), mActual.data());
452 if (MayUsePenGradients())
453 {
454 // So that we can converge to `actualCompressionColor` at the
455 // crossings of actual and target compression.
457
458 wxGraphicsGradientStops stops;
459 const auto xLeft = mActual.front().m_x;
460 const auto xRight = mActual.back().m_x;
461 const auto span = xRight - xLeft;
462 for (auto i = 0; i < mActual.size(); ++i)
463 {
464 const auto diff = mTarget[i].m_y - mActual[i].m_y;
465 const auto actualIsBelow = diff < 0;
466 const auto w = std::min(1.0, std::abs(diff) * dbPerPixel / 6);
467 const auto color = GetColorMix(
468 actualIsBelow ? releaseColor : attackColor,
470 .GetRGB();
471 stops.Add(color, (mActual[i].m_x - xLeft) / span);
472 }
473 wxGraphicsPenInfo penInfo;
474 penInfo
475 .LinearGradient(
476 mActual.front().m_x, 0, mActual.back().m_x, 0, stops)
478
479 actualGc->SetPen(actualGc->CreatePen(penInfo));
480 actualGc->DrawLines(mActual.size(), mActual.data());
481 }
482 }
483
484 if (mShowTarget)
485 {
486 const auto targetGc = MakeGraphicsContext(dc);
487 targetGc->SetPen(
489 targetGc->DrawLines(mTarget.size(), mTarget.data());
490 }
491 }
492}
int min(int a, int b)
XO("Cut/Copy/Paste")
wxColor GetColorMix(const wxColor &a, const wxColor &b, double aWeight)
std::unique_ptr< wxGraphicsContext > MakeGraphicsContext(const wxPaintDC &dc)
wxRect GetPanelRect(const wxPanelWrapper &panel)
wxGraphicsBrush GetGraphBackgroundBrush(wxGraphicsContext &gc, int height)
void FillUpTo(std::vector< wxPoint2DDouble > lines, const wxColor &color, wxGraphicsContext &gc, const wxRect &rect)
void DrawLegend(size_t height, wxPaintDC &dc, wxGraphicsContext &gc)
void InsertCrossings(std::vector< wxPoint2DDouble > &A, std::vector< wxPoint2DDouble > &B)
"finally" as in The C++ Programming Language, 4th ed., p. 358 Useful for defining ad-hoc RAII actions...
Definition: MemoryX.h:175

References DynamicRangeProcessorPanel::actualCompressionColor, DynamicRangeProcessorPanel::attackColor, anonymous_namespace{DynamicRangeProcessorHistoryPanel.cpp}::DrawLegend(), anonymous_namespace{DynamicRangeProcessorHistoryPanel.cpp}::FillUpTo(), anonymous_namespace{DynamicRangeProcessorHistoryPanel.cpp}::GetActualCompressionLineWidth(), DynamicRangeProcessorPanel::GetColorMix(), DynamicRangeProcessorPanel::GetGraphBackgroundBrush(), DynamicRangeProcessorPanel::GetGraphDbRange(), DynamicRangeProcessorPanel::GetPanelRect(), DynamicRangeProcessorPanel::inputColor, anonymous_namespace{DynamicRangeProcessorHistoryPanel.cpp}::InsertCrossings(), DynamicRangeProcessorPanel::lineColor, mActual, DynamicRangeProcessorPanel::MakeGraphicsContext(), anonymous_namespace{DynamicRangeProcessorHistoryPanel.cpp}::MayUsePenGradients(), mHistory, min(), mInput, mOutput, mPlaybackAboutToStart, mShowActual, mShowInput, mShowOutput, mShowTarget, mSync, mTarget, mX, DynamicRangeProcessorPanel::outputColor, DynamicRangeProcessorPanel::releaseColor, DynamicRangeProcessorPanel::targetCompressionColor, DynamicRangeProcessorPanel::targetCompressionLineWidth, and XO().

Here is the call graph for this function:

◆ OnSize()

void DynamicRangeProcessorHistoryPanel::OnSize ( wxSizeEvent &  evt)
private

Definition at line 494 of file DynamicRangeProcessorHistoryPanel.cpp.

495{
496 Refresh(false);
498 DynamicRangeProcessorPanel::GetGraphDbRange(GetSize().GetHeight()));
499}

References DynamicRangeProcessorPanel::GetGraphDbRange(), and mOnDbRangeChanged.

Here is the call graph for this function:

◆ OnTimer()

void DynamicRangeProcessorHistoryPanel::OnTimer ( wxTimerEvent &  evt)
private

Definition at line 501 of file DynamicRangeProcessorHistoryPanel.cpp.

502{
503 mPacketBuffer.clear();
505 while (mOutputQueue->Get(packet))
506 mPacketBuffer.push_back(packet);
507 mHistory->Push(mPacketBuffer);
508
509 if (mHistory->IsEmpty())
510 return;
511
512 // Do now get `std::chrono::steady_clock::now()` in the `OnPaint` event,
513 // because this can be triggered even when playback is paused.
514 const auto now = mClock.GetNow();
515 if (!mSync)
516 // At the time of writing, the realtime playback doesn't account for
517 // varying latencies. When it does, the synchronization will have to be
518 // updated on latency change. See
519 // https://github.com/audacity/audacity/issues/3223#issuecomment-2137025150.
520 mSync.emplace(
521 ClockSynchronization { mHistory->GetSegments().front().front().time +
523 now });
524 mPlaybackAboutToStart = false;
525
526 mSync->now = now;
527
528 Refresh(false);
529 wxPanelWrapper::Update();
530}
float GetLatencyMs() const
std::chrono::steady_clock::time_point GetNow() const

References CompressorInstance::GetLatencyMs(), DynamicRangeProcessorClock::GetNow(), mClock, mCompressorInstance, mHistory, mOutputQueue, mPacketBuffer, mPlaybackAboutToStart, and mSync.

Here is the call graph for this function:

◆ ShowActual()

void DynamicRangeProcessorHistoryPanel::ShowActual ( bool  show)

Definition at line 317 of file DynamicRangeProcessorHistoryPanel.cpp.

318{
319 mShowActual = show;
320 Refresh(false);
321}

References mShowActual.

◆ ShowInput()

void DynamicRangeProcessorHistoryPanel::ShowInput ( bool  show)

Definition at line 305 of file DynamicRangeProcessorHistoryPanel.cpp.

306{
307 mShowInput = show;
308 Refresh(false);
309}

References mShowInput.

◆ ShowOutput()

void DynamicRangeProcessorHistoryPanel::ShowOutput ( bool  show)

Definition at line 311 of file DynamicRangeProcessorHistoryPanel.cpp.

312{
313 mShowOutput = show;
314 Refresh(false);
315}

References mShowOutput.

◆ ShowTarget()

void DynamicRangeProcessorHistoryPanel::ShowTarget ( bool  show)

Definition at line 323 of file DynamicRangeProcessorHistoryPanel.cpp.

324{
325 mShowTarget = show;
326 Refresh(false);
327}

References mShowTarget.

Member Data Documentation

◆ mActual

std::vector<wxPoint2DDouble> DynamicRangeProcessorHistoryPanel::mActual
private

Definition at line 74 of file DynamicRangeProcessorHistoryPanel.h.

Referenced by OnPaint().

◆ mClock

DynamicRangeProcessorClock DynamicRangeProcessorHistoryPanel::mClock
private

Definition at line 65 of file DynamicRangeProcessorHistoryPanel.h.

Referenced by OnTimer().

◆ mCompressorInstance

CompressorInstance& DynamicRangeProcessorHistoryPanel::mCompressorInstance
private

Definition at line 61 of file DynamicRangeProcessorHistoryPanel.h.

Referenced by OnTimer().

◆ mHistory

std::optional<DynamicRangeProcessorHistory> DynamicRangeProcessorHistoryPanel::mHistory
private

Definition at line 64 of file DynamicRangeProcessorHistoryPanel.h.

Referenced by InitializeForPlayback(), OnPaint(), and OnTimer().

◆ mInitializeProcessingSettingsSubscription

const Observer::Subscription DynamicRangeProcessorHistoryPanel::mInitializeProcessingSettingsSubscription
private

Definition at line 67 of file DynamicRangeProcessorHistoryPanel.h.

◆ mInput

std::vector<wxPoint2DDouble> DynamicRangeProcessorHistoryPanel::mInput
private

Definition at line 75 of file DynamicRangeProcessorHistoryPanel.h.

Referenced by OnPaint().

◆ minWidth

constexpr auto DynamicRangeProcessorHistoryPanel::minWidth = 600
staticconstexpr

Definition at line 30 of file DynamicRangeProcessorHistoryPanel.h.

◆ mOnDbRangeChanged

const std::function<void(float)> DynamicRangeProcessorHistoryPanel::mOnDbRangeChanged
private

Definition at line 66 of file DynamicRangeProcessorHistoryPanel.h.

Referenced by OnSize().

◆ mOutput

std::vector<wxPoint2DDouble> DynamicRangeProcessorHistoryPanel::mOutput
private

Definition at line 76 of file DynamicRangeProcessorHistoryPanel.h.

Referenced by OnPaint().

◆ mOutputQueue

std::shared_ptr<DynamicRangeProcessorOutputPacketQueue> DynamicRangeProcessorHistoryPanel::mOutputQueue
private

Definition at line 62 of file DynamicRangeProcessorHistoryPanel.h.

Referenced by InitializeForPlayback(), and OnTimer().

◆ mPacketBuffer

std::vector<DynamicRangeProcessorOutputPacket> DynamicRangeProcessorHistoryPanel::mPacketBuffer
private

Definition at line 63 of file DynamicRangeProcessorHistoryPanel.h.

Referenced by InitializeForPlayback(), and OnTimer().

◆ mPlaybackAboutToStart

bool DynamicRangeProcessorHistoryPanel::mPlaybackAboutToStart = false
private

Definition at line 77 of file DynamicRangeProcessorHistoryPanel.h.

Referenced by InitializeForPlayback(), OnPaint(), and OnTimer().

◆ mPlaybackEventSubscription

const Observer::Subscription DynamicRangeProcessorHistoryPanel::mPlaybackEventSubscription
private

Definition at line 69 of file DynamicRangeProcessorHistoryPanel.h.

◆ mRealtimeResumeSubscription

const Observer::Subscription DynamicRangeProcessorHistoryPanel::mRealtimeResumeSubscription
private

Definition at line 68 of file DynamicRangeProcessorHistoryPanel.h.

◆ mShowActual

bool DynamicRangeProcessorHistoryPanel::mShowActual = true
private

Definition at line 80 of file DynamicRangeProcessorHistoryPanel.h.

Referenced by OnPaint(), and ShowActual().

◆ mShowInput

bool DynamicRangeProcessorHistoryPanel::mShowInput = true
private

Definition at line 78 of file DynamicRangeProcessorHistoryPanel.h.

Referenced by OnPaint(), and ShowInput().

◆ mShowOutput

bool DynamicRangeProcessorHistoryPanel::mShowOutput = true
private

Definition at line 79 of file DynamicRangeProcessorHistoryPanel.h.

Referenced by OnPaint(), and ShowOutput().

◆ mShowTarget

bool DynamicRangeProcessorHistoryPanel::mShowTarget = true
private

Definition at line 81 of file DynamicRangeProcessorHistoryPanel.h.

Referenced by OnPaint(), and ShowTarget().

◆ mSync

std::optional<ClockSynchronization> DynamicRangeProcessorHistoryPanel::mSync
private

Definition at line 71 of file DynamicRangeProcessorHistoryPanel.h.

Referenced by InitializeForPlayback(), OnPaint(), and OnTimer().

◆ mTarget

std::vector<wxPoint2DDouble> DynamicRangeProcessorHistoryPanel::mTarget
private

Definition at line 73 of file DynamicRangeProcessorHistoryPanel.h.

Referenced by OnPaint().

◆ mTimer

wxTimer DynamicRangeProcessorHistoryPanel::mTimer
private

Definition at line 70 of file DynamicRangeProcessorHistoryPanel.h.

Referenced by InitializeForPlayback().

◆ mX

std::vector<double> DynamicRangeProcessorHistoryPanel::mX
private

Definition at line 72 of file DynamicRangeProcessorHistoryPanel.h.

Referenced by OnPaint().


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