247
182
mp = RB_PLAYER (object);
249
184
g_source_remove (mp->priv->tick_timeout_id);
185
g_hash_table_destroy (mp->priv->idle_info_ids);
251
if (mp->priv->pipeline) {
252
g_signal_handler_disconnect (G_OBJECT (mp->priv->pipeline),
187
if (mp->priv->playbin) {
188
g_signal_handler_disconnect (G_OBJECT (mp->priv->playbin),
253
189
mp->priv->error_signal_id);
190
g_signal_handler_disconnect (G_OBJECT (mp->priv->playbin),
191
mp->priv->buffering_signal_id);
255
gst_element_set_state (mp->priv->pipeline,
193
gst_element_set_state (mp->priv->playbin,
258
rb_player_gst_free_pipeline (mp);
196
rb_player_gst_free_playbin (mp);
262
g_timer_destroy (mp->priv->timer);
264
g_free (mp->priv->uri);
266
199
g_free (mp->priv);
268
G_OBJECT_CLASS (parent_class)->finalize (object);
201
G_OBJECT_CLASS (rb_player_parent_class)->finalize (object);
272
rb_player_gst_free_pipeline (RBPlayer *player)
205
rb_player_gst_free_playbin (RBPlayer *player)
274
if (player->priv->pipeline == NULL)
207
if (player->priv->playbin == NULL)
277
if (player->priv->volume_dpmanager) {
278
gst_dpman_detach_dparam (player->priv->volume_dpmanager, "volume");
279
gst_object_unref (GST_OBJECT (player->priv->volume_dparam));
280
player->priv->volume_dpmanager = NULL;
282
gst_object_unref (GST_OBJECT (player->priv->pipeline));
283
player->priv->pipeline = NULL;
287
eos_signal_idle (RBPlayer *mp)
289
g_signal_emit (G_OBJECT (mp), rb_player_signals[EOS], 0);
291
g_object_unref (G_OBJECT (mp));
297
buffering_begin_signal_idle (RBPlayer *mp)
299
GDK_THREADS_ENTER ();
301
g_signal_emit (G_OBJECT (mp), rb_player_signals[BUFFERING_BEGIN], 0);
302
g_object_unref (G_OBJECT (mp));
304
GDK_THREADS_LEAVE ();
310
buffering_end_signal_idle (RBPlayer *mp)
312
GDK_THREADS_ENTER ();
314
g_signal_emit (G_OBJECT (mp), rb_player_signals[BUFFERING_END], 0);
315
g_object_unref (G_OBJECT (mp));
317
GDK_THREADS_LEAVE ();
323
error_signal_idle (RBPlayerSignal *signal)
325
g_signal_emit (G_OBJECT (signal->object),
326
rb_player_signals[ERROR], 0,
329
/* close if not already closing */
330
if (signal->object->priv->uri != NULL)
331
rb_player_close (signal->object, NULL);
210
gst_object_unref (GST_OBJECT (player->priv->playbin));
211
player->priv->playbin = NULL;
215
destroy_idle_signal (gpointer signal_pointer)
217
RBPlayerSignal *signal = signal_pointer;
220
g_error_free (signal->error);
223
g_value_unset (signal->info);
224
g_free (signal->info);
227
if (signal->id != 0) {
228
g_hash_table_remove (signal->object->priv->idle_info_ids,
229
GUINT_TO_POINTER (signal->id));
333
232
g_object_unref (G_OBJECT (signal->object));
334
g_error_free (signal->error);
238
emit_signal_idle (RBPlayerSignal *signal)
240
switch (signal->type) {
242
g_signal_emit (G_OBJECT (signal->object),
243
rb_player_signals[ERROR], 0,
246
/* close if not already closing */
247
if (signal->object->priv->uri != NULL)
248
rb_player_close (signal->object, NULL);
253
g_signal_emit (G_OBJECT (signal->object), rb_player_signals[EOS], 0);
254
signal->object->priv->idle_eos_id = 0;
258
g_signal_emit (G_OBJECT (signal->object),
259
rb_player_signals[INFO], 0,
260
signal->info_field, signal->info);
264
g_signal_emit (G_OBJECT (signal->object),
265
rb_player_signals[BUFFERING], 0,
266
g_value_get_uint (signal->info));
267
signal->object->priv->idle_buffering_id = 0;
341
275
eos_cb (GstElement *element,
344
g_object_ref (G_OBJECT (mp));
345
g_idle_add ((GSourceFunc) eos_signal_idle, mp);
349
rb_player_gst_signal_error (RBPlayer *mp, const char *msg)
351
278
RBPlayerSignal *signal;
353
279
signal = g_new0 (RBPlayerSignal, 1);
354
281
signal->object = mp;
355
signal->error = g_error_new_literal (RB_PLAYER_ERROR,
356
RB_PLAYER_ERROR_GENERAL,
359
282
g_object_ref (G_OBJECT (mp));
361
g_idle_add ((GSourceFunc) error_signal_idle, signal);
283
if (mp->priv->idle_eos_id)
284
g_source_remove (mp->priv->idle_eos_id);
285
mp->priv->idle_eos_id = g_idle_add_full (G_PRIORITY_HIGH_IDLE,
286
(GSourceFunc) emit_signal_idle,
288
destroy_idle_signal);
365
292
error_cb (GstElement *element,
366
293
GstElement *source,
371
rb_player_gst_signal_error (mp, error->message);
299
RBPlayerSignal *signal;
301
/* the handler shouldn't get called with error=NULL, but sometimes it does */
305
if ((error->domain == GST_CORE_ERROR)
306
|| (error->domain == GST_LIBRARY_ERROR)
307
|| (error->code == GST_RESOURCE_ERROR_BUSY)) {
308
code = RB_PLAYER_ERROR_NO_AUDIO;
310
code = RB_PLAYER_ERROR_GENERAL;
313
/* If we're in a synchronous op, we can signal the error directly */
314
if (mp->priv->can_signal_direct_error) {
315
if (mp->priv->error) {
316
g_warning ("Overwriting previous error \"%s\" with new error \"%s\"",
317
mp->priv->error->message,
319
g_error_free (mp->priv->error);
321
mp->priv->error = g_error_copy (error);
325
signal = g_new0 (RBPlayerSignal, 1);
326
signal->type = ERROR;
328
signal->error = g_error_new_literal (RB_PLAYER_ERROR,
332
g_object_ref (G_OBJECT (mp));
334
if (mp->priv->idle_error_id)
335
g_source_remove (mp->priv->idle_error_id);
336
mp->priv->idle_error_id = g_idle_add_full (G_PRIORITY_HIGH_IDLE,
337
(GSourceFunc) emit_signal_idle,
339
destroy_idle_signal);
343
process_tag (const GstTagList *list, const gchar *tag, RBPlayer *player)
346
RBMetaDataField field;
347
RBPlayerSignal *signal;
351
count = gst_tag_list_get_tag_size (list, tag);
355
/* only handle the subset of fields we use for iradio */
356
if (!strcmp (tag, GST_TAG_TITLE))
357
field = RB_METADATA_FIELD_TITLE;
358
else if (!strcmp (tag, GST_TAG_GENRE))
359
field = RB_METADATA_FIELD_GENRE;
360
else if (!strcmp (tag, GST_TAG_COMMENT))
361
field = RB_METADATA_FIELD_COMMENT;
362
else if (!strcmp (tag, GST_TAG_BITRATE))
363
field = RB_METADATA_FIELD_BITRATE;
367
/* of those, all except bitrate are strings */
368
newval = g_new0 (GValue, 1);
370
case RB_METADATA_FIELD_BITRATE:
371
g_value_init (newval, G_TYPE_ULONG);
374
case RB_METADATA_FIELD_TITLE:
375
case RB_METADATA_FIELD_GENRE:
376
case RB_METADATA_FIELD_COMMENT:
378
g_value_init (newval, G_TYPE_STRING);
381
val = gst_tag_list_get_value_index (list, tag, 0);
382
if (!g_value_transform (val, newval)) {
383
rb_debug ("Could not transform tag value type %s into %s",
384
g_type_name (G_VALUE_TYPE (val)),
385
g_type_name (G_VALUE_TYPE (newval)));
389
signal = g_new0 (RBPlayerSignal, 1);
390
signal->object = player;
391
signal->info_field = field;
392
signal->info = newval;
394
signal->id = g_idle_add_full (G_PRIORITY_DEFAULT_IDLE,
395
(GSourceFunc) emit_signal_idle,
397
destroy_idle_signal);
399
g_object_ref (G_OBJECT (player));
400
g_hash_table_insert (player->priv->idle_info_ids, GUINT_TO_POINTER (signal->id), NULL);
404
found_tag_cb (GObject *pipeline, GstElement *source, GstTagList *tags, RBPlayer *player)
406
gst_tag_list_foreach (tags, (GstTagForeachFunc) process_tag, player);
410
buffering_cb (GstElement *element, gint progress, RBPlayer *mp)
412
RBPlayerSignal *signal;
414
signal = g_new0 (RBPlayerSignal, 1);
415
signal->type = BUFFERING;
417
g_object_ref (G_OBJECT (mp));
420
signal->info = g_new0 (GValue, 1);
421
g_value_init (signal->info, G_TYPE_UINT);
422
g_value_set_uint (signal->info, (guint)progress);
423
if (mp->priv->idle_buffering_id)
424
g_source_remove (mp->priv->idle_buffering_id);
425
mp->priv->idle_buffering_id = g_idle_add ((GSourceFunc) emit_signal_idle, signal);
375
info_signal_idle (RBPlayerSignal *signal)
377
g_signal_emit (G_OBJECT (signal->object),
378
rb_player_signals[INFO], 0,
379
signal->info_field, signal->info);
381
g_object_unref (G_OBJECT (signal->object));
382
g_free (signal->info);
389
deep_notify_cb (GstElement *element, GstElement *orig,
390
GParamSpec *pspec, RBPlayer *player)
392
if (!(pspec->flags & G_PARAM_READABLE)) return;
394
if (strcmp (pspec->name, "iradio-title") == 0) {
395
RBPlayerSignal *signal;
397
rb_debug ("caught deep notify for iradio-title");
399
signal = g_new0 (RBPlayerSignal, 1);
401
signal->info_field = RB_METADATA_FIELD_TITLE;
402
signal->info = g_new0 (GValue, 1);
403
g_value_init (signal->info, G_TYPE_STRING);
404
g_object_get_property (G_OBJECT (orig), pspec->name, signal->info);
406
signal->object = player;
408
g_object_ref (G_OBJECT (player));
410
g_idle_add ((GSourceFunc) info_signal_idle, signal);
416
queue_full_cb (GstQueue *queue,
419
RBPlayer *mp = RB_PLAYER (data);
421
rb_debug ("caught queue full");
422
g_signal_handlers_block_by_func (G_OBJECT (mp->priv->queue),
423
G_CALLBACK (queue_full_cb),
425
if (gst_element_set_state (mp->priv->waiting_bin, GST_STATE_PLAYING) == GST_STATE_FAILURE) {
426
rb_player_gst_signal_error (mp, _("Could not start pipeline playing"));
428
g_object_ref (G_OBJECT (mp));
429
g_idle_add ((GSourceFunc) buffering_end_signal_idle, mp);
434
rb_player_construct (RBPlayer *mp,
435
gboolean iradio_mode,
436
gboolean audiocd_mode,
440
GstDParamManager *dpman;
429
rb_player_construct (RBPlayer *mp, GError **error)
441
431
char *element_name = NULL;
443
#define MAKE_ELEMENT_OR_LOSE(NAME, NICE) G_STMT_START { \
444
element_name = #NAME ;\
445
rb_debug ("constructing element \"" #NICE "\""); \
446
mp->priv->NICE = gst_element_factory_make (#NAME, #NICE); \
447
if (!mp->priv->NICE) \
448
goto missing_element; \
451
/* The main playback pipeline for iradio, at the end this looks like:
452
* { { src ! queue } ! { mad ! volume ! sink } }
454
* For local files, it just looks like:
455
* { src ! spider ! volume ! sink }
457
MAKE_ELEMENT_OR_LOSE(thread, pipeline);
458
g_signal_connect_object (G_OBJECT (mp->priv->pipeline),
460
G_CALLBACK (deep_notify_cb),
432
GstElement *sink, *fakesink;
435
rb_debug ("constructing element \"playbin\"");
436
mp->priv->playbin = gst_element_factory_make ("playbin", "playbin");
437
if (mp->priv->playbin == NULL) {
438
goto missing_element;
441
fakesink = gst_element_factory_make ("fakesink", "fakesink");
442
g_object_set (G_OBJECT (mp->priv->playbin), "video-sink", fakesink, NULL);
444
g_signal_connect_object (G_OBJECT (mp->priv->playbin),
446
G_CALLBACK (found_tag_cb),
449
mp->priv->buffering_signal_id =
450
g_signal_connect_object (G_OBJECT (mp->priv->playbin),
452
G_CALLBACK (buffering_cb),
463
455
mp->priv->error_signal_id =
464
g_signal_connect_object (G_OBJECT (mp->priv->pipeline),
456
g_signal_connect_object (G_OBJECT (mp->priv->playbin),
466
458
G_CALLBACK (error_cb),
469
/* Construct the two threads */
471
mp->priv->waiting_bin = gst_element_factory_make ("thread", "waiting_bin");
472
mp->priv->srcthread = gst_element_factory_make ("thread", "srcthread");
473
gst_bin_add_many (GST_BIN (mp->priv->pipeline),
474
mp->priv->srcthread, mp->priv->waiting_bin, NULL);
476
mp->priv->waiting_bin = mp->priv->pipeline;
477
mp->priv->srcthread = mp->priv->pipeline;
480
/* Construct elements */
485
element_name = "cdparanoia";
487
element_name = "gnomevfssrc";
488
mp->priv->src = gst_element_factory_make (element_name, "src");
489
if (mp->priv->src == NULL)
490
goto missing_element;
491
gst_bin_add (GST_BIN (mp->priv->srcthread), mp->priv->src);
495
g_object_set (G_OBJECT (mp->priv->src),
497
monkey_media_get_cd_playback_mode (),
499
g_object_set (G_OBJECT (mp->priv->src),
501
monkey_media_get_cd_drive (),
506
rb_debug ("constructing queue");
509
element_name = "queue";
510
mp->priv->queue = gst_element_factory_make (element_name, element_name);
511
if (mp->priv->queue == NULL)
512
goto missing_element;
513
g_object_set (G_OBJECT (mp->priv->queue), "max-size-bytes", 64 * 1024, NULL);
514
g_signal_connect_object (G_OBJECT (mp->priv->queue), "overrun",
515
G_CALLBACK (queue_full_cb), mp, 0);
516
gst_bin_add (GST_BIN (mp->priv->srcthread), mp->priv->queue);
519
MAKE_ELEMENT_OR_LOSE(typefind, typefind);
520
gst_bin_add (GST_BIN (mp->priv->waiting_bin), mp->priv->typefind);
522
MAKE_ELEMENT_OR_LOSE(spider, decoder);
523
gst_bin_add (GST_BIN (mp->priv->waiting_bin), mp->priv->decoder);
525
MAKE_ELEMENT_OR_LOSE(volume, volume);
526
gst_bin_add (GST_BIN (mp->priv->waiting_bin), mp->priv->volume);
527
dpman = gst_dpman_get_manager (mp->priv->volume);
528
mp->priv->volume_dpmanager = dpman;
529
gst_dpman_set_mode (dpman, "synchronous");
530
mp->priv->volume_dparam = gst_dpsmooth_new (G_TYPE_DOUBLE);
531
g_assert (mp->priv->volume_dparam != NULL);
532
gst_dpman_attach_dparam (dpman, "volume", mp->priv->volume_dparam);
534
MAKE_ELEMENT_OR_LOSE(audioconvert, audioconvert);
535
gst_bin_add (GST_BIN (mp->priv->waiting_bin), mp->priv->audioconvert);
537
MAKE_ELEMENT_OR_LOSE(audioscale, audioscale);
538
gst_bin_add (GST_BIN (mp->priv->waiting_bin), mp->priv->audioscale);
540
461
/* Output sink */
541
mp->priv->sink = gst_gconf_get_default_audio_sink ();
542
if (mp->priv->sink == NULL) {
462
sink = gst_gconf_get_default_audio_sink ();
543
464
g_set_error (error,
545
466
RB_PLAYER_ERROR_NO_AUDIO,
546
467
_("Could not create audio output element; check your settings"));
547
gst_object_unref (GST_OBJECT (mp->priv->pipeline));
548
mp->priv->pipeline = NULL;
468
rb_player_gst_free_playbin (mp);
551
gst_bin_add (GST_BIN (mp->priv->waiting_bin), mp->priv->sink);
553
gst_element_link_many (mp->priv->decoder, mp->priv->volume, mp->priv->audioconvert, mp->priv->audioscale, mp->priv->sink, NULL);
555
gst_element_link_many (mp->priv->src, mp->priv->queue, mp->priv->typefind, mp->priv->decoder, NULL);
557
gst_element_link_many (mp->priv->src, mp->priv->typefind, mp->priv->decoder, NULL);
559
g_signal_connect_object (G_OBJECT (mp->priv->sink), "eos",
472
g_object_set (G_OBJECT (mp->priv->playbin), "audio-sink", sink, NULL);
473
g_signal_connect_object (G_OBJECT (mp->priv->playbin), "eos",
560
474
G_CALLBACK (eos_cb), mp, 0);
562
476
if (mp->priv->cur_volume > 1.0)
563
477
mp->priv->cur_volume = 1.0;
564
478
if (mp->priv->cur_volume < 0.0)
565
479
mp->priv->cur_volume = 0;
566
g_object_set (G_OBJECT (mp->priv->volume_dparam),
567
"value_double", mp->priv->cur_volume,
480
rb_player_set_volume (mp, mp->priv->cur_volume);
571
g_timer_destroy (mp->priv->timer);
572
mp->priv->timer = g_timer_new ();
573
g_timer_stop (mp->priv->timer);
574
g_timer_reset (mp->priv->timer);
575
mp->priv->timer_add = 0;
576
482
rb_debug ("pipeline construction complete");
580
486
char *err = g_strdup_printf (_("Failed to create %s element; check your installation"),
623
rb_player_sync_pipeline (RBPlayer *mp, gboolean iradio_mode, GError **error)
530
rb_player_sync_pipeline (RBPlayer *mp)
625
static gint may_pause = -1;
627
532
rb_debug ("syncing pipeline");
628
533
if (mp->priv->playing) {
630
rb_debug ("beginning buffering");
631
g_object_ref (G_OBJECT (mp));
632
g_idle_add ((GSourceFunc) buffering_begin_signal_idle, mp);
633
if (gst_element_set_state (mp->priv->srcthread,
634
GST_STATE_PLAYING) == GST_STATE_FAILURE) {
637
RB_PLAYER_ERROR_GENERAL,
638
_("Could not start pipeline playing"));
642
rb_debug ("PLAYING pipeline");
643
if (gst_element_set_state (mp->priv->pipeline,
644
GST_STATE_PLAYING) == GST_STATE_FAILURE) {
647
RB_PLAYER_ERROR_GENERAL,
648
_("Could not start pipeline playing"));
534
rb_debug ("PLAYING pipeline");
535
if (gst_element_set_state (mp->priv->playbin,
536
GST_STATE_PLAYING) == GST_STATE_FAILURE) {
652
g_timer_start (mp->priv->timer);
654
/* get correct gst version */
655
if (may_pause == -1) {
656
guint major, minor, micro;
658
rb_debug ("decoding gst version to check if we may free the audio sink");
659
gst_version (&major, &minor, µ);
660
/* this makes sure someone removes this later on */
661
g_assert (major == 0);
662
g_assert (minor == 8);
669
540
rb_debug ("PAUSING pipeline");
670
if (gst_element_set_state (mp->priv->pipeline,
541
if (gst_element_set_state (mp->priv->playbin,
671
542
GST_STATE_PAUSED) == GST_STATE_FAILURE) {
674
RB_PLAYER_ERROR_GENERAL,
675
_("Could not pause playback"));
679
if (may_pause == 1) {
680
rb_debug ("setting sink to NULL");
681
if (gst_element_set_state (mp->priv->sink, GST_STATE_NULL) != GST_STATE_SUCCESS) {
684
RB_PLAYER_ERROR_GENERAL,
685
_("Could not close output sink"));
549
/* Start a sequence of synchronous GStreamer operations in which we
550
* can receive an error signal.
553
begin_gstreamer_operation (RBPlayer *mp)
555
g_assert (mp->priv->error == NULL);
556
mp->priv->can_signal_direct_error = TRUE;
559
/* End a sequence of synchronous operations and propagate any
560
* error from the sequence into error.
563
end_gstreamer_operation (RBPlayer *mp, gboolean op_failed, GError **error)
565
mp->priv->can_signal_direct_error = FALSE;
566
if (mp->priv->error) {
567
g_propagate_error (error, mp->priv->error);
568
mp->priv->error = NULL;
569
} else if (op_failed) {
572
RB_PLAYER_ERROR_GENERAL,
573
_("Unknown playback error"));
578
cdda_got_source_cb (GObject *object, GParamSpec *pspec, char *uri)
582
gst_element_get (GST_ELEMENT (object), "source", &source, NULL);
583
rb_debug ("got source %p", source);
585
g_signal_handlers_disconnect_by_func (object, cdda_got_source_cb, uri);
587
g_object_set (G_OBJECT (source), "device", uri, NULL);
694
593
rb_player_open (RBPlayer *mp,
698
gboolean audiocd_mode = uri && g_str_has_prefix (uri, "audiocd://");
699
gboolean iradio_mode = uri && g_str_has_prefix (uri, "http://");
701
g_return_if_fail (RB_IS_PLAYER (mp));
703
if (mp->priv->pipeline) {
704
gst_element_set_state (mp->priv->pipeline,
706
rb_player_gst_free_pipeline (mp);
597
g_return_val_if_fail (RB_IS_PLAYER (mp), TRUE);
599
if (mp->priv->playbin == NULL) {
600
if (!rb_player_construct (mp, error))
604
g_assert (mp->priv->playbin != NULL);
709
606
g_free (mp->priv->uri);
710
607
mp->priv->uri = NULL;
712
609
if (uri == NULL) {
713
610
mp->priv->playing = FALSE;
717
rb_player_construct (mp, iradio_mode, audiocd_mode, uri, error);
730
RB_PLAYER_ERROR_INTERNAL,
731
_("No AudioCD support; check your settings"));
735
tracknum = atoi (uri + 10);
737
if (!monkey_media_audio_cd_have_track (mp->priv->cd, tracknum, error)) {
741
gst_element_set_state (mp->priv->pipeline, GST_STATE_PAUSED);
743
/* 7 is track format */
744
event = gst_event_new_seek (7 |
745
GST_SEEK_METHOD_SET |
746
GST_SEEK_FLAG_FLUSH, tracknum);
747
gst_element_send_event (mp->priv->sink, event);
752
/* Internet radio support */
753
g_object_set (G_OBJECT (mp->priv->src),
754
"iradio-mode", iradio_mode, NULL);
756
g_object_set (G_OBJECT (mp->priv->src),
757
"location", uri, NULL);
759
mp->priv->iradio_mode = iradio_mode;
615
begin_gstreamer_operation (mp);
761
616
mp->priv->uri = g_strdup (uri);
763
g_timer_stop (mp->priv->timer);
764
g_timer_reset (mp->priv->timer);
765
mp->priv->timer_add = 0;
767
if (!rb_player_sync_pipeline (mp, iradio_mode, error)) {
618
if (g_str_has_prefix (uri, "cdda://")) {
619
gchar *copy, *temp, *split;
620
int l = strlen ("cdda://");
622
copy = g_strdup (uri);
623
split = g_utf8_strrchr (copy + l, -1, ':');
626
/* invalid URI, it doesn't contain a ':' */
627
end_gstreamer_operation (mp, TRUE, error);
631
temp = g_strdup_printf ("cdda://%s", split + 1);
632
g_object_set (G_OBJECT (mp->priv->playbin), "uri", temp, NULL);
636
temp = g_strdup (copy + l);
637
g_signal_connect (G_OBJECT (mp->priv->playbin),
639
G_CALLBACK (cdda_got_source_cb),
643
g_object_set (G_OBJECT (mp->priv->playbin), "uri", uri, NULL);
646
if (!rb_player_sync_pipeline (mp)) {
647
end_gstreamer_operation (mp, TRUE, error);
768
648
rb_player_close (mp, NULL);
651
end_gstreamer_operation (mp, FALSE, error);
656
remove_idle_source (gpointer key, gpointer value, gpointer user_data)
658
guint id = GPOINTER_TO_UINT (key);
660
g_source_remove (id);
773
664
rb_player_close (RBPlayer *mp, GError **error)
775
g_return_if_fail (RB_IS_PLAYER (mp));
667
g_return_val_if_fail (RB_IS_PLAYER (mp), TRUE);
777
669
mp->priv->playing = FALSE;
779
671
g_free (mp->priv->uri);
780
672
mp->priv->uri = NULL;
782
if (mp->priv->pipeline == NULL)
785
if (gst_element_set_state (mp->priv->pipeline,
786
GST_STATE_NULL) != GST_STATE_SUCCESS) {
789
RB_PLAYER_ERROR_GENERAL,
790
_("Failed to close audio output sink"));
793
gst_object_unref (GST_OBJECT (mp->priv->pipeline));
794
mp->priv->pipeline = NULL;
674
if (mp->priv->idle_eos_id != 0) {
675
g_source_remove (mp->priv->idle_eos_id);
676
mp->priv->idle_eos_id = 0;
678
if (mp->priv->idle_error_id != 0) {
679
g_source_remove (mp->priv->idle_error_id);
680
mp->priv->idle_error_id = 0;
682
if (mp->priv->idle_buffering_id != 0) {
683
g_source_remove (mp->priv->idle_buffering_id);
684
mp->priv->idle_buffering_id = 0;
686
g_hash_table_foreach (mp->priv->idle_info_ids, remove_idle_source, NULL);
688
if (mp->priv->playbin == NULL)
691
begin_gstreamer_operation (mp);
692
ret = gst_element_set_state (mp->priv->playbin, GST_STATE_READY) == GST_STATE_SUCCESS;
693
end_gstreamer_operation (mp, !ret, error);