Глядя по коду собаки, в настоящее время нет возможности записать или прочитать конкретный фрагмент. Это, однако, должно быть «простым» для записи, но чтение потребует некоторой работы.
Пример реализации, которая добавляет метод в WavWriter:
pub struct Cue {
/// unique identification value
id: u32,
/// play order position
position: u32,
/// RIFF ID of corresponding data chunk
data_chunk_id: [u8; 4],
/// Byte Offset of Data Chunk *
chunk_start: u32,
/// Byte Offset to sample of First Channel
block_start: u32,
/// Byte Offset to sample byte of First Channel
sample_offset: u32,
}
impl<W> WavWriter<W>
where
W: io::Write + io::Seek,
{
pub fn write_sues<'a, T>(&mut self, cues: T) -> io::Result<()>
where
T: IntoIterator<Item = &'a Cue>,
{
let header_size = 12;
let cues = cues.into_iter();
let (_, size) = cues.size_hint();
let mut chunk = Vec::with_capacity(size.unwrap_or(header_size));
{
let mut buffer = io::Cursor::new(&mut chunk[..]);
buffer.set_position(header_size as u64);
let mut n = 0;
for cue in cues {
buffer.write_le_u32(cue.id)?;
buffer.write_le_u32(cue.position)?;
buffer.write_all(&cue.data_chunk_id)?;
buffer.write_le_u32(cue.chunk_start)?;
buffer.write_le_u32(cue.block_start)?;
buffer.write_le_u32(cue.sample_offset)?;
n += 1;
}
buffer.set_position(0);
buffer.write_all(b"sue ")?;
buffer.write_le_u32(4 + n * 24)?;
buffer.write_le_u32(n)?;
}
self.writer.write_all(&chunk)?;
self.data_bytes_written += chunk.len() as u32;
Ok(())
}
}
Быстро и грязно сертифицировано.