pidgin/pidgin

Merged in audiomixer-rate (pull request #522)
release-2.x.y
2019-10-08, Gary Kramlich
28fd67a13644
Merged in audiomixer-rate (pull request #522)

Audiomixer rate

Approved-by: Elliott Sales de Andrade
Approved-by: Gary Kramlich
--- a/libpurple/media/backend-fs2.c Mon Oct 07 03:16:19 2019 -0500
+++ b/libpurple/media/backend-fs2.c Tue Oct 08 01:07:11 2019 +0000
@@ -2133,16 +2133,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),
@@ -2194,6 +2189,39 @@
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;
+ GstPad *mixer_srcpad;
+ GstCaps *caps;
+
+ /* The audiomixer element requires that all input
+ * streams have the same rate, so resample if
+ * needed
+ */
+ mixer_srcpad = gst_element_get_static_pad(stream->src, "src");
+ caps = gst_pad_get_current_caps(mixer_srcpad);
+
+ if (caps) {
+ 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(caps);
+ }
+ gst_object_unref(mixer_srcpad);
+ }
}
#if GST_CHECK_VERSION(1,0,0)