summaryrefslogtreecommitdiff
path: root/libpurple/media
diff options
context:
space:
mode:
authorGary Kramlich <grim@reaperworld.com>2020-02-04 03:05:18 +0000
committerGary Kramlich <grim@reaperworld.com>2020-02-04 03:05:18 +0000
commitf4f96f265d87fac0039c1a339ba8342597a66a82 (patch)
tree9f27e303b0189d7ea448b831e2aeea17e0078677 /libpurple/media
parentffe5ca22e1d8f136e7be3501061673543c6f98e1 (diff)
parent78c1a0a03ccde702bae9028023e8081550096e00 (diff)
downloadpidgin-f4f96f265d87fac0039c1a339ba8342597a66a82.tar.gz
Merged in fbellet/pidgin/port-changes-from-branch-2.x.y-to-default (pull request #632)
Port changes from branch 2.x.y to default Approved-by: Eion Robb <eionrobb@gmail.com> Approved-by: John Bailey <rekkanoryo@rekkanoryo.org> Approved-by: Gary Kramlich <grim@reaperworld.com>
Diffstat (limited to 'libpurple/media')
-rw-r--r--libpurple/media/backend-fs2.c64
-rw-r--r--libpurple/media/backend-iface.c18
-rw-r--r--libpurple/media/backend-iface.h16
3 files changed, 92 insertions, 6 deletions
diff --git a/libpurple/media/backend-fs2.c b/libpurple/media/backend-fs2.c
index ecb57b4e65..7dc79498e3 100644
--- a/libpurple/media/backend-fs2.c
+++ b/libpurple/media/backend-fs2.c
@@ -74,6 +74,9 @@ static gboolean purple_media_backend_fs2_set_decryption_parameters(
PurpleMediaBackend *self, const gchar *sess_id,
const gchar *participant, const gchar *cipher,
const gchar *auth, const gchar *key, gsize key_len);
+static gboolean purple_media_backend_fs2_set_require_encryption(
+ PurpleMediaBackend *self, const gchar *sess_id,
+ const gchar *participant, gboolean require_encryption);
static gboolean purple_media_backend_fs2_set_remote_codecs(
PurpleMediaBackend *self,
const gchar *sess_id, const gchar *participant,
@@ -505,6 +508,8 @@ purple_media_backend_iface_init(PurpleMediaBackendInterface *iface)
purple_media_backend_fs2_set_encryption_parameters;
iface->set_decryption_parameters =
purple_media_backend_fs2_set_decryption_parameters;
+ iface->set_require_encryption =
+ purple_media_backend_fs2_set_require_encryption;
iface->set_params = purple_media_backend_fs2_set_params;
iface->get_available_params = purple_media_backend_fs2_get_available_params;
iface->send_dtmf = purple_media_backend_fs2_send_dtmf;
@@ -1812,16 +1817,11 @@ src_pad_added_cb(FsStream *fsstream, GstPad *srcpad,
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);
sink = purple_media_manager_get_element(
purple_media_get_manager(priv->media),
PURPLE_MEDIA_RECV_AUDIO, priv->media,
@@ -1864,6 +1864,39 @@ src_pad_added_cb(FsStream *fsstream, GstPad *srcpad,
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);
+ }
}
sinkpad = gst_element_get_request_pad(stream->src, "sink_%u");
@@ -2383,6 +2416,25 @@ purple_media_backend_fs2_set_decryption_parameters (PurpleMediaBackend *self,
}
static gboolean
+purple_media_backend_fs2_set_require_encryption(PurpleMediaBackend *self,
+ const gchar *sess_id, const gchar *participant,
+ gboolean require_encryption)
+{
+ PurpleMediaBackendFs2Stream *stream;
+ gboolean result;
+
+ stream = get_stream(PURPLE_MEDIA_BACKEND_FS2(self), sess_id,
+ participant);
+ if (!stream) {
+ return FALSE;
+ }
+
+ g_object_set(stream->stream, "require-encryption",
+ require_encryption, NULL);
+ return TRUE;
+}
+
+static gboolean
purple_media_backend_fs2_set_send_codec(PurpleMediaBackend *self,
const gchar *sess_id, PurpleMediaCodec *codec)
{
diff --git a/libpurple/media/backend-iface.c b/libpurple/media/backend-iface.c
index aebece6371..a5e25d1119 100644
--- a/libpurple/media/backend-iface.c
+++ b/libpurple/media/backend-iface.c
@@ -219,6 +219,24 @@ purple_media_backend_set_decryption_parameters(PurpleMediaBackend *self,
sess_id, participant, cipher, auth, key, key_len);
}
+gboolean
+purple_media_backend_set_require_encryption(PurpleMediaBackend *self,
+ const gchar *sess_id, const gchar *participant,
+ gboolean require_encryption)
+{
+ PurpleMediaBackendInterface *backend_iface;
+
+ g_return_val_if_fail(PURPLE_IS_MEDIA_BACKEND(self), FALSE);
+ backend_iface = PURPLE_MEDIA_BACKEND_GET_INTERFACE(self);
+
+ if (!backend_iface->set_require_encryption) {
+ return FALSE;
+ }
+
+ return backend_iface->set_require_encryption(self,
+ sess_id, participant, require_encryption);
+}
+
void
purple_media_backend_set_params(PurpleMediaBackend *self,
guint num_params, GParameter *params)
diff --git a/libpurple/media/backend-iface.h b/libpurple/media/backend-iface.h
index ad6f409c01..f84aa4ad8e 100644
--- a/libpurple/media/backend-iface.h
+++ b/libpurple/media/backend-iface.h
@@ -90,6 +90,9 @@ struct _PurpleMediaBackendInterface
const gchar *sess_id, const gchar *participant,
const gchar *cipher, const gchar *auth,
const gchar *key, gsize key_len);
+ gboolean (*set_require_encryption) (PurpleMediaBackend *self,
+ const gchar *sess_id, const gchar *participant,
+ gboolean require_encryption);
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
void (*set_params) (PurpleMediaBackend *self,
guint num_params, GParameter *params);
@@ -254,6 +257,19 @@ gboolean purple_media_backend_set_decryption_parameters(PurpleMediaBackend *self
const gchar *key, gsize key_len);
/**
+ * purple_media_backend_set_require_encryption:
+ * @self: The media object to find the session in.
+ * @sess_id: The id of the session to set parameters of.
+ * @participant: The participant of the session to set parameters of.
+ * @require_encryption: TRUE if the media requires encryption.
+ *
+ * Sets whether a session participant's media requires encryption.
+ */
+gboolean purple_media_backend_set_require_encryption(PurpleMediaBackend *self,
+ const gchar *sess_id, const gchar *participant,
+ gboolean require_encryption);
+
+/**
* purple_media_backend_set_params:
* @self: The media backend to set the parameters on.
* @num_params: The number of parameters to pass to backend