diff -Nru libmatemixer-1.25.0/backends/alsa/alsa-backend.c libmatemixer-1.25.0/backends/alsa/alsa-backend.c
--- libmatemixer-1.25.0/backends/alsa/alsa-backend.c 2020-12-08 14:03:20.000000000 +0000
+++ libmatemixer-1.25.0/backends/alsa/alsa-backend.c 2020-12-27 01:02:35.000000000 +0000
@@ -15,9 +15,15 @@
* License along with this library; if not, see .
*/
+#include "config.h"
+
#include
#include
#include
+#ifdef HAVE_UDEV
+#include
+#include
+#endif
#include
#include
@@ -45,6 +51,15 @@
GList *streams;
GList *devices;
GHashTable *devices_ids;
+
+#ifdef HAVE_UDEV
+ struct {
+ struct udev *udev;
+ struct udev_monitor *monitor;
+ guint fd_source;
+ int fd;
+ } udev;
+#endif
};
static void alsa_backend_dispose (GObject *object);
@@ -169,15 +184,99 @@
G_OBJECT_CLASS (alsa_backend_parent_class)->finalize (object);
}
+#ifdef HAVE_UDEV
+static gboolean udev_event_ok (struct udev_device *dev)
+{
+ const char *action = udev_device_get_action (dev);
+
+ if (action && !strcmp (action, "remove"))
+ return TRUE;
+
+ /*
+ * See /lib/udev/rules.d/78-sound-card.rules
+ * why "add" events are not handled here.
+ */
+ if ((!action || !strcmp (action, "change")) &&
+ udev_device_get_property_value (dev, "SOUND_INITIALIZED"))
+ return TRUE;
+
+ return FALSE;
+}
+
static gboolean
-alsa_backend_open (MateMixerBackend *backend)
+udev_monitor_cb (gint fd,
+ GIOCondition condition,
+ gpointer user_data)
{
- AlsaBackend *alsa;
+ AlsaBackend *alsa = user_data;
+ struct udev_device *dev;
- g_return_val_if_fail (ALSA_IS_BACKEND (backend), FALSE);
+ dev = udev_monitor_receive_device (alsa->priv->udev.monitor);
+ if (!dev)
+ return TRUE;
+
+ if (!udev_event_ok (dev)) {
+ udev_device_unref (dev);
+ return TRUE;
+ }
- alsa = ALSA_BACKEND (backend);
+ read_devices (alsa);
+ udev_device_unref (dev);
+
+ return TRUE;
+}
+
+static gboolean
+udev_monitor_setup (AlsaBackend *alsa)
+{
+ alsa->priv->udev.udev = udev_new ();
+ if (!alsa->priv->udev.udev)
+ return FALSE;
+
+ alsa->priv->udev.monitor = udev_monitor_new_from_netlink (alsa->priv->udev.udev, "udev");
+ if (!alsa->priv->udev.monitor) {
+ udev_unref (alsa->priv->udev.udev);
+ alsa->priv->udev.udev = NULL;
+ return FALSE;
+ }
+
+ if (udev_monitor_filter_add_match_subsystem_devtype (alsa->priv->udev.monitor, "sound", NULL) < 0 ||
+ udev_monitor_enable_receiving (alsa->priv->udev.monitor) < 0) {
+ udev_monitor_unref (alsa->priv->udev.monitor);
+ udev_unref (alsa->priv->udev.udev);
+ alsa->priv->udev.udev = NULL;
+ return FALSE;
+ }
+
+ alsa->priv->udev.fd = udev_monitor_get_fd (alsa->priv->udev.monitor);
+ if (alsa->priv->udev.fd < 0) {
+ udev_monitor_unref (alsa->priv->udev.monitor);
+ udev_unref (alsa->priv->udev.udev);
+ alsa->priv->udev.udev = NULL;
+ return FALSE;
+ }
+
+ alsa->priv->udev.fd_source = g_unix_fd_add (alsa->priv->udev.fd, G_IO_IN, udev_monitor_cb, alsa);
+
+ return TRUE;
+}
+
+static void
+udev_monitor_cleanup (AlsaBackend *alsa)
+{
+ if (!alsa->priv->udev.udev)
+ return;
+
+ g_source_remove (alsa->priv->udev.fd_source);
+ udev_monitor_unref (alsa->priv->udev.monitor);
+ udev_unref (alsa->priv->udev.udev);
+}
+#endif
+
+static void
+timeout_source_setup (AlsaBackend *alsa)
+{
/* Poll ALSA for changes every second, this only discovers added or removed
* sound cards, sound card related events are handled by AlsaDevices */
alsa->priv->timeout_source = g_timeout_source_new_seconds (1);
@@ -187,6 +286,30 @@
NULL);
g_source_attach (alsa->priv->timeout_source,
g_main_context_get_thread_default ());
+}
+
+static void
+timeout_source_cleanup (AlsaBackend *alsa)
+{
+ if (!alsa->priv->timeout_source)
+ return;
+
+ g_source_destroy (alsa->priv->timeout_source);
+}
+
+static gboolean
+alsa_backend_open (MateMixerBackend *backend)
+{
+ AlsaBackend *alsa;
+
+ g_return_val_if_fail (ALSA_IS_BACKEND (backend), FALSE);
+
+ alsa = ALSA_BACKEND (backend);
+
+#ifdef HAVE_UDEV
+ if (!udev_monitor_setup (alsa))
+#endif
+ timeout_source_setup (alsa);
/* Read the initial list of devices so we have some starting point, there
* isn't really a way to detect errors here, failing to add a device may
@@ -206,7 +329,10 @@
alsa = ALSA_BACKEND (backend);
- g_source_destroy (alsa->priv->timeout_source);
+ timeout_source_cleanup (alsa);
+#ifdef HAVE_UDEV
+ udev_monitor_cleanup (alsa);
+#endif
if (alsa->priv->devices != NULL) {
g_list_free_full (alsa->priv->devices, g_object_unref);
diff -Nru libmatemixer-1.25.0/backends/alsa/Makefile.am libmatemixer-1.25.0/backends/alsa/Makefile.am
--- libmatemixer-1.25.0/backends/alsa/Makefile.am 2020-12-08 14:03:20.000000000 +0000
+++ libmatemixer-1.25.0/backends/alsa/Makefile.am 2020-12-27 01:02:35.000000000 +0000
@@ -8,6 +8,7 @@
-I$(top_srcdir) \
-DG_LOG_DOMAIN=\"libmatemixer-alsa\" \
$(GLIB_CFLAGS) \
+ $(UDEV_CFLAGS) \
$(ALSA_CFLAGS) \
$(NULL)
@@ -43,6 +44,7 @@
libmatemixer_alsa_la_LIBADD = \
$(GLIB_LIBS) \
+ $(UDEV_LIBS) \
$(ALSA_LIBS)
libmatemixer_alsa_la_LDFLAGS = \
diff -Nru libmatemixer-1.25.0/configure.ac libmatemixer-1.25.0/configure.ac
--- libmatemixer-1.25.0/configure.ac 2020-12-08 14:03:20.000000000 +0000
+++ libmatemixer-1.25.0/configure.ac 2020-12-27 01:02:35.000000000 +0000
@@ -184,11 +184,38 @@
fi
fi
+AC_ARG_ENABLE([udev],
+ AS_HELP_STRING([--enable-udev],
+ [Enable UDEV support @<:@default=auto@:>@]),
+ enable_udev=$enableval,
+ enable_udev=auto)
+
+have_udev=no
+if test "x$enable_udev" != "xno" -a \
+ "x$have_alsa" = "xyes"; then
+ PKG_CHECK_MODULES(UDEV, [libudev],
+ have_udev=yes,
+ have_udev=no)
+ if test "x$have_udev" = "xyes"; then
+ AC_DEFINE(HAVE_UDEV, [], [Define if we have UDEV support])
+ else
+ if test "x$enable_udev" = "xyes"; then
+ AC_MSG_ERROR([UDEV support explicitly requested but dependencies not found])
+ else
+ AC_MSG_NOTICE([UDEV dependencies not found, the module will not be built])
+ fi
+ fi
+fi
+
AM_CONDITIONAL(HAVE_ALSA, test "x$have_alsa" = "xyes")
+AM_CONDITIONAL(HAVE_UDEV, test "x$have_udev" = "xyes")
AC_SUBST(HAVE_ALSA)
AC_SUBST(ALSA_CFLAGS)
AC_SUBST(ALSA_LIBS)
+AC_SUBST(HAVE_UDEV)
+AC_SUBST(UDEV_CFLAGS)
+AC_SUBST(UDEV_LIBS)
# -----------------------------------------------------------------------
# OSS
@@ -269,6 +296,6 @@
Build Null module: $have_null
Build PulseAudio module: $have_pulseaudio
- Build ALSA module: $have_alsa
+ Build ALSA module: $have_alsa (udev: $have_udev)
Build OSS module: $have_oss
"
diff -Nru libmatemixer-1.25.0/debian/changelog libmatemixer-1.25.0/debian/changelog
--- libmatemixer-1.25.0/debian/changelog 2020-12-08 14:03:27.000000000 +0000
+++ libmatemixer-1.25.0/debian/changelog 2020-12-27 01:02:41.000000000 +0000
@@ -1,8 +1,8 @@
-libmatemixer (1.25.0-0~202012081232~ubuntu20.10.1) groovy; urgency=low
+libmatemixer (1.25.0-0~202012262236~ubuntu20.10.1) groovy; urgency=low
* Auto build.
- -- Launchpad Package Builder Tue, 08 Dec 2020 14:03:27 +0000
+ -- Launchpad Package Builder Sun, 27 Dec 2020 01:02:41 +0000
libmatemixer (1.24.1-1) unstable; urgency=medium
diff -Nru libmatemixer-1.25.0/debian/git-build-recipe.manifest libmatemixer-1.25.0/debian/git-build-recipe.manifest
--- libmatemixer-1.25.0/debian/git-build-recipe.manifest 2020-12-08 14:03:27.000000000 +0000
+++ libmatemixer-1.25.0/debian/git-build-recipe.manifest 2020-12-27 01:02:41.000000000 +0000
@@ -1,3 +1,3 @@
-# git-build-recipe format 0.4 deb-version 1.25.0-0~202012081232
-lp:~mate-desktop/mate-desktop/+git/libmatemixer git-commit:31da9e1847a5da12c9d81386a29c647908974227
+# git-build-recipe format 0.4 deb-version 1.25.0-0~202012262236
+lp:~mate-desktop/mate-desktop/+git/libmatemixer git-commit:1b96bc58cb4ce0ce8f90ec26c97437aaed994001
merge buildinfo lp:~pkg-mate-team/mate-desktop/+git/libmatemixer-debpackaging git-commit:c85efd9449d12c3471e9db62c6822be7c495a1fa