packages feed

hscdio-0.1.0.0: src/c/cdio/compat/read.c

#include "cdio/compat/read.h"

#include "stdlib.h"

#include "cdio/compat/sector.h"


// Allocate the proper sizes in C, as Haskell marshalling for anything but
// simple `Storable` types is a bit awkward.

void read_bytes(const CdIo_t* cdio, void** buf, ssize_t* out, size_t bytes) {
    *buf = malloc(bytes);
    *out = cdio_read(cdio, *buf, bytes);
}


uint16_t sector_size(cdio_read_mode_t mode) {
    switch (mode) {
        case CDIO_READ_MODE_AUDIO:
            return CDIO_CD_FRAMESIZE_RAW;
        case CDIO_READ_MODE_M1F1:
            return CDIO_CD_FRAMESIZE;
        case CDIO_READ_MODE_M1F2:
            return CDIO_CD_FRAMESIZE_RAW0;
        case CDIO_READ_MODE_M2F1:
            return CDIO_CD_FRAMESIZE;
        case CDIO_READ_MODE_M2F2:
            return M2F2_SECTOR_SIZE;
        default:
            return 0;
    }
}

void setup_read(void** buff, uint32_t* bytes, uint16_t blocksize, uint32_t blocks) {
    *bytes = blocksize * blocks;
    *buff = malloc(*bytes);
}


// Marshalling aids

driver_return_code_t read_sector(const CdIo_t* cdio, void** buff, uint32_t* bytes, lsn_t lsn, cdio_read_mode_t mode) {
    setup_read(buff, bytes, sector_size(mode), 1);
    return cdio_read_sector(cdio, *buff, lsn, mode);
}

driver_return_code_t read_sectors(const CdIo_t* cdio, void** buff, uint32_t* bytes, lsn_t lsn, cdio_read_mode_t mode, uint32_t blocks) {
    setup_read(buff, bytes, sector_size(mode), blocks);
    return cdio_read_sectors(cdio, *buff, lsn, mode, blocks);
}


driver_return_code_t read_data_sectors(const CdIo_t* cdio, void** buff, uint32_t* bytes, lsn_t lsn, uint16_t blocksize, uint32_t blocks) {
    setup_read(buff, bytes, blocksize, blocks);
    return cdio_read_data_sectors(cdio, *buff, lsn, blocksize, blocks);
}


driver_return_code_t read_audio_sector(const CdIo_t* cdio, void** buff, uint32_t* bytes, lsn_t lsn) {
    setup_read(buff, bytes, sector_size(CDIO_READ_MODE_AUDIO), 1);
    return cdio_read_audio_sector(cdio, *buff, lsn);
}

driver_return_code_t read_audio_sectors(const CdIo_t* cdio, void** buff, uint32_t* bytes, lsn_t lsn, uint32_t blocks) {
    setup_read(buff, bytes, sector_size(CDIO_READ_MODE_AUDIO), blocks);
    return cdio_read_audio_sectors(cdio, *buff, lsn, blocks);
}


driver_return_code_t read_mode1_sector(const CdIo_t* cdio, void** buff, uint32_t* bytes, lsn_t lsn, bool form2) {
    setup_read(buff, bytes, sector_size((form2 ? CDIO_READ_MODE_M1F2 : CDIO_READ_MODE_M1F1)), 1);
    return cdio_read_mode1_sector(cdio, *buff, lsn, form2);
}

driver_return_code_t read_mode1_sectors(const CdIo_t* cdio, void** buff, uint32_t* bytes, lsn_t lsn, bool form2, uint32_t blocks) {
    setup_read(buff, bytes, sector_size((form2 ? CDIO_READ_MODE_M1F2 : CDIO_READ_MODE_M1F1)), blocks);
    return cdio_read_mode1_sectors(cdio, *buff, lsn, form2, blocks);
}


driver_return_code_t read_mode2_sector(const CdIo_t* cdio, void** buff, uint32_t* bytes, lsn_t lsn, bool form2) {
    setup_read(buff, bytes, sector_size((form2 ? CDIO_READ_MODE_M2F2 : CDIO_READ_MODE_M2F1)), 1);
    return cdio_read_mode2_sector(cdio, *buff, lsn, form2);
}

driver_return_code_t read_mode2_sectors(const CdIo_t* cdio, void** buff, uint32_t* bytes, lsn_t lsn, bool form2, uint32_t blocks) {
    setup_read(buff, bytes, sector_size((form2 ? CDIO_READ_MODE_M2F2 : CDIO_READ_MODE_M2F1)), blocks);
    return cdio_read_mode2_sectors(cdio, *buff, lsn, form2, blocks);
}