static CdAlbum toAlbum(cddb_disc_t *disc, const CdAlbum &initial=CdAlbum()) { CdAlbum album; if (!disc) { return album; } album.name=QString::fromUtf8(cddb_disc_get_title(disc)); album.artist=QString::fromUtf8(cddb_disc_get_artist(disc)); album.genre=QString::fromUtf8(cddb_disc_get_genre(disc)); album.year=cddb_disc_get_year(disc); int numTracks=cddb_disc_get_track_count(disc); if (numTracks>0) { for (int t=0; t<numTracks; ++t) { cddb_track_t *trk=cddb_disc_get_track(disc, t); if (!trk) { continue; } Song track; track.track=cddb_track_get_number(trk); track.title=QString::fromUtf8(cddb_track_get_title(trk)); track.artist=QString::fromUtf8(cddb_track_get_artist(trk)); track.albumartist=album.artist; track.album=album.name; track.id=track.track; track.file=QString("%1.wav").arg(track.track); track.year=album.year; if (initial.isNull()) { track.time=cddb_track_get_length(trk); if (CddbInterface::dataTrack()==track.title) { // Adjust last track length... if (album.tracks.count()) { Song last=album.tracks.takeLast(); last.time-=FRAMES_TO_SECONDS(11400); album.tracks.append(last); } } else { album.tracks.append(track); } } else if (t>=initial.tracks.count()) { break; } else { track.time=initial.tracks.at(t).time; album.tracks.append(track); } } } // Ensure we always have same number of tracks... if (!initial.isNull() && album.tracks.count()<initial.tracks.count()) { for (int i=album.tracks.count(); i<initial.tracks.count(); ++i) { album.tracks.append(initial.tracks.at(i)); } } return album; }
bool AudioCDDemux::freedb_query( cddb_disc_t *&cddb_disc ) { #ifdef Q_OS_WIN bool hasHomeEnv = getenv( "HOME" ); if ( !hasHomeEnv ) putenv( "HOME=" + QDir::homePath().toLocal8Bit() ); #endif cddb_conn_t *cddb = cddb_new(); #ifdef Q_OS_WIN if ( !hasHomeEnv ) putenv( "HOME=" ); #endif cddb_disc = cddb_disc_new(); #ifdef Q_OS_WIN const QString cddbDir = QMPlay2Core.getSettingsDir() + "CDDB"; if ( QDir( cddbDir ).exists() || QDir( QMPlay2Core.getSettingsDir() ).mkdir( "CDDB" ) ) cddb_cache_set_dir( cddb, cddbDir.toLocal8Bit() ); #endif cddb_disc_set_length( cddb_disc, FRAMES_TO_SECONDS( cdio_get_track_lba( cdio, CDIO_CDROM_LEADOUT_TRACK ) ) ); for ( int trackno = 1 ; trackno <= numTracks ; ++trackno ) { cddb_track_t *pcddb_track = cddb_track_new(); cddb_track_set_frame_offset( pcddb_track, cdio_get_track_lba( cdio, trackno ) ); cddb_disc_add_track( cddb_disc, pcddb_track ); } bool useNetwork = false; cddb_disc_calc_discid( cddb_disc ); if ( cddb_disc_get_discid( cddb_disc ) == discID ) cddb_cache_only( cddb ); else { discID = cddb_disc_get_discid( cddb_disc ); cddb_set_timeout( cddb, 3 ); cddb_http_enable( cddb ); cddb_set_server_port( cddb, 80 ); Settings sets( "QMPlay2" ); if ( sets.getBool( "Proxy/Use" ) ) { cddb_http_proxy_enable( cddb ); cddb_set_http_proxy_server_name( cddb, sets.getString( "Proxy/Host" ).toLocal8Bit() ); cddb_set_http_proxy_server_port( cddb, sets.getUInt( "Proxy/Port" ) ); if ( sets.getBool( "Proxy/Login" ) ) { cddb_set_http_proxy_username( cddb, sets.getString( "Proxy/User" ).toLocal8Bit() ); cddb_set_http_proxy_password( cddb, QString( QByteArray::fromBase64( sets.getByteArray( "Proxy/Password" ) ) ).toLocal8Bit() ); } } useNetwork = true; } for ( int i = 0 ; i <= useNetwork ; ++i ) { if ( cddb_query( cddb, cddb_disc ) > 0 ) { do if ( cddb_disc_get_discid( cddb_disc ) == discID ) { cddb_read( cddb, cddb_disc ); cddb_destroy( cddb ); return true; } while ( cddb_query_next( cddb, cddb_disc ) ); } if ( useNetwork && !i ) cddb_set_server_name( cddb, "freedb.musicbrainz.org" ); } cddb_disc_destroy( cddb_disc ); cddb_destroy( cddb ); cddb_disc = NULL; return false; }
/* mutex must be locked */ static void scan_cd (void) { AUDDBG ("Scanning CD drive.\n"); g_return_if_fail (pcdrom_drive != NULL); g_return_if_fail (trackinfo == NULL); gint trackno; /* general track initialization */ /* skip endianness detection (because it only affects cdda_read, and we use * cdio_read_audio_sectors instead) */ pcdrom_drive->bigendianp = 0; /* finish initialization of drive/disc (performs disc TOC sanitization) */ if (cdda_open (pcdrom_drive) != 0) { cdaudio_error ("Failed to finish initializing opened CD drive."); goto ERR; } if (cdda_speed_set (pcdrom_drive, cdng_cfg.disc_speed) != DRIVER_OP_SUCCESS) warn ("Cannot set drive speed.\n"); firsttrackno = cdio_get_first_track_num (pcdrom_drive->p_cdio); lasttrackno = cdio_get_last_track_num (pcdrom_drive->p_cdio); if (firsttrackno == CDIO_INVALID_TRACK || lasttrackno == CDIO_INVALID_TRACK) { cdaudio_error ("Failed to retrieve first/last track number."); goto ERR; } AUDDBG ("first track is %d and last track is %d\n", firsttrackno, lasttrackno); trackinfo = (trackinfo_t *) g_new (trackinfo_t, (lasttrackno + 1)); cdaudio_set_fullinfo (&trackinfo[0], cdda_track_firstsector (pcdrom_drive, 0), cdda_track_lastsector (pcdrom_drive, lasttrackno), "", "", ""); n_audio_tracks = 0; for (trackno = firsttrackno; trackno <= lasttrackno; trackno++) { cdaudio_set_fullinfo (&trackinfo[trackno], cdda_track_firstsector (pcdrom_drive, trackno), cdda_track_lastsector (pcdrom_drive, trackno), "", "", ""); if (trackinfo[trackno].startlsn == CDIO_INVALID_LSN || trackinfo[trackno].endlsn == CDIO_INVALID_LSN) { cdaudio_error ("Cannot read start/end LSN for track %d.", trackno); goto ERR; } /* count how many tracks are audio tracks */ if (cdda_track_audiop (pcdrom_drive, trackno)) n_audio_tracks++; } /* get trackinfo[0] cdtext information (the disc) */ if (cdng_cfg.use_cdtext) { AUDDBG ("getting cd-text information for disc\n"); cdtext_t *pcdtext = cdio_get_cdtext (pcdrom_drive->p_cdio, 0); if (pcdtext == NULL || pcdtext->field[CDTEXT_TITLE] == NULL) { AUDDBG ("no cd-text available for disc\n"); } else { cdaudio_set_strinfo (&trackinfo[0], pcdtext->field[CDTEXT_PERFORMER] ? pcdtext-> field[CDTEXT_PERFORMER] : "", pcdtext->field[CDTEXT_TITLE] ? pcdtext-> field[CDTEXT_TITLE] : "", pcdtext->field[CDTEXT_GENRE] ? pcdtext-> field[CDTEXT_GENRE] : ""); } } /* get track information from cdtext */ gboolean cdtext_was_available = FALSE; for (trackno = firsttrackno; trackno <= lasttrackno; trackno++) { cdtext_t *pcdtext = NULL; if (cdng_cfg.use_cdtext) { AUDDBG ("getting cd-text information for track %d\n", trackno); pcdtext = cdio_get_cdtext (pcdrom_drive->p_cdio, trackno); if (pcdtext == NULL || pcdtext->field[CDTEXT_PERFORMER] == NULL) { AUDDBG ("no cd-text available for track %d\n", trackno); pcdtext = NULL; } } if (pcdtext != NULL) { cdaudio_set_strinfo (&trackinfo[trackno], pcdtext->field[CDTEXT_PERFORMER] ? pcdtext-> field[CDTEXT_PERFORMER] : "", pcdtext->field[CDTEXT_TITLE] ? pcdtext-> field[CDTEXT_TITLE] : "", pcdtext->field[CDTEXT_GENRE] ? pcdtext-> field[CDTEXT_GENRE] : ""); cdtext_was_available = TRUE; } else { cdaudio_set_strinfo (&trackinfo[trackno], "", "", ""); snprintf (trackinfo[trackno].name, DEF_STRING_LEN, "Track %d", trackno); } } if (!cdtext_was_available) { /* initialize de cddb subsystem */ cddb_conn_t *pcddb_conn = NULL; cddb_disc_t *pcddb_disc = NULL; cddb_track_t *pcddb_track = NULL; lba_t lba; /* Logical Block Address */ if (cdng_cfg.use_cddb) { pcddb_conn = cddb_new (); if (pcddb_conn == NULL) cdaudio_error ("Failed to create the cddb connection."); else { AUDDBG ("getting CDDB info\n"); cddb_cache_enable (pcddb_conn); // cddb_cache_set_dir(pcddb_conn, "~/.cddbslave"); if (cdng_cfg.use_proxy) { cddb_http_proxy_enable (pcddb_conn); cddb_set_http_proxy_server_name (pcddb_conn, cdng_cfg.proxy_host); cddb_set_http_proxy_server_port (pcddb_conn, cdng_cfg.proxy_port); cddb_set_http_proxy_username (pcddb_conn, cdng_cfg.proxy_username); cddb_set_http_proxy_password (pcddb_conn, cdng_cfg.proxy_password); cddb_set_server_name (pcddb_conn, cdng_cfg.cddb_server); cddb_set_server_port (pcddb_conn, cdng_cfg.cddb_port); } else if (cdng_cfg.cddb_http) { cddb_http_enable (pcddb_conn); cddb_set_server_name (pcddb_conn, cdng_cfg.cddb_server); cddb_set_server_port (pcddb_conn, cdng_cfg.cddb_port); cddb_set_http_path_query (pcddb_conn, cdng_cfg.cddb_path); } else { cddb_set_server_name (pcddb_conn, cdng_cfg.cddb_server); cddb_set_server_port (pcddb_conn, cdng_cfg.cddb_port); } pcddb_disc = cddb_disc_new (); lba = cdio_get_track_lba (pcdrom_drive->p_cdio, CDIO_CDROM_LEADOUT_TRACK); cddb_disc_set_length (pcddb_disc, FRAMES_TO_SECONDS (lba)); for (trackno = firsttrackno; trackno <= lasttrackno; trackno++) { pcddb_track = cddb_track_new (); cddb_track_set_frame_offset (pcddb_track, cdio_get_track_lba ( pcdrom_drive->p_cdio, trackno)); cddb_disc_add_track (pcddb_disc, pcddb_track); } cddb_disc_calc_discid (pcddb_disc); #if DEBUG guint discid = cddb_disc_get_discid (pcddb_disc); AUDDBG ("CDDB disc id = %x\n", discid); #endif gint matches; if ((matches = cddb_query (pcddb_conn, pcddb_disc)) == -1) { if (cddb_errno (pcddb_conn) == CDDB_ERR_OK) cdaudio_error ("Failed to query the CDDB server"); else cdaudio_error ("Failed to query the CDDB server: %s", cddb_error_str (cddb_errno (pcddb_conn))); cddb_disc_destroy (pcddb_disc); pcddb_disc = NULL; } else { if (matches == 0) { AUDDBG ("no cddb info available for this disc\n"); cddb_disc_destroy (pcddb_disc); pcddb_disc = NULL; } else { AUDDBG ("CDDB disc category = \"%s\"\n", cddb_disc_get_category_str (pcddb_disc)); cddb_read (pcddb_conn, pcddb_disc); if (cddb_errno (pcddb_conn) != CDDB_ERR_OK) { cdaudio_error ("failed to read the cddb info: %s", cddb_error_str (cddb_errno (pcddb_conn))); cddb_disc_destroy (pcddb_disc); pcddb_disc = NULL; } else { cdaudio_set_strinfo (&trackinfo[0], cddb_disc_get_artist (pcddb_disc), cddb_disc_get_title (pcddb_disc), cddb_disc_get_genre (pcddb_disc)); gint trackno; for (trackno = firsttrackno; trackno <= lasttrackno; trackno++) { cddb_track_t *pcddb_track = cddb_disc_get_track (pcddb_disc, trackno - 1); cdaudio_set_strinfo (&trackinfo[trackno], cddb_track_get_artist (pcddb_track), cddb_track_get_title (pcddb_track), cddb_disc_get_genre (pcddb_disc)); } } } } } } if (pcddb_disc != NULL) cddb_disc_destroy (pcddb_disc); if (pcddb_conn != NULL) cddb_destroy (pcddb_conn); } return; ERR: g_free (trackinfo); trackinfo = NULL; }