int main(int argc, const char *argv[]) { CdIo_t *p_cdio; char **ppsz_drives=NULL; int n=0; cdio_loglevel_default = (argc > 1) ? CDIO_LOG_DEBUG : CDIO_LOG_INFO; /* snprintf(psz_nrgfile, sizeof(psz_nrgfile)-1, "%s/%s", TEST_DIR, cue_file[i]); */ if (!cdio_have_driver(DRIVER_OSX)) return(77); ppsz_drives = cdio_get_devices(DRIVER_DEVICE); if (!ppsz_drives) { printf("Can't find a CD-ROM drive. Skipping test.\n"); exit(77); } do { p_cdio = cdio_open_osx(ppsz_drives[n]); if (p_cdio) { const char *psz_source = cdio_get_arg(p_cdio, "source"); const char *psz_access_mode = cdio_get_arg(p_cdio, "access-mode"); discmode_t discmode = cdio_get_discmode(p_cdio); if (0 != strncmp(psz_source, ppsz_drives[0], strlen(ppsz_drives[0]))) { fprintf(stderr, "Got %s; should get back %s, the name we opened.\n", psz_source, ppsz_drives[0]); exit(1); } if (0 != strncmp(psz_access_mode, "OS X", strlen("OS X"))) { fprintf(stderr, "Got %s; Should get back %s, the access mode requested.\n", psz_access_mode, "OS X"); exit(2); } if (CDIO_DISC_MODE_ERROR == discmode) { fprintf(stderr, "Error getting disc mode for device %s.\n", ppsz_drives[n]); exit(3); } } cdio_destroy(p_cdio); } while (ppsz_drives[++n] != NULL); cdio_free_device_list(ppsz_drives); return 0; }
static void print_disc_info(CdIo_t *p_cdio, track_t i_tracks, track_t i_first_track) { track_t i_last_track = i_first_track+i_tracks; discmode_t cd_discmode = cdio_get_discmode(p_cdio); printf("%s\n", discmode2str[cd_discmode]); print_cdtext_track_info(p_cdio, 0, "\nCD-Text for Disc:"); for ( ; i_first_track < i_last_track; i_first_track++ ) { char psz_msg[50]; snprintf(psz_msg, sizeof(psz_msg), "CD-Text for Track %d:", i_first_track); print_cdtext_track_info(p_cdio, i_first_track, psz_msg); } }
/* Return a pointer to a ISO 9660 stat buffer or NULL if there's an error */ static iso9660_stat_t * _fs_stat_root (CdIo_t *p_cdio) { if (!p_cdio) return NULL; { iso_extension_mask_t iso_extension_mask = ISO_EXTENSION_ALL; generic_img_private_t *p_env = (generic_img_private_t *) p_cdio->env; iso9660_dir_t *p_iso9660_dir; iso9660_stat_t *p_stat; bool_3way_t b_xa; if (!p_env->i_joliet_level) iso_extension_mask &= ~ISO_EXTENSION_JOLIET; /* FIXME try also with Joliet.*/ if ( !iso9660_fs_read_superblock (p_cdio, iso_extension_mask) ) { cdio_warn("Could not read ISO-9660 Superblock."); return NULL; } switch(cdio_get_discmode(p_cdio)) { case CDIO_DISC_MODE_CD_XA: b_xa = yep; break; case CDIO_DISC_MODE_CD_DATA: b_xa = nope; break; default: b_xa = dunno; } #ifdef HAVE_JOLIET p_iso9660_dir = p_env->i_joliet_level ? &(p_env->svd.root_directory_record) : &(p_env->pvd.root_directory_record) ; #else p_iso9660_dir = &(p_env->pvd.root_directory_record) ; #endif p_stat = _iso9660_dir_to_statbuf (p_iso9660_dir, b_xa, p_env->i_joliet_level); return p_stat; } }
/* mutex must be locked */ static void refresh_trackinfo (gboolean warning) { trigger_monitor (); if (pcdrom_drive == NULL) { open_cd (); if (pcdrom_drive == NULL) return; } int mode = cdio_get_discmode (pcdrom_drive->p_cdio); #ifdef _WIN32 /* cdio_get_discmode reports the wrong disk type sometimes */ if (mode == CDIO_DISC_MODE_NO_INFO || mode == CDIO_DISC_MODE_ERROR) #else if (mode != CDIO_DISC_MODE_CD_DA && mode != CDIO_DISC_MODE_CD_MIXED) #endif { if (warning) { if (mode == CDIO_DISC_MODE_NO_INFO) cdaudio_error (_("Drive is empty.")); else cdaudio_error (_("Unsupported disk type.")); } /* reset libcdio, else it will not read a new disk correctly */ if (pcdrom_drive) { cdda_close (pcdrom_drive); pcdrom_drive = NULL; } g_free (trackinfo); trackinfo = NULL; return; } if (trackinfo == NULL || cdio_get_media_changed (pcdrom_drive->p_cdio)) { g_free (trackinfo); trackinfo = NULL; scan_cd (); } }
QList< Playlist::Entry > AudioCDDemux::getTracks( const QString &_device ) { QList< Playlist::Entry > tracks; Playlist::Entry entry; device = _device; cdio_close_tray( device.toLocal8Bit(), NULL ); if ( ( cdio = cdio_open( device.toLocal8Bit(), DRIVER_UNKNOWN ) ) ) { numTracks = cdio_get_num_tracks( cdio ); if ( cdio_get_discmode( cdio ) != CDIO_DISC_MODE_ERROR && numTracks > 0 && numTracks != CDIO_INVALID_TRACK ) { cddb_disc_t *cddb_disc = NULL; bool cddb_ok = useCDDB; for ( trackNo = 1 ; trackNo <= numTracks ; ++trackNo ) { chn = cdio_get_track_channels( cdio, trackNo ); if ( chn != 2 && chn != 4 ) continue; if ( useCDTEXT ) readCDText( trackNo ); isData = cdio_get_track_format( cdio, trackNo ) != TRACK_FORMAT_AUDIO; duration = CD_BLOCKSIZE / chn / ( double )srate; numSectors = cdio_get_track_last_lsn( cdio, trackNo ) - cdio_get_track_lsn( cdio, trackNo ); if ( cddb_ok && ( cddb_disc || ( Title.isEmpty() && ( cddb_ok = freedb_query( cddb_disc ) ) ) ) ) freedb_get_track_info( cddb_disc ); entry.name = title(); entry.url = AudioCDName"://" + QString::number( trackNo ) + "?device=" + device; entry.length = length(); tracks += entry; } cddb_disc_destroy( cddb_disc ); } } return tracks; }
bool AudioCDDemux::open( const QString &_url ) { #ifdef Q_OS_WIN if ( _url.toLower().contains( QRegExp( "file://\\D:/track\\d\\d.cda" ) ) ) { QString url = _url; url.remove( "file://" ); device = url.mid( 0, url.indexOf( '/' ) ); trackNo = url.mid( url.toLower().indexOf( "track" ) + 5, 2 ).toUInt(); } else #endif { if ( _url.left( 10 ) != "AudioCD://" ) return false; QUrl url( _url.mid( 10 ) ); device = QUrlQuery( url ).queryItemValue( "device" ); trackNo = url.path().toUInt(); } if ( trackNo > 0 && trackNo < CDIO_INVALID_TRACK ) { cdio = destroyTimer.getInstance( device, discID ); if ( cdio || ( cdio = cdio_open( device.toLocal8Bit(), DRIVER_UNKNOWN ) ) ) { cdio_set_speed( cdio, 1 ); numTracks = cdio_get_num_tracks( cdio ); if ( cdio_get_discmode( cdio ) != CDIO_DISC_MODE_ERROR && numTracks > 0 && numTracks != CDIO_INVALID_TRACK ) { chn = cdio_get_track_channels( cdio, trackNo ); if ( numTracks >= trackNo && ( chn == 2 || chn == 4 ) ) { if ( useCDTEXT ) { readCDText( 0 ); readCDText( trackNo ); } isData = cdio_get_track_format( cdio, trackNo ) != TRACK_FORMAT_AUDIO; duration = CD_BLOCKSIZE / chn / ( double )srate; startSector = cdio_get_track_lsn( cdio, trackNo ); numSectors = cdio_get_track_last_lsn( cdio, trackNo ) - startSector; if ( useCDDB && Title.isEmpty() ) { cddb_disc_t *cddb_disc; if ( freedb_query( cddb_disc ) ) { if ( cdTitle.isEmpty() && cdArtist.isEmpty() ) freedb_get_disc_info( cddb_disc ); freedb_get_track_info( cddb_disc ); cddb_disc_destroy( cddb_disc ); } } StreamInfo *streamInfo = new StreamInfo; streamInfo->type = QMPLAY2_TYPE_AUDIO; streamInfo->is_default = true; streamInfo->sample_rate = srate; streamInfo->channels = chn; streams_info += streamInfo; return true; } else QMPlay2Core.log( tr( "Błąd odczytu ścieżki" ) ); } else QMPlay2Core.log( tr( "Brak płyty w napędzie" ) ); } else QMPlay2Core.log( tr( "Nieprawidłowa ścieżka do napędu CD" ) ); } else //dodawanie do listy ścieżek AudioCD { #ifndef Q_OS_WIN device = QUrl( _url ).path(); #else device = _url.mid( strlen( AudioCDName"://" ), 2 ); #endif #ifndef Q_OS_WIN if ( !QFileInfo( device ).isDir() ) #endif if ( !device.isEmpty() ) { emit QMPlay2Core.processParam( "DelPlaylistEntries", _url ); QList< Playlist::Entry > entries = getTracks( device ); if ( !entries.isEmpty() && Playlist::write( entries, "file://" + AudioCDPlaylist ) ) { emit QMPlay2Core.processParam( "open", AudioCDPlaylist ); return true; } } } return false; }