pidgin/pidgin

fix audiomixer rate consistency constraint
audiomixer-rate
2019-07-16, Fabrice Bellet
0b4112b40eb0
Parents 2a7a6f8263cc
Children 87fa3fa518c5
fix audiomixer rate consistency constraint
--- a/libpurple/media/backend-fs2.c Thu Jul 18 18:28:29 2019 +0000
+++ b/libpurple/media/backend-fs2.c Tue Jul 16 16:23:48 2019 +0200
@@ -2127,16 +2127,11 @@
if (codec->media_type == FS_MEDIA_TYPE_AUDIO) {
double output_volume = purple_prefs_get_int(
"/purple/media/audio/volume/output")/10.0;
- /*
- * Should this instead be:
- * audioconvert ! audioresample ! liveadder !
- * audioresample ! audioconvert ! realsink
- */
stream->queue = gst_element_factory_make("queue", NULL);
stream->volume = gst_element_factory_make("volume", NULL);
g_object_set(stream->volume, "volume", output_volume, NULL);
stream->level = gst_element_factory_make("level", NULL);
- stream->src = gst_element_factory_make("liveadder", NULL);
+ stream->src = gst_element_factory_make("audiomixer", NULL);
g_object_set(stream->src, "start-time-selection", 1, NULL);
sink = purple_media_manager_get_element(
purple_media_get_manager(priv->media),
@@ -2188,6 +2183,36 @@
gst_element_set_state(stream->tee, GST_STATE_PLAYING);
gst_element_set_state(stream->src, GST_STATE_PLAYING);
gst_element_link_many(stream->src, stream->tee, sink, NULL);
+ } else {
+ if (codec->media_type == FS_MEDIA_TYPE_AUDIO) {
+ GstElement *convert, *resample, *capsfilter;
+ GstCaps *caps;
+
+ /* The audiomixer element requires that all input
+ * streams have the same rate, so resample if
+ * needed
+ */
+ sinkpad = gst_element_get_static_pad (stream->src, "src");
+ caps = gst_pad_get_current_caps (sinkpad);
+
+ convert = gst_element_factory_make("audioconvert", NULL);
+ resample = gst_element_factory_make("audioresample", NULL);
+ capsfilter = gst_element_factory_make("capsfilter", NULL);
+
+ gst_bin_add_many(GST_BIN(priv->confbin), convert,
+ resample, capsfilter, NULL);
+ gst_element_link_many(gst_pad_get_parent_element (srcpad),
+ convert, resample, capsfilter, NULL);
+
+ g_object_set (capsfilter, "caps", caps, NULL);
+ gst_element_set_state (convert, GST_STATE_PLAYING);
+ gst_element_set_state (resample, GST_STATE_PLAYING);
+ gst_element_set_state (capsfilter, GST_STATE_PLAYING);
+
+ srcpad = gst_element_get_static_pad (capsfilter, "src");
+ gst_object_unref (sinkpad);
+ gst_object_unref (caps);
+ }
}
#if GST_CHECK_VERSION(1,0,0)