diff --git a/include/cdio/sector.h b/include/cdio/sector.h index 9dc59f2e..8ce2d204 100644 --- a/include/cdio/sector.h +++ b/include/cdio/sector.h @@ -1,5 +1,5 @@ /* - $Id: sector.h,v 1.5 2003/09/13 06:25:37 rocky Exp $ + $Id: sector.h,v 1.6 2003/10/08 01:06:19 rocky Exp $ Copyright (C) 2000 Herbert Valerio Riedel Copyright (C) 2003 Rocky Bernstein @@ -89,8 +89,8 @@ #define CDIO_CD_FRAMESIZE 2048 /* bytes per frame, "cooked" mode */ #define CDIO_CD_FRAMESIZE_RAW 2352/* bytes per frame, "raw" mode */ #define CDIO_CD_FRAMESIZE_RAWER 2646 /* The maximum possible returned bytes */ -#define CDIO_CD_FRAMESIZE_RAW1 (CD_FRAMESIZE_RAW-CD_SYNC_SIZE) /*2340*/ -#define CDIO_CD_FRAMESIZE_RAW0 (CD_FRAMESIZE_RAW-CD_SYNC_SIZE-CD_HEAD_SIZE) /*2336*/ +#define CDIO_CD_FRAMESIZE_RAW1 (CDIO_CD_CD_FRAMESIZE_RAW-CDIO_CD_SYNC_SIZE) /*2340*/ +#define CDIO_CD_FRAMESIZE_RAW0 (CDIO_CD_FRAMESIZE_RAW-CDIO_CD_SYNC_SIZE-CDIO_CD__HEAD_SIZE) /*2336*/ /* "before data" part of raw XA (green, mode2) frame */ #define CDIO_CD_XA_HEADER (CDIO_CD_HEADER_SIZE+CDIO_CD_SUBHEADER_SIZE) diff --git a/lib/_cdio_osx.c b/lib/_cdio_osx.c index 6a9d7fc9..2f96b6fb 100644 --- a/lib/_cdio_osx.c +++ b/lib/_cdio_osx.c @@ -1,5 +1,5 @@ /* - $Id: _cdio_osx.c,v 1.11 2003/10/05 14:55:34 rocky Exp $ + $Id: _cdio_osx.c,v 1.12 2003/10/08 01:06:19 rocky Exp $ Copyright (C) 2003 Rocky Bernstein from vcdimager code Copyright (C) 2001 Herbert Valerio Riedel @@ -7,6 +7,7 @@ Authors: Johan Bilien Gildas Bazin Jon Lech Johansen + Derk-Jan Hartman 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 +32,13 @@ # include "config.h" #endif -static const char _rcsid[] = "$Id: _cdio_osx.c,v 1.11 2003/10/05 14:55:34 rocky Exp $"; +static const char _rcsid[] = "$Id: _cdio_osx.c,v 1.12 2003/10/08 01:06:19 rocky Exp $"; #include #include #include "cdio_assert.h" #include "cdio_private.h" -/* Is this the right default? */ -#define DEFAULT_CDIO_DEVICE "/dev/rdisk2" - #include #ifdef HAVE_DARWIN_CDROM @@ -55,9 +53,14 @@ static const char _rcsid[] = "$Id: _cdio_osx.c,v 1.11 2003/10/05 14:55:34 rocky #include #include +#include #include +#include +#include #include +#include #include +#include #include #include @@ -131,20 +134,18 @@ _cdio_read_mode2_form2_sectors (int device_handle, void *data, lsn_t lsn, 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.offset = lsn * kCDSectorSizeMode2Form2; + cd_read.sectorArea = kCDSectorAreaUser; + cd_read.sectorType = kCDSectorTypeMode2Form2; cd_read.buffer = data; - cd_read.bufferLength = CDIO_CD_FRAMESIZE_RAW * nblocks; + cd_read.bufferLength = kCDSectorSizeMode2Form2 * nblocks; if( ioctl( device_handle, DKIOCCDREAD, &cd_read ) == -1 ) - { - cdio_error( "could not read block %d", lsn ); - return -1; - } + { + cdio_error( "could not read block %d, %s", lsn, strerror(errno) ); + return -1; + } return 0; } @@ -159,22 +160,27 @@ _cdio_read_mode2_sectors (void *env, void *data, lsn_t lsn, bool mode2_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); } - 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); + dk_cd_read_t cd_read; + + memset( &cd_read, 0, sizeof(cd_read) ); + + cd_read.offset = lsn * kCDSectorSizeMode2Form1; + cd_read.sectorArea = kCDSectorAreaUser; + cd_read.sectorType = kCDSectorTypeMode2Form1; + + cd_read.buffer = data; + cd_read.bufferLength = kCDSectorSizeMode2Form1 * nblocks; + + if( ioctl( _obj->gen.fd, DKIOCCDREAD, &cd_read ) == -1 ) + { + cdio_error( "could not read block %d, %s", lsn, strerror(errno) ); + return -1; } return 0; } @@ -187,7 +193,24 @@ 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; } /*! @@ -534,23 +557,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 ""; + } + return strdup((char*)cd_read.mcn); } + /*! Return the number of tracks in the current medium. CDIO_INVALID_TRACK is returned on error. @@ -572,27 +596,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; } /*! @@ -812,7 +840,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, @@ -860,5 +888,3 @@ cdio_have_osx (void) return false; #endif /* HAVE_DARWIN_CDROM */ } - -