FXbool WavOutput::write(const void * data,FXuint nframes) { FXlong duration = (nframes*NANOSECONDS_PER_SECOND) / af.rate; FXThread::sleep(duration); if (!file.isOpen() || file.writeBlock(data,af.framesize()*nframes)!=af.framesize()*nframes) return false; else return true; }
void WavOutput::close() { if (file.isOpen()) { GM_DEBUG_PRINT("[wav] closed output\n"); FXulong end=file.position(); FXulong size; FXuint size32=0xFFFFFFFF; size=end-8; if (end>0xFFFFFFFF) { // RIFF Chunk file.position(0); file.writeBlock("RF64",4); file.writeBlock(&size32,4); // DS64 Chunk file.position(12); file.writeBlock("ds64",4); file.position(20); file.writeBlock(&size,8); // Data Chunk if (data_pos) { size=end-data_pos-4; file.writeBlock(&size,8); size=0; file.writeBlock(&size,8); } } else { /// RIFF chunksize size32=size; file.position(4); file.writeBlock(&size32,4); // Data Chunksize if (data_pos) { file.position(data_pos); size=end-data_pos-4; file.writeBlock(&size,4); } } file.close(); } af.reset(); }