MixAndRender returns unique_ptr results (in a std::pair)

This commit is contained in:
Paul Licameli 2016-03-13 03:14:46 -04:00
parent 3015a9c8d9
commit c4fc7e2bf0
4 changed files with 34 additions and 32 deletions

View File

@ -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) {

View File

@ -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)

View File

@ -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,

View File

@ -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 {