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_track_information, map_error};
use crate::data_reader::track_information::{TrackInformation, parse_track_information};
use crate::{CdReaderError, ScsiOp};

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

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

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

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