static void foreach_tag (const GstTagList *list, const gchar *tag, BraseroTranscode *transcode) { BraseroTrack *track; BraseroJobAction action; brasero_job_get_action (BRASERO_JOB (transcode), &action); brasero_job_get_current_track (BRASERO_JOB (transcode), &track); BRASERO_JOB_LOG (transcode, "Retrieving tags"); if (!strcmp (tag, GST_TAG_TITLE)) { if (!brasero_track_tag_lookup_string (track, BRASERO_TRACK_STREAM_TITLE_TAG)) { gchar *title = NULL; gst_tag_list_get_string (list, tag, &title); brasero_track_tag_add_string (track, BRASERO_TRACK_STREAM_TITLE_TAG, title); g_free (title); } } else if (!strcmp (tag, GST_TAG_ARTIST)) { if (!brasero_track_tag_lookup_string (track, BRASERO_TRACK_STREAM_ARTIST_TAG)) { gchar *artist = NULL; gst_tag_list_get_string (list, tag, &artist); brasero_track_tag_add_string (track, BRASERO_TRACK_STREAM_ARTIST_TAG, artist); g_free (artist); } } else if (!strcmp (tag, GST_TAG_ISRC)) { if (!brasero_track_tag_lookup_int (track, BRASERO_TRACK_STREAM_ISRC_TAG)) { gchar *isrc = NULL; gst_tag_list_get_string (list, tag, &isrc); brasero_track_tag_add_int (track, BRASERO_TRACK_STREAM_ISRC_TAG, (int) g_ascii_strtoull (isrc, NULL, 10)); } } else if (!strcmp (tag, GST_TAG_PERFORMER)) { if (!brasero_track_tag_lookup_string (track, BRASERO_TRACK_STREAM_ARTIST_TAG)) { gchar *artist = NULL; gst_tag_list_get_string (list, tag, &artist); brasero_track_tag_add_string (track, BRASERO_TRACK_STREAM_ARTIST_TAG, artist); g_free (artist); } } else if (action == BRASERO_JOB_ACTION_SIZE && !strcmp (tag, GST_TAG_DURATION)) { guint64 duration; /* this is only useful when we try to have the size */ gst_tag_list_get_uint64 (list, tag, &duration); brasero_track_stream_set_boundaries (BRASERO_TRACK_STREAM (track), 0, duration, -1); } }
SongLoader::Result SongLoader::LoadAudioCD() { #ifdef HAVE_AUDIOCD // Create gstreamer cdda element GstElement* cdda = gst_element_make_from_uri (GST_URI_SRC, "cdda://", NULL); if (cdda == NULL) { qLog(Error) << "Error while creating CDDA GstElement"; return Error; } // Change the element's state to ready and paused, to be able to query it if (gst_element_set_state(cdda, GST_STATE_READY) == GST_STATE_CHANGE_FAILURE || gst_element_set_state(cdda, GST_STATE_PAUSED) == GST_STATE_CHANGE_FAILURE) { qLog(Error) << "Error while changing CDDA GstElement's state"; gst_element_set_state(cdda, GST_STATE_NULL); gst_object_unref(GST_OBJECT(cdda)); return Error; } // Get number of tracks GstFormat fmt = gst_format_get_by_nick ("track"); GstFormat out_fmt = fmt; gint64 num_tracks = 0; if (!gst_element_query_duration (cdda, &out_fmt, &num_tracks) || out_fmt != fmt) { qLog(Error) << "Error while querying cdda GstElement"; gst_object_unref(GST_OBJECT(cdda)); return Error; } for (int track_number = 1; track_number <= num_tracks; track_number++) { // Init song Song song; guint64 duration = 0; // quint64 == ulonglong and guint64 == ulong, therefore we must cast if (gst_tag_list_get_uint64 (GST_CDDA_BASE_SRC(cdda)->tracks[track_number-1].tags, GST_TAG_DURATION, &duration)) { song.set_length_nanosec((quint64)duration); } song.set_valid(true); song.set_filetype(Song::Type_Cdda); song.set_url(QUrl(QString("cdda://%1").arg(track_number))); song.set_title(QString("Track %1").arg(track_number)); song.set_track(track_number); songs_ << song; } // Generate MusicBrainz DiscId gst_tag_register_musicbrainz_tags(); GstElement *pipe = gst_pipeline_new ("pipeline"); gst_bin_add (GST_BIN (pipe), cdda); gst_element_set_state (pipe, GST_STATE_READY); gst_element_set_state (pipe, GST_STATE_PAUSED); GstMessage *msg = gst_bus_timed_pop_filtered (GST_ELEMENT_BUS (pipe), GST_CLOCK_TIME_NONE, GST_MESSAGE_TAG); GstTagList *tags = NULL; gst_message_parse_tag (msg, &tags); char *string_mb = NULL; if (gst_tag_list_get_string (tags, GST_TAG_CDDA_MUSICBRAINZ_DISCID, &string_mb)) { QString musicbrainz_discid(string_mb); qLog(Info) << "MusicBrainz discid: " << musicbrainz_discid; MusicBrainzClient *musicbrainz_client = new MusicBrainzClient(this); connect(musicbrainz_client, SIGNAL(Finished(const QString&, const QString&, MusicBrainzClient::ResultList)), SLOT(AudioCDTagsLoaded(const QString&, const QString&, MusicBrainzClient::ResultList))); musicbrainz_client->StartDiscIdRequest(musicbrainz_discid); g_free(string_mb); } // Clean all the Gstreamer objects we have used: we don't need them anymore gst_object_unref(GST_OBJECT(cdda)); gst_element_set_state (pipe, GST_STATE_NULL); gst_object_unref(GST_OBJECT(pipe)); gst_object_unref(GST_OBJECT(msg)); gst_object_unref(GST_OBJECT(tags)); return Success; #else // HAVE_AUDIOCD return Error; #endif }