comparison libpurple/media.c @ 26108:71eee5468b9d

Fix some crashes from printing debug messages on a separate thread.
author Mike Ruprecht <maiku@soc.pidgin.im>
date Mon, 12 Jan 2009 02:42:29 +0000
parents ac4d7695dbc7
children 5275c7ef9edf
comparison
equal deleted inserted replaced
26107:4859b0b82289 26108:71eee5468b9d
1457 GstPad *pad; 1457 GstPad *pad;
1458 GstPad *ghost; 1458 GstPad *ghost;
1459 const gchar *audio_device = purple_prefs_get_string("/purple/media/audio/device"); 1459 const gchar *audio_device = purple_prefs_get_string("/purple/media/audio/device");
1460 double input_volume = purple_prefs_get_int("/purple/media/audio/volume/input")/10.0; 1460 double input_volume = purple_prefs_get_int("/purple/media/audio/volume/input")/10.0;
1461 1461
1462 purple_debug_info("media", "purple_media_audio_init_src\n");
1463
1464 *sendbin = gst_bin_new("purplesendaudiobin"); 1462 *sendbin = gst_bin_new("purplesendaudiobin");
1465 src = gst_element_factory_make("alsasrc", "asrc"); 1463 src = gst_element_factory_make("alsasrc", "asrc");
1466 volume = gst_element_factory_make("volume", "purpleaudioinputvolume"); 1464 volume = gst_element_factory_make("volume", "purpleaudioinputvolume");
1467 g_object_set(volume, "volume", input_volume, NULL); 1465 g_object_set(volume, "volume", input_volume, NULL);
1468 *sendlevel = gst_element_factory_make("level", "sendlevel"); 1466 *sendlevel = gst_element_factory_make("level", "sendlevel");
1487 const gchar *video_plugin = purple_prefs_get_string( 1485 const gchar *video_plugin = purple_prefs_get_string(
1488 "/purple/media/video/plugin"); 1486 "/purple/media/video/plugin");
1489 const gchar *video_device = purple_prefs_get_string( 1487 const gchar *video_device = purple_prefs_get_string(
1490 "/purple/media/video/device"); 1488 "/purple/media/video/device");
1491 1489
1492 purple_debug_info("media", "purple_media_video_init_src\n");
1493
1494 *sendbin = gst_bin_new("purplesendvideobin"); 1490 *sendbin = gst_bin_new("purplesendvideobin");
1495 src = gst_element_factory_make(video_plugin, "purplevideosource"); 1491 src = gst_element_factory_make(video_plugin, "purplevideosource");
1496 gst_bin_add(GST_BIN(*sendbin), src); 1492 gst_bin_add(GST_BIN(*sendbin), src);
1497 1493
1498 tee = gst_element_factory_make("tee", "purplevideosrctee"); 1494 tee = gst_element_factory_make("tee", "purplevideosrctee");
1530 { 1526 {
1531 GstElement *sink, *volume; 1527 GstElement *sink, *volume;
1532 GstPad *pad, *ghost; 1528 GstPad *pad, *ghost;
1533 double output_volume = purple_prefs_get_int( 1529 double output_volume = purple_prefs_get_int(
1534 "/purple/media/audio/volume/output")/10.0; 1530 "/purple/media/audio/volume/output")/10.0;
1535
1536 purple_debug_info("media", "purple_media_audio_init_recv\n");
1537 1531
1538 *recvbin = gst_bin_new("pidginrecvaudiobin"); 1532 *recvbin = gst_bin_new("pidginrecvaudiobin");
1539 sink = gst_element_factory_make("alsasink", "asink"); 1533 sink = gst_element_factory_make("alsasink", "asink");
1540 g_object_set(G_OBJECT(sink), "sync", FALSE, NULL); 1534 g_object_set(G_OBJECT(sink), "sync", FALSE, NULL);
1541 volume = gst_element_factory_make("volume", "purpleaudiooutputvolume"); 1535 volume = gst_element_factory_make("volume", "purpleaudiooutputvolume");
1546 gst_element_link(volume, *recvlevel); 1540 gst_element_link(volume, *recvlevel);
1547 pad = gst_element_get_pad(volume, "sink"); 1541 pad = gst_element_get_pad(volume, "sink");
1548 ghost = gst_ghost_pad_new("ghostsink", pad); 1542 ghost = gst_ghost_pad_new("ghostsink", pad);
1549 gst_element_add_pad(*recvbin, ghost); 1543 gst_element_add_pad(*recvbin, ghost);
1550 g_object_set(G_OBJECT(*recvlevel), "message", TRUE, NULL); 1544 g_object_set(G_OBJECT(*recvlevel), "message", TRUE, NULL);
1551
1552 purple_debug_info("media", "purple_media_audio_init_recv end\n");
1553 } 1545 }
1554 1546
1555 void 1547 void
1556 purple_media_video_init_recv(GstElement **recvbin) 1548 purple_media_video_init_recv(GstElement **recvbin)
1557 { 1549 {
1558 GstElement *sink; 1550 GstElement *sink;
1559 GstPad *pad, *ghost; 1551 GstPad *pad, *ghost;
1560
1561 purple_debug_info("media", "purple_media_video_init_recv\n");
1562 1552
1563 *recvbin = gst_bin_new("pidginrecvvideobin"); 1553 *recvbin = gst_bin_new("pidginrecvvideobin");
1564 sink = gst_element_factory_make("autovideosink", "purplevideosink"); 1554 sink = gst_element_factory_make("autovideosink", "purplevideosink");
1565 gst_bin_add(GST_BIN(*recvbin), sink); 1555 gst_bin_add(GST_BIN(*recvbin), sink);
1566 pad = gst_element_get_pad(sink, "sink"); 1556 pad = gst_element_get_pad(sink, "sink");
1567 ghost = gst_ghost_pad_new("ghostsink", pad); 1557 ghost = gst_ghost_pad_new("ghostsink", pad);
1568 gst_element_add_pad(*recvbin, ghost); 1558 gst_element_add_pad(*recvbin, ghost);
1569
1570 purple_debug_info("media", "purple_media_video_init_recv end\n");
1571 } 1559 }
1572 1560
1573 static void 1561 static void
1574 purple_media_new_local_candidate_cb(FsStream *stream, 1562 purple_media_new_local_candidate_cb(FsStream *stream,
1575 FsCandidate *local_candidate, 1563 FsCandidate *local_candidate,
1645 1633
1646 purple_media_candidate_free(local); 1634 purple_media_candidate_free(local);
1647 purple_media_candidate_free(remote); 1635 purple_media_candidate_free(remote);
1648 } 1636 }
1649 1637
1638 static gboolean
1639 purple_media_connected_cb(PurpleMediaStream *stream)
1640 {
1641 g_signal_emit(stream->session->media,
1642 purple_media_signals[STATE_CHANGED],
1643 0, PURPLE_MEDIA_STATE_CHANGED_CONNECTED,
1644 stream->session->id, stream->participant);
1645 return FALSE;
1646 }
1647
1650 static void 1648 static void
1651 purple_media_src_pad_added_cb(FsStream *fsstream, GstPad *srcpad, 1649 purple_media_src_pad_added_cb(FsStream *fsstream, GstPad *srcpad,
1652 FsCodec *codec, PurpleMediaStream *stream) 1650 FsCodec *codec, PurpleMediaStream *stream)
1653 { 1651 {
1654 PurpleMediaSessionType type = purple_media_from_fs(codec->media_type, FS_DIRECTION_RECV); 1652 PurpleMediaSessionType type = purple_media_from_fs(codec->media_type, FS_DIRECTION_RECV);
1658 purple_media_manager_get(), type); 1656 purple_media_manager_get(), type);
1659 1657
1660 gst_bin_add(GST_BIN(purple_media_get_pipeline(stream->session->media)), 1658 gst_bin_add(GST_BIN(purple_media_get_pipeline(stream->session->media)),
1661 stream->sink); 1659 stream->sink);
1662 sinkpad = gst_element_get_static_pad(stream->sink, "ghostsink"); 1660 sinkpad = gst_element_get_static_pad(stream->sink, "ghostsink");
1663 purple_debug_info("media", "connecting new src pad: %s\n", 1661 gst_pad_link(srcpad, sinkpad);
1664 gst_pad_link(srcpad, sinkpad) == GST_PAD_LINK_OK ? "success" : "failure");
1665 gst_element_set_state(stream->sink, GST_STATE_PLAYING); 1662 gst_element_set_state(stream->sink, GST_STATE_PLAYING);
1666 1663
1667 g_signal_emit(stream->session->media, purple_media_signals[STATE_CHANGED], 1664 g_timeout_add(0, (GSourceFunc)purple_media_connected_cb, stream);
1668 0, PURPLE_MEDIA_STATE_CHANGED_CONNECTED,
1669 stream->session->id, stream->participant);
1670 } 1665 }
1671 1666
1672 static gchar * 1667 static gchar *
1673 purple_media_get_stun_pref_ip() 1668 purple_media_get_stun_pref_ip()
1674 { 1669 {