nkeynes@1097: /** nkeynes@1097: * $Id$ nkeynes@1097: * nkeynes@1097: * Copyright (c) 2005-2009 Nathan Keynes. nkeynes@1097: * nkeynes@1097: * This program is free software; you can redistribute it and/or modify nkeynes@1097: * it under the terms of the GNU General Public License as published by nkeynes@1097: * the Free Software Foundation; either version 2 of the License, or nkeynes@1097: * (at your option) any later version. nkeynes@1097: * nkeynes@1097: * This program is distributed in the hope that it will be useful, nkeynes@1097: * but WITHOUT ANY WARRANTY; without even the implied warranty of nkeynes@1097: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the nkeynes@1097: * GNU General Public License for more details. nkeynes@1097: */ nkeynes@1097: nkeynes@1097: #ifndef cdrom_cdrom_H nkeynes@1097: #define cdrom_cdrom_H 1 nkeynes@1097: nkeynes@1097: #include nkeynes@1097: #include nkeynes@1097: #include "drivers/cdrom/defs.h" nkeynes@1097: #include "drivers/cdrom/sector.h" nkeynes@1097: nkeynes@1097: #ifdef __cplusplus nkeynes@1097: extern "C" { nkeynes@1097: #endif nkeynes@1097: nkeynes@1097: typedef enum { nkeynes@1097: CDROM_DISC_NONE = 0x06, nkeynes@1097: CDROM_DISC_AUDIO = 0x00, nkeynes@1097: CDROM_DISC_NONXA = 0x10, nkeynes@1097: CDROM_DISC_XA = 0x20, nkeynes@1097: CDROM_DISC_GDROM = 0x80 nkeynes@1097: } cdrom_disc_type_t; nkeynes@1097: nkeynes@1097: #define TRACK_FLAG_PREEMPH 0x10 /* Pre-emphasis (audio only) */ nkeynes@1097: #define TRACK_FLAG_COPYPERM 0x20 /* Copy permitted */ nkeynes@1097: #define TRACK_FLAG_DATA 0x40 /* Data track */ nkeynes@1097: #define TRACK_FLAG_FOURCHAN 0x80 /* 4-channel audio */ nkeynes@1097: nkeynes@1097: struct cdrom_track { nkeynes@1097: cdrom_trackno_t trackno; nkeynes@1097: cdrom_sessionno_t sessionno; /* session # containing this track */ nkeynes@1097: cdrom_lba_t lba; /* start sector address */ nkeynes@1097: uint8_t flags; /* Track flags */ nkeynes@1097: sector_source_t source; nkeynes@1097: }; nkeynes@1097: nkeynes@1097: /** nkeynes@1097: * A CDROM disc, either an image file, or an open physical host device. nkeynes@1097: */ nkeynes@1097: struct cdrom_disc { nkeynes@1097: struct sector_source source; nkeynes@1097: const char *name; /* Filename or identifier used to open the disc */ nkeynes@1097: cdrom_disc_type_t disc_type; nkeynes@1097: gchar mcn[14]; /* Media catalogue number, null terminated. */ nkeynes@1097: cdrom_trackno_t track_count; nkeynes@1097: cdrom_sessionno_t session_count; nkeynes@1097: cdrom_lba_t leadout; /* LBA of the disc leadout */ nkeynes@1097: struct cdrom_track track[99]; nkeynes@1097: nkeynes@1097: /* Reference to an underlying source, if any. */ nkeynes@1097: sector_source_t base_source; nkeynes@1097: nkeynes@1097: /* Private implementation-specific data */ nkeynes@1097: void *impl_data; nkeynes@1097: nkeynes@1097: /** Check for media change. If the media cannot change (ie image file) nkeynes@1097: * or is notified asynchonously, this should be a no-op. In the event of nkeynes@1097: * a change, this function should update the structure according to the nkeynes@1097: * new media (including TOC), and return TRUE. nkeynes@1097: * @return TRUE if the media has changed since the last check, otherwise nkeynes@1097: * FALSE. nkeynes@1097: */ nkeynes@1097: gboolean (*check_media)(cdrom_disc_t disc); nkeynes@1097: nkeynes@1097: /** nkeynes@1097: * Read the table of contents from the given file nkeynes@1097: */ nkeynes@1097: gboolean (*read_toc)(cdrom_disc_t disc, ERROR *err); nkeynes@1097: nkeynes@1097: /** nkeynes@1097: * Begin playing audio from the given lba address on the disc. nkeynes@1097: */ nkeynes@1097: cdrom_error_t (*play_audio)(cdrom_disc_t disc, cdrom_lba_t lba, cdrom_count_t length); nkeynes@1097: nkeynes@1097: cdrom_error_t (*scan_audio)(cdrom_disc_t disc, cdrom_lba_t lba, gboolean direction); nkeynes@1097: nkeynes@1097: cdrom_error_t (*stop_audio)(cdrom_disc_t disc); nkeynes@1097: nkeynes@1097: }; nkeynes@1097: nkeynes@1097: /** nkeynes@1097: * Open an image file or device nkeynes@1097: */ nkeynes@1097: cdrom_disc_t cdrom_disc_open( const char *filename, ERROR *err ); nkeynes@1097: nkeynes@1097: /** nkeynes@1097: * Get the track information for the given track. If there is no such track, nkeynes@1097: * return NULL; nkeynes@1097: */ nkeynes@1097: cdrom_track_t cdrom_disc_get_track( cdrom_disc_t disc, cdrom_trackno_t track ); nkeynes@1097: nkeynes@1097: /** nkeynes@1097: * Get the track information for the first track of the given session. If there nkeynes@1097: * is no such session, return NULL; nkeynes@1097: */ nkeynes@1097: cdrom_track_t cdrom_disc_get_session( cdrom_disc_t disc, cdrom_sessionno_t session ); nkeynes@1097: nkeynes@1097: cdrom_track_t cdrom_disc_get_last_track( cdrom_disc_t disc ); nkeynes@1097: nkeynes@1097: cdrom_track_t cdrom_disc_prev_track( cdrom_disc_t disc, cdrom_track_t track ); nkeynes@1097: cdrom_track_t cdrom_disc_next_track( cdrom_disc_t disc, cdrom_track_t track ); nkeynes@1097: nkeynes@1097: /** nkeynes@1097: * Return the size of the track in sectors, including inter-track gap nkeynes@1097: */ nkeynes@1097: cdrom_count_t cdrom_disc_get_track_size( cdrom_disc_t disc, cdrom_track_t track ); nkeynes@1097: nkeynes@1097: /** nkeynes@1097: * Find the track containing the sector specified by LBA. nkeynes@1097: * Note: this function does not check for media change. nkeynes@1097: * @return The track, or NULL if no track contains the sector. nkeynes@1097: */ nkeynes@1097: cdrom_track_t cdrom_disc_get_track_by_lba( cdrom_disc_t disc, cdrom_lba_t lba ); nkeynes@1097: nkeynes@1097: /** nkeynes@1097: * Check if the disc contains valid media. nkeynes@1097: * @return CDROM_ERROR_OK if disc is present, otherwise CDROM_ERROR_NODISC nkeynes@1097: */ nkeynes@1097: cdrom_error_t cdrom_disc_check_media( cdrom_disc_t disc ); nkeynes@1097: nkeynes@1097: /** nkeynes@1097: * Read sectors from the disc. nkeynes@1097: * @return status code nkeynes@1097: */ nkeynes@1097: cdrom_error_t cdrom_disc_read_sectors( cdrom_disc_t disc, cdrom_lba_t lba, cdrom_count_t count, cdrom_read_mode_t mode, nkeynes@1097: unsigned char *buf, size_t *length ); nkeynes@1097: nkeynes@1097: /** nkeynes@1097: * Print the disc's table of contents to the given output stream. nkeynes@1097: */ nkeynes@1097: void cdrom_disc_print_toc( FILE *f, cdrom_disc_t disc ); nkeynes@1097: nkeynes@1097: #define cdrom_disc_ref(disc) sector_source_ref((sector_source_t)disc) nkeynes@1097: #define cdrom_disc_unref(disc) sector_source_unref((sector_source_t)disc) nkeynes@1097: nkeynes@1097: #ifdef __cplusplus nkeynes@1097: } nkeynes@1097: #endif nkeynes@1097: nkeynes@1097: #endif /* !cdrom_cdrom_H */