/*! Initialization routine. This is the only thing that doesn't get called via a function pointer. In fact *we* are the ones to set that up. */ CdIo_t * cdio_open_cdrdao (const char *psz_cue_name) { CdIo_t *ret; _img_private_t *p_data; cdio_funcs_t _funcs; memset( &_funcs, 0, sizeof(_funcs) ); _funcs.eject_media = _eject_media_image; _funcs.free = _free_image; _funcs.get_arg = _get_arg_image; _funcs.get_cdtext = _get_cdtext_image; _funcs.get_cdtext_raw = NULL; _funcs.get_devices = cdio_get_devices_cdrdao; _funcs.get_default_device = cdio_get_default_device_cdrdao; _funcs.get_disc_last_lsn = get_disc_last_lsn_cdrdao; _funcs.get_discmode = _get_discmode_image; _funcs.get_drive_cap = _get_drive_cap_image; _funcs.get_first_track_num = _get_first_track_num_image; _funcs.get_hwinfo = get_hwinfo_cdrdao; _funcs.get_media_changed = get_media_changed_image; _funcs.get_mcn = _get_mcn_image; _funcs.get_num_tracks = _get_num_tracks_image; _funcs.get_track_channels = get_track_channels_image; _funcs.get_track_copy_permit = get_track_copy_permit_image; _funcs.get_track_format = _get_track_format_cdrdao; _funcs.get_track_green = _get_track_green_cdrdao; _funcs.get_track_lba = _get_lba_track_cdrdao; _funcs.get_track_msf = _get_track_msf_image; _funcs.get_track_preemphasis = get_track_preemphasis_image; _funcs.get_track_pregap_lba = get_track_pregap_lba_image; _funcs.get_track_isrc = get_track_isrc_image; _funcs.lseek = _lseek_cdrdao; _funcs.read = _read_cdrdao; _funcs.read_audio_sectors = _read_audio_sectors_cdrdao; _funcs.read_data_sectors = read_data_sectors_image; _funcs.read_mode1_sector = _read_mode1_sector_cdrdao; _funcs.read_mode1_sectors = _read_mode1_sectors_cdrdao; _funcs.read_mode2_sector = _read_mode2_sector_cdrdao; _funcs.read_mode2_sectors = _read_mode2_sectors_cdrdao; _funcs.run_mmc_cmd = NULL; _funcs.set_arg = _set_arg_image; _funcs.set_speed = cdio_generic_unimplemented_set_speed; _funcs.set_blocksize = cdio_generic_unimplemented_set_blocksize; if (NULL == psz_cue_name) return NULL; p_data = calloc(1, sizeof (_img_private_t)); p_data->gen.init = false; p_data->psz_cue_name = NULL; p_data->gen.data_source = NULL; p_data->gen.source_name = NULL; ret = cdio_new ((void *)p_data, &_funcs); if (ret == NULL) { free(p_data); return NULL; } ret->driver_id = DRIVER_CDRDAO; if (!cdio_is_tocfile(psz_cue_name)) { cdio_debug ("source name %s is not recognized as a TOC file", psz_cue_name); free(p_data); free(ret); return NULL; } _set_arg_image (p_data, "cue", psz_cue_name); _set_arg_image (p_data, "source", psz_cue_name); _set_arg_image (p_data, "access-mode", "cdrdao"); if (_init_cdrdao(p_data)) { return ret; } else { _free_image(p_data); free(ret); return NULL; } }
/*! Eject media -- there's nothing to do here except free resources. We always return DRIVER_OP_UNSUPPORTED. */ driver_return_code_t _eject_media_image(void *p_user_data) { _free_image (p_user_data); return DRIVER_OP_UNSUPPORTED; }