cd-da-reader 0.3.1

CD-DA (audio CD) reading library
Documentation
#ifndef CD_DA_READER_MAC_SHIM_COMMON_H
#define CD_DA_READER_MAC_SHIM_COMMON_H

#import <CoreFoundation/CoreFoundation.h>
#import <IOKit/IOKitLib.h>
#import <IOKit/IOCFPlugIn.h>
#import <IOKit/IOBSD.h>
#import <IOKit/storage/IOCDMedia.h>
#import <IOKit/scsi/SCSITaskLib.h>
#import <IOKit/scsi/IOSCSIMultimediaCommandsDevice.h>
#include <DiskArbitration/DiskArbitration.h>
#include <dispatch/dispatch.h>

#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct {
    const char *bsdName;
    dispatch_semaphore_t sem;
} DAGuardCtx;

typedef struct {
    uint8_t has_scsi_error;
    uint8_t scsi_status;
    uint8_t has_sense;
    uint8_t sense_key;
    uint8_t asc;
    uint8_t ascq;
    uint32_t exec_error;
    uint32_t task_status;
} CdScsiError;

extern DASessionRef g_session;
extern DAGuardCtx g_guard;
extern io_service_t globalDevSvc;
extern IOCFPlugInInterface **globalPlugin;
extern MMCDeviceInterface **globalMmc;
extern SCSITaskDeviceInterface **globalDev;

void start_da_guard(const char *bsdName);
void stop_da_guard(void);

bool cd_read_toc(uint8_t **outBuf, uint32_t *outLen, CdScsiError *outErr);
bool read_cd_audio(uint32_t lba, uint32_t sectors, uint8_t **outBuf, uint32_t *outLen, CdScsiError *outErr);
void cd_free(void *p);

Boolean get_dev_svc(const char *bsdName);
void reset_dev_scv(void);
Boolean open_dev_session(const char *bsdName);
void close_dev_session(void);

#endif