soundfont 0.1.0

sf2 file parser
Documentation
use super::super::utils::Reader;
use crate::riff::{Chunk, ScratchReader};
use crate::{error::Error, riff::ChunkId};
use std::io::{Read, Seek};

#[derive(Debug, Clone)]
pub struct InstrumentHeader {
    pub name: String,
    pub bag_id: u16,
}

impl InstrumentHeader {
    pub(crate) fn read(reader: &mut Reader) -> Result<Self, Error> {
        let name: String = reader.read_string(20)?.trim_end().to_owned();
        let bag_id: u16 = reader.read_u16()?;

        Ok(Self { name, bag_id })
    }

    pub(crate) fn read_all(
        phdr: &Chunk,
        file: &mut ScratchReader<impl Read + Seek>,
    ) -> Result<Vec<Self>, Error> {
        assert_eq!(phdr.id(), ChunkId::inst);

        let size = phdr.len();
        if size % 22 != 0 || size == 0 {
            Err(Error::InvalidInstrumentChunkSize(size))
        } else {
            let amount = size / 22;

            let data = phdr.read_contents(file)?;
            let mut reader = Reader::new(data);

            (0..amount).map(|_| Self::read(&mut reader)).collect()
        }
    }
}