#include "SoundExporter.hpp"
#include <cassert>
namespace ale {
namespace sound {
static const unsigned int SampleRate = 60 * SoundExporter::SamplesPerFrame;
static const unsigned int WriteInterval = SampleRate * 30;
SoundExporter::SoundExporter(const std::string& filename, int channels)
: m_filename(filename), m_channels(channels), m_samples_since_write(0) {}
SoundExporter::~SoundExporter() { writeWAVData(); }
void SoundExporter::addSamples(SampleType* s, int len) {
assert(m_channels == 1);
for (int i = 0; i < len; i++)
m_data.push_back(s[i]);
m_samples_since_write += len;
if (m_samples_since_write >= WriteInterval) {
writeWAVData();
m_samples_since_write = 0;
}
}
void SoundExporter::writeWAVData() {
std::ofstream stream(m_filename.c_str(), std::ios::binary);
int bufSize = m_data.size();
stream.write("RIFF", 4); write<int>(stream, 36 + bufSize); stream.write("WAVE", 4);
stream.write("fmt ", 4); write<int>(stream, 16); write<short>(stream, 1); write<short>(stream, m_channels); write<int>(stream, SampleRate); write<int>(stream, SampleRate * m_channels * sizeof(SampleType)); write<short>(stream, m_channels * sizeof(SampleType)); write<short>(stream, 8 * sizeof(SampleType));
stream.write("data", 4); stream.write((const char*)&bufSize, 4); stream.write((const char*)&m_data[0], bufSize); }
} }