static void bus_message_cb (GstBus *bus, GstMessage *message, gpointer user_data) { GthMediaViewerPage *self = user_data; switch (GST_MESSAGE_TYPE (message)) { case GST_MESSAGE_STATE_CHANGED: { GstState old_state; GstState new_state; GstState pending_state; old_state = new_state = GST_STATE_NULL; gst_message_parse_state_changed (message, &old_state, &new_state, &pending_state); self->priv->paused = (new_state == GST_STATE_PAUSED); if (old_state == new_state) break; if (GST_MESSAGE_SRC (message) != GST_OBJECT (self->priv->playbin)) break; update_current_position_bar (self, TRUE); if ((old_state == GST_STATE_READY) && (new_state == GST_STATE_PAUSED)) { update_stream_info (self); gth_viewer_page_update_sensitivity (GTH_VIEWER_PAGE (self)); } if ((old_state == GST_STATE_READY) || (new_state == GST_STATE_PAUSED)) update_volume_from_playbin (self); if ((old_state == GST_STATE_PLAYING) || (new_state == GST_STATE_PLAYING)) update_play_button (self, new_state); break; } case GST_MESSAGE_DURATION: { GstFormat format; format = GST_FORMAT_TIME; gst_message_parse_duration (message, &format, &self->priv->duration); update_current_position_bar (self, TRUE); break; } case GST_MESSAGE_EOS: reset_player_state (self); break; case GST_MESSAGE_BUFFERING: { int percent = 0; gst_message_parse_buffering (message, &percent); g_print ("Buffering (%%%u percent done)", percent); break; } default: break; } }
static void gth_media_viewer_page_real_view (GthViewerPage *base, GthFileData *file_data) { GthMediaViewerPage *self; char *uri; self = (GthMediaViewerPage*) base; g_return_if_fail (file_data != NULL); if (! gstreamer_init ()) return; gth_viewer_page_focus (GTH_VIEWER_PAGE (self)); if ((self->priv->file_data != NULL) && g_file_equal (file_data->file, self->priv->file_data->file) && (gth_file_data_get_mtime (file_data) == gth_file_data_get_mtime (self->priv->file_data))) { return; } /**/ _g_object_unref (self->priv->file_data); self->priv->file_data = gth_file_data_dup (file_data); self->priv->duration = 0; _g_object_unref (self->priv->icon); self->priv->icon = NULL; _gth_media_viewer_page_update_caption (self); /**/ gth_viewer_page_file_loaded (GTH_VIEWER_PAGE (self), TRUE); g_signal_handlers_block_by_func(GET_WIDGET ("adjustment_position"), position_value_changed_cb, self); gtk_adjustment_set_value (GTK_ADJUSTMENT (GET_WIDGET ("adjustment_position")), 0.0); g_signal_handlers_unblock_by_func(GET_WIDGET ("adjustment_position"), position_value_changed_cb, self); reset_player_state (self); if (self->priv->playbin == NULL) return; gst_element_set_state (self->priv->playbin, GST_STATE_NULL); uri = g_file_get_uri (self->priv->file_data->file); g_object_set (G_OBJECT (self->priv->playbin), "uri", uri, NULL); gdk_threads_add_idle (set_to_paused, self); g_free (uri); }
static void gth_media_viewer_page_real_view (GthViewerPage *base, GthFileData *file_data) { GthMediaViewerPage *self; char *uri; self = (GthMediaViewerPage*) base; g_return_if_fail (file_data != NULL); if (! gstreamer_init ()) return; gth_viewer_page_focus (GTH_VIEWER_PAGE (self)); if ((self->priv->file_data != NULL) && g_file_equal (file_data->file, self->priv->file_data->file) && (gth_file_data_get_mtime (file_data) == gth_file_data_get_mtime (self->priv->file_data))) { return; } /**/ _g_object_unref (self->priv->file_data); self->priv->file_data = gth_file_data_dup (file_data); self->priv->duration = 0; self->priv->has_audio = FALSE; self->priv->has_video = FALSE; _g_object_unref (self->priv->icon); self->priv->icon = NULL; _gth_media_viewer_page_update_caption (self); /**/ g_signal_handlers_block_by_func(GET_WIDGET ("position_adjustment"), position_value_changed_cb, self); gtk_adjustment_set_value (GTK_ADJUSTMENT (GET_WIDGET ("position_adjustment")), 0.0); g_signal_handlers_unblock_by_func(GET_WIDGET ("position_adjustment"), position_value_changed_cb, self); reset_player_state (self); create_playbin (self); if (self->priv->playbin == NULL) return; uri = g_file_get_uri (self->priv->file_data->file); _gth_media_viewer_page_set_uri (self, uri, self->priv->visible ? GST_STATE_PLAYING : GST_STATE_PAUSED); g_free (uri); }
static void bus_message_cb (GstBus *bus, GstMessage *message, gpointer user_data) { GthMediaViewerPage *self = user_data; if (GST_MESSAGE_SRC (message) != GST_OBJECT (self->priv->playbin)) return; switch (GST_MESSAGE_TYPE (message)) { case GST_MESSAGE_STATE_CHANGED: { GstState old_state; GstState new_state; GstState pending_state; old_state = new_state = GST_STATE_NULL; gst_message_parse_state_changed (message, &old_state, &new_state, &pending_state); if (old_state == new_state) break; self->priv->paused = (new_state == GST_STATE_PAUSED); update_current_position_bar (self); if ((old_state == GST_STATE_NULL) && (new_state == GST_STATE_READY) && (pending_state != GST_STATE_PAUSED)) { update_stream_info (self); gth_viewer_page_update_sensitivity (GTH_VIEWER_PAGE (self)); gth_viewer_page_file_loaded (GTH_VIEWER_PAGE (self), self->priv->file_data, TRUE); } if ((old_state == GST_STATE_READY) && (new_state == GST_STATE_PAUSED)) { update_stream_info (self); gth_viewer_page_update_sensitivity (GTH_VIEWER_PAGE (self)); gth_viewer_page_file_loaded (GTH_VIEWER_PAGE (self), self->priv->file_data, TRUE); } if ((old_state == GST_STATE_READY) || (new_state == GST_STATE_PAUSED)) update_volume_from_playbin (self); if ((old_state == GST_STATE_PLAYING) || (new_state == GST_STATE_PLAYING)) update_play_button (self, new_state); break; } case GST_MESSAGE_DURATION_CHANGED: self->priv->duration = 0; update_current_position_bar (self); break; case GST_MESSAGE_EOS: reset_player_state (self); break; case GST_MESSAGE_BUFFERING: { int percent = 0; gst_message_parse_buffering (message, &percent); gst_element_set_state (self->priv->playbin, (percent == 100) ? GST_STATE_PLAYING : GST_STATE_PAUSED); break; } case GST_MESSAGE_ERROR: gth_viewer_page_file_loaded (GTH_VIEWER_PAGE (self), self->priv->file_data, FALSE); break; default: break; } }