mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-11 13:30:07 -05:00
stream: add support for double controls
We convert them to and from float.
This commit is contained in:
parent
7e227c5c6a
commit
42d689edf2
1 changed files with 21 additions and 1 deletions
|
|
@ -1152,7 +1152,7 @@ static int node_event_param(void *object, int seq,
|
||||||
struct control *c;
|
struct control *c;
|
||||||
const struct spa_pod *type, *pod;
|
const struct spa_pod *type, *pod;
|
||||||
uint32_t iid, choice, n_vals, container = SPA_ID_INVALID;
|
uint32_t iid, choice, n_vals, container = SPA_ID_INVALID;
|
||||||
float *vals, bool_range[3] = { 1.0, 0.0, 1.0 };
|
float *vals, bool_range[3] = { 1.0, 0.0, 1.0 }, dbl[3];
|
||||||
|
|
||||||
if (spa_pod_parse_object(param,
|
if (spa_pod_parse_object(param,
|
||||||
SPA_TYPE_OBJECT_PropInfo, NULL,
|
SPA_TYPE_OBJECT_PropInfo, NULL,
|
||||||
|
|
@ -1186,6 +1186,15 @@ static int node_event_param(void *object, int seq,
|
||||||
c->type = SPA_POD_TYPE(pod);
|
c->type = SPA_POD_TYPE(pod);
|
||||||
if (spa_pod_is_float(pod))
|
if (spa_pod_is_float(pod))
|
||||||
vals = SPA_POD_BODY(pod);
|
vals = SPA_POD_BODY(pod);
|
||||||
|
else if (spa_pod_is_double(pod)) {
|
||||||
|
double *v = SPA_POD_BODY(pod);
|
||||||
|
dbl[0] = v[0];
|
||||||
|
if (n_vals > 1)
|
||||||
|
dbl[1] = v[1];
|
||||||
|
if (n_vals > 2)
|
||||||
|
dbl[2] = v[2];
|
||||||
|
vals = dbl;
|
||||||
|
}
|
||||||
else if (spa_pod_is_bool(pod) && n_vals > 0) {
|
else if (spa_pod_is_bool(pod) && n_vals > 0) {
|
||||||
choice = SPA_CHOICE_Range;
|
choice = SPA_CHOICE_Range;
|
||||||
vals = bool_range;
|
vals = bool_range;
|
||||||
|
|
@ -1231,6 +1240,7 @@ static int node_event_param(void *object, int seq,
|
||||||
struct spa_pod_object *obj = (struct spa_pod_object *) param;
|
struct spa_pod_object *obj = (struct spa_pod_object *) param;
|
||||||
union {
|
union {
|
||||||
float f;
|
float f;
|
||||||
|
double d;
|
||||||
bool b;
|
bool b;
|
||||||
} value;
|
} value;
|
||||||
float *values;
|
float *values;
|
||||||
|
|
@ -1250,6 +1260,13 @@ static int node_event_param(void *object, int seq,
|
||||||
n_values = 1;
|
n_values = 1;
|
||||||
values = &value.f;
|
values = &value.f;
|
||||||
break;
|
break;
|
||||||
|
case SPA_TYPE_Double:
|
||||||
|
if (spa_pod_get_double(&prop->value, &value.d) < 0)
|
||||||
|
continue;
|
||||||
|
n_values = 1;
|
||||||
|
value.f = value.d;
|
||||||
|
values = &value.f;
|
||||||
|
break;
|
||||||
case SPA_TYPE_Bool:
|
case SPA_TYPE_Bool:
|
||||||
if (spa_pod_get_bool(&prop->value, &value.b) < 0)
|
if (spa_pod_get_bool(&prop->value, &value.b) < 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
@ -2039,6 +2056,9 @@ int pw_stream_set_control(struct pw_stream *stream, uint32_t id, uint32_t n_valu
|
||||||
case SPA_TYPE_Float:
|
case SPA_TYPE_Float:
|
||||||
spa_pod_builder_float(&b, values[0]);
|
spa_pod_builder_float(&b, values[0]);
|
||||||
break;
|
break;
|
||||||
|
case SPA_TYPE_Double:
|
||||||
|
spa_pod_builder_double(&b, values[0]);
|
||||||
|
break;
|
||||||
case SPA_TYPE_Bool:
|
case SPA_TYPE_Bool:
|
||||||
spa_pod_builder_bool(&b, values[0] < 0.5 ? false : true);
|
spa_pod_builder_bool(&b, values[0] < 0.5 ? false : true);
|
||||||
break;
|
break;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue