cd-da-reader 1.0.0

CD-DA (audio CD) reading library
Documentation
use std::{ptr, slice};

use super::device::Drive;
use super::ffi::{MacScsiError, cd_free, cd_read_toc, map_error};
use crate::parse_toc::parse_toc;
use crate::{CdReaderError, ScsiOp, Toc};

pub(super) fn read_toc(drive: &Drive) -> Result<Toc, CdReaderError> {
    let mut buffer: *mut u8 = ptr::null_mut();
    let mut len = 0u32;
    let mut error = MacScsiError::default();

    let success = unsafe { cd_read_toc(drive.fd(), &mut buffer, &mut len, &mut error) };
    if !success {
        return Err(map_error(error, ScsiOp::ReadToc, None, None));
    }

    let data = unsafe { slice::from_raw_parts(buffer, len as usize) }.to_vec();
    unsafe { cd_free(buffer.cast()) };

    parse_toc(data).map_err(|error| CdReaderError::Parse(error.to_string()))
}