mirror of
https://github.com/iluvcapra/bwavfile.git
synced 2025-12-31 17:00:44 +00:00
RF64 implementation
This commit is contained in:
@@ -91,12 +91,18 @@ impl<W> WaveChunkWriter<W> where W: Write + Seek {
|
|||||||
|
|
||||||
fn increment_chunk_length(&mut self, amount: u64) -> Result<(), std::io::Error> {
|
fn increment_chunk_length(&mut self, amount: u64) -> Result<(), std::io::Error> {
|
||||||
self.length = self.length + amount;
|
self.length = self.length + amount;
|
||||||
if self.length < u32::MAX as u64 {
|
if !self.inner.is_rf64 {
|
||||||
self.inner.inner.seek(SeekFrom::Start(self.content_start_pos - 4))?;
|
self.inner.inner.seek(SeekFrom::Start(self.content_start_pos - 4))?;
|
||||||
self.inner.inner.write_u32::<LittleEndian>(self.length as u32)?;
|
self.inner.inner.write_u32::<LittleEndian>(self.length as u32)?;
|
||||||
} else {
|
} else {
|
||||||
if self.ident == DATA_SIG {
|
if self.ident == DATA_SIG {
|
||||||
todo!("FIXME RF64 wave writing is not yet supported")
|
let data_chunk_64bit_field_offset = 8 + 4 + 8 + 8;
|
||||||
|
self.inner.inner.seek(SeekFrom::Start(self.content_start_pos - 4))?;
|
||||||
|
self.inner.inner.write_u32::<LittleEndian>(0xFFFF_FFFF)?;
|
||||||
|
// this only need to happen once, not every time we increment
|
||||||
|
|
||||||
|
self.inner.inner.seek(SeekFrom::Start(data_chunk_64bit_field_offset))?;
|
||||||
|
self.inner.inner.write_u64::<LittleEndian>(self.length)?;
|
||||||
} else {
|
} else {
|
||||||
todo!("FIXME RF64 wave writing is not yet supported")
|
todo!("FIXME RF64 wave writing is not yet supported")
|
||||||
}
|
}
|
||||||
@@ -208,16 +214,17 @@ impl<W> WaveWriter<W> where W: Write + Seek {
|
|||||||
Ok( retval )
|
Ok( retval )
|
||||||
}
|
}
|
||||||
|
|
||||||
fn promote_to_rf64(&mut self) -> Result<(),Error> {
|
fn promote_to_rf64(&mut self) -> Result<(), std::io::Error> {
|
||||||
if !self.is_rf64 {
|
if !self.is_rf64 {
|
||||||
self.inner.seek(SeekFrom::Start(0))?;
|
self.inner.seek(SeekFrom::Start(0))?;
|
||||||
self.inner.write_fourcc(RF64_SIG)?;
|
self.inner.write_fourcc(RF64_SIG)?;
|
||||||
self.inner.write_u32::<LittleEndian>(0xFFFF)?;
|
self.inner.write_u32::<LittleEndian>(0xFFFF_FFFF)?;
|
||||||
self.inner.seek(SeekFrom::Start(12))?;
|
self.inner.seek(SeekFrom::Start(12))?;
|
||||||
|
|
||||||
self.inner.write_fourcc(DS64_SIG)?;
|
self.inner.write_fourcc(DS64_SIG)?;
|
||||||
self.inner.seek(SeekFrom::Current(4))?;
|
self.inner.seek(SeekFrom::Current(4))?;
|
||||||
self.inner.write_u64::<LittleEndian>(self.form_length)?;
|
self.inner.write_u64::<LittleEndian>(self.form_length)?;
|
||||||
|
self.is_rf64 = true;
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
@@ -265,6 +272,7 @@ impl<W> WaveWriter<W> where W: Write + Seek {
|
|||||||
self.inner.write_u32::<LittleEndian>(self.form_length as u32)?;
|
self.inner.write_u32::<LittleEndian>(self.form_length as u32)?;
|
||||||
Ok(())
|
Ok(())
|
||||||
} else {
|
} else {
|
||||||
|
self.promote_to_rf64()?;
|
||||||
todo!("FIXME RF64 wave writing is not yet supported")
|
todo!("FIXME RF64 wave writing is not yet supported")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user