I wrote a simple function to write some audio samples to a wav file.
It works. But when I choose an existing file to overwrite, the resulting file seems wrong. I can not read that file in Audacity for instance).
void MyComponent::onSaveClick()
{
if (!mSampleBuffer) return;
mChooser = std::make_unique<juce::FileChooser> ("Save as wave file ...",
juce::File{},
"*.wav");
auto chooserFlags = juce::FileBrowserComponent::saveMode
| juce::FileBrowserComponent::warnAboutOverwriting;
mChooser->launchAsync(chooserFlags, [this] (const juce::FileChooser& fc)
{
auto file = fc.getResult();
if (file != juce::File{})
{
if (auto fileStream = std::unique_ptr<FileOutputStream> (file.createOutputStream())) {
// Now create a WAV writer object that writes to our output stream...
juce::WavAudioFormat wavFormat;
auto* writer = wavFormat.createWriterFor(fileStream.get(), mSampleRate, 1, 16, {}, 0);
if (writer != nullptr) {
fileStream.release(); // passes responsibility for deleting the stream to the writer object that is now using it
// read samples from mSampleBuffer
int numSamples = mSampleBuffer->getSize();
float* rptr = mSampleBuffer->getSamplesPtr(0);
// use juce AudioBuffer to write the samples
juce::AudioBuffer<float> audioBuffer;
audioBuffer.setSize(1, numSamples);
float* wptr = audioBuffer.getWritePointer(0);
for (int i=0 ; i<numSamples ; i++) *wptr++ = *rptr++;
// write the audio buffer to file
writer->writeFromAudioSampleBuffer(audioBuffer, 0, numSamples);
//
delete writer;
}
}
}
});
}