mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-06 13:30:01 -05:00
filter-chain: use property hints
Use property hints to expose int or bool controls.
This commit is contained in:
parent
2125ec048d
commit
2653e9f129
2 changed files with 51 additions and 10 deletions
|
|
@ -408,14 +408,36 @@ static struct spa_pod *get_prop_info(struct graph *graph, struct spa_pod_builder
|
|||
SPA_PROP_INFO_name, SPA_POD_String(name),
|
||||
0);
|
||||
spa_pod_builder_prop(b, SPA_PROP_INFO_type, 0);
|
||||
if (min == max) {
|
||||
spa_pod_builder_float(b, def);
|
||||
if (p->hint & FC_HINT_BOOLEAN) {
|
||||
if (min == max) {
|
||||
spa_pod_builder_bool(b, def <= 0.0 ? false : true);
|
||||
} else {
|
||||
spa_pod_builder_push_choice(b, &f[1], SPA_CHOICE_Enum, 0);
|
||||
spa_pod_builder_bool(b, def <= 0.0 ? false : true);
|
||||
spa_pod_builder_bool(b, false);
|
||||
spa_pod_builder_bool(b, true);
|
||||
spa_pod_builder_pop(b, &f[1]);
|
||||
}
|
||||
} else if (p->hint & FC_HINT_INTEGER) {
|
||||
if (min == max) {
|
||||
spa_pod_builder_int(b, def);
|
||||
} else {
|
||||
spa_pod_builder_push_choice(b, &f[1], SPA_CHOICE_Range, 0);
|
||||
spa_pod_builder_int(b, def);
|
||||
spa_pod_builder_int(b, min);
|
||||
spa_pod_builder_int(b, max);
|
||||
spa_pod_builder_pop(b, &f[1]);
|
||||
}
|
||||
} else {
|
||||
spa_pod_builder_push_choice(b, &f[1], SPA_CHOICE_Range, 0);
|
||||
spa_pod_builder_float(b, def);
|
||||
spa_pod_builder_float(b, min);
|
||||
spa_pod_builder_float(b, max);
|
||||
spa_pod_builder_pop(b, &f[1]);
|
||||
if (min == max) {
|
||||
spa_pod_builder_float(b, def);
|
||||
} else {
|
||||
spa_pod_builder_push_choice(b, &f[1], SPA_CHOICE_Range, 0);
|
||||
spa_pod_builder_float(b, def);
|
||||
spa_pod_builder_float(b, min);
|
||||
spa_pod_builder_float(b, max);
|
||||
spa_pod_builder_pop(b, &f[1]);
|
||||
}
|
||||
}
|
||||
spa_pod_builder_prop(b, SPA_PROP_INFO_params, 0);
|
||||
spa_pod_builder_bool(b, true);
|
||||
|
|
@ -446,7 +468,13 @@ static struct spa_pod *get_props_param(struct graph *graph, struct spa_pod_build
|
|||
snprintf(name, sizeof(name), "%s", p->name);
|
||||
|
||||
spa_pod_builder_string(b, name);
|
||||
spa_pod_builder_float(b, port->control_data);
|
||||
if (p->hint & FC_HINT_BOOLEAN) {
|
||||
spa_pod_builder_bool(b, port->control_data <= 0.0 ? false : true);
|
||||
} else if (p->hint & FC_HINT_INTEGER) {
|
||||
spa_pod_builder_int(b, port->control_data);
|
||||
} else {
|
||||
spa_pod_builder_float(b, port->control_data);
|
||||
}
|
||||
}
|
||||
spa_pod_builder_pop(b, &f[1]);
|
||||
return spa_pod_builder_pop(b, &f[0]);
|
||||
|
|
@ -487,12 +515,23 @@ static int parse_params(struct graph *graph, const struct spa_pod *pod)
|
|||
while (true) {
|
||||
const char *name;
|
||||
float value, *val = NULL;
|
||||
bool bool_val;
|
||||
int32_t int_val;
|
||||
|
||||
if (spa_pod_parser_get_string(&prs, &name) < 0)
|
||||
break;
|
||||
if (spa_pod_parser_get_float(&prs, &value) >= 0)
|
||||
if (spa_pod_parser_get_float(&prs, &value) >= 0) {
|
||||
val = &value;
|
||||
|
||||
} else if (spa_pod_parser_get_int(&prs, &int_val) >= 0) {
|
||||
value = int_val;
|
||||
val = &value;
|
||||
} else if (spa_pod_parser_get_bool(&prs, &bool_val) >= 0) {
|
||||
value = bool_val ? 1.0f : 0.0f;
|
||||
val = &value;
|
||||
} else {
|
||||
struct spa_pod *pod;
|
||||
spa_pod_parser_get_pod(&prs, &pod);
|
||||
}
|
||||
changed += set_control_value(def_node, name, val);
|
||||
}
|
||||
return changed;
|
||||
|
|
|
|||
|
|
@ -47,7 +47,9 @@ struct fc_port {
|
|||
#define FC_PORT_AUDIO (1ULL << 3)
|
||||
uint64_t flags;
|
||||
|
||||
#define FC_HINT_BOOLEAN (1ULL << 2)
|
||||
#define FC_HINT_SAMPLE_RATE (1ULL << 3)
|
||||
#define FC_HINT_INTEGER (1ULL << 5)
|
||||
uint64_t hint;
|
||||
float def;
|
||||
float min;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue