cd-da-reader 1.0.0

CD-DA (audio CD) reading library
Documentation
use super::device::Drive;
use super::sg_io::{CommandContext, execute_read};
use crate::data_reader::track_information::{
    TRACK_INFORMATION_RESPONSE_SIZE, TrackInformation, build_read_track_information_cdb,
    parse_track_information,
};
use crate::{CdReaderError, ScsiOp};

const TRACK_INFORMATION_TIMEOUT_MS: u32 = 10_000;

pub(super) fn read_track_information(
    drive: &Drive,
    track_number: u8,
) -> Result<TrackInformation, CdReaderError> {
    let mut data = vec![0u8; TRACK_INFORMATION_RESPONSE_SIZE];
    let mut cdb =
        build_read_track_information_cdb(track_number, TRACK_INFORMATION_RESPONSE_SIZE as u16);
    let transferred = execute_read(
        drive.fd(),
        &mut cdb,
        &mut data,
        TRACK_INFORMATION_TIMEOUT_MS,
        CommandContext {
            op: ScsiOp::ReadTrackInformation,
            lba: None,
            sectors: None,
        },
    )?;
    data.truncate(transferred);

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