pipewire/0013-audioconvert-keep-better-track-of-param-changes.patch
DistroBaker 3e5aaf49ce Merged update from upstream sources
This is an automated DistroBaker update from upstream sources.
If you do not know what this is about or would like to opt out,
contact the OSCI team.

Source: https://src.fedoraproject.org/rpms/pipewire.git#4467dc0ac39ed04eb0f686004dcd8e66555c6ad6
2021-02-22 09:10:22 +00:00

209 lines
7.0 KiB
Diff

From 44919c83fc51aa5e1a22c903e841897c1b4d274c Mon Sep 17 00:00:00 2001
From: Wim Taymans <wtaymans@redhat.com>
Date: Fri, 19 Feb 2021 09:55:53 +0100
Subject: [PATCH 13/30] audioconvert: keep better track of param changes
Keep track of the param changes with the user counter. Make sure to
flip the serial switch whenever a change is pending. Previously
we copied the param from the channelmixer or follower but that
did not always result in a serial change.
Fixes #764
---
spa/plugins/audioconvert/audioadapter.c | 42 +++++++++++++++++--------
spa/plugins/audioconvert/audioconvert.c | 32 +++++++++++++------
2 files changed, 52 insertions(+), 22 deletions(-)
diff --git a/spa/plugins/audioconvert/audioadapter.c b/spa/plugins/audioconvert/audioadapter.c
index 75b4d1407..5a96c7abb 100644
--- a/spa/plugins/audioconvert/audioadapter.c
+++ b/spa/plugins/audioconvert/audioadapter.c
@@ -76,6 +76,12 @@ struct impl {
uint64_t info_all;
struct spa_node_info info;
+#define IDX_EnumFormat 0
+#define IDX_PropInfo 1
+#define IDX_Props 2
+#define IDX_Format 3
+#define IDX_EnumPortConfig 4
+#define IDX_PortConfig 5
struct spa_param_info params[6];
struct spa_hook_list hooks;
@@ -206,9 +212,19 @@ static int link_io(struct impl *this)
static void emit_node_info(struct impl *this, bool full)
{
+ uint32_t i;
+
if (full)
this->info.change_mask = this->info_all;
if (this->info.change_mask) {
+ if (this->info.change_mask & SPA_NODE_CHANGE_MASK_PARAMS) {
+ for (i = 0; i < SPA_N_ELEMENTS(this->params); i++) {
+ if (this->params[i].user > 0) {
+ this->params[i].flags ^= SPA_PARAM_INFO_SERIAL;
+ this->params[i].user = 0;
+ }
+ }
+ }
spa_node_emit_info(&this->hooks, &this->info);
this->info.change_mask = 0;
}
@@ -585,15 +601,15 @@ static void convert_node_info(void *data, const struct spa_node_info *info)
switch (info->params[i].id) {
case SPA_PARAM_PropInfo:
- idx = 1;
+ idx = IDX_PropInfo;
break;
case SPA_PARAM_Props:
- idx = 2;
+ idx = IDX_Props;
break;
}
if (idx != SPA_ID_INVALID) {
- this->params[idx] = info->params[i];
this->info.change_mask |= SPA_NODE_CHANGE_MASK_PARAMS;
+ this->params[idx].user++;
}
}
}
@@ -662,12 +678,12 @@ static void follower_info(void *data, const struct spa_node_info *info)
switch (info->params[i].id) {
case SPA_PARAM_Props:
- idx = 2;
+ idx = IDX_Props;
break;
}
if (idx != SPA_ID_INVALID) {
- this->params[idx] = info->params[i];
this->info.change_mask |= SPA_NODE_CHANGE_MASK_PARAMS;
+ this->params[idx].user++;
}
}
}
@@ -687,12 +703,12 @@ static void follower_port_info(void *data,
switch (info->params[i].id) {
case SPA_PARAM_Format:
- idx = 3;
+ idx = IDX_Format;
break;
}
if (idx != SPA_ID_INVALID) {
- this->params[idx] = info->params[i];
this->info.change_mask |= SPA_NODE_CHANGE_MASK_PARAMS;
+ this->params[idx].user++;
}
}
}
@@ -1166,12 +1182,12 @@ impl_init(const struct spa_handle_factory *factory,
SPA_NODE_FLAG_IN_PORT_CONFIG |
SPA_NODE_FLAG_OUT_PORT_CONFIG |
SPA_NODE_FLAG_NEED_CONFIGURE;
- this->params[0] = SPA_PARAM_INFO(SPA_PARAM_EnumFormat, SPA_PARAM_INFO_READ);
- this->params[1] = SPA_PARAM_INFO(SPA_PARAM_PropInfo, SPA_PARAM_INFO_READ);
- this->params[2] = SPA_PARAM_INFO(SPA_PARAM_Props, SPA_PARAM_INFO_READWRITE);
- this->params[3] = SPA_PARAM_INFO(SPA_PARAM_Format, SPA_PARAM_INFO_WRITE);
- this->params[4] = SPA_PARAM_INFO(SPA_PARAM_EnumPortConfig, SPA_PARAM_INFO_READ);
- this->params[5] = SPA_PARAM_INFO(SPA_PARAM_PortConfig, SPA_PARAM_INFO_READWRITE);
+ this->params[IDX_EnumFormat] = SPA_PARAM_INFO(SPA_PARAM_EnumFormat, SPA_PARAM_INFO_READ);
+ this->params[IDX_PropInfo] = SPA_PARAM_INFO(SPA_PARAM_PropInfo, SPA_PARAM_INFO_READ);
+ this->params[IDX_Props] = SPA_PARAM_INFO(SPA_PARAM_Props, SPA_PARAM_INFO_READWRITE);
+ this->params[IDX_Format] = SPA_PARAM_INFO(SPA_PARAM_Format, SPA_PARAM_INFO_WRITE);
+ this->params[IDX_EnumPortConfig] = SPA_PARAM_INFO(SPA_PARAM_EnumPortConfig, SPA_PARAM_INFO_READ);
+ this->params[IDX_PortConfig] = SPA_PARAM_INFO(SPA_PARAM_PortConfig, SPA_PARAM_INFO_READWRITE);
this->info.params = this->params;
this->info.n_params = 6;
diff --git a/spa/plugins/audioconvert/audioconvert.c b/spa/plugins/audioconvert/audioconvert.c
index 02cf78302..570db74b2 100644
--- a/spa/plugins/audioconvert/audioconvert.c
+++ b/spa/plugins/audioconvert/audioconvert.c
@@ -81,7 +81,11 @@ struct impl {
uint64_t info_all;
struct spa_node_info info;
- struct spa_param_info params[8];
+#define IDX_EnumPortConfig 0
+#define IDX_PortConfig 1
+#define IDX_PropInfo 2
+#define IDX_Props 3
+ struct spa_param_info params[4];
int n_links;
struct link links[8];
@@ -121,12 +125,22 @@ struct impl {
static void emit_node_info(struct impl *this, bool full)
{
+ uint32_t i;
+
if (this->add_listener)
return;
if (full)
this->info.change_mask = this->info_all;
if (this->info.change_mask) {
+ if (this->info.change_mask & SPA_NODE_CHANGE_MASK_PARAMS) {
+ for (i = 0; i < SPA_N_ELEMENTS(this->params); i++) {
+ if (this->params[i].user > 0) {
+ this->params[i].flags ^= SPA_PARAM_INFO_SERIAL;
+ this->params[i].user = 0;
+ }
+ }
+ }
spa_node_emit_info(&this->hooks, &this->info);
this->info.change_mask = 0;
}
@@ -606,15 +620,15 @@ static void on_channelmix_info(void *data, const struct spa_node_info *info)
switch (info->params[i].id) {
case SPA_PARAM_PropInfo:
- idx = 2;
+ idx = IDX_PropInfo;
break;
case SPA_PARAM_Props:
- idx = 3;
+ idx = IDX_Props;
break;
}
if (idx != SPA_ID_INVALID) {
- this->params[idx] = info->params[i];
this->info.change_mask |= SPA_NODE_CHANGE_MASK_PARAMS;
+ this->params[idx].user++;
}
}
emit_node_info(this, false);
@@ -705,8 +719,8 @@ static int reconfigure_mode(struct impl *this, enum spa_param_port_config_mode m
return res;
this->info.change_mask |= SPA_NODE_CHANGE_MASK_FLAGS | SPA_NODE_CHANGE_MASK_PARAMS;
- this->params[3].flags ^= SPA_PARAM_INFO_SERIAL;
this->info.flags &= ~SPA_NODE_FLAG_NEED_CONFIGURE;
+ this->params[IDX_Props].user++;
}
/* notify ports of new node */
@@ -1253,10 +1267,10 @@ impl_init(const struct spa_handle_factory *factory,
SPA_NODE_FLAG_IN_PORT_CONFIG |
SPA_NODE_FLAG_OUT_PORT_CONFIG |
SPA_NODE_FLAG_NEED_CONFIGURE;
- this->params[0] = SPA_PARAM_INFO(SPA_PARAM_EnumPortConfig, SPA_PARAM_INFO_READ);
- this->params[1] = SPA_PARAM_INFO(SPA_PARAM_PortConfig, SPA_PARAM_INFO_READWRITE);
- this->params[2] = SPA_PARAM_INFO(SPA_PARAM_PropInfo, SPA_PARAM_INFO_READ);
- this->params[3] = SPA_PARAM_INFO(SPA_PARAM_Props, SPA_PARAM_INFO_READWRITE);
+ this->params[IDX_EnumPortConfig] = SPA_PARAM_INFO(SPA_PARAM_EnumPortConfig, SPA_PARAM_INFO_READ);
+ this->params[IDX_PortConfig] = SPA_PARAM_INFO(SPA_PARAM_PortConfig, SPA_PARAM_INFO_READWRITE);
+ this->params[IDX_PropInfo] = SPA_PARAM_INFO(SPA_PARAM_PropInfo, SPA_PARAM_INFO_READ);
+ this->params[IDX_Props] = SPA_PARAM_INFO(SPA_PARAM_Props, SPA_PARAM_INFO_READWRITE);
this->info.params = this->params;
this->info.n_params = 4;
--
2.26.2