[Debian-on-mobile-maintainers] [Git][DebianOnMobile-team/wys][upstream] New upstream version 0.1.9

Henry-Nicolas Tourneur gitlab at salsa.debian.org
Fri Nov 6 13:49:50 GMT 2020



Henry-Nicolas Tourneur pushed to branch upstream at Debian On Mobile / wys


Commits:
7d3d4f3d by Henry-Nicolas Tourneur at 2020-11-06T13:46:11+00:00
New upstream version 0.1.9
- - - - -


11 changed files:

- .gitlab-ci.yml
- README.md
- debian/changelog
- debian/wys.user-service
- − machine-conf/Purism Librem 5 devkit/codec
- − machine-conf/Purism Librem 5/codec
- − machine-conf/Purism Librem 5r2/codec
- − machine-conf/Purism Librem 5r3/codec
- src/main.c
- src/wys-audio.c
- src/wys-audio.h


Changes:

=====================================
.gitlab-ci.yml
=====================================
@@ -29,6 +29,9 @@ build:native:
   script:
     - meson --werror . _build
     - ninja -C _build
+  except:
+    variables:
+      - $PKG_ONLY == "1"
 
 package:deb-debian-buster:
   extends: .l5-build-debian-package


=====================================
README.md
=====================================
@@ -28,17 +28,16 @@ to do the following:
 
 ## Running
 Wys is usually run as a systemd user service.  To run it by hand,
-the program takes two options, --codec and --modem.  These should
-specify the ALSA card names of the codec and modem ALSA devices.  That
+the program takes one option, --modem.  It should
+specify the ALSA card name of the modem ALSA device.  That
 is, the value of the "alsa.card_name" property of the device's
 PulseAudio sink or source.
 
-  $ wys --codec sgtl5000 --modem "SIMCom SIM7100"
+  $ wys --modem "SIMCom SIM7100"
 
-You can also set the WYS_CODEC or WYS_MODEM environment variables with
+You can also set the WYS_MODEM environment variable with
 the same information.
 
-  $ export WYS_CODEC=sgtl5000
   $ export WYS_MODEM="SIMCom SIM7100"
   $ wys
 


=====================================
debian/changelog
=====================================
@@ -1,3 +1,15 @@
+wys (0.1.9) amber-phone; urgency=medium
+
+  [ Sebastian Krzyszkowiak ]
+  * Get rid of codec handling
+  * Request echo cancellation from PulseAudio on mic and speaker streams
+
+  [ Guido Günther ]
+  * gitlab-ci: Honor PKG_ONLY
+  * audio: Actually set appliction props
+
+ -- Martin Kepplinger <martin.kepplinger at puri.sm>  Wed, 04 Nov 2020 16:31:55 +0100
+
 wys (0.1.8) amber-phone; urgency=high
 
   [ Bob Ham ]


=====================================
debian/wys.user-service
=====================================
@@ -9,17 +9,16 @@ Requires=pulseaudio.service
 
 [Service]
 
-# Execution will fail unless (1) the --codec and --modem command-line
-# options are given with appropriate ALSA card names, (2) the
-# WYS_CODEC and WYS_MODEM environment variables are set, or (3) the
+# Execution will fail unless (1) the --modem command-line
+# option is given with appropriate ALSA card name, (2) the
+# WYS_MODEM environment variables is set, or (3) the
 # current machine is present in a machine-conf database under
 # /usr/share/wys, /etc/wys, $HOME/.config/wys, etc.
 #
-# Environment variables can be set elsewhere, for example adding a
+# Environment variable can be set elsewhere, for example adding a
 # wys.service.d/my-hardware.conf containing the following:
 #
 #   [Service]
-#   Environment=WYS_CODEC=sgtl5000
 #   Environment=WYS_MODEM="SIMCom SIM7100"
 #
 ExecStart=/usr/bin/wys


=====================================
machine-conf/Purism Librem 5 devkit/codec deleted
=====================================
@@ -1 +0,0 @@
-sgtl5000


=====================================
machine-conf/Purism Librem 5/codec deleted
=====================================
@@ -1 +0,0 @@
-wm8962


=====================================
machine-conf/Purism Librem 5r2/codec deleted
=====================================
@@ -1 +0,0 @@
-../Purism Librem 5/codec
\ No newline at end of file


=====================================
machine-conf/Purism Librem 5r3/codec deleted
=====================================
@@ -1 +0,0 @@
-../Purism Librem 5/codec
\ No newline at end of file


=====================================
src/main.c
=====================================
@@ -317,10 +317,9 @@ mm_vanished_cb (GDBusConnection *connection,
 
 static void
 set_up (struct wys_data *data,
-        const gchar *codec,
         const gchar *modem)
 {
-  data->audio = wys_audio_new (codec, modem);
+  data->audio = wys_audio_new (modem);
 
   data->modems = g_hash_table_new_full (g_str_hash, g_str_equal,
                                         g_free, g_object_unref);
@@ -348,18 +347,17 @@ tear_down (struct wys_data *data)
 
 
 static void
-run (const gchar *codec,
-     const gchar *modem)
+run (const gchar *modem)
 {
   struct wys_data data;
 
   memset (&data, 0, sizeof (struct wys_data));
-  set_up (&data, codec, modem);
+  set_up (&data, modem);
 
   main_loop = g_main_loop_new (NULL, FALSE);
 
-  printf (APPLICATION_NAME " started with codec `%s', modem `%s'\n",
-          codec, modem);
+  printf (APPLICATION_NAME " started with modem `%s'\n",
+          modem);
   g_main_loop_run (main_loop);
 
   g_main_loop_unref (main_loop);
@@ -601,13 +599,11 @@ main (int argc, char **argv)
   GError *error = NULL;
   GOptionContext *context;
   gboolean ok;
-  g_autofree gchar *codec = NULL;
   g_autofree gchar *modem = NULL;
   g_autofree gchar *machine = NULL;
 
   GOptionEntry options[] =
     {
-      { "codec", 'c', 0, G_OPTION_ARG_STRING, &codec, "Name of the codec's ALSA card", "NAME" },
       { "modem", 'm', 0, G_OPTION_ARG_STRING, &modem, "Name of the modem's ALSA card", "NAME" },
       { NULL }
     };
@@ -640,12 +636,11 @@ main (int argc, char **argv)
       g_strdelimit (machine, G_DIR_SEPARATOR_S, '_');
     }
 
-  ensure_alsa_card (machine, "WYS_CODEC", "codec", &codec);
   ensure_alsa_card (machine, "WYS_MODEM", "modem", &modem);
 
   setup_signals ();
 
-  run (codec, modem);
+  run (modem);
 
   return 0;
 }


=====================================
src/wys-audio.c
=====================================
@@ -35,7 +35,6 @@ struct _WysAudio
 {
   GObject parent_instance;
 
-  gchar             *codec;
   gchar             *modem;
   pa_glib_mainloop  *loop;
   pa_context        *ctx;
@@ -46,7 +45,6 @@ G_DEFINE_TYPE (WysAudio, wys_audio, G_TYPE_OBJECT);
 
 enum {
   PROP_0,
-  PROP_CODEC,
   PROP_MODEM,
   PROP_LAST_PROP,
 };
@@ -113,8 +111,8 @@ set_up_audio_context (WysAudio *self)
       wys_error ("Error creating PulseAudio main loop");
     }
 
-  self->ctx = pa_context_new (pa_glib_mainloop_get_api (self->loop),
-                              APPLICATION_NAME);
+  self->ctx = pa_context_new_with_proplist (pa_glib_mainloop_get_api (self->loop),
+                                            APPLICATION_NAME, props);
   if (!self->ctx)
     {
       wys_error ("Error creating PulseAudio context");
@@ -136,6 +134,7 @@ set_up_audio_context (WysAudio *self)
     }
 
   pa_context_set_state_callback (self->ctx, NULL, NULL);
+  pa_proplist_free (props);
 }
 
 
@@ -148,10 +147,6 @@ set_property (GObject      *object,
   WysAudio *self = WYS_AUDIO (object);
 
   switch (property_id) {
-  case PROP_CODEC:
-    self->codec = g_value_dup_string (value);
-    break;
-
   case PROP_MODEM:
     self->modem = g_value_dup_string (value);
     break;
@@ -203,7 +198,6 @@ finalize (GObject *object)
   WysAudio *self = WYS_AUDIO (object);
 
   g_free (self->modem);
-  g_free (self->codec);
 
   parent_class->finalize (object);
 }
@@ -219,13 +213,6 @@ wys_audio_class_init (WysAudioClass *klass)
   object_class->dispose      = dispose;
   object_class->finalize     = finalize;
 
-  props[PROP_CODEC] =
-    g_param_spec_string ("codec",
-                         _("Codec"),
-                         _("The ALSA card name for the codec"),
-                         "sgtl5000",
-                         G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY);
-
   props[PROP_MODEM] =
     g_param_spec_string ("modem",
                          _("Modem"),
@@ -244,11 +231,9 @@ wys_audio_init (WysAudio *self)
 
 
 WysAudio *
-wys_audio_new (const gchar *codec,
-               const gchar *modem)
+wys_audio_new (const gchar *modem)
 {
   return g_object_new (WYS_TYPE_AUDIO,
-                       "codec", codec,
                        "modem", modem,
                        NULL);
 }
@@ -388,16 +373,16 @@ props_name_alsa_card (pa_proplist *props,
 
 /**************** Find loopback data ****************/
 
-typedef void (*FindLoopbackCallback) (gchar *source_alsa_card,
-                                      gchar *sink_alsa_card,
+typedef void (*FindLoopbackCallback) (gchar *alsa_card,
+                                      WysDirection direction,
                                       GList *modules,
                                       gpointer userdata);
 
 
 struct find_loopback_data
 {
-  gchar *source_alsa_card;
-  gchar *sink_alsa_card;
+  gchar *alsa_card;
+  WysDirection direction;
   GCallback callback;
   gpointer userdata;
   GList *modules;
@@ -405,14 +390,14 @@ struct find_loopback_data
 
 
 static struct find_loopback_data *
-find_loopback_data_new (const gchar *source_alsa_card,
-                        const gchar *sink_alsa_card)
+find_loopback_data_new (const gchar *alsa_card,
+                        WysDirection direction)
 {
   struct find_loopback_data *data;
 
   data = g_rc_box_new0 (struct find_loopback_data);
-  data->source_alsa_card = g_strdup (source_alsa_card);
-  data->sink_alsa_card = g_strdup (sink_alsa_card);
+  data->alsa_card = g_strdup (alsa_card);
+  data->direction = direction;
 
   return data;
 }
@@ -423,14 +408,13 @@ find_loopback_data_clear (struct find_loopback_data *data)
 {
   FindLoopbackCallback func = (FindLoopbackCallback)data->callback;
 
-  func (data->source_alsa_card,
-        data->sink_alsa_card,
+  func (data->alsa_card,
+        data->direction,
         data->modules,
         data->userdata);
 
   g_list_free (data->modules);
-  g_free (data->sink_alsa_card);
-  g_free (data->source_alsa_card);
+  g_free (data->alsa_card);
 }
 
 
@@ -481,155 +465,134 @@ loopback_module_data_release (struct loopback_module_data *module_data)
 }
 
 
-/**************** Sink ****************/
+/**************** Module ****************/
 
 static void
-find_loopback_get_sink_cb (pa_context *ctx,
-                           const pa_sink_info *info,
-                           struct loopback_module_data *module_data)
+find_loopback_get_module_cb (pa_context *ctx,
+                             const pa_module_info *info,
+                             struct loopback_module_data *module_data)
 {
   struct find_loopback_data *loopback_data = module_data->loopback_data;
 
   if (!info)
     {
-      g_warning ("Could not get sink for module %" PRIu32
-                 " owning ALSA card `%s' source output",
+      g_warning ("Could not get module %" PRIu32
+                 " for ALSA card `%s' %s",
                  module_data->module_index,
-                 loopback_data->source_alsa_card);
-      goto release;
+                 loopback_data->alsa_card,
+                 loopback_data->direction == WYS_DIRECTION_FROM_NETWORK ? "source output" : "sink input");
+      loopback_module_data_release (module_data);
+      return;
     }
 
-  if (!props_name_alsa_card (info->proplist,
-                             loopback_data->sink_alsa_card))
+  if (strcmp (info->name, "module-loopback") != 0)
     {
-      g_debug ("Sink %" PRIu32 " `%s' for module %" PRIu32
-               " is not ALSA card `%s'",
-               info->index, info->name,
-               module_data->module_index,
-               loopback_data->sink_alsa_card);
-      goto release;
+      g_debug ("Module %" PRIu32 " for ALSA card `%s` %s"
+               " is not a loopback module",
+               info->index, loopback_data->alsa_card,
+               loopback_data->direction == WYS_DIRECTION_FROM_NETWORK ? "source output" : "sink input");
+      loopback_module_data_release (module_data);
+      return;
     }
 
 
-  g_debug ("Loopback module %" PRIu32 " has ALSA card `%s' source"
-           " and ALSA card `%s' sink",
-           module_data->module_index,
-           loopback_data->source_alsa_card,
-           loopback_data->sink_alsa_card);
+  g_debug ("Module %" PRIu32 " for ALSA card `%s' %s is a"
+           " loopback module",
+           info->index, loopback_data->alsa_card,
+           loopback_data->direction == WYS_DIRECTION_FROM_NETWORK ? "source output" : "sink input");
 
   loopback_data->modules = g_list_append
     (loopback_data->modules,
      GUINT_TO_POINTER (module_data->module_index));
 
- release:
   loopback_module_data_release (module_data);
 }
 
-/**************** Sink input list ****************/
+/**************** Sink ****************/
 
 static void
-find_loopback_sink_input_list_cb (pa_context *ctx,
-                                  const pa_sink_input_info *info,
-                                  int eol,
-                                  void *userdata)
+find_loopback_get_sink_cb (pa_context *ctx,
+                           const pa_sink_info *info,
+                           struct loopback_module_data *module_data)
 {
-  struct loopback_module_data *module_data = userdata;
   struct find_loopback_data *loopback_data = module_data->loopback_data;
 
-  if (eol == -1)
-    {
-      wys_error ("Error listing sink inputs: %s",
-                 pa_strerror (pa_context_errno (ctx)));
-    }
-
-  if (eol)
+  if (!info)
     {
-      g_debug ("End of sink input list reached");
+      g_warning ("Couldn't find sink for sink input"
+                 " while finding ALSA card `%s' sink",
+                 loopback_data->alsa_card);
       loopback_module_data_release (module_data);
       return;
     }
 
-  if (info->owner_module != module_data->module_index)
+  if (!props_name_alsa_card (info->proplist,
+                             loopback_data->alsa_card))
     {
-      g_debug ("Sink input %" PRIu32 " `%s' has"
-               " owner module %" PRIu32 " which does"
-               " not match sought module %" PRIu32
-               " for ALSA card `%s' source output",
-               info->index,
-               info->name,
-               info->owner_module,
-               module_data->module_index,
-               loopback_data->source_alsa_card);
+      g_debug ("Sink %" PRIu32 " `%s' is not ALSA card `%s'",
+               info->index, info->name,
+               loopback_data->alsa_card);
+      loopback_module_data_release (module_data);
       return;
     }
 
-  g_debug ("Checking whether sink %" PRIu32
-           " for sink input %" PRIu32
-           " `%s' owned by module %" PRIu32
-           " has ALSA card name `%s'",
-           info->sink,
-           info->index,
-           info->name,
-           info->owner_module,
-           loopback_data->sink_alsa_card);
-
-  g_rc_box_acquire (module_data);
-  get_sink (ctx,
-            info->sink,
-            G_CALLBACK (find_loopback_get_sink_cb),
-            module_data);
-}
-
-static void
-find_sink_input (pa_context *ctx,
-                 struct loopback_module_data *module_data)
-{
-  pa_operation *op;
 
-  op = pa_context_get_sink_input_info_list
-    (ctx, find_loopback_sink_input_list_cb, module_data);
+  g_debug ("Checking whether module %" PRIu32
+           " for ALSA card `%s' sink input"
+           " is a loopback module",
+           module_data->module_index,
+           loopback_data->alsa_card);
 
-  pa_operation_unref (op);
+  get_module (ctx,
+              module_data->module_index,
+              G_CALLBACK (find_loopback_get_module_cb),
+              module_data);
 }
 
-
-/**************** Module ****************/
+/**************** Sink input list ****************/
 
 static void
-find_loopback_get_module_cb (pa_context *ctx,
-                             const pa_module_info *info,
-                             struct loopback_module_data *module_data)
+find_loopback_sink_input_list_cb (pa_context *ctx,
+                                  const pa_sink_input_info *info,
+                                  int eol,
+                                  void *userdata)
 {
-  struct find_loopback_data *loopback_data = module_data->loopback_data;
+  struct find_loopback_data *loopback_data = userdata;
+  struct loopback_module_data *module_data;
 
-  if (!info)
+  if (eol == -1)
     {
-      g_warning ("Could not get module %" PRIu32
-                 " for ALSA card `%s' source output",
-                 module_data->module_index,
-                 loopback_data->source_alsa_card);
-      loopback_module_data_release (module_data);
-      return;
+      wys_error ("Error listing PulseAudio source outputs: %s",
+                 pa_strerror (pa_context_errno (ctx)));
     }
 
-  if (strcmp (info->name, "module-loopback") != 0)
+  if (eol)
     {
-      g_debug ("Module %" PRIu32 " for ALSA card `%s` source output"
-               " is not a loopback module",
-               info->index, loopback_data->source_alsa_card);
-      loopback_module_data_release (module_data);
+      g_debug ("End of sink input list reached");
+      find_loopback_data_release (loopback_data);
       return;
     }
 
+  if (info->owner_module == PA_INVALID_INDEX)
+    {
+      g_debug ("Sink input %" PRIu32 " `%s'"
+               " is not owned by a module",
+               info->index, info->name);
+      return;
+    }
 
-  g_debug ("Module %" PRIu32 " for ALSA card `%s' source output is a"
-           " loopback module, finding sink input with matching module",
-           info->index, loopback_data->source_alsa_card);
+  module_data = loopback_module_data_new (loopback_data,
+                                          info->owner_module);
 
-  find_sink_input (ctx, module_data);
+  g_debug ("Getting sink %" PRIu32
+           " of sink input %" PRIu32 " `%s'",
+           info->sink, info->index, info->name);
+  get_sink (ctx,
+              info->sink,
+              G_CALLBACK (find_loopback_get_sink_cb),
+              module_data);
 }
 
-
 /**************** Source ****************/
 
 static void
@@ -643,17 +606,17 @@ find_loopback_get_source_cb (pa_context *ctx,
     {
       g_warning ("Couldn't find source for source output"
                  " while finding ALSA card `%s' source",
-                 loopback_data->source_alsa_card);
+                 loopback_data->alsa_card);
       loopback_module_data_release (module_data);
       return;
     }
 
   if (!props_name_alsa_card (info->proplist,
-                             loopback_data->source_alsa_card))
+                             loopback_data->alsa_card))
     {
       g_debug ("Source %" PRIu32 " `%s' is not ALSA card `%s'",
                info->index, info->name,
-               loopback_data->source_alsa_card);
+               loopback_data->alsa_card);
       loopback_module_data_release (module_data);
       return;
     }
@@ -663,7 +626,7 @@ find_loopback_get_source_cb (pa_context *ctx,
            " for ALSA card `%s' source output"
            " is a loopback module",
            module_data->module_index,
-           loopback_data->source_alsa_card);
+           loopback_data->alsa_card);
 
   get_module (ctx,
               module_data->module_index,
@@ -717,39 +680,48 @@ find_loopback_source_output_list_cb (pa_context *ctx,
 }
 
 
-/** Find any loopback module between the specified source and sink
-    alsa cards.
+/** Find any loopback module for the specified source or sink
+    alsa card.
 
-    1. Loop through all source outputs.
-      1. Skip any source output that doesn't have the specified
+    1. Loop through all source outputs / sink outputs.
+      1. Skip any source output / sink input that doesn't have the specified
       alsa card as its source.
-      2. Skip any source output that isn't a loopback module.
-      3. Loop through all sink inputs.
-        1. Skip any sink input whose module index doesn't match.
-        2. Skip any sink input which doesn't have the specified alsa
-        card as its sink.
-        3. Found a loopback.
+      2. Skip any source output / sink input that isn't a loopback module.
+      3. Found a loopback.
 */
 static void
 find_loopback (pa_context *ctx,
-               const gchar *source_alsa_card,
-               const gchar *sink_alsa_card,
+               const gchar *alsa_card,
+               WysDirection direction,
                GCallback callback,
                gpointer userdata)
 {
   struct find_loopback_data *data;
   pa_operation *op;
 
-  data = find_loopback_data_new (source_alsa_card, sink_alsa_card);
+  data = find_loopback_data_new (alsa_card, direction);
   data->callback = callback;
   data->userdata = userdata;
 
-  g_debug ("Finding ALSA card `%s' source output",
-           source_alsa_card);
-  op = pa_context_get_source_output_info_list
-    (ctx, find_loopback_source_output_list_cb, data);
-
-  pa_operation_unref (op);
+  switch (direction)
+    {
+    case WYS_DIRECTION_FROM_NETWORK:
+      g_debug ("Finding ALSA card `%s' source output",
+               alsa_card);
+      op = pa_context_get_source_output_info_list
+        (ctx, find_loopback_source_output_list_cb, data);
+      pa_operation_unref (op);
+      break;
+    case WYS_DIRECTION_TO_NETWORK:
+      g_debug ("Finding ALSA card `%s' sink input",
+               alsa_card);
+      op = pa_context_get_sink_input_info_list
+        (ctx, find_loopback_sink_input_list_cb, data);
+      pa_operation_unref (op);
+      break;
+    default:
+      break;
+    }
 }
 
 
@@ -888,28 +860,26 @@ DECLARE_FIND_ALSA_CARD(sink);
 
 /**************** Instantiate loopback data ****************/
 
-typedef void (*InstantiateLoopbackCallback) (gchar *source_alsa_card,
-                                             gchar *sink_alsa_card,
-                                             gchar *source,
-                                             gchar *sink,
+typedef void (*InstantiateLoopbackCallback) (gchar *alsa_card,
+                                             WysDirection direction,
+                                             gchar *master,
                                              gpointer userdata);
 
 
 struct instantiate_loopback_data
 {
   pa_context *ctx;
-  gchar *source_alsa_card;
-  gchar *sink_alsa_card;
+  gchar *alsa_card;
+  WysDirection direction;
   gchar *media_name;
-  gchar *source;
-  gchar *sink;
+  gchar *master;
 };
 
 
 static struct instantiate_loopback_data *
 instantiate_loopback_data_new (pa_context *ctx,
-                               const gchar *source_alsa_card,
-                               const gchar *sink_alsa_card,
+                               const gchar *alsa_card,
+                               WysDirection direction,
                                const gchar *media_name)
 {
   struct instantiate_loopback_data *data;
@@ -919,8 +889,8 @@ instantiate_loopback_data_new (pa_context *ctx,
   pa_context_ref (ctx);
   data->ctx = ctx;
 
-  data->source_alsa_card = g_strdup (source_alsa_card);
-  data->sink_alsa_card = g_strdup (sink_alsa_card);
+  data->alsa_card = g_strdup (alsa_card);
+  data->direction = direction;
   data->media_name = g_strdup (media_name);
 
   return data;
@@ -930,11 +900,9 @@ instantiate_loopback_data_new (pa_context *ctx,
 static void
 instantiate_loopback_data_clear (struct instantiate_loopback_data *data)
 {
-  g_free (data->sink);
-  g_free (data->source);
+  g_free (data->master);
   g_free (data->media_name);
-  g_free (data->sink_alsa_card);
-  g_free (data->source_alsa_card);
+  g_free (data->alsa_card);
   pa_context_unref (data->ctx);
 }
 
@@ -957,24 +925,21 @@ instantiate_loopback_load_module_cb (pa_context *ctx,
 
   if (index == PA_INVALID_INDEX)
     {
-      g_warning ("Error instantiating loopback module with source `%s'"
-                 " (ALSA card `%s') and sink `%s' (ALSA card `%s'): %s",
-                 data->source,
-                 data->source_alsa_card,
-                 data->sink,
-                 data->sink_alsa_card,
+      g_warning ("Error instantiating loopback module with %s `%s'"
+                 " (ALSA card `%s'): %s",
+                 data->direction == WYS_DIRECTION_FROM_NETWORK ? "source" : "sink",
+                 data->master,
+                 data->alsa_card,
                  pa_strerror (pa_context_errno (ctx)));
     }
   else
     {
       g_debug ("Instantiated loopback module %" PRIu32
-               " with source `%s' (ALSA card `%s')"
-               " and sink `%s' (ALSA card `%s')",
+               " with %s `%s' (ALSA card `%s')",
                index,
-               data->source,
-               data->source_alsa_card,
-               data->sink,
-               data->sink_alsa_card);
+               data->direction == WYS_DIRECTION_FROM_NETWORK ? "source" : "sink",
+               data->master,
+               data->alsa_card);
     }
 
   instantiate_loopback_data_release (data);
@@ -982,55 +947,60 @@ instantiate_loopback_load_module_cb (pa_context *ctx,
 
 
 static void
-instantiate_loopback_sink_cb (const gchar *alsa_card_name,
-                              const gchar *pulse_object_name,
-                              gpointer userdata)
+instantiate_loopback_load_module (struct instantiate_loopback_data *data)
 {
-  struct instantiate_loopback_data *data = userdata;
   pa_proplist *stream_props;
-  gchar *stream_props_str;
+  gchar *stream_sink_props_str, *stream_source_props_str;
   gchar *arg;
   pa_operation *op;
 
-  if (!pulse_object_name)
+  g_debug ("Instantiating loopback module with %s `%s'"
+           " (ALSA card `%s')",
+           data->direction == WYS_DIRECTION_FROM_NETWORK ? "source" : "sink",
+           data->master,
+           data->alsa_card);
+
+  // sink properties
+  stream_props = pa_proplist_new ();
+  g_assert (stream_props != NULL);
+  proplist_set (stream_props, "media.role", "phone");
+  proplist_set (stream_props, "media.icon_name", "phone");
+  proplist_set (stream_props, "media.name", data->media_name);
+  if (data->direction == WYS_DIRECTION_FROM_NETWORK)
     {
-      g_warning ("Could not find sink for ALSA card `%s'",
-                 alsa_card_name);
-      instantiate_loopback_data_release (data);
-      return;
+      proplist_set (stream_props, "filter.want", "echo-cancel");
     }
 
-  data->sink = g_strdup (pulse_object_name);
-
-  g_debug ("Instantiating loopback module with source `%s'"
-           " (ALSA card `%s') and sink `%s' (ALSA card `%s')",
-           data->source,
-           data->source_alsa_card,
-           data->sink,
-           data->sink_alsa_card);
+  stream_sink_props_str = pa_proplist_to_string (stream_props);
+  pa_proplist_free (stream_props);
 
+  // source properties
   stream_props = pa_proplist_new ();
   g_assert (stream_props != NULL);
   proplist_set (stream_props, "media.role", "phone");
   proplist_set (stream_props, "media.icon_name", "phone");
   proplist_set (stream_props, "media.name", data->media_name);
+  if (data->direction == WYS_DIRECTION_TO_NETWORK)
+    {
+      proplist_set (stream_props, "filter.want", "echo-cancel");
+    }
 
-  stream_props_str = pa_proplist_to_string (stream_props);
+  stream_source_props_str = pa_proplist_to_string (stream_props);
   pa_proplist_free (stream_props);
-  
-  arg = g_strdup_printf ("source=%s"
-                         " sink=%s"
-                         " source_dont_move=true"
-                         " sink_dont_move=true"
+
+  arg = g_strdup_printf ("%s=%s"
+                         " %s_dont_move=true"
                          " fast_adjust_threshold_msec=100"
                          " max_latency_msec=25"
                          " sink_input_properties='%s'"
                          " source_output_properties='%s'",
-                         data->source,
-                         data->sink,
-                         stream_props_str,
-                         stream_props_str);
-  pa_xfree (stream_props_str);
+                         data->direction == WYS_DIRECTION_FROM_NETWORK ? "source" : "sink",
+                         data->master,
+                         data->direction == WYS_DIRECTION_FROM_NETWORK ? "source" : "sink",
+                         stream_sink_props_str,
+                         stream_source_props_str);
+  pa_xfree (stream_sink_props_str);
+  pa_xfree (stream_source_props_str);
 
   op = pa_context_load_module (data->ctx,
                                "module-loopback",
@@ -1042,9 +1012,8 @@ instantiate_loopback_sink_cb (const gchar *alsa_card_name,
   g_free (arg);
 }
 
-
 static void
-instantiate_loopback_source_cb (const gchar *alsa_card_name,
+instantiate_loopback_master_cb (const gchar *alsa_card_name,
                                 const gchar *pulse_object_name,
                                 gpointer userdata)
 {
@@ -1052,40 +1021,50 @@ instantiate_loopback_source_cb (const gchar *alsa_card_name,
 
   if (!pulse_object_name)
     {
-      g_warning ("Could not find source for ALSA card `%s'",
+      g_warning ("Could not find source/sink for ALSA card `%s'",
                  alsa_card_name);
       instantiate_loopback_data_release (data);
       return;
     }
 
-  data->source = g_strdup (pulse_object_name);
+  data->master = g_strdup (pulse_object_name);
 
-  g_debug ("Finding sink for ALSA card `%s'", data->sink_alsa_card);
-  find_alsa_card_sink (data->ctx,
-                       data->sink_alsa_card,
-                       G_CALLBACK (instantiate_loopback_sink_cb),
-                       data);
+  instantiate_loopback_load_module (data);
 }
 
 
 static void
 instantiate_loopback (pa_context *ctx,
-                      const gchar *source_alsa_card,
-                      const gchar *sink_alsa_card,
+                      const gchar *alsa_card,
+                      WysDirection direction,
                       const gchar *media_name)
 {
   struct instantiate_loopback_data *loopback_data;
 
   loopback_data = instantiate_loopback_data_new (ctx,
-                                                 source_alsa_card,
-                                                 sink_alsa_card,
+                                                 alsa_card,
+                                                 direction,
                                                  media_name);
 
-  g_debug ("Finding source for ALSA card `%s'", source_alsa_card);
-  find_alsa_card_source (ctx,
-                         source_alsa_card,
-                         G_CALLBACK (instantiate_loopback_source_cb),
-                         loopback_data);
+  switch (direction)
+    {
+    case WYS_DIRECTION_FROM_NETWORK:
+      g_debug ("Finding source for ALSA card `%s'", alsa_card);
+      find_alsa_card_source (ctx,
+                             alsa_card,
+                             G_CALLBACK (instantiate_loopback_master_cb),
+                             loopback_data);
+      break;
+    case WYS_DIRECTION_TO_NETWORK:
+      g_debug ("Finding sink for ALSA card `%s'", alsa_card);
+      find_alsa_card_sink (ctx,
+                           alsa_card,
+                           G_CALLBACK (instantiate_loopback_master_cb),
+                           loopback_data);
+      break;
+    default:
+      break;
+    }
 }
 
 
@@ -1099,26 +1078,27 @@ struct ensure_loopback_data
 
 
 static void
-ensure_loopback_find_loopback_cb (gchar *source_alsa_card,
-                                  gchar *sink_alsa_card,
+ensure_loopback_find_loopback_cb (gchar *alsa_card,
+                                  WysDirection direction,
                                   GList *modules,
                                   struct ensure_loopback_data *data)
 {
   if (modules != NULL)
     {
-      g_warning ("%u loopback module(s) for ALSA card `%s' source ->"
-                 " ALSA card `%s' sink already exist",
+      g_warning ("%u loopback module(s) for ALSA card `%s' %s ->"
+                 " already exist",
                  g_list_length (modules),
-                 source_alsa_card, sink_alsa_card);
+                 alsa_card,
+                 direction == WYS_DIRECTION_FROM_NETWORK ? "source" : "sink");
     }
   else
     {
-      g_debug ("Instantiating loopback module for ALSA card `%s' source ->"
-               " ALSA card `%s' sink",
-               source_alsa_card, sink_alsa_card);
+      g_debug ("Instantiating loopback module for ALSA card `%s' %s",
+               alsa_card,
+               direction == WYS_DIRECTION_FROM_NETWORK ? "source" : "sink");
 
-      instantiate_loopback (data->ctx, source_alsa_card,
-                            sink_alsa_card, data->media_name);
+      instantiate_loopback (data->ctx, alsa_card,
+                            direction, data->media_name);
     }
 
   g_free (data);
@@ -1127,8 +1107,8 @@ ensure_loopback_find_loopback_cb (gchar *source_alsa_card,
 
 static void
 ensure_loopback (pa_context *ctx,
-                 const gchar *source_alsa_card,
-                 const gchar *sink_alsa_card,
+                 const gchar *alsa_card,
+                 WysDirection  direction,
                  const gchar *media_name)
 {
   struct ensure_loopback_data *data;
@@ -1137,8 +1117,7 @@ ensure_loopback (pa_context *ctx,
   data->ctx = ctx;
   // This is a static string so we don't need a copy
   data->media_name = media_name;
-
-  find_loopback (ctx, source_alsa_card, sink_alsa_card,
+  find_loopback (ctx, alsa_card, direction,
                  G_CALLBACK (ensure_loopback_find_loopback_cb),
                  data);
 }
@@ -1151,11 +1130,11 @@ wys_audio_ensure_loopback (WysAudio     *self,
   switch (direction)
     {
     case WYS_DIRECTION_FROM_NETWORK:
-      ensure_loopback (self->ctx, self->modem, self->codec,
+      ensure_loopback (self->ctx, self->modem, direction,
                        "Voice call audio (to speaker)");
       break;
     case WYS_DIRECTION_TO_NETWORK:
-      ensure_loopback (self->ctx, self->codec, self->modem,
+      ensure_loopback (self->ctx, self->modem, direction,
                        "Voice call audio (from mic)");
       break;
     default:
@@ -1207,22 +1186,22 @@ ensure_no_loopback_modules_cb (gpointer data,
 
 
 static void
-ensure_no_loopback_find_loopback_cb (gchar *source_alsa_card,
-                                     gchar *sink_alsa_card,
+ensure_no_loopback_find_loopback_cb (gchar *alsa_card,
+                                     WysDirection direction,
                                      GList *modules,
                                      pa_context *ctx)
 {
   if (modules == NULL)
     {
-      g_warning ("No loopback module(s) for ALSA card `%s' source ->"
-                 " ALSA card `%s' sink",
-                 source_alsa_card, sink_alsa_card);
+      g_warning ("No loopback module(s) for ALSA card `%s' %s",
+                 alsa_card,
+                 direction == WYS_DIRECTION_FROM_NETWORK ? "source" : "sink");
       return;
     }
 
-  g_debug ("Deinstantiating loopback modules for ALSA card `%s' source ->"
-           " ALSA card `%s' sink",
-           source_alsa_card, sink_alsa_card);
+  g_debug ("Deinstantiating loopback modules for ALSA card `%s' %s",
+           alsa_card,
+           direction == WYS_DIRECTION_FROM_NETWORK ? "source" : "sink");
 
   g_list_foreach (modules,
                   (GFunc)ensure_no_loopback_modules_cb,
@@ -1232,10 +1211,10 @@ ensure_no_loopback_find_loopback_cb (gchar *source_alsa_card,
 
 static void
 ensure_no_loopback (pa_context *ctx,
-                    const gchar *source_alsa_card,
-                    const gchar *sink_alsa_card)
+                    const gchar *alsa_card,
+                    WysDirection direction)
 {
-  find_loopback (ctx, source_alsa_card, sink_alsa_card,
+  find_loopback (ctx, alsa_card, direction,
                  G_CALLBACK (ensure_no_loopback_find_loopback_cb),
                  ctx);
 }
@@ -1245,15 +1224,5 @@ void
 wys_audio_ensure_no_loopback (WysAudio     *self,
                               WysDirection  direction)
 {
-  switch (direction)
-    {
-    case WYS_DIRECTION_FROM_NETWORK:
-      ensure_no_loopback (self->ctx, self->modem, self->codec);
-      break;
-    case WYS_DIRECTION_TO_NETWORK:
-      ensure_no_loopback (self->ctx, self->codec, self->modem);
-      break;
-    default:
-      break;
-    }
+  ensure_no_loopback (self->ctx, self->modem, direction);
 }


=====================================
src/wys-audio.h
=====================================
@@ -35,8 +35,7 @@ G_BEGIN_DECLS
 
 G_DECLARE_FINAL_TYPE (WysAudio, wys_audio, WYS, AUDIO, GObject);
 
-WysAudio *wys_audio_new                (const gchar  *codec,
-                                        const gchar  *modem);
+WysAudio *wys_audio_new                (const gchar  *modem);
 void      wys_audio_ensure_loopback    (WysAudio     *self,
                                         WysDirection  direction);
 void      wys_audio_ensure_no_loopback (WysAudio     *self,



View it on GitLab: https://salsa.debian.org/DebianOnMobile-team/wys/-/commit/7d3d4f3d1233a6bf1b3327c3d0fb1fb06b4e18b8

-- 
View it on GitLab: https://salsa.debian.org/DebianOnMobile-team/wys/-/commit/7d3d4f3d1233a6bf1b3327c3d0fb1fb06b4e18b8
You're receiving this email because of your account on salsa.debian.org.


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/debian-on-mobile-maintainers/attachments/20201106/8d0e61e3/attachment-0001.html>


More information about the Debian-on-mobile-maintainers mailing list