Audacity 3.2.0
Public Member Functions | Static Public Attributes | Protected Member Functions | Private Member Functions | Private Attributes | List of all members
CompareAudioCommand Class Referencefinal

Returns information about the amount of audio that is about a certain threshold of difference in two selected tracks. More...

#include <CompareAudioCommand.h>

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

Public Member Functions

ComponentInterfaceSymbol GetSymbol () const override
 
TranslatableString GetDescription () const override
 
template<bool Const>
bool VisitSettings (SettingsVisitorBase< Const > &S)
 
bool VisitSettings (SettingsVisitor &S) override
 
bool VisitSettings (ConstSettingsVisitor &S) override
 
void PopulateOrExchange (ShuttleGui &S) override
 
ManualPageID ManualPage () override
 
bool Apply (const CommandContext &context) override
 
- Public Member Functions inherited from AudacityCommand
 AudacityCommand ()
 
virtual ~AudacityCommand ()
 
PluginPath GetPath () const override
 
VendorSymbol GetVendor () const override
 
wxString GetVersion () const override
 
ComponentInterfaceSymbol GetSymbol () const override=0
 
virtual TranslatableString GetDescription () const override
 
virtual ManualPageID ManualPage ()
 
virtual bool IsBatchProcessing () const
 
virtual void SetBatchProcessing (bool start)
 
virtual bool Apply (const CommandContext &WXUNUSED(context))
 
bool ShowInterface (wxWindow *parent, bool forceModal=false)
 
wxDialog * CreateUI (wxWindow *parent, AudacityCommand *client)
 
bool SaveSettingsAsString (wxString &parms)
 
bool LoadSettingsFromString (const wxString &parms)
 
bool DoAudacityCommand (const CommandContext &context, bool shouldPrompt=true)
 
int MessageBox (const TranslatableString &message, long style=DefaultMessageBoxStyle, const TranslatableString &titleStr={})
 
virtual bool Init ()
 
virtual bool PromptUser (AudacityProject &)
 
virtual bool CheckWhetherSkipAudacityCommand ()
 
virtual void End ()
 
virtual void PopulateOrExchange (ShuttleGui &WXUNUSED(S))
 
virtual bool TransferDataToWindow ()
 
virtual bool TransferDataFromWindow ()
 
virtual bool VisitSettings (SettingsVisitor &)
 
virtual bool VisitSettings (ConstSettingsVisitor &)
 
- Public Member Functions inherited from ComponentInterface
virtual ~ComponentInterface ()
 
virtual PluginPath GetPath () const =0
 
virtual ComponentInterfaceSymbol GetSymbol () const =0
 
virtual VendorSymbol GetVendor () const =0
 
virtual wxString GetVersion () const =0
 
virtual TranslatableString GetDescription () const =0
 
TranslatableString GetName () const
 

Static Public Attributes

static const ComponentInterfaceSymbol Symbol { XO("Compare Audio") }
 

Protected Member Functions

double CompareSample (double value1, double value2)
 

Private Member Functions

bool GetSelection (const CommandContext &context, AudacityProject &proj)
 

Private Attributes

double errorThreshold
 
double mT0
 
double mT1
 
const WaveTrackmTrack0
 
const WaveTrackmTrack1
 

Additional Inherited Members

- Public Types inherited from AudacityCommand
enum  : long { DefaultMessageBoxStyle = wxOK | wxCENTRE }
 
- Protected Attributes inherited from AudacityCommand
ProgressDialogmProgress
 
wxDialog * mUIDialog
 
wxWindow * mUIParent
 

Detailed Description

Returns information about the amount of audio that is about a certain threshold of difference in two selected tracks.

Definition at line 26 of file CompareAudioCommand.h.

Member Function Documentation

◆ Apply()

bool CompareAudioCommand::Apply ( const CommandContext context)
override

Definition at line 119 of file CompareAudioCommand.cpp.

120{
121 if (!GetSelection(context, context.project))
122 {
123 return false;
124 }
125
126 wxString msg = wxT("Comparing tracks '");
127 msg += mTrack0->GetName() + wxT("' and '")
128 + mTrack1->GetName() + wxT("'.");
129 context.Status(msg);
130
131 long errorCount = 0;
132 // Initialize buffers for track data to be analyzed
134
135 Floats buff0{ buffSize };
136 Floats buff1{ buffSize };
137
138 // Compare tracks block by block
139 auto s0 = mTrack0->TimeToLongSamples(mT0);
140 auto s1 = mTrack0->TimeToLongSamples(mT1);
141 const auto channels0 = mTrack0->Channels();
142 auto iter = mTrack1->Channels().begin();
143 for (const auto pChannel0 : channels0) {
144 const auto pChannel1 = *iter++;
145 auto position = s0;
146 auto length = s1 - s0;
147 while (position < s1) {
148 // Get a block of data into the buffers
149 auto block = limitSampleBufferSize(
150 pChannel0->GetBestBlockSize(position), s1 - position
151 );
152 pChannel0->GetFloats(buff0.get(), position, block);
153 pChannel1->GetFloats(buff1.get(), position, block);
154
155 for (decltype(block) buffPos = 0; buffPos < block; ++buffPos)
156 if (CompareSample(buff0[buffPos], buff1[buffPos]) > errorThreshold)
157 ++errorCount;
158
159 position += block;
160 context.Progress(
161 (position - s0).as_double() /
162 length.as_double()
163 );
164 }
165 }
166
167 // Output the results
168 double errorSeconds = mTrack0->LongSamplesToTime(errorCount);
169 context.Status(wxString::Format(wxT("%li"), errorCount));
170 context.Status(wxString::Format(wxT("%.4f"), errorSeconds));
171 context.Status(wxString::Format(wxT("Finished comparison: %li samples (%.3f seconds) exceeded the error threshold of %f."), errorCount, errorSeconds, errorThreshold));
172 return true;
173}
wxT("CloseDown"))
int min(int a, int b)
size_t limitSampleBufferSize(size_t bufferSize, sampleCount limit)
Definition: SampleCount.cpp:22
virtual void Progress(double d) const
virtual void Status(const wxString &message, bool bFlush=false) const
AudacityProject & project
double CompareSample(double value1, double value2)
const WaveTrack * mTrack1
bool GetSelection(const CommandContext &context, AudacityProject &proj)
const WaveTrack * mTrack0
const wxString & GetName() const
Name is always the same for all channels of a group.
Definition: Track.cpp:64
auto Channels()
Definition: WaveTrack.h:263
size_t GetMaxBlockSize() const
Definition: WaveTrack.cpp:2279
double LongSamplesToTime(sampleCount pos) const
sampleCount TimeToLongSamples(double t0) const

References WaveTrack::Channels(), CompareSample(), errorThreshold, WaveTrack::GetMaxBlockSize(), Track::GetName(), GetSelection(), limitSampleBufferSize(), WideSampleSequence::LongSamplesToTime(), min(), mT0, mT1, mTrack0, mTrack1, CommandContext::Progress(), CommandContext::project, CommandContext::Status(), WideSampleSequence::TimeToLongSamples(), and wxT().

Here is the call graph for this function:

◆ CompareSample()

double CompareAudioCommand::CompareSample ( double  value1,
double  value2 
)
protected

Definition at line 109 of file CompareAudioCommand.cpp.

110{
111 return fabs(value1 - value2);
112}

Referenced by Apply().

Here is the caller graph for this function:

◆ GetDescription()

TranslatableString CompareAudioCommand::GetDescription ( ) const
inlineoverridevirtual

Reimplemented from AudacityCommand.

Definition at line 33 of file CompareAudioCommand.h.

33{return XO("Compares a range on two tracks.");};
XO("Cut/Copy/Paste")

References XO().

Here is the call graph for this function:

◆ GetSelection()

bool CompareAudioCommand::GetSelection ( const CommandContext context,
AudacityProject proj 
)
private

Definition at line 75 of file CompareAudioCommand.cpp.

76{
77 // Get the selected time interval
78 auto &selectedRegion = ViewInfo::Get( proj ).selectedRegion;
79 mT0 = selectedRegion.t0();
80 mT1 = selectedRegion.t1();
81 if (mT0 >= mT1)
82 {
83 context.Error(wxT("There is no selection!"));
84 return false;
85 }
86
87 // Get the selected tracks and check that there are at least two to
88 // compare
89 auto trackRange = TrackList::Get(proj).Selected<const WaveTrack>();
90 mTrack0 = *trackRange.first;
91 if (!mTrack0) {
92 context.Error(wxT("No tracks selected! Select two tracks to compare."));
93 return false;
94 }
95 mTrack1 = * ++ trackRange.first;
96 if (!mTrack1) {
97 context.Error(wxT("Only one track selected! Select two tracks to compare."));
98 return false;
99 }
100 if (mTrack0->NChannels() != mTrack1->NChannels()) {
101 context.Error(wxT("Selected tracks must have the same number of channels!"));
102 return false;
103 }
104 if (* ++ trackRange.first)
105 context.Status(wxT("More than two tracks selected - only the first two will be compared."));
106 return true;
107}
virtual void Error(const wxString &message) const
static TrackList & Get(AudacityProject &project)
Definition: Track.cpp:314
auto Selected() -> TrackIterRange< TrackType >
Definition: Track.h:967
NotifyingSelectedRegion selectedRegion
Definition: ViewInfo.h:216
static ViewInfo & Get(AudacityProject &project)
Definition: ViewInfo.cpp:235
A Track that contains audio waveform data.
Definition: WaveTrack.h:203
size_t NChannels() const override
A constant property.
Definition: WaveTrack.cpp:530

References CommandContext::Error(), ViewInfo::Get(), TrackList::Get(), mT0, mT1, mTrack0, mTrack1, WaveTrack::NChannels(), TrackList::Selected(), ViewInfo::selectedRegion, CommandContext::Status(), and wxT().

Referenced by Apply().

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

◆ GetSymbol()

ComponentInterfaceSymbol CompareAudioCommand::GetSymbol ( ) const
inlineoverridevirtual

Implements AudacityCommand.

Definition at line 32 of file CompareAudioCommand.h.

32{return Symbol;}
static const ComponentInterfaceSymbol Symbol

References Symbol.

◆ ManualPage()

ManualPageID CompareAudioCommand::ManualPage ( )
inlineoverridevirtual

Reimplemented from AudacityCommand.

Definition at line 40 of file CompareAudioCommand.h.

40{return L"Extra_Menu:_Scriptables_II#compare_Audio";}

◆ PopulateOrExchange()

void CompareAudioCommand::PopulateOrExchange ( ShuttleGui S)
override

Definition at line 63 of file CompareAudioCommand.cpp.

64{
65 S.AddSpace(0, 5);
66
67 S.StartMultiColumn(2, wxALIGN_CENTER);
68 {
69 S.TieTextBox(XXO("Threshold:"),errorThreshold);
70 }
71 S.EndMultiColumn();
72}
XXO("&Cut/Copy/Paste Toolbar")
#define S(N)
Definition: ToChars.cpp:64

References errorThreshold, S, and XXO().

Here is the call graph for this function:

◆ VisitSettings() [1/3]

bool CompareAudioCommand::VisitSettings ( ConstSettingsVisitor )
overridevirtual

Visit settings, if defined. false means no defined settings. Default implementation returns false

Reimplemented from AudacityCommand.

Definition at line 60 of file CompareAudioCommand.cpp.

61 { return VisitSettings<true>(S); }

References S.

◆ VisitSettings() [2/3]

bool CompareAudioCommand::VisitSettings ( SettingsVisitor )
overridevirtual

Visit settings, if defined. false means no defined settings. Default implementation returns false

Reimplemented from AudacityCommand.

Definition at line 57 of file CompareAudioCommand.cpp.

58 { return VisitSettings<false>(S); }

References S.

◆ VisitSettings() [3/3]

template<bool Const>
bool CompareAudioCommand::VisitSettings ( SettingsVisitorBase< Const > &  S)

Definition at line 53 of file CompareAudioCommand.cpp.

53 {
54 S.Define( errorThreshold, wxT("Threshold"), 0.0f, 0.0f, 0.01f, 1.0f );
55 return true;
56}

References errorThreshold, S, and wxT().

Here is the call graph for this function:

Member Data Documentation

◆ errorThreshold

double CompareAudioCommand::errorThreshold
private

Definition at line 45 of file CompareAudioCommand.h.

Referenced by Apply(), PopulateOrExchange(), and VisitSettings().

◆ mT0

double CompareAudioCommand::mT0
private

Definition at line 46 of file CompareAudioCommand.h.

Referenced by Apply(), and GetSelection().

◆ mT1

double CompareAudioCommand::mT1
private

Definition at line 46 of file CompareAudioCommand.h.

Referenced by Apply(), and GetSelection().

◆ mTrack0

const WaveTrack* CompareAudioCommand::mTrack0
private

Definition at line 47 of file CompareAudioCommand.h.

Referenced by Apply(), and GetSelection().

◆ mTrack1

const WaveTrack* CompareAudioCommand::mTrack1
private

Definition at line 48 of file CompareAudioCommand.h.

Referenced by Apply(), and GetSelection().

◆ Symbol

const ComponentInterfaceSymbol CompareAudioCommand::Symbol { XO("Compare Audio") }
static

Definition at line 29 of file CompareAudioCommand.h.

Referenced by GetSymbol().


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