mirror of
https://github.com/cookiengineer/audacity
synced 2025-06-19 09:30:06 +02:00
Remove naked new and delete in effect preview
This commit is contained in:
parent
52cb094f0f
commit
a0a76e86d1
@ -2533,129 +2533,127 @@ void Effect::Preview(bool dryOnly)
|
|||||||
if (!mPreviewFullSelection)
|
if (!mPreviewFullSelection)
|
||||||
mT1 = t1;
|
mT1 = t1;
|
||||||
|
|
||||||
// Save the original track list
|
|
||||||
TrackList *saveTracks = mTracks;
|
|
||||||
|
|
||||||
// Build NEW tracklist from rendering tracks
|
|
||||||
mTracks = new TrackList();
|
|
||||||
|
|
||||||
// Linear Effect preview optimised by pre-mixing to one track.
|
|
||||||
// Generators need to generate per track.
|
|
||||||
if (mIsLinearEffect && !isGenerator) {
|
|
||||||
WaveTrack::Holder mixLeft, mixRight;
|
|
||||||
MixAndRender(saveTracks, mFactory, rate, floatSample, mT0, t1, mixLeft, mixRight);
|
|
||||||
if (!mixLeft) {
|
|
||||||
delete mTracks;
|
|
||||||
mTracks = saveTracks;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
mixLeft->Offset(-mixLeft->GetStartTime());
|
|
||||||
mixLeft->InsertSilence(0.0, mT0);
|
|
||||||
mixLeft->SetSelected(true);
|
|
||||||
mixLeft->SetDisplay(WaveTrack::NoDisplay);
|
|
||||||
mTracks->Add(std::move(mixLeft));
|
|
||||||
if (mixRight) {
|
|
||||||
mixRight->Offset(-mixRight->GetStartTime());
|
|
||||||
mixRight->InsertSilence(0.0, mT0);
|
|
||||||
mixRight->SetSelected(true);
|
|
||||||
mTracks->Add(std::move(mixRight));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
TrackListOfKindIterator iter(Track::Wave, saveTracks);
|
|
||||||
WaveTrack *src = (WaveTrack *) iter.First();
|
|
||||||
while (src)
|
|
||||||
{
|
|
||||||
if (src->GetSelected() || mPreviewWithNotSelected) {
|
|
||||||
auto dest = src->Copy(mT0, t1);
|
|
||||||
dest->InsertSilence(0.0, mT0);
|
|
||||||
dest->SetSelected(src->GetSelected());
|
|
||||||
static_cast<WaveTrack*>(dest.get())->SetDisplay(WaveTrack::NoDisplay);
|
|
||||||
mTracks->Add(std::move(dest));
|
|
||||||
}
|
|
||||||
src = (WaveTrack *) iter.Next();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Update track/group counts
|
|
||||||
CountWaveTracks();
|
|
||||||
|
|
||||||
// Apply effect
|
|
||||||
if (!dryOnly) {
|
|
||||||
ProgressDialog progress(GetName(),
|
|
||||||
_("Preparing preview"),
|
|
||||||
pdlgHideCancelButton); // Have only "Stop" button.
|
|
||||||
SetProgress sp(mProgress, &progress);
|
|
||||||
mIsPreview = true;
|
|
||||||
success = Process();
|
|
||||||
mIsPreview = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (success)
|
|
||||||
{
|
{
|
||||||
WaveTrackArray playbackTracks;
|
// Save the original track list
|
||||||
WaveTrackArray recordingTracks;
|
TrackList *saveTracks = mTracks;
|
||||||
|
auto cleanup = finally( [&] { mTracks = saveTracks; } );
|
||||||
|
|
||||||
SelectedTrackListOfKindIterator iter(Track::Wave, mTracks);
|
// Build NEW tracklist from rendering tracks
|
||||||
WaveTrack *src = (WaveTrack *) iter.First();
|
auto uTracks = std::make_unique<TrackList>();
|
||||||
while (src) {
|
mTracks = uTracks.get();
|
||||||
playbackTracks.push_back(src);
|
|
||||||
src = (WaveTrack *) iter.Next();
|
// Linear Effect preview optimised by pre-mixing to one track.
|
||||||
|
// Generators need to generate per track.
|
||||||
|
if (mIsLinearEffect && !isGenerator) {
|
||||||
|
WaveTrack::Holder mixLeft, mixRight;
|
||||||
|
MixAndRender(saveTracks, mFactory, rate, floatSample, mT0, t1, mixLeft, mixRight);
|
||||||
|
if (!mixLeft)
|
||||||
|
return;
|
||||||
|
|
||||||
|
mixLeft->Offset(-mixLeft->GetStartTime());
|
||||||
|
mixLeft->InsertSilence(0.0, mT0);
|
||||||
|
mixLeft->SetSelected(true);
|
||||||
|
mixLeft->SetDisplay(WaveTrack::NoDisplay);
|
||||||
|
mTracks->Add(std::move(mixLeft));
|
||||||
|
if (mixRight) {
|
||||||
|
mixRight->Offset(-mixRight->GetStartTime());
|
||||||
|
mixRight->InsertSilence(0.0, mT0);
|
||||||
|
mixRight->SetSelected(true);
|
||||||
|
mTracks->Add(std::move(mixRight));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// Some effects (Paulstretch) may need to generate more
|
else {
|
||||||
// than previewLen, so take the min.
|
TrackListOfKindIterator iter(Track::Wave, saveTracks);
|
||||||
t1 = std::min(mT0 + previewLen, mT1);
|
WaveTrack *src = (WaveTrack *) iter.First();
|
||||||
|
while (src)
|
||||||
|
{
|
||||||
|
if (src->GetSelected() || mPreviewWithNotSelected) {
|
||||||
|
auto dest = src->Copy(mT0, t1);
|
||||||
|
dest->InsertSilence(0.0, mT0);
|
||||||
|
dest->SetSelected(src->GetSelected());
|
||||||
|
static_cast<WaveTrack*>(dest.get())->SetDisplay(WaveTrack::NoDisplay);
|
||||||
|
mTracks->Add(std::move(dest));
|
||||||
|
}
|
||||||
|
src = (WaveTrack *) iter.Next();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Update track/group counts
|
||||||
|
CountWaveTracks();
|
||||||
|
|
||||||
|
// Apply effect
|
||||||
|
if (!dryOnly) {
|
||||||
|
ProgressDialog progress(GetName(),
|
||||||
|
_("Preparing preview"),
|
||||||
|
pdlgHideCancelButton); // Have only "Stop" button.
|
||||||
|
SetProgress sp(mProgress, &progress);
|
||||||
|
mIsPreview = true;
|
||||||
|
success = Process();
|
||||||
|
mIsPreview = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (success)
|
||||||
|
{
|
||||||
|
WaveTrackArray playbackTracks;
|
||||||
|
WaveTrackArray recordingTracks;
|
||||||
|
|
||||||
|
SelectedTrackListOfKindIterator iter(Track::Wave, mTracks);
|
||||||
|
WaveTrack *src = (WaveTrack *) iter.First();
|
||||||
|
while (src) {
|
||||||
|
playbackTracks.push_back(src);
|
||||||
|
src = (WaveTrack *) iter.Next();
|
||||||
|
}
|
||||||
|
// Some effects (Paulstretch) may need to generate more
|
||||||
|
// than previewLen, so take the min.
|
||||||
|
t1 = std::min(mT0 + previewLen, mT1);
|
||||||
|
|
||||||
#ifdef EXPERIMENTAL_MIDI_OUT
|
#ifdef EXPERIMENTAL_MIDI_OUT
|
||||||
NoteTrackArray empty;
|
NoteTrackArray empty;
|
||||||
#endif
|
#endif
|
||||||
// Start audio playing
|
// Start audio playing
|
||||||
AudioIOStartStreamOptions options { rate };
|
AudioIOStartStreamOptions options { rate };
|
||||||
int token =
|
int token =
|
||||||
gAudioIO->StartStream(playbackTracks, recordingTracks,
|
gAudioIO->StartStream(playbackTracks, recordingTracks,
|
||||||
#ifdef EXPERIMENTAL_MIDI_OUT
|
#ifdef EXPERIMENTAL_MIDI_OUT
|
||||||
empty,
|
empty,
|
||||||
#endif
|
#endif
|
||||||
mT0, t1, options);
|
mT0, t1, options);
|
||||||
|
|
||||||
if (token) {
|
if (token) {
|
||||||
int previewing = eProgressSuccess;
|
int previewing = eProgressSuccess;
|
||||||
// The progress dialog must be deleted before stopping the stream
|
// The progress dialog must be deleted before stopping the stream
|
||||||
// to allow events to flow to the app during StopStream processing.
|
// to allow events to flow to the app during StopStream processing.
|
||||||
// The progress dialog blocks these events.
|
// The progress dialog blocks these events.
|
||||||
{
|
{
|
||||||
ProgressDialog progress
|
ProgressDialog progress
|
||||||
(GetName(), _("Previewing"), pdlgHideCancelButton);
|
(GetName(), _("Previewing"), pdlgHideCancelButton);
|
||||||
|
|
||||||
while (gAudioIO->IsStreamActive(token) && previewing == eProgressSuccess) {
|
while (gAudioIO->IsStreamActive(token) && previewing == eProgressSuccess) {
|
||||||
|
::wxMilliSleep(100);
|
||||||
|
previewing = progress.Update(gAudioIO->GetStreamTime() - mT0, t1 - mT0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
gAudioIO->StopStream();
|
||||||
|
|
||||||
|
while (gAudioIO->IsBusy()) {
|
||||||
::wxMilliSleep(100);
|
::wxMilliSleep(100);
|
||||||
previewing = progress.Update(gAudioIO->GetStreamTime() - mT0, t1 - mT0);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
gAudioIO->StopStream();
|
wxMessageBox(_("Error opening sound device. Try changing the audio host, playback device and the project sample rate."),
|
||||||
|
_("Error"), wxOK | wxICON_EXCLAMATION, FocusDialog);
|
||||||
while (gAudioIO->IsBusy()) {
|
|
||||||
::wxMilliSleep(100);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
wxMessageBox(_("Error opening sound device. Try changing the audio host, playback device and the project sample rate."),
|
if (FocusDialog) {
|
||||||
_("Error"), wxOK | wxICON_EXCLAMATION, FocusDialog);
|
FocusDialog->SetFocus();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mOutputTracks.reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (FocusDialog) {
|
|
||||||
FocusDialog->SetFocus();
|
|
||||||
}
|
|
||||||
|
|
||||||
mOutputTracks.reset();
|
|
||||||
|
|
||||||
mTracks->Clear();
|
|
||||||
delete mTracks;
|
|
||||||
|
|
||||||
mTracks = saveTracks;
|
|
||||||
mT0 = oldT0;
|
mT0 = oldT0;
|
||||||
mT1 = oldT1;
|
mT1 = oldT1;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user