From 1d2edcb67571c55e550599f6fda2fc390f69c630 Mon Sep 17 00:00:00 2001 From: Jamie Hardt Date: Sat, 26 Dec 2020 18:50:16 -0800 Subject: [PATCH] Documentation and RF64 impl --- src/wavewriter.rs | 34 +++++++++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/src/wavewriter.rs b/src/wavewriter.rs index 61f26c8..9d3c540 100644 --- a/src/wavewriter.rs +++ b/src/wavewriter.rs @@ -2,7 +2,8 @@ use std::fs::File; use std::io::{Write,Seek,SeekFrom}; use super::Error; -use super::fourcc::{FourCC, WriteFourCC, RIFF_SIG, WAVE_SIG, FMT__SIG, DATA_SIG, ELM1_SIG, JUNK_SIG, BEXT_SIG}; +use super::fourcc::{FourCC, WriteFourCC, RIFF_SIG, RF64_SIG, DS64_SIG, + WAVE_SIG, FMT__SIG, DATA_SIG, ELM1_SIG, JUNK_SIG, BEXT_SIG}; use super::fmt::WaveFmt; //use super::common_format::CommonFormat; use super::chunks::WriteBWaveChunks; @@ -62,6 +63,7 @@ impl AudioFrameWriter where W: Write + Seek { /// When you are done writing to a chunk you must call `end()` in order to /// finalize the chunk for storage. pub struct WaveChunkWriter where W: Write + Seek { + ident : FourCC, inner : WaveWriter, content_start_pos : u64, length : u64 @@ -75,7 +77,7 @@ impl WaveChunkWriter where W: Write + Seek { inner.inner.write_u32::(length as u32)?; inner.increment_form_length(8)?; let content_start_pos = inner.inner.seek(SeekFrom::End(0))?; - Ok( WaveChunkWriter { inner , content_start_pos, length } ) + Ok( WaveChunkWriter { ident, inner , content_start_pos, length } ) } fn end(mut self) -> Result, Error> { @@ -93,7 +95,12 @@ impl WaveChunkWriter where W: Write + Seek { self.inner.inner.seek(SeekFrom::Start(self.content_start_pos - 4))?; self.inner.inner.write_u32::(self.length as u32)?; } else { - todo!("FIXME RF64 wave writing is not yet supported") + if self.ident == DATA_SIG { + todo!("FIXME RF64 wave writing is not yet supported") + } else { + todo!("FIXME RF64 wave writing is not yet supported") + } + } Ok(()) @@ -158,6 +165,9 @@ pub struct WaveWriter where W: Write + Seek { inner : W, form_length: u64, + /// True if file is RF64 + pub is_rf64: bool, + /// Format of the wave file. pub format: WaveFmt } @@ -183,7 +193,8 @@ impl WaveWriter where W: Write + Seek { inner.write_u32::(0)?; inner.write_fourcc(WAVE_SIG)?; - let mut retval = WaveWriter { inner, form_length: 0, format}; + let mut retval = WaveWriter { inner, form_length: 0, is_rf64: false, format}; + retval.increment_form_length(4)?; let mut chunk = retval.chunk(JUNK_SIG)?; @@ -197,6 +208,20 @@ impl WaveWriter where W: Write + Seek { Ok( retval ) } + fn promote_to_rf64(&mut self) -> Result<(),Error> { + if !self.is_rf64 { + self.inner.seek(SeekFrom::Start(0))?; + self.inner.write_fourcc(RF64_SIG)?; + self.inner.write_u32::(0xFFFF)?; + self.inner.seek(SeekFrom::Start(12))?; + + self.inner.write_fourcc(DS64_SIG)?; + self.inner.seek(SeekFrom::Current(4))?; + self.inner.write_u64::(self.form_length)?; + } + Ok(()) + } + fn chunk(mut self, ident: FourCC) -> Result,Error> { self.inner.seek(SeekFrom::End(0))?; @@ -229,7 +254,6 @@ impl WaveWriter where W: Write + Seek { let buf = vec![0u8; to_add as usize]; chunk.write(&buf)?; let closed = chunk.end()?; - let inner = closed.chunk(DATA_SIG)?; Ok( AudioFrameWriter { inner } ) }