Audacity  3.2.0
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 #include "../prefs/TracksBehaviorsPrefs.h"
25 
26 #include "TimeWarper.h"
27 
28 #include "../widgets/AudacityMessageBox.h"
29 
31 {
32  if (GetDuration() < 0.0)
33  return false;
34 
35 
36  // Set up mOutputTracks.
37  // This effect needs all for sync-lock grouping.
38  this->CopyInputTracks(true);
39 
40  // Iterate over the tracks
41  bool bGoodResult = true;
42  int ntrack = 0;
43 
44  mOutputTracks->Any().VisitWhile( bGoodResult,
45  [&](WaveTrack *track, const Track::Fallthrough &fallthrough) {
46  if (!track->GetSelected())
47  return fallthrough();
48  bool editClipCanMove = GetEditClipsCanMove();
49 
50  //if we can't move clips, and we're generating into an empty space,
51  //make sure there's room.
52  if (!editClipCanMove &&
53  track->IsEmpty(mT0, mT1+1.0/track->GetRate()) &&
54  !track->IsEmpty(mT0, mT0+GetDuration()-(mT1-mT0)-1.0/track->GetRate()))
55  {
57  XO("There is not enough room available to generate the audio"),
58  wxICON_STOP,
59  XO("Error") );
60  Failure();
61  bGoodResult = false;
62  return;
63  }
64 
65  if (GetDuration() > 0.0)
66  {
67  auto pProject = FindProject();
68  // Create a temporary track
69  auto tmp = track->EmptyCopy();
70  BeforeTrack(*track);
72 
73  // Fill it with data
74  if (!GenerateTrack(&*tmp, *track, ntrack))
75  bGoodResult = false;
76  else {
77  // Transfer the data from the temporary track to the actual one
78  tmp->Flush();
79  PasteTimeWarper warper{ mT1, mT0+GetDuration() };
80  const auto &selectedRegion =
81  ViewInfo::Get( *pProject ).selectedRegion;
82  track->ClearAndPaste(
83  selectedRegion.t0(), selectedRegion.t1(),
84  &*tmp, true, false, &warper);
85  }
86 
87  if (!bGoodResult) {
88  Failure();
89  return;
90  }
91  }
92  else
93  {
94  // If the duration is zero, there's no need to actually
95  // generate anything
96  track->Clear(mT0, mT1);
97  }
98 
99  ntrack++;
100  },
101  [&](Track *t) {
103  t->SyncLockAdjust(mT1, mT0 + GetDuration());
104  }
105  }
106  );
107 
108  if (bGoodResult) {
109  Success();
110 
111  this->ReplaceProcessedTracks(bGoodResult);
112 
113  mT1 = mT0 + GetDuration(); // Update selection.
114  }
115 
116  return bGoodResult;
117 }
118 
120  const WaveTrack &track,
121  int ntrack)
122 {
123  bool bGoodResult = true;
125  decltype(numSamples) i = 0;
126  Floats data{ tmp->GetMaxBlockSize() };
127 
128  while ((i < numSamples) && bGoodResult) {
129  const auto block =
131 
132  GenerateBlock(data.get(), track, block);
133 
134  // Add the generated data to the temporary track
135  tmp->Append((samplePtr)data.get(), floatSample, block);
136  i += block;
137 
138  // Update the progress meter
139  if (TrackProgress(ntrack,
140  i.as_double() /
142  bGoodResult = false;
143  }
144  return bGoodResult;
145 }
ViewInfo::Get
static ViewInfo & Get(AudacityProject &project)
Definition: ViewInfo.cpp:235
Generator::Failure
virtual void Failure()
Definition: Generator.h:47
Effect::FindProject
const AudacityProject * FindProject() const
Definition: Effect.cpp:2035
WaveTrack
A Track that contains audio waveform data.
Definition: WaveTrack.h:75
Effect::GetDuration
double GetDuration() override
Definition: Effect.cpp:769
GetEditClipsCanMove
bool GetEditClipsCanMove()
Definition: WaveTrack.cpp:2849
BlockGenerator::GenerateTrack
bool GenerateTrack(WaveTrack *tmp, const WaveTrack &track, int ntrack) override
Definition: Generator.cpp:119
Effect::MessageBox
int MessageBox(const TranslatableString &message, long style=DefaultMessageBoxStyle, const TranslatableString &titleStr={})
Definition: Effect.cpp:2238
Effect::CopyInputTracks
void CopyInputTracks(bool allSyncLockSelected=false)
Definition: Effect.cpp:1834
Project.h
TimeWarper.h
Contains declarations for TimeWarper, IdentityTimeWarper, ShiftTimeWarper, LinearTimeWarper,...
Generator::GenerateTrack
virtual bool GenerateTrack(WaveTrack *tmp, const WaveTrack &track, int ntrack)=0
Effect::mT1
double mT1
Definition: Effect.h:424
BlockGenerator::GenerateBlock
virtual void GenerateBlock(float *data, const WaveTrack &track, size_t block)=0
XO
#define XO(s)
Definition: Internat.h:31
WaveTrack::GetBestBlockSize
size_t GetBestBlockSize(sampleCount t) const override
This returns a nonnegative number of samples meant to size a memory buffer.
Definition: WaveTrack.cpp:1793
BlockGenerator::numSamples
sampleCount numSamples
Definition: Generator.h:64
WaveTrack::ClearAndPaste
void ClearAndPaste(double t0, double t1, const Track *src, bool preserve=true, bool merge=true, const TimeWarper *effectWarper=NULL)
Definition: WaveTrack.cpp:917
Generator::Success
virtual void Success()
Definition: Generator.h:46
WaveTrack::EmptyCopy
Holder EmptyCopy(const SampleBlockFactoryPtr &pFactory={}) const
Definition: WaveTrack.cpp:709
Generator::BeforeTrack
virtual void BeforeTrack(const WaveTrack &WXUNUSED(track))
Definition: Generator.h:42
floatSample
@ floatSample
Definition: SampleFormat.h:34
ViewInfo::selectedRegion
NotifyingSelectedRegion selectedRegion
Definition: ViewInfo.h:215
WaveTrack::Clear
void Clear(double t0, double t1) override
Definition: WaveTrack.cpp:790
Effect::mT0
double mT0
Definition: Effect.h:423
sampleCount::as_double
double as_double() const
Definition: SampleCount.h:45
Generator::BeforeGenerate
virtual void BeforeGenerate()
Definition: Generator.h:41
SyncLock::IsSyncLockSelected
static bool IsSyncLockSelected(const Track *pTrack)
Definition: SyncLock.cpp:43
WaveTrack::IsEmpty
bool IsEmpty(double t0, double t1) const
Returns true if there are no WaveClips in the specified region.
Definition: WaveTrack.cpp:609
Effect::ReplaceProcessedTracks
void ReplaceProcessedTracks(const bool bGoodResult)
Definition: Effect.cpp:1956
Track::Fallthrough
Continuation<> Fallthrough
Type of arguments passed as optional second parameter to TypeSwitch<void>() cases.
Definition: Track.h:499
WaveTrack::GetMaxBlockSize
size_t GetMaxBlockSize() const override
This returns a nonnegative number of samples meant to size a memory buffer.
Definition: WaveTrack.cpp:1811
Effect::mOutputTracks
std::shared_ptr< TrackList > mOutputTracks
Definition: Effect.h:422
ViewInfo.h
Track::GetSelected
bool GetSelected() const
Definition: Track.h:428
samplePtr
char * samplePtr
Definition: SampleFormat.h:49
SyncLock.h
Track
Abstract base class for an object holding data associated with points on a time axis.
Definition: Track.h:224
WaveTrack::GetRate
double GetRate() const override
Definition: WaveTrack.cpp:495
SampleTrack::TimeToLongSamples
sampleCount TimeToLongSamples(double t0) const
Convert correctly between an (absolute) time in seconds and a number of samples.
Definition: SampleTrack.cpp:35
WaveTrack::Append
bool Append(constSamplePtr buffer, sampleFormat format, size_t len, unsigned int stride=1) override
Definition: WaveTrack.cpp:1771
Prefs.h
limitSampleBufferSize
size_t limitSampleBufferSize(size_t bufferSize, sampleCount limit)
Definition: SampleCount.cpp:23
PasteTimeWarper
Unit slope but with either a jump (pasting more) or a flat interval (pasting less)
Definition: TimeWarper.h:181
Generator.h
Effect::TrackProgress
bool TrackProgress(int whichTrack, double frac, const TranslatableString &={})
Definition: Effect.cpp:1788
ArrayOf< float >
Generator::Process
AUDACITY_DLL_API bool Process() override
Definition: Generator.cpp:30