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

Reply via email to