!78 update to version 16.99.1

From: @weigang-li 
Reviewed-by: @liqingqing_1229 
Signed-off-by: @liqingqing_1229
This commit is contained in:
openeuler-ci-bot 2023-11-01 08:51:16 +00:00 committed by Gitee
commit 2a94bf6783
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F
13 changed files with 13 additions and 652 deletions

View File

@ -1,27 +0,0 @@
From 306282bee2b993ebdf83ffb6c731655bb841441d Mon Sep 17 00:00:00 2001
From: tangjie02 <tangjie02@kylinsec.com.cn>
Date: Tue, 26 Jul 2022 19:52:44 +0800
Subject: [PATCH] Fix the problem that the description field of pa_alsa_path
struct isn't translated
Signed-off-by: tangjie02 <tangjie02@kylinsec.com.cn>
---
src/modules/alsa/alsa-mixer.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/modules/alsa/alsa-mixer.c b/src/modules/alsa/alsa-mixer.c
index 7b755ce..49c3968 100644
--- a/src/modules/alsa/alsa-mixer.c
+++ b/src/modules/alsa/alsa-mixer.c
@@ -2838,7 +2838,7 @@ static int path_verify(pa_alsa_path *p) {
if (p->device_port_type == PA_DEVICE_PORT_TYPE_UNKNOWN)
p->device_port_type = map->type;
if (!p->description)
- p->description = pa_xstrdup(map->description);
+ p->description = pa_xstrdup(_(map->description));
}
if (!p->description) {
--
2.33.0

View File

@ -1,49 +0,0 @@
From def8eb074eb4a80836c39fa320c33fe89bce38d9 Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Mon, 27 Jun 2022 10:32:07 +0200
Subject: [PATCH] alsa-mixer: allow to re-attach the mixer control element
It may be possible that the ALSA control element appears
again. Allow this combination by checking, if the pulseaudio
mixer element already exists. Do not create the duplicate
mixer element in this case.
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/729>
---
src/modules/alsa/alsa-util.c | 18 +++++++++++++-----
1 file changed, 13 insertions(+), 5 deletions(-)
diff --git a/src/modules/alsa/alsa-util.c b/src/modules/alsa/alsa-util.c
index f4e838d37..81dc77cc3 100644
--- a/src/modules/alsa/alsa-util.c
+++ b/src/modules/alsa/alsa-util.c
@@ -1663,12 +1663,20 @@ static int mixer_class_event(snd_mixer_class_t *class, unsigned int mask,
} 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_t *mixer = snd_mixer_class_get_mixer(class);
+ snd_ctl_elem_iface_t iface = snd_hctl_elem_get_interface(helem);
+ const char *name = snd_hctl_elem_get_name(helem);
+ const int index = snd_hctl_elem_get_index(helem);
+ const int device = snd_hctl_elem_get_device(helem);
snd_mixer_elem_t *new_melem;
-
- /* Put the hctl pointer as our private data - it will be useful for callbacks */
- if ((err = snd_mixer_elem_new(&new_melem, SND_MIXER_ELEM_PULSEAUDIO, 0, helem, NULL)) < 0) {
- pa_log_warn("snd_mixer_elem_new failed: %s", pa_alsa_strerror(err));
- return 0;
+
+ new_melem = pa_alsa_mixer_find(mixer, iface, name, index, device);
+ if (!new_melem) {
+ /* Put the hctl pointer as our private data - it will be useful for callbacks */
+ if ((err = snd_mixer_elem_new(&new_melem, SND_MIXER_ELEM_PULSEAUDIO, 0, helem, NULL)) < 0) {
+ pa_log_warn("snd_mixer_elem_new failed: %s", pa_alsa_strerror(err));
+ return 0;
+ }
}
if ((err = snd_mixer_elem_attach(new_melem, helem)) < 0) {
--
2.33.0

View File

@ -1,59 +0,0 @@
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

View File

@ -1,138 +0,0 @@
From d8c89de24dbe261cadb76f9715e25215af3a6faa Mon Sep 17 00:00:00 2001
From: Alper Nebi Yasak <alpernebiyasak@gmail.com>
Date: Thu, 24 Jun 2021 08:32:19 +0300
Subject: [PATCH] alsa-ucm: Always create device conflicting/supported device
idxsets
This is intended to make the current and upcoming code a bit clearer, as
we won't need to constantly check for the existence of these idxsets
before using or operating on them.
Signed-off-by: Alper Nebi Yasak <alpernebiyasak@gmail.com>
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/596>
Signed-off-by: buque <wuxu.wu@huawei.com>
---
src/modules/alsa/alsa-ucm.c | 64 ++++++++++++++++---------------------
1 file changed, 27 insertions(+), 37 deletions(-)
diff --git a/src/modules/alsa/alsa-ucm.c b/src/modules/alsa/alsa-ucm.c
index 08e36b571..3e23bc416 100644
--- a/src/modules/alsa/alsa-ucm.c
+++ b/src/modules/alsa/alsa-ucm.c
@@ -523,10 +523,10 @@ static int ucm_get_device_property(
n_confdev = snd_use_case_get_list(uc_mgr, id, &devices);
pa_xfree(id);
+ device->conflicting_devices = pa_idxset_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func);
if (n_confdev <= 0)
pa_log_debug("No %s for device %s", "_conflictingdevs", device_name);
else {
- device->conflicting_devices = pa_idxset_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func);
ucm_add_devices_to_idxset(device->conflicting_devices, device, verb->devices, devices, n_confdev);
snd_use_case_free_list(devices, n_confdev);
}
@@ -535,10 +535,10 @@ static int ucm_get_device_property(
n_suppdev = snd_use_case_get_list(uc_mgr, id, &devices);
pa_xfree(id);
+ device->supported_devices = pa_idxset_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func);
if (n_suppdev <= 0)
pa_log_debug("No %s for device %s", "_supporteddevs", device_name);
else {
- device->supported_devices = pa_idxset_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func);
ucm_add_devices_to_idxset(device->supported_devices, device, verb->devices, devices, n_suppdev);
snd_use_case_free_list(devices, n_suppdev);
}
@@ -730,29 +730,17 @@ static void append_lost_relationship(pa_alsa_ucm_device *dev) {
uint32_t idx;
pa_alsa_ucm_device *d;
- if (dev->conflicting_devices) {
- PA_IDXSET_FOREACH(d, dev->conflicting_devices, idx) {
- if (!d->conflicting_devices)
- d->conflicting_devices = pa_idxset_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func);
+ PA_IDXSET_FOREACH(d, dev->conflicting_devices, idx)
+ if (pa_idxset_put(d->conflicting_devices, dev, NULL) == 0)
+ pa_log_warn("Add lost conflicting device %s to %s",
+ pa_proplist_gets(dev->proplist, PA_ALSA_PROP_UCM_NAME),
+ pa_proplist_gets(d->proplist, PA_ALSA_PROP_UCM_NAME));
- if (pa_idxset_put(d->conflicting_devices, dev, NULL) == 0)
- pa_log_warn("Add lost conflicting device %s to %s",
- pa_proplist_gets(dev->proplist, PA_ALSA_PROP_UCM_NAME),
- pa_proplist_gets(d->proplist, PA_ALSA_PROP_UCM_NAME));
- }
- }
-
- if (dev->supported_devices) {
- PA_IDXSET_FOREACH(d, dev->supported_devices, idx) {
- if (!d->supported_devices)
- d->supported_devices = pa_idxset_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func);
-
- if (pa_idxset_put(d->supported_devices, dev, NULL) == 0)
- pa_log_warn("Add lost supported device %s to %s",
- pa_proplist_gets(dev->proplist, PA_ALSA_PROP_UCM_NAME),
- pa_proplist_gets(d->proplist, PA_ALSA_PROP_UCM_NAME));
- }
- }
+ PA_IDXSET_FOREACH(d, dev->supported_devices, idx)
+ if (pa_idxset_put(d->supported_devices, dev, NULL) == 0)
+ pa_log_warn("Add lost supported device %s to %s",
+ pa_proplist_gets(dev->proplist, PA_ALSA_PROP_UCM_NAME),
+ pa_proplist_gets(d->proplist, PA_ALSA_PROP_UCM_NAME));
}
int pa_alsa_ucm_query_profiles(pa_alsa_ucm_config *ucm, int card_index) {
@@ -1199,23 +1187,27 @@ static int ucm_check_conformance(
return 1;
}
- if (dev->conflicting_devices) { /* the device defines conflicting devices */
- PA_IDXSET_FOREACH(d, dev->conflicting_devices, idx) {
- for (i = 0; i < dev_num; i++) {
- if (pdevices[i] == d) {
- pa_log_debug("Conflicting device found");
- return 0;
- }
+ PA_IDXSET_FOREACH(d, dev->conflicting_devices, idx) {
+ /* No conflicting device must already be selected */
+ for (i = 0; i < dev_num; i++) {
+ if (pdevices[i] == d) {
+ pa_log_debug("Conflicting device found");
+ return 0;
}
}
- } else if (dev->supported_devices) { /* the device defines supported devices */
+ }
+
+ if (!pa_idxset_isempty(dev->supported_devices)) {
+ /* No already selected device must be unsupported */
for (i = 0; i < dev_num; i++) {
if (!ucm_device_exists(dev->supported_devices, pdevices[i])) {
pa_log_debug("Supported device not found");
return 0;
}
}
- } else { /* not support any other devices */
+ }
+
+ if (pa_idxset_isempty(dev->conflicting_devices) && pa_idxset_isempty(dev->supported_devices)) {
pa_log_debug("Not support any other devices");
return 0;
}
@@ -2113,10 +2105,8 @@ static void free_verb(pa_alsa_ucm_verb *verb) {
pa_proplist_free(di->proplist);
- if (di->conflicting_devices)
- pa_idxset_free(di->conflicting_devices, NULL);
- if (di->supported_devices)
- pa_idxset_free(di->supported_devices, NULL);
+ pa_idxset_free(di->conflicting_devices, NULL);
+ pa_idxset_free(di->supported_devices, NULL);
pa_xfree(di->eld_mixer_device_name);
--
2.33.0

View File

@ -1,58 +0,0 @@
From fb63e589310fab20e60c46bb40c7b7acab5eeac9 Mon Sep 17 00:00:00 2001
From: Alper Nebi Yasak <alpernebiyasak@gmail.com>
Date: Sat, 26 Jun 2021 12:05:17 +0300
Subject: [PATCH] idxset: Add set contains() function
This is functionally equivalent to get_by_data(s, p, NULL) == p, but
with a more obvious name and form because some existing code is instead
manually iterating through idxsets to check for existence of an item.
Signed-off-by: Alper Nebi Yasak <alpernebiyasak@gmail.com>
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/596>
---
src/pulsecore/idxset.c | 14 ++++++++++++++
src/pulsecore/idxset.h | 3 +++
2 files changed, 17 insertions(+)
diff --git a/src/pulsecore/idxset.c b/src/pulsecore/idxset.c
index 5175ca217..91ac6a015 100644
--- a/src/pulsecore/idxset.c
+++ b/src/pulsecore/idxset.c
@@ -258,6 +258,20 @@ void* pa_idxset_get_by_data(pa_idxset*s, const void *p, uint32_t *idx) {
return e->data;
}
+bool pa_idxset_contains(pa_idxset *s, const void *p) {
+ unsigned hash;
+ struct idxset_entry *e;
+
+ pa_assert(s);
+
+ hash = s->hash_func(p) % NBUCKETS;
+
+ if (!(e = data_scan(s, hash, p)))
+ return false;
+
+ return e->data == p;
+}
+
void* pa_idxset_remove_by_index(pa_idxset*s, uint32_t idx) {
struct idxset_entry *e;
unsigned hash;
diff --git a/src/pulsecore/idxset.h b/src/pulsecore/idxset.h
index 7acb202ff..6797852b7 100644
--- a/src/pulsecore/idxset.h
+++ b/src/pulsecore/idxset.h
@@ -66,6 +66,9 @@ void* pa_idxset_get_by_index(pa_idxset*s, uint32_t idx);
/* Get the entry by its data. The index is returned in *idx */
void* pa_idxset_get_by_data(pa_idxset*s, const void *p, uint32_t *idx);
+/* Return true if item is in idxset */
+bool pa_idxset_contains(pa_idxset *s, const void *p);
+
/* Similar to pa_idxset_get_by_index(), but removes the entry from the idxset. */
void* pa_idxset_remove_by_index(pa_idxset*s, uint32_t idx);
--
2.33.0

View File

@ -1,86 +0,0 @@
From ec668ac44bc6e666123f22f2696745dcdce98fed Mon Sep 17 00:00:00 2001
From: Alper Nebi Yasak <alpernebiyasak@gmail.com>
Date: Wed, 23 Jun 2021 17:50:50 +0300
Subject: [PATCH] idxset: Add set comparison operations
Add isdisjoint(), issubset(), issuperset() and equals() functions that
element-wise compare two idxsets.
Signed-off-by: Alper Nebi Yasak <alpernebiyasak@gmail.com>
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/596>
---
src/pulsecore/idxset.c | 34 ++++++++++++++++++++++++++++++++++
src/pulsecore/idxset.h | 12 ++++++++++++
2 files changed, 46 insertions(+)
diff --git a/src/pulsecore/idxset.c b/src/pulsecore/idxset.c
index 91ac6a015..b5dd9b3e1 100644
--- a/src/pulsecore/idxset.c
+++ b/src/pulsecore/idxset.c
@@ -470,6 +470,40 @@ bool pa_idxset_isempty(pa_idxset *s) {
return s->n_entries == 0;
}
+bool pa_idxset_isdisjoint(pa_idxset *s, pa_idxset *t) {
+ struct idxset_entry *i;
+
+ pa_assert(s);
+ pa_assert(t);
+
+ for (i = s->iterate_list_head; i; i = i->iterate_next)
+ if (pa_idxset_contains(t, i->data))
+ return false;
+
+ return true;
+}
+
+bool pa_idxset_issubset(pa_idxset *s, pa_idxset *t) {
+ struct idxset_entry *i;
+
+ pa_assert(s);
+ pa_assert(t);
+
+ for (i = s->iterate_list_head; i; i = i->iterate_next)
+ if (!pa_idxset_contains(t, i->data))
+ return false;
+
+ return true;
+}
+
+bool pa_idxset_issuperset(pa_idxset *s, pa_idxset *t) {
+ return pa_idxset_issubset(t, s);
+}
+
+bool pa_idxset_equals(pa_idxset *s, pa_idxset *t) {
+ return pa_idxset_issubset(s, t) && pa_idxset_issuperset(s, t);
+}
+
pa_idxset *pa_idxset_copy(pa_idxset *s, pa_copy_func_t copy_func) {
pa_idxset *copy;
struct idxset_entry *i;
diff --git a/src/pulsecore/idxset.h b/src/pulsecore/idxset.h
index 6797852b7..ee530bf2b 100644
--- a/src/pulsecore/idxset.h
+++ b/src/pulsecore/idxset.h
@@ -107,6 +107,18 @@ unsigned pa_idxset_size(pa_idxset*s);
/* Return true of the idxset is empty */
bool pa_idxset_isempty(pa_idxset *s);
+/* Return true if s and t have no entries in common */
+bool pa_idxset_isdisjoint(pa_idxset *s, pa_idxset *t);
+
+/* Return true if all entries in s are also in t */
+bool pa_idxset_issubset(pa_idxset *s, pa_idxset *t);
+
+/* Return true if all entries in t are also in s */
+bool pa_idxset_issuperset(pa_idxset *s, pa_idxset *t);
+
+/* Return true if s and t have all entries in common */
+bool pa_idxset_equals(pa_idxset *s, pa_idxset *t);
+
/* Duplicate the idxset. This will not copy the actual indexes. If copy_func is
* set, each entry is copied using the provided function, otherwise a shallow
* copy will be made. */
--
2.33.0

View File

@ -1,197 +0,0 @@
From 97d9c28579c7c7400969fd93f911e7745fb483ef Mon Sep 17 00:00:00 2001
From: Alper Nebi Yasak <alpernebiyasak@gmail.com>
Date: Wed, 23 Jun 2021 17:58:37 +0300
Subject: [PATCH] idxset: Add reverse iteration functions
Add complementary functions to the existing idxset iterate(),
steal_first(), first(), next() functions that work in the reverse
direction: reverse_iterate(), steal_last(), last() and previous().
Signed-off-by: Alper Nebi Yasak <alpernebiyasak@gmail.com>
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/596>
---
src/pulsecore/idxset.c | 110 +++++++++++++++++++++++++++++++++++++++++
src/pulsecore/idxset.h | 19 ++++---
2 files changed, 123 insertions(+), 6 deletions(-)
diff --git a/src/pulsecore/idxset.c b/src/pulsecore/idxset.c
index b5dd9b3e1..324894d01 100644
--- a/src/pulsecore/idxset.c
+++ b/src/pulsecore/idxset.c
@@ -381,6 +381,39 @@ at_end:
return NULL;
}
+void *pa_idxset_reverse_iterate(pa_idxset *s, void **state, uint32_t *idx) {
+ struct idxset_entry *e;
+
+ pa_assert(s);
+ pa_assert(state);
+
+ if (*state == (void*) -1)
+ goto at_end;
+
+ if ((!*state && !s->iterate_list_tail))
+ goto at_end;
+
+ e = *state ? *state : s->iterate_list_tail;
+
+ if (e->iterate_previous)
+ *state = e->iterate_previous;
+ else
+ *state = (void*) -1;
+
+ if (idx)
+ *idx = e->idx;
+
+ return e->data;
+
+at_end:
+ *state = (void *) -1;
+
+ if (idx)
+ *idx = PA_IDXSET_INVALID;
+
+ return NULL;
+}
+
void* pa_idxset_steal_first(pa_idxset *s, uint32_t *idx) {
void *data;
@@ -399,6 +432,24 @@ void* pa_idxset_steal_first(pa_idxset *s, uint32_t *idx) {
return data;
}
+void* pa_idxset_steal_last(pa_idxset *s, uint32_t *idx) {
+ void *data;
+
+ pa_assert(s);
+
+ if (!s->iterate_list_tail)
+ return NULL;
+
+ data = s->iterate_list_tail->data;
+
+ if (idx)
+ *idx = s->iterate_list_tail->idx;
+
+ remove_entry(s, s->iterate_list_tail);
+
+ return data;
+}
+
void* pa_idxset_first(pa_idxset *s, uint32_t *idx) {
pa_assert(s);
@@ -414,6 +465,21 @@ void* pa_idxset_first(pa_idxset *s, uint32_t *idx) {
return s->iterate_list_head->data;
}
+void* pa_idxset_last(pa_idxset *s, uint32_t *idx) {
+ pa_assert(s);
+
+ if (!s->iterate_list_tail) {
+ if (idx)
+ *idx = PA_IDXSET_INVALID;
+ return NULL;
+ }
+
+ if (idx)
+ *idx = s->iterate_list_tail->idx;
+
+ return s->iterate_list_tail->data;
+}
+
void *pa_idxset_next(pa_idxset *s, uint32_t *idx) {
struct idxset_entry *e;
unsigned hash;
@@ -458,6 +524,50 @@ void *pa_idxset_next(pa_idxset *s, uint32_t *idx) {
}
}
+void *pa_idxset_previous(pa_idxset *s, uint32_t *idx) {
+ struct idxset_entry *e;
+ unsigned hash;
+
+ pa_assert(s);
+ pa_assert(idx);
+
+ if (*idx == PA_IDXSET_INVALID)
+ return NULL;
+
+ hash = *idx % NBUCKETS;
+
+ if ((e = index_scan(s, hash, *idx))) {
+
+ e = e->iterate_previous;
+
+ if (e) {
+ *idx = e->idx;
+ return e->data;
+ } else {
+ *idx = PA_IDXSET_INVALID;
+ return NULL;
+ }
+
+ } else {
+
+ /* If the entry passed doesn't exist anymore we try to find
+ * the preceding one. */
+
+ for ((*idx)--; *idx < s->current_index; (*idx)--) {
+
+ hash = *idx % NBUCKETS;
+
+ if ((e = index_scan(s, hash, *idx))) {
+ *idx = e->idx;
+ return e->data;
+ }
+ }
+
+ *idx = PA_IDXSET_INVALID;
+ return NULL;
+ }
+}
+
unsigned pa_idxset_size(pa_idxset*s) {
pa_assert(s);
diff --git a/src/pulsecore/idxset.h b/src/pulsecore/idxset.h
index ee530bf2b..dbc4187d9 100644
--- a/src/pulsecore/idxset.h
+++ b/src/pulsecore/idxset.h
@@ -88,18 +88,25 @@ void* pa_idxset_rrobin(pa_idxset *s, uint32_t *idx);
/* Iterate through the idxset. At first iteration state should be NULL */
void *pa_idxset_iterate(pa_idxset *s, void **state, uint32_t *idx);
+void *pa_idxset_reverse_iterate(pa_idxset *s, void **state, uint32_t *idx);
-/* Return the oldest entry in the idxset and remove it. If idx is not NULL fill in its index in *idx */
+/* Return the oldest or newest entry in the idxset and remove it.
+ * If idx is not NULL fill in its index in *idx */
void* pa_idxset_steal_first(pa_idxset *s, uint32_t *idx);
+void* pa_idxset_steal_last(pa_idxset *s, uint32_t *idx);
-/* Return the oldest entry in the idxset. Fill in its index in *idx. */
+/* Return the oldest or newest entry in the idxset.
+ * Fill in its index in *idx. */
void* pa_idxset_first(pa_idxset *s, uint32_t *idx);
+void* pa_idxset_last(pa_idxset *s, uint32_t *idx);
-/* Return the entry following the entry indexed by *idx. After the
- * call *index contains the index of the returned
- * object. pa_idxset_first() and pa_idxset_next() may be used to
- * iterate through the set.*/
+/* Return the entry following or preceding the entry indexed by *idx.
+ * After the call *index contains the index of the returned object.
+ * pa_idxset_first() and pa_idxset_next() may be used to iterate through
+ * the set. pa_idxset_last() and pa_idxset_previous() may be used to
+ * iterate through the set in reverse. */
void *pa_idxset_next(pa_idxset *s, uint32_t *idx);
+void *pa_idxset_previous(pa_idxset *s, uint32_t *idx);
/* Return the current number of entries in the idxset */
unsigned pa_idxset_size(pa_idxset*s);
--
2.33.0

Binary file not shown.

View File

@ -1 +0,0 @@
8eef32ce91d47979f95fd9a935e738cd7eb7463430dabc72863251751e504ae4 *pulseaudio-16.1.tar.xz

BIN
pulseaudio-16.99.1.tar.xz Normal file

Binary file not shown.

View File

@ -0,0 +1 @@
dbb89a4c4a5f30f03b2c8c95de864ad53f7a40d4fdee29063f966cf66cfa800a *pulseaudio-16.99.1.tar.xz

View File

@ -1,23 +0,0 @@
---
src/daemon/start-pulseaudio-x11.in | 3 +++
1 file changed, 3 insertions(+)
diff --git a/src/daemon/start-pulseaudio-x11.in b/src/daemon/start-pulseaudio-x11.in
index 722a639..7cdf14e 100755
--- a/src/daemon/start-pulseaudio-x11.in
+++ b/src/daemon/start-pulseaudio-x11.in
@@ -17,6 +17,9 @@
set -e
+# probe to test if autospawn works, else resort to starting manually
+@PACTL_BINARY@ info > /dev/null 2>&1 || /usr/bin/pulseaudio --start "$@"
+
if [ -n "$1" ] ; then
case $1 in
stop)
--
2.27.0

View File

@ -1,3 +1,6 @@
%global pa_major 16.99
%global pa_minor 1
%undefine _strict_symbol_defs_build
%global multilib_archs x86_64 %{ix86}
@ -5,22 +8,14 @@
Name: pulseaudio
Summary: Improved Linux Sound Server
Version: 16.1
Release: 9
Version: %{pa_major}%{?pa_minor:.%{pa_minor}}
Release: 1
License: LGPLv2+
URL: https://www.freedesktop.org/wiki/Software/PulseAudio
Source0: https://freedesktop.org/software/pulseaudio/releases/pulseaudio-%{version}.tar.xz
Source1: https://freedesktop.org/software/pulseaudio/releases/pulseaudio-%{version}.tar.xz.sha256sum
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
Patch1003: 0001-alsa-mixer-allow-to-re-attach-the-mixer-control-elem.patch
Patch1004: 0001-idxset-Add-set-contains-function.patch
Patch1005: 0002-idxset-Add-set-comparison-operations.patch
Patch1006: 0003-idxset-Add-reverse-iteration-functions.patch
Patch1007: 0001-alsa-ucm-Always-create-device-conflicting-supported-.patch
BuildRequires: meson
BuildRequires: automake libtool gcc-c++ bash-completion
@ -173,7 +168,7 @@ exit 0
%config(noreplace) %{_sysconfdir}/pulse/daemon.conf
%config(noreplace) %{_sysconfdir}/pulse/*.pa
%config(noreplace) %{_sysconfdir}/pulse/client.conf
%{_sysconfdir}/dbus-1/system.d/pulseaudio-system.conf
%{_datadir}/dbus-1/system.d/pulseaudio-system.conf
%{_sysconfdir}/xdg/autostart/pulseaudio.desktop
%{bash_completionsdir}/*
%{_bindir}/pulseaudio
@ -193,7 +188,7 @@ exit 0
%exclude %{_libdir}/libpulse-simple.so.0*
%exclude %{_libdir}/libpulse-mainloop-glib.so.0*
%{_libdir}/pulseaudio/*.so
%exclude %{_libdir}/pulseaudio/libpulsecommon-%{version}.so
%exclude %{_libdir}/pulseaudio/libpulsecommon-%{pa_major}.so
%{_libdir}/pulseaudio/modules/*.so
%exclude %{_libdir}/pulseaudio/modules/module-equalizer-sink.so
%exclude %{_libdir}/pulseaudio/modules/module-detect.so
@ -230,7 +225,7 @@ exit 0
%{_libdir}/libpulse.so.0*
%{_libdir}/libpulse-simple.so.0*
%dir %{_libdir}/pulseaudio/
%{_libdir}/pulseaudio/libpulsecommon-%{version}.so
%{_libdir}/pulseaudio/libpulsecommon-%{pa_major}.so
%files libs-glib2
%{_libdir}/libpulse-mainloop-glib.so.0*
@ -248,7 +243,10 @@ exit 0
%{_mandir}/man*/*
%changelog
* Thu April 27 2023 wuxu <wuxu.wu@huawei.com> - 16.1-9
* Wed Nov 01 2023 liweigang <weigangli99@gmail.com> - 16.99.1-1
- update to version 16.99.1
* Thu Apr 27 2023 wuxu <wuxu.wu@huawei.com> - 16.1-9
- alsa-ucm: Always create device conflicting/supported device idxsets
* Tue Mar 14 2023 peijiankang <peijiankang@kylinos.cn> - 16.1-8