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 {