7#include "dependencies/choc/platform/choc_DisableAllWarnings.h"
8#include "dependencies/dr_libs/dr_wav.h"
9#include "dependencies/choc/platform/choc_ReenableAllWarnings.h"
23template <
typename SampleType>
30 hassert (buffer.hasSampleRate());
31 hassert (! floatsEqual (buffer.getSampleRateHz(), 0.0));
33 const size_t numFrames = buffer.getNumFrames();
34 const size_t numChannels = buffer.getNumChannels();
37 drwav_data_format drWavFormat;
38 drWavFormat.container = drwav_container_riff;
39 drWavFormat.channels =
static_cast<drwav_uint16> (numChannels);
40 drWavFormat.sampleRate =
static_cast<drwav_uint32> (buffer.getSampleRateHz());
45 drWavFormat.format = DR_WAVE_FORMAT_PCM;
46 drWavFormat.bitsPerSample = 16;
49 drWavFormat.format = DR_WAVE_FORMAT_PCM;
50 drWavFormat.bitsPerSample = 24;
53 drWavFormat.format = DR_WAVE_FORMAT_PCM;
54 drWavFormat.bitsPerSample = 32;
57 drWavFormat.format = DR_WAVE_FORMAT_IEEE_FLOAT;
58 drWavFormat.bitsPerSample = 32;
62 if (! drwav_init_file_write (&drWavHandle, fileName.c_str(), &drWavFormat,
nullptr))
69 std::vector<
float> pcmData (numFrames * numChannels);
71 for (size_t frame = 0; frame < numFrames; ++frame)
73 for (size_t channel = 0; channel < numChannels; ++channel)
74 pcmData[frame * numChannels + channel] = buffer[channel][frame];
77 drwav_write_pcm_frames (&drWavHandle, numFrames, pcmData.data());
83 std::vector<int16_t> pcmData (numFrames * numChannels);
84 constexpr double scale = 32767.0;
86 for (size_t frame = 0; frame < numFrames; ++frame)
88 for (size_t channel = 0; channel < numChannels; ++channel)
90 const double sample =
static_cast<
double> (buffer[channel][frame]);
91 const int16_t pcmValue =
static_cast<int16_t> (std::round (
hart::clamp (scale * sample
, -scale
, scale
)));
92 pcmData[frame * numChannels + channel] = pcmValue;
96 drwav_write_pcm_frames (&drWavHandle, numFrames, pcmData.data());
102 std::vector<int32_t> pcmData (numFrames * numChannels);
103 constexpr double scale = 2147483647.0;
105 for (size_t frame = 0; frame < numFrames; ++frame)
107 for (size_t channel = 0; channel < numChannels; ++channel)
109 const double sample =
static_cast<
double> (buffer[channel][frame]);
110 const int32_t pcmValue =
static_cast<int32_t> (std::round (
hart::clamp (scale * sample
, -scale
, scale
)));
111 pcmData[frame * numChannels + channel] = pcmValue;
115 drwav_write_pcm_frames (&drWavHandle, numFrames, pcmData.data());
121 std::vector<uint8_t> pcmData (numFrames * numChannels * 3);
122 constexpr double scale = 8388607.0;
124 for (size_t frame = 0; frame < numFrames; ++frame)
126 for (size_t channel = 0; channel < numChannels; ++channel)
128 const double sample =
static_cast<
double> (buffer[channel][frame]);
129 const int32_t pcmValue =
static_cast<int32_t> (std::round (
hart::clamp (scale * sample
, -scale
, scale
)));
130 size_t idx = (frame * numChannels + channel) * 3;
131 pcmData[idx] =
static_cast<uint8_t> (pcmValue & 0xff);
132 pcmData[idx + 1] =
static_cast<uint8_t> ((pcmValue >> 8) & 0xff);
133 pcmData[idx + 2] =
static_cast<uint8_t> ((pcmValue >> 16) & 0xff);
137 drwav_write_pcm_frames (&drWavHandle, numFrames, pcmData.data());
142 drwav_uninit (&drWavHandle);
Container for audio data.
Thrown when some I/O operation fails.
Helper class for writing audio buffers to wav files.
static void writeBuffer(const AudioBuffer< SampleType > &buffer, const std::string &fileName, WavFormat wavFormat=WavFormat::pcm24)
#define HART_THROW_OR_RETURN_VOID(ExceptionType, message)
Throws an exception if HART_DO_NOT_THROW_EXCEPTIONS is set, prints a message and returns otherwise.
#define hassert(condition)
Triggers a HartAssertException if the condition is false
NumericType clamp(const NumericType &value, const NumericType &low, const NumericType &high)
std::clamp() replacement for C++11
WavFormat
Audio data storage format for the wav files.