60 lines
2.5 KiB
Diff
60 lines
2.5 KiB
Diff
|
|
From 4bdf4c99662f3da0e58d6c04bafff95d84362922 Mon Sep 17 00:00:00 2001
|
||
|
|
From: Takashi Sakamoto <o-takashi@sakamocchi.jp>
|
||
|
|
Date: Mon, 27 Jun 2022 10:09:52 +0900
|
||
|
|
Subject: [PATCH] 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>
|
||
|
|
---
|
||
|
|
src/modules/alsa/alsa-util.c | 8 +++++++-
|
||
|
|
1 file changed, 7 insertions(+), 1 deletion(-)
|
||
|
|
|
||
|
|
diff --git a/src/modules/alsa/alsa-util.c b/src/modules/alsa/alsa-util.c
|
||
|
|
index 7dc373fa0..f4e838d37 100644
|
||
|
|
--- a/src/modules/alsa/alsa-util.c
|
||
|
|
+++ b/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;
|
||
|
|
--
|
||
|
|
2.33.0
|
||
|
|
|