From 2ee6b234754e0a3ed2b67389052f3f242feb0fb5 Mon Sep 17 00:00:00 2001 From: Evangelos Ribeiro Tzaras Date: Sat, 17 Apr 2021 11:24:23 +0200 Subject: [PATCH] sip: media-pipeline: Allow overriding audio elements from environment This is useful for tests where "pulsesrc" and "pulsesink" GstElements may not be available (for example in CI). Additionally only set the echo cancellation and buffer properties for the pulse GstElements. --- plugins/sip/calls-sip-media-pipeline.c | 54 ++++++++++++++++---------- 1 file changed, 33 insertions(+), 21 deletions(-) diff --git a/plugins/sip/calls-sip-media-pipeline.c b/plugins/sip/calls-sip-media-pipeline.c index 41143e4..dd21c2a 100644 --- a/plugins/sip/calls-sip-media-pipeline.c +++ b/plugins/sip/calls-sip-media-pipeline.c @@ -364,10 +364,40 @@ initable_init (GInitable *initable, g_autofree char *caps_string = NULL; GstPad *srcpad, *sinkpad; GstStructure *props = NULL; + const char *env_var; + + env_var = g_getenv ("CALLS_AUDIOSINK"); + if (env_var) { + self->audiosink = gst_element_factory_make (env_var, "sink"); + } else { + /* could also use autoaudiosink instead of pulsesink */ + self->audiosink = gst_element_factory_make ("pulsesink", "sink"); + + /* enable echo cancellation and set buffer size to 40ms */ + props = gst_structure_new ("props", + "media.role", G_TYPE_STRING, "phone", + "filter.want", G_TYPE_STRING, "echo-cancel", + NULL); + + g_object_set (self->audiosink, + "buffer-time", (gint64) 40000, + "stream-properties", props, + NULL); + + g_object_set (self->audiosrc, + "buffer-time", (gint64) 40000, + "stream-properties", props, + NULL); + + gst_structure_free (props); + } + + env_var = g_getenv ("CALLS_AUDIOSRC"); + if (env_var) + self->audiosrc = gst_element_factory_make (env_var, "source"); + else + self->audiosrc = gst_element_factory_make ("pulsesrc", "source"); - /* could also use autoaudiosink instead of pulsesink */ - self->audiosink = gst_element_factory_make ("pulsesink", "sink"); - self->audiosrc = gst_element_factory_make ("pulsesrc", "source"); if (!self->audiosrc || !self->audiosink) { g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, "Could not create audiosink or audiosrc"); @@ -461,24 +491,6 @@ initable_init (GInitable *initable, return FALSE; } - /* enable echo cancellation and set buffer size to 40ms */ - props = gst_structure_new ("props", - "media.role", G_TYPE_STRING, "phone", - "filter.want", G_TYPE_STRING, "echo-cancel", - NULL); - - g_object_set (self->audiosink, - "buffer-time", (gint64) 40000, - "stream-properties", props, - NULL); - - g_object_set (self->audiosrc, - "buffer-time", (gint64) 40000, - "stream-properties", props, - NULL); - - gst_structure_free (props); - gst_bin_add (GST_BIN (self->send_pipeline), self->send_rtpbin); gst_bin_add (GST_BIN (self->recv_pipeline), self->recv_rtpbin);