1#include "../CommonCommandFlags.h"
2#include "../LabelTrack.h"
11#include "../ProjectSettings.h"
14#include "../ProjectWindow.h"
15#include "../SelectUtilities.h"
18#include "../TrackPanelAx.h"
19#include "../TrackPanel.h"
20#include "../TrackUtilities.h"
25#include "../commands/CommandContext.h"
26#include "../commands/CommandManager.h"
27#include "../effects/EffectManager.h"
28#include "../effects/EffectUI.h"
30#include "../tracks/playabletrack/wavetrack/ui/WaveTrackControls.h"
31#include "../toolbars/ToolManager.h"
32#include "../widgets/ASlider.h"
36#include <wx/combobox.h>
38#ifdef EXPERIMENTAL_SCOREALIGN
39#include "../effects/ScoreAlignDialog.h"
40#include "audioreader.h"
41#include "scorealign.h"
42#include "scorealign-glue.h"
58 auto trackRange = tracks.Selected<
WaveTrack >();
62 tracks.MakeUniqueTrackName(
_(
"Mix")),
63 &trackFactory, rate, defaultFormat, 0.0, 0.0, uNewLeft, uNewRight);
69 auto last = *trackRange.rbegin();
70 auto insertionPoint = * ++ tracks.Find( last );
75 if (selectedCount > 0) {
76 firstName = (*trackRange.begin())->GetName();
77 firstColour = (*trackRange.begin())->GetWaveColorIndex();
81 for (
auto &it = trackRange.first, &
end = trackRange.second; it !=
end;)
82 tracks.Remove( *it++ );
87 auto pNewLeft = tracks.Add( uNewLeft );
88 decltype(pNewLeft) pNewRight{};
91 pNewRight = tracks.Add(uNewRight);
92 tracks.MakeMultiChannelTrack(*pNewLeft, 2,
true);
96 if (selectedCount==1) {
97 pNewLeft->SetName(firstName);
99 pNewRight->SetName(firstName);
104 if (selectedCount>=1) {
105 pNewLeft->SetWaveColorIndex(firstColour);
106 pNewLeft->SetSelected(!toNewTrack);
108 pNewRight->SetWaveColorIndex(firstColour);
109 pNewRight->SetSelected(!toNewTrack);
118 std::vector<TrackNodePointer> arr;
119 arr.reserve( tracks.size() );
120 size_t begin = 0, ii = 0;
121 for (
auto iter = tracks.ListOfTracks::begin(),
122 end = tracks.ListOfTracks::end(); iter !=
end; ++iter) {
123 arr.push_back( {iter, &tracks} );
124 if ( iter->get() == insertionPoint )
128 auto mid = arr.end();
130 std::rotate( arr.begin() +
begin, mid, arr.end() );
131 tracks.Permute( arr );
135 if (selectedCount==1) {
136 auto msg =
XO(
"Rendered all audio in track '%s'").Format( firstName );
142 auto msg = (pNewRight
143 ?
XO(
"Mixed and rendered %d tracks into one new stereo track")
144 :
XO(
"Mixed and rendered %d tracks into one new mono track")
146 .
Format( (
int)selectedCount );
150 trackPanel.SetFocus();
162 const auto range = tracks.Any<
WaveTrack >();
164 auto count = selectedRange.
size();
167 for (
auto left : count == 0 ? range : selectedRange )
168 left->SetPan( PanValue );
173 .
PushState(
XO(
"Panned audio track(s)"),
XO(
"Pan Track"), flags);
188static const std::vector< ComponentInterfaceSymbol >
189&
alignLabels() {
static std::vector< ComponentInterfaceSymbol > symbols{
190 {
wxT(
"StartToZero"),
XXO(
"Start to &Zero") },
191 {
wxT(
"StartToSelStart"),
XXO(
"Start to &Cursor/Selection Start") },
192 {
wxT(
"StartToSelEnd"),
XXO(
"Start to Selection &End") },
193 {
wxT(
"EndToSelStart"),
XXO(
"End to Cu&rsor/Selection Start") },
194 {
wxT(
"EndToSelEnd"),
XXO(
"End to Selection En&d") },
208 double newPos = -1.0;
210 auto channelRange = tracks.Selected<
AudioTrack >();
211 auto trackRange = tracks.SelectedLeaders<
AudioTrack >();
213 auto FindOffset = [](
const Track *pTrack ) {
216 auto firstTrackOffset = [&]{
return FindOffset( *trackRange.begin() ); };
217 auto minOffset = [&]{
return trackRange.min( FindOffset ); };
218 auto avgOffset = [&]{
219 return trackRange.sum( FindOffset ) /
220 std::max(
size_t(1), trackRange.
size() ); };
222 auto maxEndOffset = [&]{
227 delta = -minOffset();
234 ?
XO(
"Aligned/Moved start to zero")
235 :
XO(
"Aligned start to zero");
236 shortAction = moveSel
239 ?
XO(
"Align/Move Start")
243 delta = selectedRegion.t0() - minOffset();
245 ?
XO(
"Aligned/Moved start to cursor/selection start")
246 :
XO(
"Aligned start to cursor/selection start");
247 shortAction = moveSel
248 ?
XO(
"Align/Move Start")
252 delta = selectedRegion.t1() - minOffset();
254 ?
XO(
"Aligned/Moved start to selection end")
255 :
XO(
"Aligned start to selection end");
256 shortAction = moveSel
257 ?
XO(
"Align/Move Start")
261 delta = selectedRegion.t0() - maxEndOffset();
263 ?
XO(
"Aligned/Moved end to cursor/selection start")
264 :
XO(
"Aligned end to cursor/selection start");
267 ?
XO(
"Align/Move End")
271 delta = selectedRegion.t1() - maxEndOffset();
273 ?
XO(
"Aligned/Moved end to selection end")
274 :
XO(
"Aligned end to selection end");
277 ?
XO(
"Align/Move End")
282 newPos = firstTrackOffset();
284 ?
XO(
"Aligned/Moved end to end")
285 :
XO(
"Aligned end to end");
288 ?
XO(
"Align/Move End to End")
289 :
XO(
"Align End to End");
292 newPos = avgOffset();
294 ?
XO(
"Aligned/Moved together")
295 :
XO(
"Aligned together");
298 ?
XO(
"Align/Move Together")
299 :
XO(
"Align Together");
304 for (
auto t : tracks.SelectedLeaders<
AudioTrack >()) {
313 for (
auto channel : channels)
315 channel->SetOffset(newPos + channel->GetStartTime() - trackStart);
318 newPos += (trackEnd - trackStart);
326 for (
auto t : tracks.Any()
328 t->SetOffset(t->GetOffset() + delta);
332 selectedRegion.move(delta);
337#ifdef EXPERIMENTAL_SCOREALIGN
352#define AUDIO_WORK_UNIT 0.004F
353#define MIDI_WORK_UNIT 0.0001F
354#define MATRIX_WORK_UNIT 0.000002F
355#define SMOOTHING_WORK_UNIT 0.000001F
361#define COLLECT_TIMING_DATA
364class ASAProgress final :
public SAProgress {
371 std::optional<ProgressDialog> mProgress;
372 #ifdef COLLECT_TIMING_DATA
374 wxDateTime mStartTime;
381 #ifdef COLLECT_TIMING_DATA
382 mTimeFile = fopen(
"timing-data.txt",
"w");
386 #ifdef COLLECT_TIMING_DATA
390 void set_phase(
int i)
override {
392 float work2, work3 = 0;
393 SAProgress::set_phase(i);
394 #ifdef COLLECT_TIMING_DATA
396 wxDateTime now = wxDateTime::UNow();
397 wxFprintf(mTimeFile,
"Phase %d begins at %s\n",
398 i, now.FormatTime());
400 ms = now.Subtract(mStartTime).GetMilliseconds().ToLong();
405 for (
int j = 0; j < 2; j++) {
406 mFrames[j] = durations[j] / frame_period;
409 for (
int j = 0; j < 2; j++) {
411 (is_audio[j] ? AUDIO_WORK_UNIT : MIDI_WORK_UNIT) * mFrames[j];
412 mTotalWork += work[j];
414 mTotalCells = mFrames[0] * mFrames[1];
415 work2 = mTotalCells * MATRIX_WORK_UNIT;
421 wxMax(mFrames[0], mFrames[1]) * SMOOTHING_WORK_UNIT * 40;
424 #ifdef COLLECT_TIMING_DATA
426 " mTotalWork (an estimate) = %g\n", mTotalWork);
427 wxFprintf(mTimeFile,
" work0 = %g, frames %g, is_audio %d\n",
428 work[0], mFrames[0], is_audio[0]);
429 wxFprintf(mTimeFile,
" work1 = %g, frames %g, is_audio %d\n",
430 work[1], mFrames[1], is_audio[1]);
431 wxFprintf(mTimeFile,
"work2 = %g, work3 = %g\n", work2, work3);
433 mProgress.emplace(
XO(
"Synchronize MIDI with Audio"),
434 XO(
"Synchronizing MIDI and Audio Tracks"));
437 "Phase %d took %d ms for %g frames, coefficient = %g s/frame\n",
438 i - 1, ms, mFrames[i - 1], (ms * 0.001) / mFrames[i - 1]);
441 "Phase 2 took %d ms for %d cells, coefficient = %g s/cell\n",
442 ms, mCellCount, (ms * 0.001) / mCellCount);
445 "Phase 3 took %d ms for %d iterations on %g frames, "
446 "coefficient = %g s per frame per iteration\n",
447 ms, iterations, wxMax(mFrames[0], mFrames[1]),
448 (ms * 0.001) / (wxMax(mFrames[0], mFrames[1]) * iterations));
451 bool set_feature_progress(
float s)
override {
454 float f = s / frame_period;
455 work = (is_audio[0] ? AUDIO_WORK_UNIT : MIDI_WORK_UNIT) * f;
456 }
else if (phase == 1) {
457 float f = s / frame_period;
458 work = (is_audio[0] ? AUDIO_WORK_UNIT : MIDI_WORK_UNIT) * mFrames[0] +
459 (is_audio[1] ? AUDIO_WORK_UNIT : MIDI_WORK_UNIT) * f;
461 auto updateResult = mProgress->Update((
int)(work), (
int)(mTotalWork));
464 bool set_matrix_progress(
int cells)
override {
467 (is_audio[0] ? AUDIO_WORK_UNIT : MIDI_WORK_UNIT) * mFrames[0] +
468 (is_audio[1] ? AUDIO_WORK_UNIT : MIDI_WORK_UNIT) * mFrames[1];
469 work += mCellCount * MATRIX_WORK_UNIT;
470 auto updateResult = mProgress->Update((
int)(work), (
int)(mTotalWork));
473 bool set_smoothing_progress(
int i)
override {
476 (is_audio[0] ? AUDIO_WORK_UNIT : MIDI_WORK_UNIT) * mFrames[0] +
477 (is_audio[1] ? AUDIO_WORK_UNIT : MIDI_WORK_UNIT) * mFrames[1] +
478 MATRIX_WORK_UNIT * mFrames[0] * mFrames[1];
479 work += i * wxMax(mFrames[0], mFrames[1]) * SMOOTHING_WORK_UNIT;
480 auto updateResult = mProgress->Update((
int)(work), (
int)(mTotalWork));
486long mixer_process(
void *mixer,
float **buffer,
long n)
489 long frame_count = mix->
Process(std::max(0L, n));
503 auto GetTime = [](
const Track *t) {
504 return t->TypeSwitch<
double >(
506 auto stime = w->GetEndTime();
509 for (ndx = 0; ndx < w->GetNumClips(); ndx++) {
510 const auto c = w->GetClipByIndex(ndx);
511 if (c->GetPlaySamplesCount() == 0)
513 stime =
std::min(stime, c->GetPlayStartTime());
518 return l->GetStartTime();
526 std::vector<TrackNodePointer> arr;
528 arr.reserve(tracks.size());
533 for (
auto iter = tracks.ListOfTracks::begin(),
534 end = tracks.ListOfTracks::end(); iter !=
end; ++iter) {
535 const auto &track = *iter;
536 if ( !track->IsLeader() )
540 auto size = arr.size();
541 for (ndx = 0; ndx <
size;) {
542 Track &arrTrack = **arr[ndx].first;
552 auto cmpValue = track->GetName().CmpNoCase(arrTrack.
GetName());
555 track->GetName().CompareTo(arrTrack.
GetName()) > 0 ) )
563 auto time2 = channels.min( GetTime );
568 ndx += channels.size();
581 float newValue = slider->
Get();
584 channel->SetGain(newValue);
595 float newValue = slider->
Get();
598 channel->SetPan(newValue);
622 auto &project = context.
project;
628 auto &project = context.
project;
634 auto &project = context.
project;
649 rate.Printf(
wxT(
"%ld"),
lrint(projectRate));
667 S.StartVerticalLay(
true);
671 S.StartHorizontalLay(wxCENTER,
false);
673 cb =
S.AddCombo(
XXO(
"New sample rate (Hz):"),
677 S.EndHorizontalLay();
681 S.AddStandardButtons();
689 if (dlg.ShowModal() != wxID_OK)
695 if (cb->GetValue().ToLong(&lrate) && lrate >= 1 && lrate <= 1000000)
697 newRate = (int)lrate;
702 XO(
"The entered value is invalid"),
710 for (
auto wt : tracks.Selected<
WaveTrack >())
712 auto msg =
XO(
"Resampling track %d").Format( ++ndx );
722 wt->Resample(newRate, progress.get());
729 XO(
"Resampled audio track(s)"),
XO(
"Resample Track"), flags);
733 undoManager.StopConsolidating();
736 window.FinishAutoScroll();
746 auto &project = context.
project;
751 auto soloSimple =
settings.IsSoloSimple();
752 auto soloNone =
settings.IsSoloNone();
758 if (soloSimple || soloNone)
787 auto &project = context.
project;
793 auto &project = context.
project;
799 auto &project = context.
project;
805 auto &project = context.
project;
813 auto &project = context.
project;
816 gPrefs->Read(
wxT(
"/GUI/MoveSelectionWithTracks"), &bMoveWith,
false);
831 gPrefs->Read(
wxT(
"/GUI/MoveSelectionWithTracks"), &bMoveWith,
false);
832 gPrefs->Write(
wxT(
"/GUI/MoveSelectionWithTracks"), !bMoveWith);
837#ifdef EXPERIMENTAL_SCOREALIGN
840 auto &project = context.
project;
844 int numWaveTracksSelected = 0;
845 int numNoteTracksSelected = 0;
846 int numOtherTracksSelected = 0;
847 double endTime = 0.0;
851 tracks.Selected().Visit(
853 numWaveTracksSelected++;
857 numNoteTracksSelected++;
860 numOtherTracksSelected++;
864 if(numWaveTracksSelected == 0 ||
865 numNoteTracksSelected != 1 ||
866 numOtherTracksSelected != 0){
868 XO(
"Please select at least one audio track and one MIDI track.") );
880 CloseScoreAlignDialog();
882 if (
params.mStatus != wxID_OK)
return;
888 auto holder = nt->Duplicate();
889 auto alignedNoteTrack =
static_cast<NoteTrack*
>(holder.get());
892 if (alignedNoteTrack->GetOffset() < 0) {
894 nt->
Clear(alignedNoteTrack->GetOffset(), 0);
895 }
else if (alignedNoteTrack->GetOffset() > 0) {
896 alignedNoteTrack->Shift(alignedNoteTrack->GetOffset());
898 alignedNoteTrack->SetOffset(0);
901 tracks->GetWaveTrackConstArray(
true );
919 ASAProgress progress;
927#ifndef SKIP_ACTUAL_SCORE_ALIGNMENT
928 result = scorealign((
void *) &mix, &mixer_process,
929 2 , 44100.0 , endTime,
930 &alignedNoteTrack->GetSeq(), &progress,
params);
936 if (result == SA_SUCCESS) {
937 tracks->Replace(nt, holder);
939 XO(
"Alignment completed: MIDI from %.2f to %.2f secs, Audio from %.2f to %.2f secs.")
944 .
PushState(
XO(
"Sync MIDI with Audio"),
XO(
"Sync MIDI with Audio"));
945 }
else if (result == SA_TOOSHORT) {
948"Alignment error: input too short: MIDI from %.2f to %.2f secs, Audio from %.2f to %.2f secs.")
952 }
else if (result == SA_CANCEL) {
965 auto &project = context.
project;
974 auto &project = context.
project;
983 auto &project = context.
project;
992 trackPanel.Refresh(
false);
999 auto &project = context.
project;
1003 if (track) track->TypeSwitch( [&](
WaveTrack *wt) {
1012 auto &project = context.
project;
1016 if (track) track->TypeSwitch( [&](
WaveTrack *wt) {
1025 auto &project = context.
project;
1029 if (track) track->TypeSwitch( [&](
WaveTrack *wt) {
1038 auto &project = context.
project;
1043 if (track) track->TypeSwitch( [&](
WaveTrack *wt) {
1052 auto &project = context.
project;
1056 if (track) track->TypeSwitch( [&](
WaveTrack *wt) {
1065 auto &project = context.
project;
1069 if (track) track->TypeSwitch( [&](
WaveTrack *wt) {
1078 auto &project = context.
project;
1081 trackPanel.OnTrackMenu();
1086 auto &project = context.
project;
1100 auto &project = context.
project;
1110 auto &project = context.
project;
1122 XO(
"Can't delete track with active audio"));
1129 trackPanel.UpdateViewIfNoTracks();
1130 trackPanel.Refresh(
false);
1135 auto &project = context.
project;
1140 if (tracks.CanMoveUp(focusedTrack)) {
1142 trackPanel.Refresh(
false);
1148 auto &project = context.
project;
1153 if (tracks.CanMoveDown(focusedTrack)) {
1155 trackPanel.Refresh(
false);
1161 auto &project = context.
project;
1166 if (tracks.CanMoveUp(focusedTrack)) {
1168 trackPanel.Refresh(
false);
1174 auto &project = context.
project;
1179 if (tracks.CanMoveDown(focusedTrack)) {
1181 trackPanel.Refresh(
false);
1224 XXO(
"Mix and Render to Ne&w Track"),
1273 {
wxT(
"EndToEnd"),
XXO(
"&Align End to End") },
1274 {
wxT(
"Together"),
XXO(
"Align &Together") },
1288 XXO(
"&Move Selection with Tracks (on/off)"),
1298 Menu(
wxT(
"MoveSelectionAndTracks"),
XO(
"Move Sele&ction and Tracks"), {
1306 #ifdef EXPERIMENTAL_SCOREALIGN
1307 Command(
wxT(
"ScoreAlign"),
XXO(
"Synchronize MIDI with Audio"),
1327 Command(
wxT(
"SyncLock"),
XXO(
"Sync-&Lock Tracks (on/off)"),
1346 Command(
wxT(
"TrackPan"),
XXO(
"Change P&an on Focused Track..."),
1349 Command(
wxT(
"TrackPanLeft"),
XXO(
"Pan &Left on Focused Track"),
1352 Command(
wxT(
"TrackPanRight"),
XXO(
"Pan &Right on Focused Track"),
1355 Command(
wxT(
"TrackGain"),
XXO(
"Change Gai&n on Focused Track..."),
1358 Command(
wxT(
"TrackGainInc"),
XXO(
"&Increase Gain on Focused Track"),
1361 Command(
wxT(
"TrackGainDec"),
XXO(
"&Decrease Gain on Focused Track"),
1364 Command(
wxT(
"TrackMenu"),
XXO(
"Op&en Menu on Focused Track..."),
1368 Command(
wxT(
"TrackMute"),
XXO(
"M&ute/Unmute Focused Track"),
1371 Command(
wxT(
"TrackSolo"),
XXO(
"&Solo/Unsolo Focused Track"),
1381 Command(
wxT(
"TrackMoveDown"),
XXO(
"Move Focused Track Do&wn"),
1384 Command(
wxT(
"TrackMoveTop"),
XXO(
"Move Focused Track to T&op"),
1387 Command(
wxT(
"TrackMoveBottom"),
XXO(
"Move Focused Track to &Bottom"),
1395 wxT(
"Optional/Extra/Part2"),
int AudacityMessageBox(const TranslatableString &message, const TranslatableString &caption, long style, wxWindow *parent, int x, int y)
AttachedItem sAttachment1
AttachedItem sAttachment2
constexpr CommandFlag AlwaysEnabledFlag
const ReservedCommandFlag & AudioIONotBusyFlag()
const ReservedCommandFlag & StereoRequiredFlag()
const ReservedCommandFlag & EditableTracksSelectedFlag()
const ReservedCommandFlag & AnyTracksSelectedFlag()
const ReservedCommandFlag & TracksExistFlag()
const ReservedCommandFlag & WaveTracksSelectedFlag()
const ReservedCommandFlag & TrackPanelHasFocus()
EffectDistortionSettings params
std::vector< std::shared_ptr< const WaveTrack > > WaveTrackConstArray
XXO("&Cut/Copy/Paste Toolbar")
void MixAndRender(const TrackIterRange< const WaveTrack > &trackRange, const Mixer::WarpOptions &warpOptions, const wxString &newTrackName, WaveTrackFactory *trackFactory, double rate, sampleFormat format, double startTime, double endTime, WaveTrack::Holder &uLeft, WaveTrack::Holder &uRight)
Mixes together all input tracks, applying any envelopes, amplitude gain, panning, and real-time effec...
an object holding per-project preferred sample rate
BoolSetting SyncLockTracks
std::pair< ListOfTracks::iterator, ListOfTracks * > TrackNodePointer
Pairs a std::list iterator and a pointer to a list, for comparison purposes.
static Settings & settings()
The top-level handle to an Audacity project. It serves as a source of events that other objects can b...
Track subclass holding data representing sound (as notes, or samples, or ...)
bool Toggle()
Write the negation of the previous value, and then return the current value.
size_t size() const
How many attachment pointers are in the Site.
Subclass & Get(const RegisteredFactory &key)
Get reference to an attachment, creating on demand if not present, down-cast it to Subclass.
CommandContext provides additional information to an 'Apply()' command. It provides the project,...
TemporarySelection temporarySelection
AudacityProject & project
static EffectManager & Get()
const PluginID & GetEffectByIdentifier(const CommandID &strTarget)
virtual bool Flush(bool bCurrentOnly=false) wxOVERRIDE
Lightweight version of ASlider. In other words it does not have a window permanently associated with ...
void Decrease(float steps)
void Increase(float steps)
float Get(bool convert=true)
A LabelTrack is a Track that holds labels (LabelStruct).
Functions for doing the mixdown of the tracks.
size_t Process(size_t maxSamples)
constSamplePtr GetBuffer()
Retrieve the main buffer or the interleaved buffer.
A Track that is used for Midi notes. (Somewhat old code).
void Clear(double t0, double t1) override
AudioTrack subclass that can also be audibly replayed by the program.
const PluginDescriptor * GetPlugin(const PluginID &ID) const
static PluginManager & Get()
bool IsAudioActive() const
static ProjectAudioIO & Get(AudacityProject &project)
void PushState(const TranslatableString &desc, const TranslatableString &shortDesc)
void ModifyState(bool bWantsAutoSave)
static ProjectHistory & Get(AudacityProject &project)
static ProjectRate & Get(AudacityProject &project)
static ProjectSettings & Get(AudacityProject &project)
static ProjectStatus & Get(AudacityProject &project)
void Set(const TranslatableString &msg, StatusBarField field=mainStatusBarField)
static ProjectWindow & Get(AudacityProject &project)
ScoreAlignDialog is \TODO.
Derived from ShuttleGuiBase, an Audacity specific class for shuttling data to and from GUI.
static bool IsSelectedOrSyncLockSelected(const Track *pTrack)
Abstract base class for an object holding data associated with points on a time axis.
void EnsureVisible(bool modifyState=false)
virtual double GetStartTime() const =0
virtual double GetOffset() const =0
virtual double GetEndTime() const =0
static TrackList & Get(AudacityProject &project)
auto Selected() -> TrackIterRange< TrackType >
static auto Channels(TrackType *pTrack) -> TrackIterRange< TrackType >
static TrackPanel & Get(AudacityProject &project)
void RefreshTrack(Track *trk, bool refreshbacking=true)
Holds a msgid for the translation catalog; may also bind format arguments.
static UndoManager & Get(AudacityProject &project)
NotifyingSelectedRegion selectedRegion
static ViewInfo & Get(AudacityProject &project)
static LWSlider * PanSlider(CellularPanel &panel, const WaveTrack &wt)
static LWSlider * GainSlider(CellularPanel &panel, const WaveTrack &wt)
static WaveTrackFactory & Get(AudacityProject &project)
A Track that contains audio waveform data.
double GetEndTime() const override
Get the time at which the last clip in the track ends, plus recorded stuff.
std::shared_ptr< WaveTrack > Holder
Extend wxArrayString with move operations and construction and insertion fromstd::initializer_list.
std::unique_ptr< ProgressDialog > MakeProgress(const TranslatableString &title, const TranslatableString &message, unsigned flags=(ProgressShowStop|ProgressShowCancel), const TranslatableString &remainingLabelText={})
Create and display a progress dialog.
AUDACITY_DLL_API bool DoEffect(const PluginID &ID, const CommandContext &context, unsigned flags)
'Repeat Last Effect'.
auto end(const Ptr< Type, BaseDeleter > &p)
Enables range-for.
auto begin(const Ptr< Type, BaseDeleter > &p)
Enables range-for.
PROJECT_RATE_API sampleFormat SampleFormatChoice()
std::unique_ptr< BaseItem > BaseItemPtr
std::shared_ptr< BaseItem > BaseItemSharedPtr
void DoTrackMute(AudacityProject &project, Track *t, bool exclusive)
void DoMoveTrack(AudacityProject &project, Track *target, MoveChoice choice)
Move a track up, down, to top or to bottom.
void DoTrackSolo(AudacityProject &project, Track *t, bool exclusive)
void DoRemoveTrack(AudacityProject &project, Track *toRemove)
void DoRemoveTracks(AudacityProject &project)
CommandManager::Options Options
Options && CheckTest(const CheckFn &fn) &&
Options && LongName(const TranslatableString &value) &&
Immutable structure is an argument to Mixer's constructor.