[Xfce4-commits] <parole:master> Hacked-together Audio CD playlist support.
Sean Davis
noreply at xfce.org
Sun Dec 2 20:26:03 CET 2012
Updating branch refs/heads/master
to 6b991bbf4f61e8076f392a60614d737e7308656b (commit)
from e683631c487cc3ccd0c204336b6a3330af635965 (commit)
commit 6b991bbf4f61e8076f392a60614d737e7308656b
Author: Sean Davis <smd.seandavis at gmail.com>
Date: Sun Dec 2 14:25:52 2012 -0500
Hacked-together Audio CD playlist support.
src/gst/parole-gst.c | 62 +++--------------------------------------------
src/gst/parole-gst.h | 2 +
src/misc/parole-file.c | 44 +++++++++++++++++++++++++++++++++-
src/misc/parole-file.h | 2 +
src/parole-medialist.c | 16 ++++++++++++
src/parole-medialist.h | 2 +
src/parole-player.c | 37 +++++++++++++++++-----------
7 files changed, 91 insertions(+), 74 deletions(-)
diff --git a/src/gst/parole-gst.c b/src/gst/parole-gst.c
index 5d09e59..346e1fd 100644
--- a/src/gst/parole-gst.c
+++ b/src/gst/parole-gst.c
@@ -64,9 +64,6 @@ static void parole_gst_change_state (ParoleGst *gst,
static void parole_gst_terminate_internal (ParoleGst *gst,
gboolean fade_sound);
-static void parole_gst_seek_cdda_track (ParoleGst *gst,
- gint track);
-
static gchar * parole_gst_tag_list_get_cover_external (ParoleGst *gst);
static GdkPixbuf * parole_gst_tag_list_get_cover (ParoleGst *gst, GstTagList *tag_list);
@@ -1370,28 +1367,12 @@ parole_gst_bus_event (GstBus *bus, GstMessage *msg, gpointer data)
case GST_MESSAGE_EOS:
{
ParoleMediaType media_type;
- gint current_track;
TRACE ("End of stream");
g_object_get (G_OBJECT (gst->priv->stream),
"media-type", &media_type,
NULL);
- if ( media_type == PAROLE_MEDIA_TYPE_CDDA )
- {
- gint num_tracks;
- g_object_get (G_OBJECT (gst->priv->stream),
- "num-tracks", &num_tracks,
- "track", ¤t_track,
- NULL);
-
- TRACE ("Current track %d Number of tracks %d", current_track, num_tracks);
- if ( num_tracks != current_track )
- {
- parole_gst_seek_cdda_track (gst, current_track);
- break;
- }
- }
gst->priv->media_state = PAROLE_STATE_PLAYBACK_FINISHED;
g_signal_emit (G_OBJECT (gst), signals [MEDIA_STATE], 0,
@@ -1670,19 +1651,6 @@ parole_gst_button_release_event (GtkWidget *widget, GdkEventButton *ev)
return ret;
}
-static void parole_gst_seek_cdda_track (ParoleGst *gst,
- gint track)
-{
- TRACE ("Track %d", track);
-
- if ( !gst_element_seek (gst->priv->playbin, 1.0, gst_format_get_by_nick ("track"),
- GST_SEEK_FLAG_FLUSH, GST_SEEK_TYPE_SET,
- track,
- GST_SEEK_TYPE_NONE,
- 0) )
- g_warning ("Seek to track %d failed ", track);
-}
-
static void
parole_gst_seek_by_format (ParoleGst *gst, GstFormat format, gint step)
{
@@ -2400,37 +2368,15 @@ void parole_gst_prev_dvd_chapter (ParoleGst *gst)
parole_gst_change_dvd_chapter (gst, -1);
}
-void parole_gst_next_cdda_track (ParoleGst *gst)
+gint parole_gst_get_num_tracks (ParoleGst *gst)
{
- //parole_gst_change_cdda_track (gst, 1);
-
- gint num_tracks, current_track;
+ gint num_tracks;
g_object_get (G_OBJECT (gst->priv->stream),
"num-tracks", &num_tracks,
- "track", ¤t_track,
- NULL);
-
- if ( num_tracks != current_track )
- {
- parole_gst_seek_cdda_track (gst, current_track);
- }
-}
-
-void parole_gst_prev_cdda_track (ParoleGst *gst)
-{
- //parole_gst_change_cdda_track (gst, -1);
-
- gint current_track;
-
- g_object_get (G_OBJECT (gst->priv->stream),
- "track", ¤t_track,
NULL);
-
- if ( current_track != 1 )
- {
- parole_gst_seek_cdda_track (gst, current_track-2);
- }
+
+ return num_tracks;
}
void parole_gst_seek_cdda (ParoleGst *gst, guint track_num)
diff --git a/src/gst/parole-gst.h b/src/gst/parole-gst.h
index 1102de1..5530768 100644
--- a/src/gst/parole-gst.h
+++ b/src/gst/parole-gst.h
@@ -128,6 +128,8 @@ void parole_gst_next_cdda_track (ParoleGst *gst);
void parole_gst_prev_cdda_track (ParoleGst *gst);
+gint parole_gst_get_num_tracks (ParoleGst *gst);
+
void parole_gst_seek_cdda (ParoleGst *gst,
guint track_num);
diff --git a/src/misc/parole-file.c b/src/misc/parole-file.c
index 531948b..996a74b 100644
--- a/src/misc/parole-file.c
+++ b/src/misc/parole-file.c
@@ -164,9 +164,24 @@ parole_file_constructed (GObject *object)
ParoleFilePrivate *priv;
GError *error = NULL;
+ gchar *filename;
+
file = PAROLE_FILE (object);
priv = PAROLE_FILE_GET_PRIVATE (file);
+ filename = g_strdup(priv->filename);
+
+ if ( g_str_has_prefix(filename, "cdda") )
+ {
+ priv->directory = NULL;
+ priv->uri = g_strdup(filename);
+ priv->content_type = "cdda";
+ g_free(filename);
+ return;
+ }
+
+ g_free(filename);
+
gfile = g_file_new_for_commandline_arg (priv->filename);
info = g_file_query_info (gfile,
@@ -310,7 +325,7 @@ parole_file_class_init (ParoleFileClass *klass)
"Content type",
"The content type of the file",
NULL,
- G_PARAM_READABLE));
+ G_PARAM_READABLE));
/**
* ParoleFile:directory:
@@ -394,10 +409,37 @@ ParoleFile *
parole_file_new_with_display_name (const gchar *filename, const gchar *display_name)
{
ParoleFile *file = NULL;
+
file = g_object_new (PAROLE_TYPE_FILE,
"filename", filename,
"display-name", display_name,
NULL);
+
+ return file;
+}
+
+/**
+ * parole_file_new_cdda_track:
+ * @track_num: cd track number.
+ *
+ *
+ *
+ * Returns: A new #ParoleFile object.
+ *
+ * Since: 0.4
+ **/
+ParoleFile *
+parole_file_new_cdda_track (const gint track_num, const gchar *display_name)
+{
+ ParoleFile *file = NULL;
+ gchar *uri = g_strdup_printf("cdda://%i", track_num);
+
+ file = g_object_new (PAROLE_TYPE_FILE,
+ "filename", uri,
+ "display-name", display_name,
+ NULL);
+
+ g_free(uri);
return file;
}
diff --git a/src/misc/parole-file.h b/src/misc/parole-file.h
index 7b55450..6fc5b9c 100644
--- a/src/misc/parole-file.h
+++ b/src/misc/parole-file.h
@@ -53,6 +53,8 @@ ParoleFile *parole_file_new (const gchar *filename)
ParoleFile *parole_file_new_with_display_name (const gchar *filename,
const gchar *display_name);
+ParoleFile *parole_file_new_cdda_track (const gint track_num, const gchar *display_name);
+
void parole_file_set_custom_subtitles (const ParoleFile *file, gchar *suburi);
diff --git a/src/parole-medialist.c b/src/parole-medialist.c
index f898153..655d068 100644
--- a/src/parole-medialist.c
+++ b/src/parole-medialist.c
@@ -307,6 +307,22 @@ parole_media_list_files_open (ParoleMediaList *list, GSList *files, gboolean emi
}
}
+void
+parole_media_list_add_cdda_tracks (ParoleMediaList *list, gint n_tracks)
+{
+ GSList *files = NULL;
+ ParoleFile *file;
+ int i;
+
+ for (i = 0; i < n_tracks; i++)
+ {
+ file = parole_file_new_cdda_track( i+1, g_strdup_printf( _("Track %i"), i+1) );
+ files = g_slist_append(files, file);
+ }
+
+ parole_media_list_files_open(list, files, TRUE);
+}
+
/* Callback to determine whether opened files should start playing immediately */
static void
parole_media_list_files_opened_cb (ParoleMediaChooser *chooser,
diff --git a/src/parole-medialist.h b/src/parole-medialist.h
index 8b6253e..249008d 100644
--- a/src/parole-medialist.h
+++ b/src/parole-medialist.h
@@ -125,6 +125,8 @@ void parole_media_list_open_location (ParoleMediaList *list);
gboolean parole_media_list_add_files (ParoleMediaList *list,
gchar **filenames, gboolean enqueue);
+
+void parole_media_list_add_cdda_tracks (ParoleMediaList *list, gint n_tracks);
void parole_media_list_save_list (ParoleMediaList *list);
diff --git a/src/parole-player.c b/src/parole-player.c
index 9d40010..54c32c6 100644
--- a/src/parole-player.c
+++ b/src/parole-player.c
@@ -361,6 +361,8 @@ struct ParolePlayerPrivate
gboolean internal_range_change;
gboolean buffering;
+ gboolean wait_for_gst_disc_info;
+
GtkTreeRowReference *row;
};
@@ -960,8 +962,10 @@ parole_player_media_activated_cb (ParoleMediaList *list, GtkTreeRowReference *ro
{
const gchar *sub = NULL;
const gchar *uri;
+ const gchar *directory = NULL;
uri = parole_file_get_uri (file);
+ directory = parole_file_get_directory(file);
if ( g_str_has_prefix (uri, "file:/") )
{
@@ -974,7 +978,7 @@ parole_player_media_activated_cb (ParoleMediaList *list, GtkTreeRowReference *ro
}
}
TRACE ("Trying to play media file %s", uri);
- TRACE ("File content type %s", parole_file_get_content_type (file));
+ TRACE ("File content type %s", parole_file_get_content_type(file));
parole_gst_play_uri (PAROLE_GST (player->priv->gst),
@@ -982,7 +986,9 @@ parole_player_media_activated_cb (ParoleMediaList *list, GtkTreeRowReference *ro
sub);
gtk_window_set_title (GTK_WINDOW (player->priv->window), parole_file_get_display_name(file));
- parole_rc_write_entry_string ("media-chooser-folder", PAROLE_RC_GROUP_GENERAL, parole_file_get_directory(file));
+
+ if ( directory )
+ parole_rc_write_entry_string ("media-chooser-folder", PAROLE_RC_GROUP_GENERAL, directory);
g_object_unref (file);
@@ -996,6 +1002,9 @@ parole_player_disc_selected_cb (ParoleDisc *disc, const gchar *uri, const gchar
parole_player_reset (player);
parole_gst_play_device_uri (PAROLE_GST (player->priv->gst), uri, device);
player->priv->current_media_type = parole_gst_get_current_stream_type (PAROLE_GST (player->priv->gst));
+
+ if ( player->priv->current_media_type == PAROLE_MEDIA_TYPE_CDDA )
+ player->priv->wait_for_gst_disc_info = TRUE;
}
static void
@@ -1224,6 +1233,12 @@ parole_player_playing (ParolePlayer *player, const ParoleStream *stream)
"live", &live,
NULL);
+ if (player->priv->wait_for_gst_disc_info == TRUE)
+ {
+ parole_media_list_add_cdda_tracks(player->priv->list, parole_gst_get_num_tracks(PAROLE_GST (player->priv->gst)));
+ player->priv->wait_for_gst_disc_info = FALSE;
+ }
+
gtk_widget_set_sensitive (player->priv->play_pause, TRUE);
parole_player_set_playpause_button_image (player->priv->play_pause, GTK_STOCK_MEDIA_PAUSE);
@@ -1341,14 +1356,10 @@ parole_player_play_next (ParolePlayer *player, gboolean allow_shuffle)
{
gboolean repeat, shuffle;
GtkTreeRowReference *row;
-
- if ( player->priv->current_media_type == PAROLE_MEDIA_TYPE_DVD ||
- player->priv->current_media_type == PAROLE_MEDIA_TYPE_CDDA )
+
+ if ( player->priv->current_media_type == PAROLE_MEDIA_TYPE_DVD )
{
- if ( player->priv->current_media_type == PAROLE_MEDIA_TYPE_DVD )
parole_gst_next_dvd_chapter (PAROLE_GST(player->priv->gst));
- else if ( player->priv->current_media_type == PAROLE_MEDIA_TYPE_CDDA)
- parole_gst_next_cdda_track (PAROLE_GST(player->priv->gst));
return;
}
@@ -1387,13 +1398,9 @@ parole_player_play_prev (ParolePlayer *player)
{
GtkTreeRowReference *row;
- if ( player->priv->current_media_type == PAROLE_MEDIA_TYPE_DVD ||
- player->priv->current_media_type == PAROLE_MEDIA_TYPE_CDDA )
+ if ( player->priv->current_media_type == PAROLE_MEDIA_TYPE_DVD )
{
- if ( player->priv->current_media_type == PAROLE_MEDIA_TYPE_DVD )
parole_gst_prev_dvd_chapter (PAROLE_GST(player->priv->gst));
- else if ( player->priv->current_media_type == PAROLE_MEDIA_TYPE_CDDA)
- parole_gst_prev_cdda_track (PAROLE_GST(player->priv->gst));
return;
}
@@ -1476,8 +1483,7 @@ parole_player_media_state_cb (ParoleGst *gst, const ParoleStream *stream, Parole
#ifdef DEBUG
TRACE ("***Playback about to finish***");
#endif
- if ( player->priv->current_media_type == PAROLE_MEDIA_TYPE_DVD ||
- player->priv->current_media_type == PAROLE_MEDIA_TYPE_CDDA )
+ if ( player->priv->current_media_type == PAROLE_MEDIA_TYPE_DVD )
parole_player_play_next (player, TRUE);
}
else if ( state == PAROLE_STATE_PLAYBACK_FINISHED )
@@ -2685,6 +2691,7 @@ parole_player_init (ParolePlayer *player)
player->priv->full_screen = FALSE;
player->priv->buffering = FALSE;
player->priv->row = NULL;
+ player->priv->wait_for_gst_disc_info = FALSE;
player->priv->recent = gtk_recent_manager_get_default ();
More information about the Xfce4-commits
mailing list