Как мне написать волновой файл с маркерами в ржавчине? - PullRequest
0 голосов
/ 06 ноября 2018

Существует ящик для ржавчины под названием hound для записи "простых" необработанных волновых файлов, но я не увидел ни одной функции для записи маркера в волновой файл. Как бы я это сделал?

EDIT: Согласно комментариям, я не был достаточно конкретным, что имел в виду под написанием маркера. Чтобы прояснить и, таким образом, улучшить понимание моего вопроса, я имею в виду «реплики». Смотрите здесь для более подробной информации.

РЕДАКТИРОВАТЬ 2: Кто-то дал ответ на вопрос, похожий на мой: https://stackoverflow.com/a/1550865/8725011

1 Ответ

0 голосов
/ 06 ноября 2018

Глядя по коду собаки, в настоящее время нет возможности записать или прочитать конкретный фрагмент. Это, однако, должно быть «простым» для записи, но чтение потребует некоторой работы.

Пример реализации, которая добавляет метод в 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(())
    }
}

Быстро и грязно сертифицировано.

...