32 double sampleRate,
unsigned int numChannels,
int bitsPerSample,
36 double sampleRate,
unsigned int numChannels,
int bitsPerSample,
44 float maxZeroLevelDb);
51 bool canCreateWavIntermediate =
true);
54 static SampleCount copySectionToNewFile (
Engine& e,
59 static SampleCount copySectionToNewFile (
Engine& e,
66 static void applyBWAVStartTime (
const juce::File&, SampleCount start);
71 template<
class TargetFormat>
79 return convertToFormat<TargetFormat> (reader.get(), destStream, quality, metadata, blockSize,
80 continuePredicate, updateProgress);
83 template<
class TargetFormat>
91 if (reader !=
nullptr)
111 if (writer->writeFromAudioReader (*reader, 0, -1))
114 destStream << tempFile.
getFile();
127 if (continuePredicate && ! continuePredicate())
132 if (! writer->writeFromAudioReader (*reader, startSample, numThisTime))
135 startSample += numThisTime;
136 numLeft -= numThisTime;
139 updateProgress (
static_cast<float> (startSample) / reader->
lengthInSamples);
144 destStream << tempFile.
getFile();
161 template <
typename SourceFormat>
168 juce::int64 getTotalLength()
override {
return stream.getTotalLength(); }
169 bool isExhausted()
override {
return stream.isExhausted(); }
170 int read (
void* d,
int sz)
override {
return stream.read (d, sz); }
171 juce::int64 getPosition()
override {
return stream.getPosition(); }
172 bool setPosition (
juce::int64 pos)
override {
return stream.setPosition (pos); }
177 SourceFormat sourceFormat;
181 auto& manager = engine.getAudioFileFormatManager().writeFormatManager;
183 auto* destFormat = manager.findFormatForFileExtension (dest.
getFileExtension());
185 if (destFormat ==
nullptr)
186 destFormat = manager.findFormatForFileExtension (
"wav");
188 AudioFileWriter writer (AudioFile (engine, dest), destFormat,
194 if (writer.isOpen() && writer.writeFromAudioReader (*reader, 0, -1))
208 void processEnvelope (
const float* inputBuffer,
float* outputBuffer,
int numSamples)
noexcept
210 for (
int i = 0; i < numSamples; ++i)
212 float envIn = std::abs (inputBuffer[i]);
214 if (envelope < envIn)
215 envelope += envAttack * (envIn - envelope);
216 else if (envelope > envIn)
217 envelope -= envRelease * (envelope - envIn);
219 outputBuffer[i] = envelope;
229 envRelease = release;
233 float envelope = 0.0f;
234 float envAttack = 1.0f, envRelease = 1.0f;
static bool reverse(Engine &, const juce::File &source, const juce::File &destination, std::atomic< float > &progress, juce::ThreadPoolJob *job=nullptr, bool canCreateWavIntermediate=true)
Reverses a file updating a progress value and checking the exit status of a given job.