23#include <wx/simplebook.h>
28#include "../ProjectFileManager.h"
29#include "../ShuttleGui.h"
30#include "../WaveTrack.h"
31#include "../widgets/valnum.h"
32#include "../widgets/ProgressDialog.h"
38 {
XO(
"perceived loudness") },
57{
XO(
"Loudness Normalization") };
80 return XO(
"Sets the loudness of one or more tracks");
85 return L
"Loudness_Normalization";
108 bool bGoodResult =
true;
109 auto topMsg =
XO(
"Normalizing Loudness...\n");
119 double trackStart = track->GetStartTime();
120 double trackEnd = track->GetEndTime();
131 auto trackName = track->GetName();
135 topMsg +
XO(
"Analyzing: %s").Format( trackName );
157 for(
auto channel : range)
218 S.StartVerticalLay(0);
220 S.StartMultiColumn(2, wxALIGN_CENTER);
222 S.StartVerticalLay(
false);
224 S.StartHorizontalLay(wxALIGN_LEFT,
false);
226 S.AddVariableText(
XO(
"&Normalize"),
false,
227 wxALIGN_CENTER_VERTICAL | wxALIGN_LEFT);
235 .AddVariableText(
XO(
"t&o"),
false,
236 wxALIGN_CENTER_VERTICAL | wxALIGN_LEFT);
244 S.StartNotebookPage({});
246 S.StartHorizontalLay(wxALIGN_LEFT,
false);
250 .Name(
XO(
"Loudness LUFS") )
251 .
Validator<FloatingPointValidator<double>>(
253 NumValidatorStyle::ONE_TRAILING_ZERO,
255 .AddTextBox( {}, L
"", 10);
259 .AddVariableText(
XO(
"LUFS"),
false,
260 wxALIGN_CENTER_VERTICAL | wxALIGN_LEFT);
262 S.EndHorizontalLay();
266 S.StartNotebookPage({});
268 S.StartHorizontalLay(wxALIGN_LEFT,
false);
271 .Name(
XO(
"RMS dB") )
272 .
Validator<FloatingPointValidator<double>>(
274 NumValidatorStyle::ONE_TRAILING_ZERO,
276 .AddTextBox( {}, L
"", 10);
279 .AddVariableText(
XO(
"dB"),
false,
280 wxALIGN_CENTER_VERTICAL | wxALIGN_LEFT);
282 S.EndHorizontalLay();
290 .AddVariableText( {},
false,
291 wxALIGN_CENTER_VERTICAL | wxALIGN_LEFT);
293 S.EndHorizontalLay();
297 .AddCheckBox(
XXO(
"Normalize &stereo channels independently"),
301 .Validator<wxGenericValidator>( &
mDualMono )
302 .AddCheckBox(
XXO(
"&Treat mono as dual-mono (recommended)"),
316 wxCommandEvent dummy;
328 bool stereoTrackFound =
false;
329 double maxSampleRate = 0;
335 maxSampleRate = std::max(maxSampleRate, track->GetRate());
338 if(track->IsLeader())
339 stereoTrackFound =
true;
398 const size_t remainingLen = (
end - s).as_size_t();
399 blockLen = blockLen > remainingLen ? remainingLen : blockLen;
428 for(
auto channel : range)
471 for(
auto channel : range)
488 mChoice->GetValidator()->TransferFromWindow();
501 if (!
mUIParent->TransferDataFromWindow())
static const EnumValueSymbol kNormalizeTargetStrings[EffectLoudness::nAlgos]
size_t limitSampleBufferSize(size_t bufferSize, sampleCount limit)
TranslatableStrings Msgids(const EnumValueSymbol strings[], size_t nStrings)
Convenience function often useful when adding choice controls.
void reinit(Integral count, bool initialize=false)
Generates EffectParameterMethods overrides from variadic template arguments.
ComponentInterfaceSymbol pairs a persistent string identifier used internally with an optional,...
Implements EBU-R128 loudness measurement.
std::shared_ptr< TrackList > mOutputTracks
void SetLinearEffectFlag(bool linearEffectFlag)
void ReplaceProcessedTracks(const bool bGoodResult)
void CopyInputTracks(bool allSyncLockSelected=false)
bool EnableApply(bool enable=true)
bool TotalProgress(double frac, const TranslatableString &={}) const
int GetNumWaveTracks() const
Performs effect computation.
An Effect to bring the loudness level up to a chosen level.
bool Process(EffectInstance &instance, EffectSettings &settings) override
Actually do the effect here.
size_t mTrackBufferCapacity
wxCheckBox * mDualMonoCheckBox
static const ComponentInterfaceSymbol Symbol
wxCheckBox * mStereoIndCheckBox
std::unique_ptr< EBUR128 > mLoudnessProcessor
ComponentInterfaceSymbol GetSymbol() const override
ManualPageID ManualPage() const override
Name of a page in the Audacity alpha manual, default is empty.
bool GetTrackRMS(WaveTrack *track, float &rms)
bool ProcessBufferBlock()
void OnUpdateUI(wxCommandEvent &evt)
const EffectParameterMethods & Parameters() const override
bool AnalyseBufferBlock()
TranslatableString GetDescription() const override
bool TransferDataToWindow(const EffectSettings &settings) override
Update controls for the settings.
EffectType GetType() const override
Type determines how it behaves.
static constexpr EffectParameter StereoInd
static constexpr EffectParameter LUFSLevel
void StoreBufferBlock(TrackIterRange< WaveTrack > range, sampleCount pos, size_t len)
static constexpr EffectParameter RMSLevel
static constexpr EffectParameter DualMono
virtual ~EffectLoudness()
static constexpr EffectParameter NormalizeTo
std::unique_ptr< EffectUIValidator > PopulateOrExchange(ShuttleGui &S, EffectInstance &instance, EffectSettingsAccess &access) override
Add controls to effect panel; always succeeds.
void OnChoice(wxCommandEvent &evt)
TranslatableString mProgressMsg
bool ProcessOne(TrackIterRange< WaveTrack > range, bool analyse)
void LoadBufferBlock(TrackIterRange< WaveTrack > range, sampleCount pos, size_t len)
Interface for manipulations of an Effect's settings.
virtual void Reset(Effect &effect) const =0
sampleCount TimeToLongSamples(double t0) const
Convert correctly between an (absolute) time in seconds and a number of samples.
Derived from ShuttleGuiBase, an Audacity specific class for shuttling data to and from GUI.
static auto SingletonRange(TrackType *pTrack) -> TrackIterRange< TrackType >
static auto Channels(TrackType *pTrack) -> TrackIterRange< TrackType >
Holds a msgid for the translation catalog; may also bind format arguments.
A Validator is an object which checks whether a wxVariant satisfies a certain criterion....
A Track that contains audio waveform data.
size_t GetBestBlockSize(sampleCount t) const override
This returns a nonnegative number of samples meant to size a memory buffer.
float GetRMS(double t0, double t1, bool mayThrow=true) const
Positions or offsets within audio files need a wide type.
auto end(const Ptr< Type, BaseDeleter > &p)
Enables range-for.
BuiltinEffectsModule::Registration< EffectLoudness > reg
const Type min
Minimum value.
const Type max
Maximum value.
Externalized state of a plug-in.
Range between two TrackIters, usable in range-for statements, and with Visit member functions.