Revision: 2003
http://gtkpod.svn.sourceforge.net/gtkpod/?rev=2003&view=rev
Author: tmzullinger
Date: 2008-05-31 15:33:00 -0700 (Sat, 31 May 2008)
Log Message:
-----------
Pull in the latest player branch changes from Ryan
Modified Paths:
--------------
gtkpod/branches/gstreamer_player_support/ChangeLog
gtkpod/branches/gstreamer_player_support/data/Makefile.am
gtkpod/branches/gstreamer_player_support/po/POTFILES.in
gtkpod/branches/gstreamer_player_support/src/display.c
gtkpod/branches/gstreamer_player_support/src/display_playlists.c
gtkpod/branches/gstreamer_player_support/src/display_sorttabs.c
gtkpod/branches/gstreamer_player_support/src/file.c
gtkpod/branches/gstreamer_player_support/src/misc.h
gtkpod/branches/gstreamer_player_support/src/player.c
gtkpod/branches/gstreamer_player_support/src/player.h
Modified: gtkpod/branches/gstreamer_player_support/ChangeLog
===================================================================
--- gtkpod/branches/gstreamer_player_support/ChangeLog 2008-05-31 22:27:23 UTC
(rev 2002)
+++ gtkpod/branches/gstreamer_player_support/ChangeLog 2008-05-31 22:33:00 UTC
(rev 2003)
@@ -1,5 +1,15 @@
2008-05-31 Todd Zullinger <tmzullinger at users.sourceforge.net>
+ * src/display.c
+ src/display_playlists.c
+ src/display_sorttabs.c
+ src/file.c
+ src/misc.h
+ src/player.c
+ src/player.h: Pull in the latest player branch changes from Ryan
+
+2008-05-31 Todd Zullinger <tmzullinger at users.sourceforge.net>
+
* po/POTFILES.in: update file list to keep distcheck happy
* data/icons/hicolor/16x16/places/Makefile.am
Modified: gtkpod/branches/gstreamer_player_support/data/Makefile.am
===================================================================
--- gtkpod/branches/gstreamer_player_support/data/Makefile.am 2008-05-31
22:27:23 UTC (rev 2002)
+++ gtkpod/branches/gstreamer_player_support/data/Makefile.am 2008-05-31
22:33:00 UTC (rev 2003)
@@ -18,8 +18,10 @@
gtkpod-logo.png \
gtkpod-read.png \
gtkpod-read-16.png \
- photo-toolbar-album.png \
- photo-toolbar-photos.png
+ photo-toolbar-album.png \
+ photo-toolbar-photos.png \
+ video-mode.png \
+ volume-control.png
EXTRA_DIST = \
$(desktop_in_files) \
Modified: gtkpod/branches/gstreamer_player_support/po/POTFILES.in
===================================================================
--- gtkpod/branches/gstreamer_player_support/po/POTFILES.in 2008-05-31
22:27:23 UTC (rev 2002)
+++ gtkpod/branches/gstreamer_player_support/po/POTFILES.in 2008-05-31
22:33:00 UTC (rev 2003)
@@ -41,6 +41,7 @@
src/mp3file.c
src/mp4file.c
src/oggfile.c
+src/player.c
src/prefs.c
src/prefsdlg.c
src/repository.c
Modified: gtkpod/branches/gstreamer_player_support/src/display.c
===================================================================
--- gtkpod/branches/gstreamer_player_support/src/display.c 2008-05-31
22:27:23 UTC (rev 2002)
+++ gtkpod/branches/gstreamer_player_support/src/display.c 2008-05-31
22:33:00 UTC (rev 2003)
@@ -51,7 +51,20 @@
GtkWidget *gtkpod_window = NULL;
-
+gboolean show = TRUE;
+void IconClick(GtkStatusIcon *status_icon, guint button, guint activate_time,
gpointer user_data)
+{
+ if(show == TRUE)
+ {
+ show = FALSE;
+ gtk_widget_hide (user_data);
+ }
+ else
+ {
+ show = TRUE;
+ gtk_widget_show (user_data);
+ }
+}
/* Create the listviews etc */
void display_create (void)
{
@@ -59,7 +72,9 @@
GtkTooltips *main_tooltips;
g_return_if_fail (gtkpod_window);
-
+ GtkStatusIcon *icon;
+ icon = gtk_status_icon_new();
+
g_signal_connect(G_OBJECT(icon),"activate",G_CALLBACK(IconClick),(gpointer)gtkpod_window);
#ifndef HAVE_GSTREAMER
gtk_widget_hide (gtkpod_xml_get_widget (main_window_xml, "media_toolbar"));
#else
Modified: gtkpod/branches/gstreamer_player_support/src/display_playlists.c
===================================================================
--- gtkpod/branches/gstreamer_player_support/src/display_playlists.c
2008-05-31 22:27:23 UTC (rev 2002)
+++ gtkpod/branches/gstreamer_player_support/src/display_playlists.c
2008-05-31 22:33:00 UTC (rev 2003)
@@ -2190,7 +2190,11 @@
GtkTreeIter iter;
Playlist *pl;
ExtraiTunesDBData *eitdb;
-
+ #ifdef HAVE_GSTREAMER
+ Playlist *selected_playlist = NULL;
+ GList *selected_tracks = NULL;
+ iTunesDB *active_itdb = NULL;
+ #endif
g_return_val_if_fail (w && e, FALSE);
switch(e->button)
{
@@ -2247,6 +2251,29 @@
}
}
break;
+ case 2:
+ #ifdef HAVE_GSTREAMER
+ switch(e->type)
+ {
+ case GDK_2BUTTON_PRESS:
+ pm_select_current_position (e->x, e->y);
+ active_itdb = gp_get_selected_itdb ();
+ selected_playlist =
pm_get_selected_playlist();
+ if (gphoto_is_photo_playlist
(selected_playlist)) return FALSE;
+ if (selected_tracks)
+ g_list_free (selected_tracks);
+ selected_tracks = g_list_copy
(selected_playlist->members);
+ if(selected_tracks)
+ {
+ tools_play_tracks
(selected_tracks);
+ }
+ return TRUE;
+ break;
+ default:
+ break;
+ }
+ #endif
+ break;
case 3:
pm_select_current_position (e->x, e->y);
pm_context_menu_init ();
Modified: gtkpod/branches/gstreamer_player_support/src/display_sorttabs.c
===================================================================
--- gtkpod/branches/gstreamer_player_support/src/display_sorttabs.c
2008-05-31 22:27:23 UTC (rev 2002)
+++ gtkpod/branches/gstreamer_player_support/src/display_sorttabs.c
2008-05-31 22:33:00 UTC (rev 2003)
@@ -2694,10 +2694,37 @@
static gboolean
st_button_press_event(GtkWidget *w, GdkEventButton *e, gpointer data)
{
+ #ifdef HAVE_GSTREAMER
+ TabEntry *selected_entry = NULL;
+ GList *selected_tracks = NULL;
+ iTunesDB *active_itdb = NULL;
+ #endif
if(w && e)
{
switch(e->button)
{
+ case 2:
+ #ifdef HAVE_GSTREAMER
+ switch(e->type)
+ {
+ case GDK_2BUTTON_PRESS:
+ st_select_current_position
(GPOINTER_TO_INT(data), e->x, e->y);
+ if (selected_tracks)
g_list_free (selected_tracks);
+ selected_entry =
st_get_selected_entry (GPOINTER_TO_INT(data));
+ active_itdb = gp_get_selected_itdb ();
+
+ if(selected_entry)
+ {
+ selected_tracks =
g_list_copy (selected_entry->members);
+ tools_play_tracks
(selected_tracks);
+ }
+ return TRUE;
+ break;
+ default:
+ break;
+ }
+ #endif
+ break;
case 3:
st_select_current_position (GPOINTER_TO_INT(data), e->x, e->y);
st_context_menu_init(GPOINTER_TO_INT(data));
Modified: gtkpod/branches/gstreamer_player_support/src/file.c
===================================================================
--- gtkpod/branches/gstreamer_player_support/src/file.c 2008-05-31 22:27:23 UTC
(rev 2002)
+++ gtkpod/branches/gstreamer_player_support/src/file.c 2008-05-31 22:33:00 UTC
(rev 2003)
@@ -880,6 +880,13 @@
changed = TRUE; /* FIXME: probably should actually compare chapters for
changes */
}
+ if (from->chapterdata)
+ {
+ itdb_chapterdata_free (to->chapterdata);
+ to->chapterdata = itdb_chapterdata_duplicate (from->chapterdata);
+ changed = TRUE; /* FIXME: probably should actually compare chapters for
changes */
+ }
+
itdb_artwork_free (to->artwork);
to->artwork = itdb_artwork_duplicate (from->artwork);
if ((to->artwork_size != from->artwork_size) ||
Modified: gtkpod/branches/gstreamer_player_support/src/misc.h
===================================================================
--- gtkpod/branches/gstreamer_player_support/src/misc.h 2008-05-31 22:27:23 UTC
(rev 2002)
+++ gtkpod/branches/gstreamer_player_support/src/misc.h 2008-05-31 22:33:00 UTC
(rev 2003)
@@ -253,4 +253,5 @@
gboolean save_ipod_prefs (iTunesDB *itdb, const gchar *mountpoint);
gboolean get_offline (iTunesDB *itdb);
+GtkStatusIcon *icon;
#endif
Modified: gtkpod/branches/gstreamer_player_support/src/player.c
===================================================================
--- gtkpod/branches/gstreamer_player_support/src/player.c 2008-05-31
22:27:23 UTC (rev 2002)
+++ gtkpod/branches/gstreamer_player_support/src/player.c 2008-05-31
22:33:00 UTC (rev 2003)
@@ -41,17 +41,26 @@
#include "tools.h"
#include "string.h"
-static GMainLoop *playerloop;
-static GstBus *playerbus;
-static GstElement *playersong;
+GMainLoop *loop;
+GstElement *pipeline, *audio, *audiomixer, *volume;
+GstElement *src, *dec, *conv, *sink;
+GstPad *audiopad;
+GstElement *video, *videosink, *videoconv;
+GstPad *videopad;
+
+GstBus *bus;
+GtkWidget *drawing_area;
+GtkWidget *vol_scale;
static gboolean prevbut = FALSE;
static gboolean stopall = FALSE;
+static gboolean shuffle = TRUE;
static GThread *thread = NULL;
static GtkWidget *play_button;
static GtkWidget *song_scale;
static GtkWidget *song_label;
-static GList *l;
+static GList *rtracks = NULL;
+gboolean hasvideo = FALSE;
static int my_bus_callback (GstBus *bus, GstMessage *msg, gpointer data)
{
@@ -61,7 +70,7 @@
gtk_range_set_range(GTK_RANGE (song_scale), 0, 1);
gtk_range_set_value (GTK_RANGE (song_scale), 0);
gtk_label_set_text(GTK_LABEL (song_label),"");
- g_main_loop_quit (playerloop);
+ g_main_loop_quit (data);
break;
case GST_MESSAGE_ERROR:
{
@@ -74,7 +83,7 @@
g_print ("Error: %s\n", err->message);
g_error_free (err);
- g_main_loop_quit (playerloop);
+ g_main_loop_quit (data);
break;
}
default:
@@ -83,15 +92,17 @@
return TRUE;
}
-
int init_audio(int argc, char *argv[])
{
gst_init (&argc, &argv);
-
+ srand ( time(NULL) );
+
//g_signal_connect(G_OBJECT(icon),"popup-menu",G_CALLBACK(IconMenu),(gpointer)"beh?");
play_button = gtkpod_xml_get_widget (main_window_xml, "Play_button");
song_scale = gtkpod_xml_get_widget (main_window_xml, "song_scale");
song_label = gtkpod_xml_get_widget (main_window_xml, "song_label");
- playerloop = g_main_loop_new (NULL, FALSE);
+ drawing_area = gtkpod_xml_get_widget (main_window_xml, "video_widget");
+ vol_scale = gtkpod_xml_get_widget (main_window_xml, "vol_scale");
+ gtk_widget_realize(gtkpod_xml_get_widget (main_window_xml,
"video_widget"));
return 0;
}
@@ -101,14 +112,16 @@
GstFormat fmt = GST_FORMAT_TIME;
gint64 len;
- if (playerloop == NULL || playersong == NULL ||
GST_OBJECT_IS_DISPOSING(pipeline))
+ if (loop == NULL || GST_OBJECT_IS_DISPOSING(pipeline))
return FALSE;
- if (g_main_loop_is_running (playerloop))
+ if (loop != NULL || g_main_loop_is_running (loop))
{
if(gst_element_query_duration (pipeline, &fmt, &len))
{
gtk_range_set_range (GTK_RANGE (song_scale), 0,
(((GstClockTime)(len)) / GST_SECOND));
+ if(icon)
+ gtk_status_icon_set_tooltip(icon,(gchar *)
g_object_get_data (G_OBJECT (song_label), "tr_title"));
return FALSE;
}
}
@@ -117,19 +130,18 @@
return TRUE;
}
-
static gboolean set_scale_position (GstElement *pipeline)
{
GstFormat fmt = GST_FORMAT_TIME;
gint64 pos;
gint64 len;
- if (playerloop == NULL || playersong == NULL)
+ if(loop == NULL || thread == NULL || !g_main_loop_is_running(loop))
return FALSE;
- if (g_main_loop_is_running(playerloop))
+ if (loop != NULL || g_main_loop_is_running(loop))
{
- if (gst_element_query_position (playersong, &fmt, &pos))
+ if (gst_element_query_position (pipeline, &fmt, &pos))
{
gint seconds = ((GstClockTime) pos) / GST_SECOND;
gint length;
@@ -144,10 +156,8 @@
seconds % 60,
length / 60,
length % 60);
-
gtk_range_set_value (GTK_RANGE (song_scale), seconds);
gtk_label_set_text (GTK_LABEL (song_label), label);
-
g_free (label);
return TRUE;
}
@@ -168,142 +178,234 @@
level = exp (value / 20.0 * M_LN10);
g_object_set (volume, "volume", level, NULL);
}
+static void
+cb_newpad (GstElement *decodebin,
+ GstPad *pad,
+ gboolean last,
+ gpointer data)
+{
+ GstCaps *caps;
+ GstStructure *str;
+ GstPad *audiopad2, *videopad2;
+ /* check media type */
+ caps = gst_pad_get_caps (pad);
+ str = gst_caps_get_structure (caps, 0);
+ printf("string = %s\n",gst_structure_get_name (str));
+ const gchar *name = gst_structure_get_name (str);
+ if (g_strrstr (name, "audio")) {
+ /* only link once */
+ audiopad2 = gst_element_get_pad (audio, "sink");
+ if (GST_PAD_IS_LINKED (audiopad2))
+ {
+ printf("audio pad is linked!unreffing\n");
+ g_object_unref (audiopad2);
+ return;
+ }
+
+ /* link'n'play */
+ gst_pad_link (pad, audiopad2); // Link audiopad to pad or other way
around, dunno
+ //gst_element_link (volume, dec); //Doesn't seem to work...
+ //volume_changed_callback (vol_scale, volume); //Change volume to
default
+ }
+
+ if (g_strrstr (name, "video")) {
+ // only link once
+
+ videopad2 = gst_element_get_pad (videoconv, "sink");
+ if (GST_PAD_IS_LINKED (videopad2))
+ {
+ printf("video pad is linked!unreffing\n");
+ g_object_unref (videopad2);
+ return;
+ }
+ // link'n'play
+ gst_pad_link (pad, videopad2);
+ //set_video_mode (TRUE);//Not needed since We can't actually SEE the
video
+ }
+
+ gst_caps_unref (caps);
+
+}
static void *playsong_real (void *ptr)
{
+ GstStateChangeReturn sret;
+ GstState state;
gchar *str;
+ static GList *l;
l = ptr;
+ //Does the same thing as generate_random_playlist()
+ if(shuffle)
+ {
+ GRand *grand = g_rand_new ();
+ while (l || (g_list_length(l) != 0))
+ {
+ /* get random number between 0 and g_list_length()-1 */
+ gint rn = g_rand_int_range (grand, 0, g_list_length
(l));
+ GList *random = g_list_nth (l, rn);
+ rtracks = g_list_append (rtracks, random->data);
+ l = g_list_delete_link (l, random);
+ }
+ g_rand_free (grand);
+ }
+ else
+ rtracks = l;
- while (l)
+ while (rtracks)
{
- Track *tr = l->data;
- g_return_val_if_fail(tr, (void*)-1);
- str = get_file_name_from_source(tr, SOURCE_PREFER_LOCAL);
-
+ Track *tr = rtracks->data;
+ g_return_val_if_fail(tr, (void*)-1);//printf("%d\n",a++);
+ str = get_file_name_from_source(tr,
SOURCE_PREFER_LOCAL);//printf("%d\n",a++);
if (str)
{
- GstStateChangeReturn sret;
- GstState state;
- gchar *str2 = g_strdup_printf ("file://%s", str);
- GstElement *vsink;
- GtkWidget *drawing_area = gtkpod_xml_get_widget (main_window_xml,
"video_widget");
- GtkWidget *vol_scale = gtkpod_xml_get_widget (main_window_xml,
"vol_scale");
+ gtk_label_set_text(GTK_LABEL (song_label), tr->title); // set
label to title
+ g_object_set_data (G_OBJECT (song_label), "tr_title", tr->title);
// set label to title...again?wtf?
+ g_object_set_data (G_OBJECT (song_label), "tr_artist",
tr->artist); // set label to title...again?wtf?
+ gtk_widget_set_sensitive (vol_scale, TRUE); //set volume scale
sensitivity to true
- gtk_label_set_text(GTK_LABEL (song_label), tr->title);
- playersong = gst_element_factory_make ("playbin",
"play");
+ /* init GStreamer */
+ loop = g_main_loop_new (NULL, FALSE); // make new loop
+ /* setup */
+ pipeline = gst_pipeline_new ("pipeline"); //Create our
pipeline
+ volume = gst_element_factory_make ("volume", "volume");
// Create volume element
+ bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
// get pipeline's bus
+ gst_bus_add_watch (bus, my_bus_callback, loop); //Add a
watch to the bus
+ gst_object_unref (bus); //unref the bus
- g_object_set (G_OBJECT (playersong), "uri", str2, NULL);
- g_object_set_data (G_OBJECT (song_label), "tr_title", tr->title);
-
- vsink = gst_element_factory_make("ximagesink", "screen_sink");
-
- if(!vsink)
- {
- printf("Couldn't make image sink!\n");
- }
-
- g_object_set (G_OBJECT (playersong), "video-sink", vsink, NULL);
- g_object_set (G_OBJECT (vsink), "force-aspect-ratio", TRUE, NULL);
-
- gst_x_overlay_set_xwindow_id (GST_X_OVERLAY (vsink),
gdk_x11_drawable_get_xid (drawing_area->window));
- playerbus = gst_pipeline_get_bus (GST_PIPELINE (playersong));
- gst_bus_add_watch (playerbus, my_bus_callback,
playerloop);
+ src = gst_element_factory_make ("filesrc", "source");
//create the file source
+ g_object_set (G_OBJECT (src), "location", str, NULL);
//set location to the file location
+ dec = gst_element_factory_make ("decodebin",
"decoder"); //create our decodebing
+ g_signal_connect (dec, "new-decoded-pad", G_CALLBACK
(cb_newpad), NULL); //signal to the new-decoded-pad(same as new-pad)
+ gst_bin_add_many (GST_BIN (pipeline), src, dec, NULL);
//add src and dec to pipeline
+ gst_element_link (src, dec); //link src and dec together
- volume_changed_callback (vol_scale, playersong);
- g_signal_connect (vol_scale, "value-changed", G_CALLBACK
(volume_changed_callback), playersong);
- gtk_widget_set_sensitive (vol_scale, TRUE);
+ /* create audio output */
+ audio = gst_bin_new ("audiobin"); //create our audio bin
+ conv = gst_element_factory_make ("audioconvert",
"aconv"); //Create audioconvert element
+ audiopad = gst_element_get_pad (conv, "sink"); //get
the audioconvert pad
+ sink = gst_element_factory_make ("alsasink", "sink");
//create our alsasink
+
+ gst_bin_add_many (GST_BIN (audio), conv, sink, volume,
NULL); //add volume, conv, and sink to audio
+ gst_element_link (conv, sink); // link sink and conv
+ gst_element_add_pad (audio,
+ gst_ghost_pad_new ("sink", audiopad)); // add pad to
audio...?
+ gst_object_unref (audiopad); //unref audiopad
+ gst_bin_add (GST_BIN (pipeline), audio); //add audio to
pipeline
+
+ /*create video output*/
+
+ video = gst_bin_new ("videobin"); //create videobin
+ videoconv = gst_element_factory_make
("ffmpegcolorspace", "vconv"); //make ffmpegcolorspace
+ //videopad = gst_element_get_pad (videoconv, "sink");
//get videoconv pad, why the hell am I getting
+ //videosink = gst_element_factory_make ("ximagesink",
"sink"); //create video sink
+ //g_object_set (G_OBJECT (videosink), "force-aspect-ratio", TRUE,
NULL); //force aspect ratio
+ // gst_x_overlay_set_xwindow_id (GST_X_OVERLAY (videosink),
gdk_x11_drawable_get_xid (drawing_area->window)); //set the overlay to our
drawing area
+ //gst_element_link (videoconv, videosink); //link
videoconv and videosink
+ //gst_bin_add_many (GST_BIN (video),videoconv,
videosink, NULL); //add videoconv and videosink to video
+ gst_bin_add(GST_BIN (video),videoconv);
+ //gst_object_unref (videopad); //unref videopad
+ gst_bin_add(GST_BIN (pipeline), video);
+ //[NOTE] If file doesn't contain video, it crashes the
program, so commented out
+
+ /* Volume Control */
+
+ //volume_changed_callback (vol_scale, volume);
+ //g_signal_connect (vol_scale, "value-changed", G_CALLBACK
(volume_changed_callback), volume); //connect volume-changed signal
- if(!playerbus)
- gst_object_unref (playerbus);
-
- gst_element_set_state (playersong, GST_STATE_PLAYING);
- g_timeout_add (250, (GSourceFunc) set_scale_range,
GST_PIPELINE (playersong));
- g_timeout_add (1000, (GSourceFunc) set_scale_position,
GST_PIPELINE (playersong));
- g_main_loop_run (playerloop);
+ /* run */
+ gst_element_set_state (pipeline, GST_STATE_PLAYING);//
set state
+ g_timeout_add (250, (GSourceFunc) set_scale_range,
GST_PIPELINE (pipeline));
+ g_timeout_add (1000, (GSourceFunc) set_scale_position,
GST_PIPELINE (pipeline));
+ //g_timeout_add (500, (GSourceFunc) checkinfo,
gst_pipeline_get_bus (GST_PIPELINE (pipeline)));
+ g_main_loop_run (loop);
- sret = gst_element_set_state (playersong, GST_STATE_NULL);
-
-#ifndef NEW_PIPE_PER_FILE
- if (GST_STATE_CHANGE_ASYNC == sret)
- {
- if (gst_element_get_state (GST_ELEMENT (playersong),
- &state,
- NULL,
- GST_CLOCK_TIME_NONE) ==
GST_STATE_CHANGE_FAILURE)
- {
- g_print ("State change failed. Aborting");
- break;
- }
- }
-#endif
- if(playersong != NULL)
- gst_object_unref (GST_OBJECT (playersong));
-
- g_free(str2);
+ /* cleanup */
+ sret = gst_element_set_state (pipeline, GST_STATE_NULL);
+ #ifndef NEW_PIPE_PER_FILE
+ printf("New_pipe_per_file is NOT defined\n");
+ if (GST_STATE_CHANGE_ASYNC == sret)
+ {
+ if (gst_element_get_state (GST_ELEMENT (pipeline),
+ &state,
+ NULL,
+ GST_CLOCK_TIME_NONE) ==
GST_STATE_CHANGE_FAILURE)
+ {
+ g_print ("State change failed. Aborting");
+ break;
+ }
+ }
+ #endif
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ free(str);//Free it since it is no longer needed.
}
-
if (stopall)
break;
-
if (!prevbut)
- l = g_list_next(l);
+ rtracks = g_list_next(rtracks);
else
prevbut = FALSE;
}
-
+ g_list_free (rtracks);
+ rtracks = NULL;
thread = NULL;
stopall = FALSE;
+ //g_free(ptr);
g_thread_exit (0);
return (void*)-1;
}
void seek_to_time (gint64 time_seconds)
{
- if (!gst_element_seek (playersong, 1.0, GST_FORMAT_TIME,
GST_SEEK_FLAG_FLUSH,GST_SEEK_TYPE_SET, time_seconds*1000000000,
GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE))
+ if(loop == NULL || pipeline == NULL || thread == NULL ||
!g_main_loop_is_running(loop))
+ return;
+ if (!gst_element_seek (pipeline, 1.0, GST_FORMAT_TIME,
GST_SEEK_FLAG_FLUSH,GST_SEEK_TYPE_SET, time_seconds*1000000000,
GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE))
g_print ("Seek failed!\n");
}
void pause_song()
{
- if(playerloop == NULL || playersong == NULL || thread == NULL ||
!g_main_loop_is_running(playerloop))
+ if(loop == NULL || pipeline == NULL || thread == NULL ||
!g_main_loop_is_running(loop))
{
play_song (tm_get_selected_tracks());
}
GstState state, pending;
- gst_element_get_state(playersong, &state, &pending,
GST_CLOCK_TIME_NONE);
+ gst_element_get_state(pipeline, &state, &pending, GST_CLOCK_TIME_NONE);
if(state == GST_STATE_PLAYING)
{
- gst_element_set_state (playersong, GST_STATE_PAUSED);
+ gst_element_set_state (pipeline, GST_STATE_PAUSED);
gtk_tool_button_set_stock_id (GTK_TOOL_BUTTON (play_button),
GTK_STOCK_MEDIA_PLAY);
}
else if(state == GST_STATE_PAUSED)
{
- gst_element_set_state (playersong, GST_STATE_PLAYING);
+ gst_element_set_state (pipeline, GST_STATE_PLAYING);
gtk_tool_button_set_stock_id (GTK_TOOL_BUTTON (play_button),
GTK_STOCK_MEDIA_PAUSE);
}
}
static void waitforpipeline(int state)
{
- if(playersong == NULL || thread == NULL || playersong == NULL)
+ if(pipeline == NULL || thread == NULL)
return;
GstState istate, ipending;
- gst_element_get_state(playersong, &istate, &ipending,
GST_CLOCK_TIME_NONE);
+ gst_element_get_state(pipeline, &istate, &ipending,
GST_CLOCK_TIME_NONE);
if(istate == GST_STATE_VOID_PENDING)
+ {
return;
+ }
+ gst_element_set_state (pipeline, state);
- gst_element_set_state (playersong, state);
-
do
{
- gst_element_get_state(playersong, &istate, &ipending,
GST_CLOCK_TIME_NONE);
+ gst_element_get_state(pipeline, &istate, &ipending,
GST_CLOCK_TIME_NONE);
if(istate == GST_STATE_VOID_PENDING)
+ {
return;
+ }
}
while(istate != state);
@@ -312,9 +414,10 @@
static void stop_song ()
{
- if(g_main_loop_is_running(playerloop))
- g_main_loop_quit(playerloop);
-
+ stopall = FALSE;
+ if(loop != NULL && g_main_loop_is_running(loop))
+ g_main_loop_quit(loop);
+ waitforpipeline(1);
gtk_range_set_range(GTK_RANGE (song_scale), 0, 1);
gtk_range_set_value (GTK_RANGE (song_scale), 0);
gtk_label_set_text(GTK_LABEL (song_label), "");
@@ -323,48 +426,50 @@
void stop_all_songs ()
{
stopall = TRUE;
- stop_song ();
- waitforpipeline (1);
- thread = NULL;
+ if(loop != NULL && g_main_loop_is_running(loop))
+ {
+ g_main_loop_quit(loop);
+ }
+ else
+ stopall = FALSE;
+ waitforpipeline(1);
+ gtk_range_set_range(GTK_RANGE (song_scale), 0, 1);
+ gtk_range_set_value (GTK_RANGE (song_scale), 0);
+ gtk_label_set_text(GTK_LABEL (song_label), "");
set_video_mode (FALSE);
gtk_tool_button_set_stock_id (GTK_TOOL_BUTTON (play_button),
GTK_STOCK_MEDIA_PLAY);
- gtk_widget_set_sensitive (gtkpod_xml_get_widget (main_window_xml,
"vol_scale"), FALSE);
+ gtk_widget_set_sensitive (gtkpod_xml_get_widget (main_window_xml,
"song_scale"), FALSE);
}
void previous_song()
{
prevbut = TRUE;
- l = g_list_previous (l);
+ rtracks = g_list_previous (rtracks);
stop_song();
- waitforpipeline (1);
+ //waitforpipeline (1);
}
void next_song()
{
stop_song();
- waitforpipeline (1);
+ //waitforpipeline (1);
}
int play_song(GList *songs)
{
stop_all_songs();
GError *err1 = NULL ;
-
if (!g_thread_supported ())
{
g_thread_init (NULL);
gdk_threads_init ();
}
-
- set_video_mode (TRUE);
thread = g_thread_create ((GThreadFunc)playsong_real, (void *)songs, TRUE,
&err1);
-
if (!thread)
{
printf ("GStreamer thread creation failed: %s\n",
err1->message);
g_error_free (err1);
}
-
gtk_tool_button_set_stock_id (GTK_TOOL_BUTTON (play_button),
GTK_STOCK_MEDIA_PAUSE);
return 0;
}
Modified: gtkpod/branches/gstreamer_player_support/src/player.h
===================================================================
--- gtkpod/branches/gstreamer_player_support/src/player.h 2008-05-31
22:27:23 UTC (rev 2002)
+++ gtkpod/branches/gstreamer_player_support/src/player.h 2008-05-31
22:33:00 UTC (rev 2003)
@@ -40,6 +40,7 @@
void previous_song ();
void next_song ();
void seek_to_time (gint64 time_nanoseconds);
+gboolean checkcontainsvideo(const gchar *str);
#endif
#endif
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
gtkpod-cvs2 mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/gtkpod-cvs2