Update to 0.3.27
This commit is contained in:
parent
e36ced716e
commit
2adf140d7f
1
.gitignore
vendored
1
.gitignore
vendored
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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.
|
||||
|
||||
|
||||
2
sources
2
sources
@ -1 +1 @@
|
||||
SHA512 (pipewire-0.3.26.tar.gz) = d771956a42801a6e07fac48a175363eb4107a9fba13d649ff5c2cdc40044c84a61bf56050783507f6dd8efae8c59a2be07ec67433827335ae60f8116c4a4e178
|
||||
SHA512 (pipewire-0.3.27.tar.gz) = a2df1df8e43846b91fbeedeb1cda9c73b970ac9de58d8b4e97ada54ee74a8f26a168504289c7392c94cc7ea54aa01ada4791c66a5d3159a2bc980df633f6bcfe
|
||||
|
||||
Loading…
Reference in New Issue
Block a user