[pulseaudio-commits] [Git][pulseaudio/pulseaudio][master] alsa-mixer: avoid assertion at alsa-lib mixer API when element removal

PulseAudio Marge Bot (@pulseaudio-merge-bot) gitlab at gitlab.freedesktop.org
Mon Jun 27 19:20:26 UTC 2022



PulseAudio Marge Bot pushed to branch master at PulseAudio / pulseaudio


Commits:
4bdf4c99 by Takashi Sakamoto at 2022-06-27T22:08:13+03:00
alsa-mixer: avoid assertion at alsa-lib mixer API when element removal

PulseAudio v5.99 or later hits assertion at alsa-lib mixer API due to
wrong handling of removal event for mixer element.

pulseaudio: mixer.c:149: hctl_elem_event_handler: Assertion `bag_empty(bag)' failed.

The removal event is defined as '~0U', thus it's not distinguished from
the other type of event just by bitwise operator.

At the removal event, class implementator for mixer API should detach
mixer element from hcontrol element in callback handler since alsa-lib
has assertion to check the list of mixer elements for a hcontrol element
is empty or not after calling all of handlers. In detail, please refer to
MR to alsa-lib:

 * https://github.com/alsa-project/alsa-lib/pull/244

This commit fixes the above two issues. The issue can be regenerated by
`samples/ctl` Python 3 script of alsa-gobject.

 * https://github.com/alsa-project/alsa-gobject/

It adds some user-defined elements into sound card 0. When terminated by
SIGINT signal, it removes the elements. Then PulseAudio dies due to the
assertion.

Fixes: 1fd8848e64cf ("alsa-util: Add functions for accessing mixer elements through mixer class")
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/728>

- - - - -


1 changed file:

- src/modules/alsa/alsa-util.c


Changes:

=====================================
src/modules/alsa/alsa-util.c
=====================================
@@ -1654,7 +1654,13 @@ static int mixer_class_event(snd_mixer_class_t *class, unsigned int mask,
 {
     int err;
     const char *name = snd_hctl_elem_get_name(helem);
-    if (mask & SND_CTL_EVENT_MASK_ADD) {
+    /* NOTE: The remove event is defined as '~0U`. */
+    if (mask == SND_CTL_EVENT_MASK_REMOVE) {
+        /* NOTE: Unless we remove the pointer to melem from the linked-list at
+         * private_data of helem, an assertion will be hit in alsa-lib since
+         * the list is not empty. */
+        snd_mixer_elem_detach(melem, helem);
+    } else if (mask & SND_CTL_EVENT_MASK_ADD) {
         snd_ctl_elem_iface_t iface = snd_hctl_elem_get_interface(helem);
         if (iface == SND_CTL_ELEM_IFACE_CARD || iface == SND_CTL_ELEM_IFACE_PCM) {
             snd_mixer_elem_t *new_melem;



View it on GitLab: https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/commit/4bdf4c99662f3da0e58d6c04bafff95d84362922

-- 
View it on GitLab: https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/commit/4bdf4c99662f3da0e58d6c04bafff95d84362922
You're receiving this email because of your account on gitlab.freedesktop.org.


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/pulseaudio-commits/attachments/20220627/019bec08/attachment.htm>


More information about the pulseaudio-commits mailing list