!68 alsa-mixer: avoid assertion at alsa-lib mixer API when element removal
From: @wuxu_buque Reviewed-by: @liqingqing_1229 Signed-off-by: @liqingqing_1229
This commit is contained in:
commit
347860192e
@ -0,0 +1,59 @@
|
||||
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
|
||||
|
||||
@ -15,6 +15,7 @@ Source5: default.pa-for-gdm
|
||||
|
||||
Patch201: pulseaudio-autostart.patch
|
||||
Patch1001: 0001-Fix-the-problem-that-the-description-field-of-pa_als.patch
|
||||
Patch1002: 0001-alsa-mixer-avoid-assertion-at-alsa-lib-mixer-API-whe.patch
|
||||
|
||||
BuildRequires: meson
|
||||
BuildRequires: automake libtool gcc-c++ bash-completion
|
||||
@ -242,6 +243,9 @@ exit 0
|
||||
%{_mandir}/man*/*
|
||||
|
||||
%changelog
|
||||
* Mon Dec 12 2022 wuxu <wuxu.wu@huawei.com> - 16.1-4
|
||||
- alsa-mixer: avoid assertion at alsa-lib mixer API when element removal
|
||||
|
||||
* Tue Oct 18 2022 Liu Zixian <liuzixian4@huawei.com> - 16.1-4
|
||||
- delete unused BuildRequires
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user