File WavWriter.cpp¶
File List > examples > WavWriter > WavWriter.cpp
Go to the documentation of this file
Source Code¶
#include "daisy_seed.h"
#include <cmath>
using namespace daisy;
static constexpr float kTargetSr = 48000.f;
static constexpr size_t kTransferSize = 16384;
DaisySeed hw;
SdmmcHandler sdmmc;
FatFSInterface fsi;
WavWriter<kTransferSize> wav_writer;
struct SimpleOsc
{
static constexpr float kTargetFreq = 220.f;
static constexpr float kSignalIncrement
= (M_TWOPI * kTargetFreq) * (1.f / kTargetSr);
float phs_;
SimpleOsc() : phs_(0.f) {}
inline float RenderSample()
{
float signal = sin(phs_) * 0.5f;
phs_ += kSignalIncrement;
if(phs_ > M_TWOPI)
phs_ -= M_TWOPI;
return signal;
}
};
int main(void)
{
hw.Init();
SdmmcHandler::Config sd_cfg;
sd_cfg.Defaults();
sd_cfg.width = SdmmcHandler::BusWidth::BITS_1;
sdmmc.Init(sd_cfg);
FatFSInterface::Config fsi_cfg;
fsi_cfg.media = FatFSInterface::Config::MEDIA_SD;
fsi.Init(fsi_cfg);
if(f_mount(&fsi.GetSDFileSystem(), "/", 0) != FR_OK)
{
while(1)
{
hw.SetLed((System::GetNow() & 127) > 63);
}
}
hw.SetLed(true);
WavWriter<kTransferSize>::Config cfg;
cfg.bitspersample = 16;
cfg.channels = 2;
cfg.samplerate = kTargetSr;
wav_writer.Init(cfg);
SimpleOsc oscillator;
size_t duration_sec = 1;
size_t duration_in_samps = duration_sec * kTargetSr;
wav_writer.OpenFile("ExampleWavFile.wav");
for(size_t i = 0; i < duration_in_samps; i++)
{
// If recording Realtime Audio:
// The rendering/sampling should occur in the realtime audio interrupt
float sample = oscillator.RenderSample();
float samps_to_write[2] = {sample, sample};
wav_writer.Sample(samps_to_write);
// The actual DiskIO should happen outside of the realtime audio interrupt
// For offline-rendering, it is okay to do this check on every sample.
wav_writer.Write();
}
// Flush and Close
wav_writer.SaveFile();
while(1)
{
// Blink Afterwards to show success
hw.SetLed((System::GetNow() & 511) > 255);
}
}