diff --git a/src/Menus.cpp b/src/Menus.cpp index ea534b946..649fd0366 100644 --- a/src/Menus.cpp +++ b/src/Menus.cpp @@ -5607,14 +5607,15 @@ bool AudacityProject::DoEditMetadata void AudacityProject::HandleMixAndRender(bool toNewTrack) { - WaveTrack *newLeft = NULL; - WaveTrack *newRight = NULL; - wxGetApp().SetMissingAliasedFileWarningShouldShow(true); - if (::MixAndRender(mTracks, mTrackFactory, mRate, mDefaultFormat, 0.0, 0.0, - &newLeft, &newRight)) { + auto results = + ::MixAndRender(mTracks, mTrackFactory, mRate, mDefaultFormat, 0.0, 0.0); + auto &uNewLeft = results.first, &uNewRight = results.second; + const auto newLeft = uNewLeft.get(); + const auto newRight = uNewRight.get(); + if (newLeft) { // Remove originals, get stats on what tracks were mixed TrackListIterator iter(mTracks); @@ -5644,9 +5645,9 @@ void AudacityProject::HandleMixAndRender(bool toNewTrack) // Add NEW tracks - mTracks->Add(newLeft); + mTracks->Add(uNewLeft.release()); if (newRight) - mTracks->Add(newRight); + mTracks->Add(uNewRight.release()); // If we're just rendering (not mixing), keep the track name the same if (selectedCount==1) { diff --git a/src/Mix.cpp b/src/Mix.cpp index b4d1d578e..94d64244f 100644 --- a/src/Mix.cpp +++ b/src/Mix.cpp @@ -43,10 +43,10 @@ #include "float_cast.h" //TODO-MB: wouldn't it make more sense to DELETE the time track after 'mix and render'? -bool MixAndRender(TrackList *tracks, TrackFactory *trackFactory, +std::pair<WaveTrack::Holder, WaveTrack::Holder> +MixAndRender(TrackList *tracks, TrackFactory *trackFactory, double rate, sampleFormat format, - double startTime, double endTime, - WaveTrack **newLeft, WaveTrack **newRight) + double startTime, double endTime) { // This function was formerly known as "Quick Mix". Track *t; @@ -121,18 +121,18 @@ bool MixAndRender(TrackList *tracks, TrackFactory *trackFactory, oneinput = true; // only one input track (either 1 mono or one linked stereo pair) - WaveTrack *mixLeft = trackFactory->NewWaveTrack(format, rate).release(); + auto mixLeft = trackFactory->NewWaveTrack(format, rate); if (oneinput) mixLeft->SetName(usefulIter.First()->GetName()); /* set name of output track to be the same as the sole input track */ else mixLeft->SetName(_("Mix")); mixLeft->SetOffset(mixStartTime); - WaveTrack *mixRight = 0; + decltype(mixLeft) mixRight{}; if (mono) { mixLeft->SetChannel(Track::MonoChannel); } else { - mixRight = trackFactory->NewWaveTrack(format, rate).release(); + mixRight = trackFactory->NewWaveTrack(format, rate); if (oneinput) { if (usefulIter.First()->GetLink() != NULL) // we have linked track mixLeft->SetName(usefulIter.First()->GetLink()->GetName()); /* set name to match input track's right channel!*/ @@ -197,14 +197,13 @@ bool MixAndRender(TrackList *tracks, TrackFactory *trackFactory, mixRight->Flush(); if (updateResult == eProgressCancelled || updateResult == eProgressFailed) { - delete mixLeft; - if (!mono) - delete mixRight; - } else { - *newLeft = mixLeft; - if (!mono) - *newRight = mixRight; - + return{}; + } + else { + return std::make_pair( + std::move(mixLeft), + std::move(mixRight) + ); #if 0 int elapsedMS = wxGetElapsedTime(); double elapsedTime = elapsedMS * 0.001; @@ -218,7 +217,6 @@ bool MixAndRender(TrackList *tracks, TrackFactory *trackFactory, printf("Max number of tracks to mix in real time: %f\n", maxTracks); #endif } - return (updateResult == eProgressSuccess || updateResult == eProgressStopped); } Mixer::WarpOptions::WarpOptions(double min, double max) diff --git a/src/Mix.h b/src/Mix.h index 2df4a2115..585080427 100644 --- a/src/Mix.h +++ b/src/Mix.h @@ -12,6 +12,8 @@ #ifndef __AUDACITY_MIX__ #define __AUDACITY_MIX__ +#include "MemoryX.h" +#include <utility> #include <wx/string.h> #include "SampleFormat.h" @@ -36,10 +38,12 @@ class WaveTrackConstArray; * no explicit time range to process, and the whole occupied length of the * input tracks is processed. */ -bool MixAndRender(TrackList * tracks, TrackFactory *factory, +std::pair< + std::unique_ptr<WaveTrack>, + std::unique_ptr<WaveTrack> +> MixAndRender(TrackList * tracks, TrackFactory *factory, double rate, sampleFormat format, - double startTime, double endTime, - WaveTrack **newLeft, WaveTrack **newRight); + double startTime, double endTime); void MixBuffers(int numChannels, int *channelFlags, float *gains, samplePtr src, diff --git a/src/effects/Effect.cpp b/src/effects/Effect.cpp index 16b3fcaa8..9227150a6 100644 --- a/src/effects/Effect.cpp +++ b/src/effects/Effect.cpp @@ -2551,8 +2551,6 @@ void Effect::Preview(bool dryOnly) return; bool success = true; - WaveTrack *mixLeft = NULL; - WaveTrack *mixRight = NULL; double oldT0 = mT0; double oldT1 = mT1; // Most effects should stop at t1. @@ -2568,9 +2566,10 @@ void Effect::Preview(bool dryOnly) // Linear Effect preview optimised by pre-mixing to one track. // Generators need to generate per track. if (mIsLinearEffect && !isGenerator) { - success = ::MixAndRender(saveTracks, mFactory, rate, floatSample, mT0, t1, - &mixLeft, &mixRight); - if (!success) { + auto results = ::MixAndRender(saveTracks, mFactory, rate, floatSample, mT0, t1); + auto &mixLeft = results.first; + auto &mixRight = results.second; + if (!mixLeft) { delete mTracks; mTracks = saveTracks; return; @@ -2580,12 +2579,12 @@ void Effect::Preview(bool dryOnly) mixLeft->InsertSilence(0.0, mT0); mixLeft->SetSelected(true); mixLeft->SetDisplay(WaveTrack::NoDisplay); - mTracks->Add(mixLeft); + mTracks->Add(mixLeft.release()); if (mixRight) { mixRight->Offset(-mixRight->GetStartTime()); mixRight->InsertSilence(0.0, mT0); mixRight->SetSelected(true); - mTracks->Add(mixRight); + mTracks->Add(mixRight.release()); } } else {