diff --git a/lib/driver/_cdio_linux.c b/lib/driver/_cdio_linux.c index 16961cd5..d8eb0ec9 100644 --- a/lib/driver/_cdio_linux.c +++ b/lib/driver/_cdio_linux.c @@ -1,5 +1,5 @@ /* - $Id: _cdio_linux.c,v 1.3 2004/12/31 08:27:49 rocky Exp $ + $Id: _cdio_linux.c,v 1.4 2005/01/01 14:20:15 rocky Exp $ Copyright (C) 2001 Herbert Valerio Riedel Copyright (C) 2002, 2003, 2004 Rocky Bernstein @@ -27,7 +27,7 @@ # include "config.h" #endif -static const char _rcsid[] = "$Id: _cdio_linux.c,v 1.3 2004/12/31 08:27:49 rocky Exp $"; +static const char _rcsid[] = "$Id: _cdio_linux.c,v 1.4 2005/01/01 14:20:15 rocky Exp $"; #include @@ -850,13 +850,16 @@ read_toc_linux (void *p_user_data) /** FIXME: Do in a more generic place? **/ p_env->gen.track_flags[i].preemphasis = - p_toc->cdte_ctrl & 0x1 ? CDIO_TRACK_FLAG_TRUE : CDIO_TRACK_FLAG_FALSE; + p_toc->cdte_ctrl & CDIO_TRACK_FLAG_PRE_EMPHASIS + ? CDIO_TRACK_FLAG_TRUE : CDIO_TRACK_FLAG_FALSE; p_env->gen.track_flags[i].copy_permit = - p_toc->cdte_ctrl & 0x2 ? CDIO_TRACK_FLAG_TRUE : CDIO_TRACK_FLAG_FALSE; + p_toc->cdte_ctrl & CDIO_TRACK_FLAG_COPY_PERMITTED + ? CDIO_TRACK_FLAG_TRUE : CDIO_TRACK_FLAG_FALSE; p_env->gen.track_flags[i].channels = - p_toc->cdte_ctrl & 0x8 ? 4 : 2; + p_toc->cdte_ctrl & CDIO_TRACK_FLAG_FOUR_CHANNEL_AUDIO + ? 4 : 2; /**** struct cdrom_msf0 *msf= &env->tocent[i-1].cdte_addr.msf; diff --git a/lib/driver/image/nrg.c b/lib/driver/image/nrg.c index ddf3aad6..69047f6e 100644 --- a/lib/driver/image/nrg.c +++ b/lib/driver/image/nrg.c @@ -1,5 +1,5 @@ /* - $Id: nrg.c,v 1.2 2004/12/31 07:51:43 rocky Exp $ + $Id: nrg.c,v 1.3 2005/01/01 14:20:15 rocky Exp $ Copyright (C) 2003, 2004 Rocky Bernstein Copyright (C) 2001, 2003 Herbert Valerio Riedel @@ -46,7 +46,7 @@ #include "_cdio_stdio.h" #include "nrg.h" -static const char _rcsid[] = "$Id: nrg.c,v 1.2 2004/12/31 07:51:43 rocky Exp $"; +static const char _rcsid[] = "$Id: nrg.c,v 1.3 2005/01/01 14:20:15 rocky Exp $"; /* reader */ @@ -62,7 +62,6 @@ typedef struct { include pregap before next entry. */ uint64_t img_offset; /* Bytes offset from beginning of disk image file.*/ uint32_t blocksize; /* Number of bytes in a block */ - int flags; /* don't copy, 4 channel, pre-emphasis */ } _mapping_t; @@ -78,8 +77,7 @@ static uint32_t _stat_size_nrg (void *user_data); static void _register_mapping (_img_private_t *env, lsn_t start_lsn, uint32_t sec_count, uint64_t img_offset, uint32_t blocksize, - track_format_t track_format, bool track_green, - int flags) + track_format_t track_format, bool track_green) { const int track_num=env->gen.i_tracks; track_info_t *this_track=&(env->tocent[env->gen.i_tracks]); @@ -89,7 +87,6 @@ _register_mapping (_img_private_t *env, lsn_t start_lsn, uint32_t sec_count, _map->sec_count = sec_count; _map->img_offset = img_offset; _map->blocksize = blocksize; - _map->flags = flags; if (!env->mapping) env->mapping = _cdio_list_new (); _cdio_list_append (env->mapping, _map); @@ -246,7 +243,8 @@ parse_nrg (_img_private_t *p_env, const char *psz_nrg_name) if (CUES_ID == opcode) { lsn_t lsn = UINT32_FROM_BE (_entries[0].lsn); - int idx; + unsigned int idx; + unsigned int i = 0; cdio_info ("CUES type image detected" ); @@ -254,17 +252,32 @@ parse_nrg (_img_private_t *p_env, const char *psz_nrg_name) cdio_assert (lsn == 0?); */ - p_env->is_cues = true; /* HACK alert. */ + p_env->is_cues = true; /* HACK alert. */ p_env->gen.i_tracks = 0; p_env->gen.i_first_track = 1; - for (idx = 1; idx < entries-1; idx += 2) { + for (idx = 1; idx < entries-1; idx += 2, i++) { lsn_t sec_count; - int addrtype = _entries[idx].addr_ctrl / 16; - int control = _entries[idx].addr_ctrl % 16; - int flags = 0; - if ( 1 == control ) - flags &= ~CDIO_TRACK_FLAG_COPY_PERMITTED; + int cdte_format = _entries[idx].addr_ctrl / 16; + int cdte_ctrl = _entries[idx].type >> 4; + if ( COPY_PERMITTED & cdte_ctrl ) { + if (p_env) p_env->tocent[i].flags |= COPY_PERMITTED; + } else { + if (p_env) p_env->tocent[i].flags &= ~COPY_PERMITTED; + } + + if ( PRE_EMPHASIS & cdte_ctrl ) { + if (p_env) p_env->tocent[i].flags |= PRE_EMPHASIS; + } else { + if (p_env) p_env->tocent[i].flags &= ~PRE_EMPHASIS; + } + + if ( FOUR_CHANNEL_AUDIO & cdte_ctrl ) { + if (p_env) p_env->tocent[i].flags |= FOUR_CHANNEL_AUDIO; + } else { + if (p_env) p_env->tocent[i].flags &= ~FOUR_CHANNEL_AUDIO; + } + cdio_assert (_entries[idx].track == _entries[idx + 1].track); /* lsn and sec_count*2 aren't correct, but it comes closer on the @@ -273,7 +286,7 @@ parse_nrg (_img_private_t *p_env, const char *psz_nrg_name) them correctly. */ - switch (addrtype) { + switch (cdte_format) { case 0: lsn = UINT32_FROM_BE (_entries[idx].lsn); break; @@ -290,39 +303,54 @@ parse_nrg (_img_private_t *p_env, const char *psz_nrg_name) } default: lsn = CDIO_INVALID_LSN; - cdio_warn("unknown addrtype %d", addrtype); + cdio_warn("unknown cdte_format %d", cdte_format); } sec_count = UINT32_FROM_BE (_entries[idx + 1].lsn); _register_mapping (p_env, lsn, sec_count*2, (lsn+CDIO_PREGAP_SECTORS) * M2RAW_SECTOR_SIZE, - M2RAW_SECTOR_SIZE, TRACK_FORMAT_XA, true, - flags); + M2RAW_SECTOR_SIZE, TRACK_FORMAT_XA, true); } } else { lsn_t lsn = UINT32_FROM_BE (_entries[0].lsn); - int idx; + unsigned int idx; + unsigned int i = 0; cdio_info ("CUEX type image detected"); /* LSN must start at -150 (LBA 0)? */ cdio_assert (lsn == -150); - for (idx = 2; idx < entries; idx += 2) { + for (idx = 2; idx < entries; idx += 2, i++) { lsn_t sec_count; - int addrtype = _entries[idx].addr_ctrl >> 4; - int control = _entries[idx].addr_ctrl & 0xf; - int flags = 0; - if ( 1 == control ) - flags &= ~CDIO_TRACK_FLAG_COPY_PERMITTED; + int cdte_format = _entries[idx].addr_ctrl >> 4; + int cdte_ctrl = _entries[idx].type >> 4; - /* extractnrg.pl has addrtype for LBA's 0, and + if ( COPY_PERMITTED & cdte_ctrl ) { + if (p_env) p_env->tocent[i].flags |= COPY_PERMITTED; + } else { + if (p_env) p_env->tocent[i].flags &= ~COPY_PERMITTED; + } + + if ( PRE_EMPHASIS & cdte_ctrl ) { + if (p_env) p_env->tocent[i].flags |= PRE_EMPHASIS; + } else { + if (p_env) p_env->tocent[i].flags &= ~PRE_EMPHASIS; + } + + if ( FOUR_CHANNEL_AUDIO & cdte_ctrl ) { + if (p_env) p_env->tocent[i].flags |= FOUR_CHANNEL_AUDIO; + } else { + if (p_env) p_env->tocent[i].flags &= &FOUR_CHANNEL_AUDIO; + } + + /* extractnrg.pl has cdte_format for LBA's 0, and for MSF 1. ??? - FIXME: Should decode as appropriate for addrtype. + FIXME: Should decode as appropriate for cdte_format. */ - cdio_assert ( addrtype == 0 || addrtype == 1 ); + cdio_assert ( cdte_format == 0 || cdte_format == 1 ); cdio_assert (_entries[idx].track != _entries[idx + 1].track); @@ -331,8 +359,7 @@ parse_nrg (_img_private_t *p_env, const char *psz_nrg_name) _register_mapping (p_env, lsn, sec_count - lsn, (lsn + CDIO_PREGAP_SECTORS)*M2RAW_SECTOR_SIZE, - M2RAW_SECTOR_SIZE, TRACK_FORMAT_XA, true, - flags); + M2RAW_SECTOR_SIZE, TRACK_FORMAT_XA, true); } } break; @@ -540,7 +567,7 @@ parse_nrg (_img_private_t *p_env, const char *psz_nrg_name) _start += idx * CDIO_PREGAP_SECTORS; _register_mapping (p_env, _start, _len, _start2, blocksize, - track_format, track_green, 0); + track_format, track_green); } } @@ -646,7 +673,7 @@ parse_nrg (_img_private_t *p_env, const char *psz_nrg_name) _start += idx * CDIO_PREGAP_SECTORS; _register_mapping (p_env, _start, _len, _start2, blocksize, - track_format, track_green, 0); + track_format, track_green); } } break; @@ -1177,31 +1204,34 @@ cdio_open_nrg (const char *psz_source) memset( &_funcs, 0, sizeof(_funcs) ); - _funcs.eject_media = _eject_media_nrg; - _funcs.free = _free_nrg; - _funcs.get_arg = _get_arg_image; - _funcs.get_cdtext = get_cdtext_generic; - _funcs.get_devices = cdio_get_devices_nrg; - _funcs.get_default_device = cdio_get_default_device_nrg; - _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_nrg; - _funcs.get_mcn = _get_mcn_image; - _funcs.get_num_tracks = _get_num_tracks_image; - _funcs.get_track_format = get_track_format_nrg; - _funcs.get_track_green = _get_track_green_nrg; - _funcs.get_track_lba = NULL; /* Will use generic routine via msf */ - _funcs.get_track_msf = _get_track_msf_image; - _funcs.lseek = _lseek_nrg; - _funcs.read = _read_nrg; - _funcs.read_audio_sectors = _read_audio_sectors_nrg; - _funcs.read_mode1_sector = _read_mode1_sector_nrg; - _funcs.read_mode1_sectors = _read_mode1_sectors_nrg; - _funcs.read_mode2_sector = _read_mode2_sector_nrg; - _funcs.read_mode2_sectors = _read_mode2_sectors_nrg; - _funcs.set_arg = _set_arg_image; - _funcs.stat_size = _stat_size_nrg; + _funcs.eject_media = _eject_media_nrg; + _funcs.free = _free_nrg; + _funcs.get_arg = _get_arg_image; + _funcs.get_cdtext = get_cdtext_generic; + _funcs.get_devices = cdio_get_devices_nrg; + _funcs.get_default_device = cdio_get_default_device_nrg; + _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_nrg; + _funcs.get_mcn = _get_mcn_image; + _funcs.get_num_tracks = _get_num_tracks_image; + _funcs.get_track_channels = get_track_channels_generic, + _funcs.get_track_copy_permit = get_track_copy_permit_image, + _funcs.get_track_format = get_track_format_nrg; + _funcs.get_track_green = _get_track_green_nrg; + _funcs.get_track_lba = NULL; /* Will use generic routine via msf */ + _funcs.get_track_msf = _get_track_msf_image; + _funcs.get_track_preemphasis = get_track_preemphasis_generic, + _funcs.lseek = _lseek_nrg; + _funcs.read = _read_nrg; + _funcs.read_audio_sectors = _read_audio_sectors_nrg; + _funcs.read_mode1_sector = _read_mode1_sector_nrg; + _funcs.read_mode1_sectors = _read_mode1_sectors_nrg; + _funcs.read_mode2_sector = _read_mode2_sector_nrg; + _funcs.read_mode2_sectors = _read_mode2_sectors_nrg; + _funcs.set_arg = _set_arg_image; + _funcs.stat_size = _stat_size_nrg; _data = _cdio_malloc (sizeof (_img_private_t)); _data->gen.init = false;