static gboolean construct_pipeline (RBPlayerGst *mp, GError **error) { GstElement *sink; mp->priv->playbin = gst_element_factory_make ("playbin2", NULL); if (mp->priv->playbin == NULL) { g_set_error (error, RB_PLAYER_ERROR, RB_PLAYER_ERROR_GENERAL, _("Failed to create playbin2 element; check your GStreamer installation")); return FALSE; } g_signal_connect_object (G_OBJECT (mp->priv->playbin), "about-to-finish", G_CALLBACK (about_to_finish_cb), mp, 0); g_signal_connect_object (G_OBJECT (mp->priv->playbin), "deep-notify::volume", G_CALLBACK (volume_notify_cb), mp, 0); g_signal_connect_object (G_OBJECT (mp->priv->playbin), "notify::source", G_CALLBACK (source_notify_cb), mp, 0); gst_bus_add_watch (gst_element_get_bus (mp->priv->playbin), (GstBusFunc) bus_cb, mp); /* let plugins add bits to playbin */ g_object_notify (G_OBJECT (mp), "playbin"); g_object_notify (G_OBJECT (mp), "bus"); /* Use gsettingsaudiosink for audio if there's no audio sink yet */ g_object_get (mp->priv->playbin, "audio-sink", &mp->priv->audio_sink, NULL); if (mp->priv->audio_sink == NULL) { const char *try_sinks[] = { "gsettingsaudiosink", "gconfaudiosink", "autoaudiosink" }; int i; for (i = 0; i < G_N_ELEMENTS (try_sinks); i++) { mp->priv->audio_sink = rb_player_gst_try_audio_sink (try_sinks[i], NULL); if (mp->priv->audio_sink != NULL) { g_object_set (mp->priv->playbin, "audio-sink", mp->priv->audio_sink, NULL); break; } } } else { rb_debug ("existing audio sink found"); g_object_unref (mp->priv->audio_sink); } { GstPad *pad; GList *l; GstElement *queue; GstPad *ghostpad; /* setup filterbin */ mp->priv->filterbin = rb_gst_create_filter_bin (); /* set up the sinkbin with its tee element */ mp->priv->sinkbin = gst_bin_new (NULL); mp->priv->tee = gst_element_factory_make ("tee", NULL); queue = gst_element_factory_make ("queue", NULL); /* link it all together and insert */ gst_bin_add_many (GST_BIN (mp->priv->sinkbin), mp->priv->filterbin, mp->priv->tee, queue, mp->priv->audio_sink, NULL); gst_element_link_many (mp->priv->filterbin, mp->priv->tee, queue, mp->priv->audio_sink, NULL); pad = gst_element_get_pad (mp->priv->filterbin, "sink"); ghostpad = gst_ghost_pad_new ("sink", pad); gst_element_add_pad (mp->priv->sinkbin, ghostpad); gst_object_unref (pad); g_object_set (G_OBJECT (mp->priv->playbin), "audio-sink", mp->priv->sinkbin, NULL); /* add any tees and filters that were waiting for us */ for (l = mp->priv->waiting_tees; l != NULL; l = g_list_next (l)) { rb_player_gst_tee_add_tee (RB_PLAYER_GST_TEE (mp), GST_ELEMENT (l->data)); } g_list_free (mp->priv->waiting_tees); mp->priv->waiting_tees = NULL; for (l = mp->priv->waiting_filters; l != NULL; l = g_list_next (l)) { rb_player_gst_filter_add_filter (RB_PLAYER_GST_FILTER(mp), GST_ELEMENT (l->data)); } g_list_free (mp->priv->waiting_filters); mp->priv->waiting_filters = NULL; } /* Use fakesink for video if there's no video sink yet */ g_object_get (mp->priv->playbin, "video-sink", &sink, NULL); if (sink == NULL) { sink = gst_element_factory_make ("fakesink", NULL); g_object_set (mp->priv->playbin, "video-sink", sink, NULL); } else { g_object_unref (sink); } if (mp->priv->cur_volume > 1.0) mp->priv->cur_volume = 1.0; if (mp->priv->cur_volume < 0.0) mp->priv->cur_volume = 0; rb_debug ("pipeline construction complete"); return TRUE; }
static gboolean construct_pipeline (RBPlayerGst *mp, GError **error) { GstElement *sink; GList *l; mp->priv->playbin = gst_element_factory_make ("playbin", NULL); if (mp->priv->playbin == NULL) { g_set_error (error, RB_PLAYER_ERROR, RB_PLAYER_ERROR_GENERAL, _("Failed to create playbin element; check your GStreamer installation")); return FALSE; } g_signal_connect_object (G_OBJECT (mp->priv->playbin), "about-to-finish", G_CALLBACK (about_to_finish_cb), mp, 0); g_signal_connect_object (G_OBJECT (mp->priv->playbin), "deep-notify::volume", G_CALLBACK (volume_notify_cb), mp, 0); g_signal_connect_object (G_OBJECT (mp->priv->playbin), "source-setup", G_CALLBACK (source_setup_cb), mp, 0); gst_bus_add_watch (gst_element_get_bus (mp->priv->playbin), (GstBusFunc) bus_cb, mp); /* let plugins add bits to playbin */ g_object_notify (G_OBJECT (mp), "playbin"); g_object_notify (G_OBJECT (mp), "bus"); g_object_get (mp->priv->playbin, "audio-sink", &mp->priv->audio_sink, NULL); if (mp->priv->audio_sink == NULL) { mp->priv->audio_sink = rb_player_gst_try_audio_sink ("autoaudiosink", NULL); if (mp->priv->audio_sink == NULL) { g_set_error (error, RB_PLAYER_ERROR, RB_PLAYER_ERROR_GENERAL, _("Failed to create %s element; check your GStreamer installation"), "autoaudiosink"); return FALSE; } g_object_set (mp->priv->playbin, "audio-sink", mp->priv->audio_sink, NULL); } else { rb_debug ("existing audio sink found"); g_object_unref (mp->priv->audio_sink); } g_object_set (mp->priv->playbin, "audio-sink", mp->priv->audio_sink, NULL); /* setup filterbin */ mp->priv->filterbin = rb_gst_create_filter_bin (); g_object_set (mp->priv->playbin, "audio-filter", mp->priv->filterbin, NULL); /* add any filters that have already been added */ for (l = mp->priv->waiting_filters; l != NULL; l = g_list_next (l)) { rb_player_gst_filter_add_filter (RB_PLAYER_GST_FILTER(mp), GST_ELEMENT (l->data)); } g_list_free (mp->priv->waiting_filters); mp->priv->waiting_filters = NULL; /* Use fakesink for video if there's no video sink yet */ g_object_get (mp->priv->playbin, "video-sink", &sink, NULL); if (sink == NULL) { sink = gst_element_factory_make ("fakesink", NULL); g_object_set (mp->priv->playbin, "video-sink", sink, NULL); } else { g_object_unref (sink); } if (mp->priv->cur_volume > 1.0) mp->priv->cur_volume = 1.0; if (mp->priv->cur_volume < 0.0) mp->priv->cur_volume = 0; rb_debug ("pipeline construction complete"); return TRUE; }