Mercurial > pidgin.yaz
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 { |