Audacity 3.2.0
src/effects/Generator.cpp
Go to the documentation of this file.
1/**********************************************************************
2
3 Audacity: A Digital Audio Editor
4
5 Generator.h
6
7 Two Abstract classes, Generator, and BlockGenerator, that effects which
8 generate audio should derive from.
9
10 Block Generator breaks the synthesis task up into smaller parts.
11
12 Dominic Mazzoni
13 Vaughan Johnson
14
15**********************************************************************/
16
17#include "Generator.h"
18
19#include "Project.h"
20#include "Prefs.h"
21#include "SyncLock.h"
22#include "ViewInfo.h"
23#include "WaveTrack.h"
24
25#include "TimeWarper.h"
26
27#include "AudacityMessageBox.h"
28
30{
31 const auto duration = settings.extra.GetDuration();
32
33 // Set up mOutputTracks.
34 // This effect needs all for sync-lock grouping.
35 this->CopyInputTracks(true);
36
37 // Iterate over the tracks
38 bool bGoodResult = true;
39 int ntrack = 0;
40
41 mOutputTracks->Any().VisitWhile( bGoodResult,
42 [&](WaveTrack *track, const Track::Fallthrough &fallthrough) {
43 if (!track->GetSelected())
44 return fallthrough();
45 bool editClipCanMove = GetEditClipsCanMove();
46
47 //if we can't move clips, and we're generating into an empty space,
48 //make sure there's room.
49 if (!editClipCanMove &&
50 track->IsEmpty(mT0, mT1+1.0/track->GetRate()) &&
51 !track->IsEmpty(mT0,
52 mT0 + duration - (mT1 - mT0) - 1.0 / track->GetRate()))
53 {
55 XO("There is not enough room available to generate the audio"),
56 wxICON_STOP,
57 XO("Error") );
58 Failure();
59 bGoodResult = false;
60 return;
61 }
62
63 if (duration > 0.0)
64 {
65 auto pProject = FindProject();
66 // Create a temporary track
67 auto tmp = track->EmptyCopy();
68 BeforeTrack(*track);
70
71 // Fill it with data
72 if (!GenerateTrack(settings, &*tmp, *track, ntrack))
73 bGoodResult = false;
74 else {
75 // Transfer the data from the temporary track to the actual one
76 tmp->Flush();
77 PasteTimeWarper warper{ mT1, mT0 + duration };
78 const auto &selectedRegion =
79 ViewInfo::Get( *pProject ).selectedRegion;
80 track->ClearAndPaste(
81 selectedRegion.t0(), selectedRegion.t1(),
82 &*tmp, true, false, &warper);
83 }
84
85 if (!bGoodResult) {
86 Failure();
87 return;
88 }
89 }
90 else
91 {
92 // If the duration is zero, there's no need to actually
93 // generate anything
94 track->Clear(mT0, mT1);
95 }
96
97 ntrack++;
98 },
99 [&](Track *t) {
101 t->SyncLockAdjust(mT1, mT0 + duration);
102 }
103 }
104 );
105
106 if (bGoodResult) {
107 Success();
108
109 this->ReplaceProcessedTracks(bGoodResult);
110
111 mT1 = mT0 + duration; // Update selection.
112 }
113
114 return bGoodResult;
115}
116
118 WaveTrack *tmp, const WaveTrack &track, int ntrack)
119{
120 bool bGoodResult = true;
121 numSamples = track.TimeToLongSamples(settings.extra.GetDuration());
122 decltype(numSamples) i = 0;
123 Floats data{ tmp->GetMaxBlockSize() };
124
125 while ((i < numSamples) && bGoodResult) {
126 const auto block =
128
129 GenerateBlock(data.get(), track, block);
130
131 // Add the generated data to the temporary track
132 tmp->Append((samplePtr)data.get(), floatSample, block);
133 i += block;
134
135 // Update the progress meter
136 if (TrackProgress(ntrack,
137 i.as_double() /
139 bGoodResult = false;
140 }
141 return bGoodResult;
142}
XO("Cut/Copy/Paste")
size_t limitSampleBufferSize(size_t bufferSize, sampleCount limit)
Definition: SampleCount.cpp:22
char * samplePtr
Definition: SampleFormat.h:55
Contains declarations for TimeWarper, IdentityTimeWarper, ShiftTimeWarper, LinearTimeWarper,...
static Settings & settings()
Definition: TrackInfo.cpp:83
bool GetEditClipsCanMove()
Definition: WaveTrack.cpp:2656
virtual void GenerateBlock(float *data, const WaveTrack &track, size_t block)=0
bool GenerateTrack(EffectSettings &settings, WaveTrack *tmp, const WaveTrack &track, int ntrack) override
sampleCount numSamples
Definition: Generator.h:62
double mT1
Definition: EffectBase.h:119
std::shared_ptr< TrackList > mOutputTracks
Definition: EffectBase.h:97
double mT0
Definition: EffectBase.h:118
void ReplaceProcessedTracks(const bool bGoodResult)
Definition: EffectBase.cpp:224
const AudacityProject * FindProject() const
Definition: EffectBase.cpp:303
void CopyInputTracks(bool allSyncLockSelected=false)
Definition: Effect.cpp:400
bool TrackProgress(int whichTrack, double frac, const TranslatableString &={}) const
Definition: Effect.cpp:350
Performs effect computation.
static int DoMessageBox(const EffectPlugin &plugin, const TranslatableString &message, long style=DefaultMessageBoxStyle, const TranslatableString &titleStr={})
virtual void BeforeTrack(const WaveTrack &WXUNUSED(track))
Definition: Generator.h:40
virtual bool GenerateTrack(EffectSettings &settings, WaveTrack *tmp, const WaveTrack &track, int ntrack)=0
virtual void BeforeGenerate()
Definition: Generator.h:39
virtual void Failure()
Definition: Generator.h:45
AUDACITY_DLL_API bool Process(EffectInstance &instance, EffectSettings &settings) override
virtual void Success()
Definition: Generator.h:44
Unit slope but with either a jump (pasting more) or a flat interval (pasting less)
Definition: TimeWarper.h:181
sampleCount TimeToLongSamples(double t0) const
Convert correctly between an (absolute) time in seconds and a number of samples.
Definition: SampleTrack.cpp:43
static bool IsSyncLockSelected(const Track *pTrack)
Definition: SyncLock.cpp:82
Abstract base class for an object holding data associated with points on a time axis.
Definition: Track.h:162
bool GetSelected() const
Selectedness is always the same for all channels of a group.
Definition: Track.cpp:82
Continuation<> Fallthrough
Type of arguments passed as optional second parameter to TypeSwitch<void>() cases.
Definition: Track.h:470
NotifyingSelectedRegion selectedRegion
Definition: ViewInfo.h:219
static ViewInfo & Get(AudacityProject &project)
Definition: ViewInfo.cpp:235
A Track that contains audio waveform data.
Definition: WaveTrack.h:51
bool Append(constSamplePtr buffer, sampleFormat format, size_t len, unsigned int stride=1, sampleFormat effectiveFormat=widestSampleFormat) override
Definition: WaveTrack.cpp:1631
size_t GetMaxBlockSize() const override
This returns a nonnegative number of samples meant to size a memory buffer.
Definition: WaveTrack.cpp:1672
size_t GetBestBlockSize(sampleCount t) const override
This returns a nonnegative number of samples meant to size a memory buffer.
Definition: WaveTrack.cpp:1654
void Clear(double t0, double t1) override
Definition: WaveTrack.cpp:713
bool IsEmpty(double t0, double t1) const
Returns true if there are no WaveClips in the specified region.
Definition: WaveTrack.cpp:535
double GetRate() const override
Definition: WaveTrack.cpp:421
void ClearAndPaste(double t0, double t1, const Track *src, bool preserve=true, bool merge=true, const TimeWarper *effectWarper=NULL)
Definition: WaveTrack.cpp:771
Holder EmptyCopy(const SampleBlockFactoryPtr &pFactory={}, bool keepLink=true) const
Definition: WaveTrack.cpp:635
double as_double() const
Definition: SampleCount.h:46
Externalized state of a plug-in.