diff options
Diffstat (limited to 'src/input/vcd/libcdio/_cdio_osx.c')
-rw-r--r-- | src/input/vcd/libcdio/_cdio_osx.c | 193 |
1 files changed, 123 insertions, 70 deletions
diff --git a/src/input/vcd/libcdio/_cdio_osx.c b/src/input/vcd/libcdio/_cdio_osx.c index b02151f30..887eb00bf 100644 --- a/src/input/vcd/libcdio/_cdio_osx.c +++ b/src/input/vcd/libcdio/_cdio_osx.c @@ -1,12 +1,14 @@ /* - $Id: _cdio_osx.c,v 1.1 2003/10/13 11:47:11 f1rmb Exp $ + $Id: _cdio_osx.c,v 1.2 2004/04/11 12:20:31 miguelfreitas Exp $ - Copyright (C) 2003 Rocky Bernstein <rocky@panix.com> from vcdimager code + Copyright (C) 2003, 2004 Rocky Bernstein <rocky@panix.com> + from vcdimager code: Copyright (C) 2001 Herbert Valerio Riedel <hvr@gnu.org> and VideoLAN code Copyright (C) 1998-2001 VideoLAN Authors: Johan Bilien <jobi@via.ecp.fr> Gildas Bazin <gbazin@netcourrier.com> Jon Lech Johansen <jon-vl@nanocrew.net> + Derk-Jan Hartman <hartman at videolan.org> This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -31,16 +33,13 @@ # include "config.h" #endif -static const char _rcsid[] = "$Id: _cdio_osx.c,v 1.1 2003/10/13 11:47:11 f1rmb Exp $"; +static const char _rcsid[] = "$Id: _cdio_osx.c,v 1.2 2004/04/11 12:20:31 miguelfreitas Exp $"; #include <cdio/sector.h> #include <cdio/util.h> #include "cdio_assert.h" #include "cdio_private.h" -/* Is this the right default? */ -#define DEFAULT_CDIO_DEVICE "/dev/rdisk2" - #include <string.h> #ifdef HAVE_DARWIN_CDROM @@ -55,9 +54,14 @@ static const char _rcsid[] = "$Id: _cdio_osx.c,v 1.1 2003/10/13 11:47:11 f1rmb E #include <sys/types.h> #include <sys/ioctl.h> +#include <paths.h> #include <CoreFoundation/CFBase.h> +#include <CoreFoundation/CFString.h> +#include <CoreFoundation/CFNumber.h> #include <IOKit/IOKitLib.h> +#include <IOKit/IOBSD.h> #include <IOKit/storage/IOCDTypes.h> +#include <IOKit/storage/IOMedia.h> #include <IOKit/storage/IOCDMedia.h> #include <IOKit/storage/IOCDMediaBSDClient.h> @@ -124,61 +128,71 @@ _cdio_getNumberOfTracks( CDTOC *pTOC, int i_descriptors ) Returns 0 if no error. */ static int -_cdio_read_mode2_form2_sectors (int device_handle, void *data, lsn_t lsn, - bool mode2_form2, unsigned int nblocks) +_cdio_read_mode1_sectors (void *env, void *data, lsn_t lsn, + bool is_form2, unsigned int nblocks) { + _img_private_t *_obj = env; dk_cd_read_t cd_read; memset( &cd_read, 0, sizeof(cd_read) ); - cd_read.offset = lsn * CDIO_CD_FRAMESIZE_RAW; - cd_read.sectorArea = kCDSectorAreaSync | kCDSectorAreaHeader | - kCDSectorAreaSubHeader | kCDSectorAreaUser | - kCDSectorAreaAuxiliary; - cd_read.sectorType = kCDSectorTypeUnknown; + cd_read.sectorArea = kCDSectorAreaUser; + cd_read.buffer = data; + cd_read.sectorType = kCDSectorTypeMode1; - cd_read.buffer = data; - cd_read.bufferLength = CDIO_CD_FRAMESIZE_RAW * nblocks; + if (is_form2) { + cd_read.offset = lsn * kCDSectorSizeMode2; + cd_read.bufferLength = kCDSectorSizeMode2 * nblocks; + } else { + cd_read.offset = lsn * kCDSectorSizeMode1; + cd_read.bufferLength = kCDSectorSizeMode1 * nblocks; + } - if( ioctl( device_handle, DKIOCCDREAD, &cd_read ) == -1 ) - { - cdio_error( "could not read block %d", lsn ); - return -1; - } + if( ioctl( _obj->gen.fd, DKIOCCDREAD, &cd_read ) == -1 ) + { + cdio_error( "could not read block %d, %s", lsn, strerror(errno) ); + return -1; + } return 0; } /*! - Reads nblocks of mode2 sectors from cd device into data starting + Reads nblocks of mode2 form2 sectors from cd device into data starting from lsn. Returns 0 if no error. */ static int _cdio_read_mode2_sectors (void *env, void *data, lsn_t lsn, - bool mode2_form2, unsigned int nblocks) + bool is_form2, unsigned int nblocks) { _img_private_t *_obj = env; - int i; - int retval; - - if (mode2_form2) { - return _cdio_read_mode2_form2_sectors(_obj->gen.fd, data, lsn, - mode2_form2, nblocks); + dk_cd_read_t cd_read; + + memset( &cd_read, 0, sizeof(cd_read) ); + + cd_read.sectorArea = kCDSectorAreaUser; + cd_read.buffer = data; + + if (is_form2) { + cd_read.offset = lsn * kCDSectorSizeMode2Form2; + cd_read.sectorType = kCDSectorTypeMode2Form2; + cd_read.bufferLength = kCDSectorSizeMode2Form2 * nblocks; + } else { + cd_read.offset = lsn * kCDSectorSizeMode2Form1; + cd_read.sectorType = kCDSectorTypeMode2Form1; + cd_read.bufferLength = kCDSectorSizeMode2Form1 * nblocks; } - for (i = 0; i < nblocks; i++) { - char buf[M2RAW_SECTOR_SIZE] = { 0, }; - retval = _cdio_read_mode2_form2_sectors (_obj->gen.fd, buf, lsn + i, - mode2_form2, 1); - if ( retval ) return retval; - - memcpy (((char *)data) + (CDIO_CD_FRAMESIZE * i), - buf + CDIO_CD_SUBHEADER_SIZE, CDIO_CD_FRAMESIZE); + if( ioctl( _obj->gen.fd, DKIOCCDREAD, &cd_read ) == -1 ) + { + cdio_error( "could not read block %d, %s", lsn, strerror(errno) ); + return -1; } return 0; } + /*! Reads a single audio sector from CD device into data starting from lsn. Returns 0 if no error. @@ -187,7 +201,35 @@ static int _cdio_read_audio_sectors (void *env, void *data, lsn_t lsn, unsigned int nblocks) { - return _cdio_read_mode2_sectors(env, data, lsn, true, nblocks); + _img_private_t *_obj = env; + dk_cd_read_t cd_read; + + memset( &cd_read, 0, sizeof(cd_read) ); + + cd_read.offset = lsn * kCDSectorSizeCDDA; + cd_read.sectorArea = kCDSectorAreaUser; + cd_read.sectorType = kCDSectorTypeCDDA; + + cd_read.buffer = data; + cd_read.bufferLength = kCDSectorSizeCDDA * nblocks; + + if( ioctl( _obj->gen.fd, DKIOCCDREAD, &cd_read ) == -1 ) + { + cdio_error( "could not read block %d", lsn ); + return -1; + } + return 0; +} + +/*! + Reads a single mode2 sector from cd device into data starting + from lsn. Returns 0 if no error. + */ +static int +_cdio_read_mode1_sector (void *env, void *data, lsn_t lsn, + bool is_form2) +{ + return _cdio_read_mode1_sectors(env, data, lsn, is_form2, 1); } /*! @@ -196,9 +238,9 @@ _cdio_read_audio_sectors (void *env, void *data, lsn_t lsn, */ static int _cdio_read_mode2_sector (void *env, void *data, lsn_t lsn, - bool mode2_form2) + bool is_form2) { - return _cdio_read_mode2_sectors(env, data, lsn, mode2_form2, 1); + return _cdio_read_mode2_sectors(env, data, lsn, is_form2, 1); } /*! @@ -534,23 +576,24 @@ _cdio_get_first_track_num(void *env) } /*! - Return the media catalog number MCN. - */ + Return the media catalog number MCN. + */ static char * _cdio_get_mcn (void *env) { - _img_private_t *_obj = env; - dk_cd_read_mcn_t cd_read; + _img_private_t *_obj = env; + dk_cd_read_mcn_t cd_read; - memset( &cd_read, 0, sizeof(cd_read) ); + memset( &cd_read, 0, sizeof(cd_read) ); - if( ioctl( _obj->gen.fd, DKIOCCDREADMCN, &cd_read ) < 0 ) - { - cdio_error( "could not read MCN, %s", strerror(errno) ); - return -1; - } - return strdup((char*)cd_read.mcn); + if( ioctl( _obj->gen.fd, DKIOCCDREADMCN, &cd_read ) < 0 ) + { + cdio_error( "could not read MCN, %s", strerror(errno) ); + return NULL; + } + return strdup((char*)cd_read.mcn); } + /*! Return the number of tracks in the current medium. CDIO_INVALID_TRACK is returned on error. @@ -572,27 +615,31 @@ static track_format_t _cdio_get_track_format(void *env, track_t track_num) { _img_private_t *_obj = env; + CDTrackInfo a_track; if (!_obj->toc_init) _cdio_read_toc (_obj) ; if (track_num > TOTAL_TRACKS || track_num == 0) return TRACK_FORMAT_ERROR; + + dk_cd_read_track_info_t cd_read; + memset( &cd_read, 0, sizeof(cd_read) ); -#if 0 - if (_obj->tocent[track_num-1].entry.control & CDROM_DATA_TRACK) { - if (_obj->tocent[track_num-1].cdte_format == 0x10) - return TRACK_FORMAT_CDI; - else if (_obj->tocent[track_num-1].cdte_format == 0x20) - return TRACK_FORMAT_XA; - else - return TRACK_FORMAT_DATA; - } else - return TRACK_FORMAT_AUDIO; -#else - /* FIXME! Figure out how to do. */ - return TRACK_FORMAT_DATA; -#endif + cd_read.address = track_num; + cd_read.addressType = kCDTrackInfoAddressTypeTrackNumber; + + cd_read.buffer = &a_track; + cd_read.bufferLength = sizeof(CDTrackInfo); + if( ioctl( _obj->gen.fd, DKIOCCDREADTRACKINFO, &cd_read ) == -1 ) + { + cdio_error( "could not read trackinfo for track %d", track_num ); + return -1; + } + + cdio_warn( "trackinfo trackMode: %x dataMode: %x", a_track.trackMode, a_track.dataMode ); + + return TRACK_FORMAT_AUDIO; } /*! @@ -798,12 +845,13 @@ cdio_get_default_device_osx(void) ones to set that up. */ CdIo * -cdio_open_osx (const char *source_name) +cdio_open_osx (const char *orig_source_name) { #ifdef HAVE_DARWIN_CDROM CdIo *ret; _img_private_t *_data; + char *source_name; cdio_funcs _funcs = { .eject_media = _cdio_eject_media, @@ -812,7 +860,7 @@ cdio_open_osx (const char *source_name) .get_default_device = cdio_get_default_device_osx, .get_devices = cdio_get_devices_osx, .get_first_track_num= _cdio_get_first_track_num, - .get_mcn = _cdio_get_mcn, + .get_mcn = _cdio_get_mcn, .get_num_tracks = _cdio_get_num_tracks, .get_track_format = _cdio_get_track_format, .get_track_green = _cdio_get_track_green, @@ -821,6 +869,8 @@ cdio_open_osx (const char *source_name) .lseek = cdio_generic_lseek, .read = cdio_generic_read, .read_audio_sectors = _cdio_read_audio_sectors, + .read_mode1_sector = _cdio_read_mode1_sector, + .read_mode1_sectors = _cdio_read_mode1_sectors, .read_mode2_sector = _cdio_read_mode2_sector, .read_mode2_sectors = _cdio_read_mode2_sectors, .set_arg = _cdio_set_arg, @@ -832,8 +882,13 @@ cdio_open_osx (const char *source_name) _data->gen.init = false; _data->gen.fd = -1; - _cdio_set_arg(_data, "source", (NULL == source_name) - ? DEFAULT_CDIO_DEVICE: source_name); + if (NULL == orig_source_name) { + source_name=cdio_get_default_device_linux(); + if (NULL == source_name) return NULL; + _cdio_set_arg(_data, "source", source_name); + free(source_name); + } else + _cdio_set_arg(_data, "source", orig_source_name); ret = cdio_new (_data, &_funcs); if (ret == NULL) return NULL; @@ -860,5 +915,3 @@ cdio_have_osx (void) return false; #endif /* HAVE_DARWIN_CDROM */ } - - |