Update to 0.3.27

This commit is contained in:
Wim Taymans 2021-05-06 11:00:11 +02:00
parent e36ced716e
commit 2adf140d7f
12 changed files with 8 additions and 655 deletions

1
.gitignore vendored
View File

@ -45,3 +45,4 @@
/pipewire-0.3.24.tar.gz
/pipewire-0.3.25.tar.gz
/pipewire-0.3.26.tar.gz
/pipewire-0.3.27.tar.gz

View File

@ -1,91 +0,0 @@
From cd4a47666d537fce00e736dde5a0170f93260f10 Mon Sep 17 00:00:00 2001
From: Wim Taymans <wtaymans@redhat.com>
Date: Thu, 22 Apr 2021 12:25:48 +0200
Subject: [PATCH 02/10] acp: sync with pulseaudio
Remove our custom hack to work around missing duplex and use
upstream fix.
---
spa/plugins/alsa/acp/alsa-mixer.c | 24 +++++++++++++++++-------
spa/plugins/alsa/acp/idxset.h | 8 ++++++++
2 files changed, 25 insertions(+), 7 deletions(-)
diff --git a/spa/plugins/alsa/acp/alsa-mixer.c b/spa/plugins/alsa/acp/alsa-mixer.c
index 606d00b8..9d41b193 100644
--- a/spa/plugins/alsa/acp/alsa-mixer.c
+++ b/spa/plugins/alsa/acp/alsa-mixer.c
@@ -5142,6 +5142,7 @@ void pa_alsa_profile_set_probe(
pa_alsa_profile **pp, **probe_order;
pa_alsa_mapping *m;
pa_hashmap *broken_inputs, *broken_outputs, *used_paths;
+ pa_alsa_mapping *selected_fallback_input = NULL, *selected_fallback_output = NULL;
pa_assert(ps);
pa_assert(dev_id);
@@ -5164,13 +5165,16 @@ void pa_alsa_profile_set_probe(
uint32_t idx;
p = *pp;
- pa_log_debug("Check Profile %s.", p->name);
-
- /* Skip if fallback and already found something */
+ /* Skip if fallback and already found something, but still probe already selected fallbacks.
+ * If UCM is used then both fallback_input and fallback_output flags are false.
+ * If UCM is not used then there will be only a single entry in mappings.
+ */
if (found_input && p->fallback_input)
- continue;
+ if (selected_fallback_input == NULL || pa_idxset_get_by_index(p->input_mappings, 0) != selected_fallback_input)
+ continue;
if (found_output && p->fallback_output)
- continue;
+ if (selected_fallback_output == NULL || pa_idxset_get_by_index(p->output_mappings, 0) != selected_fallback_output)
+ continue;
/* Skip if this is already marked that it is supported (i.e. from the config file) */
if (!p->supported) {
@@ -5261,14 +5265,20 @@ void pa_alsa_profile_set_probe(
if (p->output_mappings)
PA_IDXSET_FOREACH(m, p->output_mappings, idx)
if (m->output_pcm) {
- found_output |= !p->fallback_output;
+ found_output = true;
+ if (p->fallback_output && selected_fallback_output == NULL) {
+ selected_fallback_output = m;
+ }
mapping_paths_probe(m, p, PA_ALSA_DIRECTION_OUTPUT, used_paths, mixers);
}
if (p->input_mappings)
PA_IDXSET_FOREACH(m, p->input_mappings, idx)
if (m->input_pcm) {
- found_input |= !p->fallback_input;
+ found_input = true;
+ if (p->fallback_input && selected_fallback_input == NULL) {
+ selected_fallback_input = m;
+ }
mapping_paths_probe(m, p, PA_ALSA_DIRECTION_INPUT, used_paths, mixers);
}
}
diff --git a/spa/plugins/alsa/acp/idxset.h b/spa/plugins/alsa/acp/idxset.h
index 4840f0fc..6e88a847 100644
--- a/spa/plugins/alsa/acp/idxset.h
+++ b/spa/plugins/alsa/acp/idxset.h
@@ -181,6 +181,14 @@ static inline void* pa_idxset_get_by_data(pa_idxset*s, const void *p, uint32_t *
return item->ptr;
}
+static inline void* pa_idxset_get_by_index(pa_idxset*s, uint32_t idx)
+{
+ pa_idxset_item *item;
+ if (!pa_array_check_index(&s->array, idx, pa_idxset_item))
+ return NULL;
+ item = pa_array_get_unchecked(&s->array, idx, pa_idxset_item);
+ return item->ptr;
+}
#define PA_IDXSET_FOREACH(e, s, idx) \
for ((e) = pa_idxset_first((s), &(idx)); (e); (e) = pa_idxset_next((s), &(idx)))
--
2.30.2

View File

@ -1,30 +0,0 @@
From 87b30e280e1e36cecd57422d9c619293feef2307 Mon Sep 17 00:00:00 2001
From: Wim Taymans <wtaymans@redhat.com>
Date: Sun, 25 Apr 2021 13:47:23 +0200
Subject: [PATCH 03/10] media-session: fix match rule
When matching without regex, don't just to a startswith check but also
check that the sizes of the strings match.
Fixes #1098
---
src/examples/media-session/match-rules.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/src/examples/media-session/match-rules.c b/src/examples/media-session/match-rules.c
index 84dca414..7e2ab701 100644
--- a/src/examples/media-session/match-rules.c
+++ b/src/examples/media-session/match-rules.c
@@ -72,7 +72,8 @@ static bool find_match(struct spa_json *arr, struct pw_properties *props)
success = true;
regfree(&preg);
}
- } else if (strncmp(str, value, len) == 0) {
+ } else if (strncmp(str, value, len) == 0 &&
+ strlen(str) == (size_t)len) {
success = true;
}
}
--
2.30.2

View File

@ -1,151 +0,0 @@
From a193bf7e1faa03d1907ebecac097f9ccc3420310 Mon Sep 17 00:00:00 2001
From: Pauli Virtanen <pav@iki.fi>
Date: Sun, 25 Apr 2021 19:11:43 +0300
Subject: [PATCH 04/10] media-session: keep track of seq in pw_*_enum_params
If multiple async enum param are running at the same time, take results
only from the latest one.
---
src/examples/media-session/media-session.c | 55 +++++++++++++++++-----
src/examples/media-session/media-session.h | 4 ++
2 files changed, 46 insertions(+), 13 deletions(-)
diff --git a/src/examples/media-session/media-session.c b/src/examples/media-session/media-session.c
index 640c4caa..21fc8030 100644
--- a/src/examples/media-session/media-session.c
+++ b/src/examples/media-session/media-session.c
@@ -361,7 +361,7 @@ int sm_object_destroy(struct sm_object *obj)
}
static struct param *add_param(struct spa_list *param_list,
- uint32_t id, const struct spa_pod *param)
+ int seq, int *param_seq, uint32_t id, const struct spa_pod *param)
{
struct param *p;
@@ -372,6 +372,19 @@ static struct param *add_param(struct spa_list *param_list,
if (id == SPA_ID_INVALID)
id = SPA_POD_OBJECT_ID(param);
+ if (id >= SM_MAX_PARAMS) {
+ pw_log_error(NAME": too big param id %d", id);
+ errno = EINVAL;
+ return NULL;
+ }
+
+ if (seq != param_seq[id]) {
+ pw_log_debug(NAME": ignoring param %d, seq:%d != current_seq:%d",
+ id, seq, param_seq[id]);
+ errno = EBUSY;
+ return NULL;
+ }
+
p = malloc(sizeof(struct param) + SPA_POD_SIZE(param));
if (p == NULL)
return NULL;
@@ -490,13 +503,21 @@ static void device_event_info(void *object, const struct pw_device_info *info)
if (info->params[i].user == 0)
continue;
+ if (id >= SM_MAX_PARAMS) {
+ pw_log_error(NAME" %p: too big param id %d", impl, id);
+ continue;
+ }
+
device->n_params -= clear_params(&device->param_list, id);
if (info->params[i].flags & SPA_PARAM_INFO_READ) {
- pw_log_debug(NAME" %p: device %d enum params %d", impl,
- device->obj.id, id);
- pw_device_enum_params((struct pw_device*)device->obj.proxy,
- 1, id, 0, UINT32_MAX, NULL);
+ int res;
+ res = pw_device_enum_params((struct pw_device*)device->obj.proxy,
+ ++device->param_seq[id], id, 0, UINT32_MAX, NULL);
+ if (SPA_RESULT_IS_ASYNC(res))
+ device->param_seq[id] = res;
+ pw_log_debug(NAME" %p: device %d enum params %d seq:%d", impl,
+ device->obj.id, id, device->param_seq[id]);
}
info->params[i].user = 0;
}
@@ -512,8 +533,8 @@ static void device_event_param(void *object, int seq,
struct sm_device *device = object;
struct impl *impl = SPA_CONTAINER_OF(device->obj.session, struct impl, this);
- pw_log_debug(NAME" %p: device %p param %d index:%d", impl, device, id, index);
- if (add_param(&device->param_list, id, param) != NULL)
+ pw_log_debug(NAME" %p: device %p param %d index:%d seq:%d", impl, device, id, index, seq);
+ if (add_param(&device->param_list, seq, device->param_seq, id, param) != NULL)
device->n_params++;
device->obj.avail |= SM_DEVICE_CHANGE_MASK_PARAMS;
@@ -591,13 +612,21 @@ static void node_event_info(void *object, const struct pw_node_info *info)
if (info->params[i].user == 0)
continue;
+ if (id >= SM_MAX_PARAMS) {
+ pw_log_error(NAME" %p: too big param id %d", impl, id);
+ continue;
+ }
+
node->n_params -= clear_params(&node->param_list, id);
if (info->params[i].flags & SPA_PARAM_INFO_READ) {
- pw_log_debug(NAME" %p: node %d enum params %d", impl,
- node->obj.id, id);
- pw_node_enum_params((struct pw_node*)node->obj.proxy,
- 1, id, 0, UINT32_MAX, NULL);
+ int res;
+ res = pw_node_enum_params((struct pw_node*)node->obj.proxy,
+ ++node->param_seq[id], id, 0, UINT32_MAX, NULL);
+ if (SPA_RESULT_IS_ASYNC(res))
+ node->param_seq[id] = res;
+ pw_log_debug(NAME" %p: node %d enum params %d seq:%d", impl,
+ node->obj.id, id, node->param_seq[id]);
}
info->params[i].user = 0;
}
@@ -613,8 +642,8 @@ static void node_event_param(void *object, int seq,
struct sm_node *node = object;
struct impl *impl = SPA_CONTAINER_OF(node->obj.session, struct impl, this);
- pw_log_debug(NAME" %p: node %p param %d index:%d", impl, node, id, index);
- if (add_param(&node->param_list, id, param) != NULL)
+ pw_log_debug(NAME" %p: node %p param %d index:%d seq:%d", impl, node, id, index, seq);
+ if (add_param(&node->param_list, seq, node->param_seq, id, param) != NULL)
node->n_params++;
node->obj.avail |= SM_NODE_CHANGE_MASK_PARAMS;
diff --git a/src/examples/media-session/media-session.h b/src/examples/media-session/media-session.h
index edfb1331..7d036288 100644
--- a/src/examples/media-session/media-session.h
+++ b/src/examples/media-session/media-session.h
@@ -35,6 +35,8 @@ extern "C" {
#define SM_TYPE_MEDIA_SESSION PW_TYPE_INFO_OBJECT_BASE "SessionManager"
+#define SM_MAX_PARAMS 32
+
struct sm_media_session;
struct sm_object_events {
@@ -133,6 +135,7 @@ struct sm_device {
#define SM_DEVICE_CHANGE_MASK_NODES (SM_OBJECT_CHANGE_MASK_LAST<<2)
uint32_t n_params;
struct spa_list param_list; /**< list of sm_param */
+ int param_seq[SM_MAX_PARAMS];
struct pw_device_info *info;
struct spa_list node_list;
};
@@ -148,6 +151,7 @@ struct sm_node {
#define SM_NODE_CHANGE_MASK_PORTS (SM_OBJECT_CHANGE_MASK_LAST<<2)
uint32_t n_params;
struct spa_list param_list; /**< list of sm_param */
+ int param_seq[SM_MAX_PARAMS];
struct pw_node_info *info;
struct spa_list port_list;
--
2.30.2

View File

@ -1,155 +0,0 @@
From f6cbb05aa95f0580bded97c194d928296cc0e874 Mon Sep 17 00:00:00 2001
From: Pauli Virtanen <pav@iki.fi>
Date: Sun, 25 Apr 2021 20:42:03 +0300
Subject: [PATCH 05/10] pulse-server: keep track of seq in pw_*_enum_params
If multiple async enum param are running at the same time, take results
only from the latest one.
---
src/modules/module-protocol-pulse/manager.c | 55 +++++++++++++++++----
1 file changed, 46 insertions(+), 9 deletions(-)
diff --git a/src/modules/module-protocol-pulse/manager.c b/src/modules/module-protocol-pulse/manager.c
index 8aff48a4..6d0e65f6 100644
--- a/src/modules/module-protocol-pulse/manager.c
+++ b/src/modules/module-protocol-pulse/manager.c
@@ -26,8 +26,11 @@
#include <spa/pod/iter.h>
#include <spa/pod/parser.h>
+#include <spa/utils/result.h>
#include <extensions/metadata.h>
+#define MAX_PARAMS 32
+
#define manager_emit_sync(m) spa_hook_list_call(&m->hooks, struct pw_manager_events, sync, 0)
#define manager_emit_added(m,o) spa_hook_list_call(&m->hooks, struct pw_manager_events, added, 0, o)
#define manager_emit_updated(m,o) spa_hook_list_call(&m->hooks, struct pw_manager_events, updated, 0, o)
@@ -72,6 +75,8 @@ struct object {
struct spa_hook proxy_listener;
struct spa_hook object_listener;
+ int param_seq[MAX_PARAMS];
+
struct spa_list data_list;
};
@@ -97,7 +102,8 @@ static uint32_t clear_params(struct spa_list *param_list, uint32_t id)
return count;
}
-static struct pw_manager_param *add_param(struct spa_list *params, uint32_t id, const struct spa_pod *param)
+static struct pw_manager_param *add_param(struct spa_list *params,
+ int seq, int *param_seq, uint32_t id, const struct spa_pod *param)
{
struct pw_manager_param *p;
@@ -109,6 +115,19 @@ static struct pw_manager_param *add_param(struct spa_list *params, uint32_t id,
id = SPA_POD_OBJECT_ID(param);
}
+ if (id >= MAX_PARAMS) {
+ pw_log_error("too big param id %d", id);
+ errno = EINVAL;
+ return NULL;
+ }
+
+ if (seq != param_seq[id]) {
+ pw_log_debug("ignoring param %d, seq:%d != current_seq:%d",
+ id, seq, param_seq[id]);
+ errno = EBUSY;
+ return NULL;
+ }
+
p = malloc(sizeof(*p) + (param != NULL ? SPA_POD_SIZE(param) : 0));
if (p == NULL)
return NULL;
@@ -287,11 +306,17 @@ static void device_event_info(void *object, const struct pw_device_info *info)
if (info->change_mask & PW_DEVICE_CHANGE_MASK_PARAMS) {
for (i = 0; i < info->n_params; i++) {
uint32_t id = info->params[i].id;
+ int res;
if (info->params[i].user == 0)
continue;
info->params[i].user = 0;
+ if (id >= MAX_PARAMS) {
+ pw_log_error("too big param id %d", id);
+ continue;
+ }
+
switch (id) {
case SPA_PARAM_EnumProfile:
case SPA_PARAM_Profile:
@@ -301,12 +326,14 @@ static void device_event_info(void *object, const struct pw_device_info *info)
case SPA_PARAM_Route:
break;
}
- add_param(&o->pending_list, id, NULL);
+ add_param(&o->pending_list, o->param_seq[id], o->param_seq, id, NULL);
if (!(info->params[i].flags & SPA_PARAM_INFO_READ))
continue;
- pw_device_enum_params((struct pw_device*)o->this.proxy,
- 0, id, 0, -1, NULL);
+ res = pw_device_enum_params((struct pw_device*)o->this.proxy,
+ ++o->param_seq[id], id, 0, -1, NULL);
+ if (SPA_RESULT_IS_ASYNC(res))
+ o->param_seq[id] = res;
}
}
if (changed) {
@@ -343,7 +370,9 @@ static void device_event_param(void *object, int seq,
struct manager *m = o->manager;
struct pw_manager_param *p;
- p = add_param(&o->pending_list, id, param);
+ p = add_param(&o->pending_list, seq, o->param_seq, id, param);
+ if (p == NULL)
+ return;
if (id == SPA_PARAM_Route && !has_param(&o->this.param_list, p)) {
uint32_t id, device;
@@ -400,18 +429,26 @@ static void node_event_info(void *object, const struct pw_node_info *info)
if (info->change_mask & PW_NODE_CHANGE_MASK_PARAMS) {
for (i = 0; i < info->n_params; i++) {
uint32_t id = info->params[i].id;
+ int res;
if (info->params[i].user == 0)
continue;
info->params[i].user = 0;
+ if (id >= MAX_PARAMS) {
+ pw_log_error("too big param id %d", id);
+ continue;
+ }
+
changed++;
- add_param(&o->pending_list, id, NULL);
+ add_param(&o->pending_list, o->param_seq[id], o->param_seq, id, NULL);
if (!(info->params[i].flags & SPA_PARAM_INFO_READ))
continue;
- pw_node_enum_params((struct pw_node*)o->this.proxy,
- 0, id, 0, -1, NULL);
+ res = pw_node_enum_params((struct pw_node*)o->this.proxy,
+ ++o->param_seq[id], id, 0, -1, NULL);
+ if (SPA_RESULT_IS_ASYNC(res))
+ o->param_seq[id] = res;
}
}
if (changed) {
@@ -425,7 +462,7 @@ static void node_event_param(void *object, int seq,
const struct spa_pod *param)
{
struct object *o = object;
- add_param(&o->pending_list, id, param);
+ add_param(&o->pending_list, seq, o->param_seq, id, param);
}
static const struct pw_node_events node_events = {
--
2.30.2

View File

@ -1,29 +0,0 @@
From b6d6800fc39538db50753df35d117b7b6a8c3311 Mon Sep 17 00:00:00 2001
From: Pauli Virtanen <pav@iki.fi>
Date: Sun, 25 Apr 2021 21:18:45 +0300
Subject: [PATCH 06/10] bluez5: don't unregister HFP/HSP profiles when shutting
down
This apparently causes delays in shutdown under some conditions, and
closing the DBus connection should be enought to tell BlueZ that we are
shutting down.
---
spa/plugins/bluez5/backend-native.c | 2 --
1 file changed, 2 deletions(-)
diff --git a/spa/plugins/bluez5/backend-native.c b/spa/plugins/bluez5/backend-native.c
index ceb00c52..c546c2af 100644
--- a/spa/plugins/bluez5/backend-native.c
+++ b/spa/plugins/bluez5/backend-native.c
@@ -1870,8 +1870,6 @@ static int backend_native_free(void *data)
sco_close(backend);
- backend_native_unregister_profiles(backend);
-
#ifdef HAVE_BLUEZ_5_BACKEND_HSP_NATIVE
dbus_connection_unregister_object_path(backend->conn, PROFILE_HSP_AG);
dbus_connection_unregister_object_path(backend->conn, PROFILE_HSP_HS);
--
2.30.2

View File

@ -1,68 +0,0 @@
From 86654f2bc9f4b3de114107008bb98e5f526dfe8c Mon Sep 17 00:00:00 2001
From: Wim Taymans <wtaymans@redhat.com>
Date: Mon, 26 Apr 2021 17:34:14 +0200
Subject: [PATCH 07/10] audioconvert: run lr4 on tagged channels in generic
case
Mark the LFE channels and run the lowpass filter on them in
the generic case. Generates LFE correctly in 2.1 upmix case.
See #1095
---
spa/plugins/audioconvert/channelmix-ops-c.c | 4 ++++
spa/plugins/audioconvert/channelmix-ops.c | 9 +++++++--
spa/plugins/audioconvert/channelmix-ops.h | 1 +
3 files changed, 12 insertions(+), 2 deletions(-)
diff --git a/spa/plugins/audioconvert/channelmix-ops-c.c b/spa/plugins/audioconvert/channelmix-ops-c.c
index 588cff19..e7359a93 100644
--- a/spa/plugins/audioconvert/channelmix-ops-c.c
+++ b/spa/plugins/audioconvert/channelmix-ops-c.c
@@ -78,6 +78,10 @@ channelmix_f32_n_m_c(struct channelmix *mix, uint32_t n_dst, void * SPA_RESTRICT
d[i][n] = sum;
}
}
+ for (i = 0; i < n_dst; i++) {
+ if (mix->lr4_info[i] > 0)
+ lr4_process(&mix->lr4[i], d[i], n_samples);
+ }
}
}
diff --git a/spa/plugins/audioconvert/channelmix-ops.c b/spa/plugins/audioconvert/channelmix-ops.c
index c669c58b..7c98e645 100644
--- a/spa/plugins/audioconvert/channelmix-ops.c
+++ b/spa/plugins/audioconvert/channelmix-ops.c
@@ -422,10 +422,15 @@ done:
continue;
mix->matrix_orig[ic][jc++] = matrix[i][j];
sum += fabs(matrix[i][j]);
- if (i == _CH(LFE))
- lr4_set(&mix->lr4[ic], BQ_LOWPASS, mix->lfe_cutoff / mix->freq);
}
maxsum = SPA_MAX(maxsum, sum);
+ if (i == _CH(LFE)) {
+ spa_log_debug(mix->log, "channel %d is LFE", ic);
+ lr4_set(&mix->lr4[ic], BQ_LOWPASS, mix->lfe_cutoff / mix->freq);
+ mix->lr4_info[ic] = 1;
+ } else {
+ mix->lr4_info[ic] = 0;
+ }
ic++;
}
if (SPA_FLAG_IS_SET(mix->options, CHANNELMIX_OPTION_NORMALIZE) &&
diff --git a/spa/plugins/audioconvert/channelmix-ops.h b/spa/plugins/audioconvert/channelmix-ops.h
index 3dd600e4..8fc15c4f 100644
--- a/spa/plugins/audioconvert/channelmix-ops.h
+++ b/spa/plugins/audioconvert/channelmix-ops.h
@@ -65,6 +65,7 @@ struct channelmix {
float freq; /* sample frequency */
float lfe_cutoff; /* in Hz, 0 is disabled */
+ uint32_t lr4_info[SPA_AUDIO_MAX_CHANNELS];
struct lr4 lr4[SPA_AUDIO_MAX_CHANNELS];
void (*process) (struct channelmix *mix, uint32_t n_dst, void * SPA_RESTRICT dst[n_dst],
--
2.30.2

View File

@ -1,26 +0,0 @@
From ca5f08e701b9a8f271637c51040fdfb8e8daf0f5 Mon Sep 17 00:00:00 2001
From: Wim Taymans <wtaymans@redhat.com>
Date: Tue, 27 Apr 2021 15:38:31 +0200
Subject: [PATCH 08/10] conf: remove X bit from config files
Fixes #1107
---
src/pipewire/conf.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/pipewire/conf.c b/src/pipewire/conf.c
index 50e0b0f9..24b15ffb 100644
--- a/src/pipewire/conf.c
+++ b/src/pipewire/conf.c
@@ -193,7 +193,7 @@ int pw_conf_save_state(const char *prefix, const char *name, struct pw_propertie
tmp_name = alloca(strlen(name)+5);
sprintf(tmp_name, "%s.tmp", name);
- if ((fd = openat(sfd, tmp_name, O_CLOEXEC | O_CREAT | O_WRONLY | O_TRUNC, 0700)) < 0) {
+ if ((fd = openat(sfd, tmp_name, O_CLOEXEC | O_CREAT | O_WRONLY | O_TRUNC, 0600)) < 0) {
pw_log_error("can't open file '%s': %m", tmp_name);
res = -errno;
goto error;
--
2.30.2

View File

@ -1,63 +0,0 @@
From 3a04f6d90ebda0f982ea7da59f28502d20c0bec1 Mon Sep 17 00:00:00 2001
From: Wim Taymans <wtaymans@redhat.com>
Date: Tue, 27 Apr 2021 16:42:52 +0200
Subject: [PATCH 09/10] Revert "acp: use the right profile name and
description"
This reverts commit 09106151d3a829ab6108260136b3a4f79f23797d.
We need the actual name and description of the mapping, not the
profile or else we end up with the full profile description in the
node description instead of the part of the profile that applies to
the device.
---
spa/plugins/alsa/acp/acp.c | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/spa/plugins/alsa/acp/acp.c b/spa/plugins/alsa/acp/acp.c
index 2dc1591f..bf84a2ed 100644
--- a/spa/plugins/alsa/acp/acp.c
+++ b/spa/plugins/alsa/acp/acp.c
@@ -199,8 +199,8 @@ static void device_free(void *data)
pa_hashmap_free(dev->ports);
}
-static void init_device(pa_card *impl, pa_alsa_profile *ap, pa_alsa_device *dev,
- pa_alsa_direction_t direction, pa_alsa_mapping *m, uint32_t index)
+static void init_device(pa_card *impl, pa_alsa_device *dev, pa_alsa_direction_t direction,
+ pa_alsa_mapping *m, uint32_t index)
{
uint32_t i;
@@ -231,8 +231,8 @@ static void init_device(pa_card *impl, pa_alsa_profile *ap, pa_alsa_device *dev,
dev->device.direction = ACP_DIRECTION_CAPTURE;
pa_proplist_update(dev->proplist, PA_UPDATE_REPLACE, m->input_proplist);
}
- pa_proplist_sets(dev->proplist, PA_PROP_DEVICE_PROFILE_NAME, ap->name);
- pa_proplist_sets(dev->proplist, PA_PROP_DEVICE_PROFILE_DESCRIPTION, ap->description);
+ pa_proplist_sets(dev->proplist, PA_PROP_DEVICE_PROFILE_NAME, m->name);
+ pa_proplist_sets(dev->proplist, PA_PROP_DEVICE_PROFILE_DESCRIPTION, m->description);
pa_proplist_setf(dev->proplist, "card.profile.device", "%u", index);
pa_proplist_as_dict(dev->proplist, &dev->device.props);
@@ -430,7 +430,7 @@ static void add_profiles(pa_card *impl)
PA_IDXSET_FOREACH(m, ap->output_mappings, idx) {
dev = &m->output;
if (dev->mapping == NULL) {
- init_device(impl, ap, dev, PA_ALSA_DIRECTION_OUTPUT, m, n_devices++);
+ init_device(impl, dev, PA_ALSA_DIRECTION_OUTPUT, m, n_devices++);
pa_dynarray_append(&impl->out.devices, dev);
}
if (impl->use_ucm) {
@@ -451,7 +451,7 @@ static void add_profiles(pa_card *impl)
PA_IDXSET_FOREACH(m, ap->input_mappings, idx) {
dev = &m->input;
if (dev->mapping == NULL) {
- init_device(impl, ap, dev, PA_ALSA_DIRECTION_INPUT, m, n_devices++);
+ init_device(impl, dev, PA_ALSA_DIRECTION_INPUT, m, n_devices++);
pa_dynarray_append(&impl->out.devices, dev);
}
--
2.30.2

View File

@ -1,30 +0,0 @@
From b136b3e2e34f9efb410a4041fa1c6f780217e0bf Mon Sep 17 00:00:00 2001
From: Wim Taymans <wtaymans@redhat.com>
Date: Wed, 28 Apr 2021 17:04:36 +0200
Subject: [PATCH 10/10] client-node: use the right port for io
To set the io on the mixer ports, we need to use the same id that
was used to add the port, not the id we use to identify the mixer
structure.
Fixes #759
---
src/modules/module-client-node/remote-node.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/modules/module-client-node/remote-node.c b/src/modules/module-client-node/remote-node.c
index ac9fae12..61919aab 100644
--- a/src/modules/module-client-node/remote-node.c
+++ b/src/modules/module-client-node/remote-node.c
@@ -793,7 +793,7 @@ client_node_port_set_io(void *object,
}
if ((res = spa_node_port_set_io(mix->port->mix,
- direction, mix_id, id, ptr, size)) < 0) {
+ direction, mix->mix.port.port_id, id, ptr, size)) < 0) {
if (res == -ENOTSUP)
res = 0;
else
--
2.30.2

View File

@ -1,6 +1,6 @@
%global majorversion 0
%global minorversion 3
%global microversion 26
%global microversion 27
%global apiversion 0.3
%global spaversion 0.2
@ -8,7 +8,7 @@
%global libversion %{soversion}.%(bash -c '((intversion = (%{minorversion} * 100) + %{microversion})); echo ${intversion}').0
# For rpmdev-bumpspec and releng automation
%global baserelease 4
%global baserelease 1
#global snapdate 20210107
#global gitcommit b17db2cebc1a5ab2c01851d29c05f79cd2f262bb
@ -53,15 +53,6 @@ Source0: https://gitlab.freedesktop.org/pipewire/pipewire/-/archive/%{ver
%endif
## upstream patches
Patch0001: 0002-acp-sync-with-pulseaudio.patch
Patch0002: 0003-media-session-fix-match-rule.patch
Patch0003: 0004-media-session-keep-track-of-seq-in-pw_-_enum_params.patch
Patch0004: 0005-pulse-server-keep-track-of-seq-in-pw_-_enum_params.patch
Patch0005: 0006-bluez5-don-t-unregister-HFP-HSP-profiles-when-shutti.patch
Patch0006: 0007-audioconvert-run-lr4-on-tagged-channels-in-generic-c.patch
Patch0007: 0008-conf-remove-X-bit-from-config-files.patch
Patch0008: 0009-Revert-acp-use-the-right-profile-name-and-descriptio.patch
Patch0009: 0010-client-node-use-the-right-port-for-io.patch
## upstreamable patches
@ -71,6 +62,7 @@ Patch1001: 0001-conf-start-media-session-through-pipewire.patch
BuildRequires: gettext
BuildRequires: meson >= 0.49.0
BuildRequires: gcc
BuildRequires: g++
BuildRequires: pkgconfig
BuildRequires: pkgconfig(libudev)
BuildRequires: pkgconfig(dbus-1)
@ -481,6 +473,9 @@ systemctl --no-reload preset --global pipewire.socket >/dev/null 2>&1 || :
%endif
%changelog
* Thu May 06 2021 Wim Taymans <wtaymans@redhat.com> - 0.3.27-1
- Update to 0.3.27
* Thu Apr 29 2021 Wim Taymans <wtaymans@redhat.com> - 0.3.26-4
- Add some more important upstream patches.

View File

@ -1 +1 @@
SHA512 (pipewire-0.3.26.tar.gz) = d771956a42801a6e07fac48a175363eb4107a9fba13d649ff5c2cdc40044c84a61bf56050783507f6dd8efae8c59a2be07ec67433827335ae60f8116c4a4e178
SHA512 (pipewire-0.3.27.tar.gz) = a2df1df8e43846b91fbeedeb1cda9c73b970ac9de58d8b4e97ada54ee74a8f26a168504289c7392c94cc7ea54aa01ada4791c66a5d3159a2bc980df633f6bcfe