summaryrefslogtreecommitdiff
path: root/src/input/vcd/libcdio/_cdio_osx.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/input/vcd/libcdio/_cdio_osx.c')
-rw-r--r--src/input/vcd/libcdio/_cdio_osx.c193
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 */
}
-
-