mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-04 13:30:12 -05:00
Make AllocParams into POD objects
Make allocparams into pod objects. This makes it easy to serialize, copy, create and intersect them. Add convenience macros for properties Add helper function to collect object properties.
This commit is contained in:
parent
b1f7df52e3
commit
8a6ce3b179
34 changed files with 948 additions and 1054 deletions
|
|
@ -84,8 +84,7 @@ struct _SpaAudioTestSrc {
|
|||
|
||||
SpaPortInfo info;
|
||||
SpaAllocParam *params[2];
|
||||
SpaAllocParamBuffers param_buffers;
|
||||
SpaAllocParamMetaEnable param_meta;
|
||||
uint8_t params_buffer[1024];
|
||||
SpaPortOutput *output;
|
||||
|
||||
bool have_format;
|
||||
|
|
@ -131,13 +130,30 @@ reset_audiotestsrc_props (SpaAudioTestSrcProps *props)
|
|||
props->volume = DEFAULT_VOLUME;
|
||||
}
|
||||
|
||||
#define PROP(f,key,type,...) \
|
||||
SPA_POD_PROP (f,key,SPA_POD_PROP_FLAG_READWRITE,type,1,__VA_ARGS__)
|
||||
#define PROP_MM(f,key,type,...) \
|
||||
SPA_POD_PROP (f,key,SPA_POD_PROP_FLAG_READWRITE | \
|
||||
SPA_POD_PROP_RANGE_MIN_MAX,type,3,__VA_ARGS__)
|
||||
#define PROP_U_MM(f,key,type,...) \
|
||||
SPA_POD_PROP (f,key,SPA_POD_PROP_FLAG_READWRITE | \
|
||||
SPA_POD_PROP_FLAG_UNSET | \
|
||||
SPA_POD_PROP_RANGE_MIN_MAX,type,3,__VA_ARGS__)
|
||||
#define PROP_EN(f,key,type,n,...) \
|
||||
SPA_POD_PROP (f,key,SPA_POD_PROP_FLAG_READWRITE | \
|
||||
SPA_POD_PROP_RANGE_ENUM,type,n,__VA_ARGS__)
|
||||
#define PROP_U_EN(f,key,type,n,...) \
|
||||
SPA_POD_PROP (f,key,SPA_POD_PROP_FLAG_READWRITE | \
|
||||
SPA_POD_PROP_FLAG_UNSET | \
|
||||
SPA_POD_PROP_RANGE_ENUM,type,n,__VA_ARGS__)
|
||||
|
||||
static SpaResult
|
||||
spa_audiotestsrc_node_get_props (SpaNode *node,
|
||||
SpaProps **props)
|
||||
{
|
||||
SpaAudioTestSrc *this;
|
||||
SpaPODBuilder b = { NULL, };
|
||||
SpaPODFrame f;
|
||||
SpaPODFrame f[2];
|
||||
|
||||
if (node == NULL || props == NULL)
|
||||
return SPA_RESULT_INVALID_ARGUMENTS;
|
||||
|
|
@ -145,38 +161,17 @@ spa_audiotestsrc_node_get_props (SpaNode *node,
|
|||
this = SPA_CONTAINER_OF (node, SpaAudioTestSrc, node);
|
||||
|
||||
spa_pod_builder_init (&b, this->props_buffer, sizeof (this->props_buffer));
|
||||
spa_pod_builder_props (&b, &f[0],
|
||||
PROP (&f[1], PROP_ID_LIVE, SPA_POD_TYPE_BOOL, this->props.live),
|
||||
PROP_EN (&f[1], PROP_ID_WAVE, SPA_POD_TYPE_INT, 3, this->props.wave,
|
||||
wave_val_sine,
|
||||
wave_val_square),
|
||||
PROP_MM (&f[1], PROP_ID_FREQ, SPA_POD_TYPE_DOUBLE, this->props.freq,
|
||||
0.0, 50000000.0),
|
||||
PROP_MM (&f[1], PROP_ID_VOLUME, SPA_POD_TYPE_DOUBLE, this->props.volume,
|
||||
0.0, 10.0));
|
||||
|
||||
*props = SPA_MEMBER (b.data, spa_pod_builder_props (&b,
|
||||
SPA_POD_TYPE_PROP, &f,
|
||||
PROP_ID_LIVE, SPA_POD_PROP_FLAG_READWRITE |
|
||||
SPA_POD_PROP_RANGE_NONE,
|
||||
SPA_POD_TYPE_BOOL, 1,
|
||||
this->props.live,
|
||||
-SPA_POD_TYPE_PROP, &f,
|
||||
SPA_POD_TYPE_PROP, &f,
|
||||
PROP_ID_WAVE, SPA_POD_PROP_FLAG_READWRITE |
|
||||
SPA_POD_PROP_RANGE_ENUM,
|
||||
SPA_POD_TYPE_INT, 3,
|
||||
this->props.wave,
|
||||
wave_val_sine,
|
||||
wave_val_square,
|
||||
-SPA_POD_TYPE_PROP, &f,
|
||||
SPA_POD_TYPE_PROP, &f,
|
||||
PROP_ID_FREQ, SPA_POD_PROP_FLAG_READWRITE |
|
||||
SPA_POD_PROP_RANGE_MIN_MAX,
|
||||
SPA_POD_TYPE_DOUBLE, 3,
|
||||
this->props.freq,
|
||||
0.0,
|
||||
50000000.0,
|
||||
-SPA_POD_TYPE_PROP, &f,
|
||||
SPA_POD_TYPE_PROP, &f,
|
||||
PROP_ID_VOLUME, SPA_POD_PROP_FLAG_READWRITE |
|
||||
SPA_POD_PROP_RANGE_MIN_MAX,
|
||||
SPA_POD_TYPE_DOUBLE, 3,
|
||||
this->props.volume,
|
||||
0.0,
|
||||
10.0,
|
||||
-SPA_POD_TYPE_PROP, &f, 0), SpaProps);
|
||||
*props = SPA_POD_BUILDER_DEREF (&b, f[0].ref, SpaProps);
|
||||
|
||||
return SPA_RESULT_OK;
|
||||
}
|
||||
|
|
@ -195,31 +190,12 @@ spa_audiotestsrc_node_set_props (SpaNode *node,
|
|||
if (props == NULL) {
|
||||
reset_audiotestsrc_props (&this->props);
|
||||
} else {
|
||||
SpaPOD *p;
|
||||
|
||||
SPA_POD_OBJECT_BODY_FOREACH (&props->body, props->pod.size, p) {
|
||||
SpaPODProp *pr;
|
||||
|
||||
if (p->type != SPA_POD_TYPE_PROP)
|
||||
continue;
|
||||
|
||||
pr = (SpaPODProp *) p;
|
||||
|
||||
switch (pr->body.key) {
|
||||
case PROP_ID_LIVE:
|
||||
this->props.live = ((SpaPODBool*)&pr->body.value)->value;
|
||||
break;
|
||||
case PROP_ID_WAVE:
|
||||
this->props.wave = ((SpaPODInt*)&pr->body.value)->value;
|
||||
break;
|
||||
case PROP_ID_FREQ:
|
||||
this->props.freq = ((SpaPODDouble*)&pr->body.value)->value;
|
||||
break;
|
||||
case PROP_ID_VOLUME:
|
||||
this->props.volume = ((SpaPODDouble*)&pr->body.value)->value;
|
||||
break;
|
||||
}
|
||||
}
|
||||
spa_props_query (props,
|
||||
PROP_ID_LIVE, SPA_POD_TYPE_BOOL, &this->props.live,
|
||||
PROP_ID_WAVE, SPA_POD_TYPE_INT, &this->props.wave,
|
||||
PROP_ID_FREQ, SPA_POD_TYPE_DOUBLE, &this->props.freq,
|
||||
PROP_ID_VOLUME, SPA_POD_TYPE_DOUBLE, &this->props.volume,
|
||||
0);
|
||||
}
|
||||
|
||||
if (this->props.live)
|
||||
|
|
@ -490,34 +466,18 @@ next:
|
|||
|
||||
switch (index++) {
|
||||
case 0:
|
||||
fmt = SPA_MEMBER (buffer, spa_pod_builder_format (&b,
|
||||
spa_pod_builder_format (&b, &f[0],
|
||||
SPA_MEDIA_TYPE_AUDIO, SPA_MEDIA_SUBTYPE_RAW,
|
||||
SPA_POD_TYPE_PROP, &f[0],
|
||||
SPA_PROP_ID_AUDIO_FORMAT, SPA_POD_PROP_FLAG_UNSET | SPA_POD_PROP_FLAG_READWRITE |
|
||||
SPA_POD_PROP_RANGE_ENUM,
|
||||
SPA_POD_TYPE_INT, 3,
|
||||
SPA_AUDIO_FORMAT_S16,
|
||||
SPA_AUDIO_FORMAT_S16,
|
||||
SPA_AUDIO_FORMAT_S32,
|
||||
-SPA_POD_TYPE_PROP, &f[0],
|
||||
SPA_POD_TYPE_PROP, &f[0],
|
||||
SPA_PROP_ID_AUDIO_RATE, SPA_POD_PROP_FLAG_UNSET | SPA_POD_PROP_FLAG_READWRITE |
|
||||
SPA_POD_PROP_RANGE_MIN_MAX,
|
||||
SPA_POD_TYPE_INT, 3,
|
||||
44100,
|
||||
1, INT32_MAX,
|
||||
-SPA_POD_TYPE_PROP, &f[0],
|
||||
SPA_POD_TYPE_PROP, &f[0],
|
||||
SPA_PROP_ID_AUDIO_CHANNELS, SPA_POD_PROP_FLAG_UNSET | SPA_POD_PROP_FLAG_READWRITE |
|
||||
SPA_POD_PROP_RANGE_MIN_MAX,
|
||||
SPA_POD_TYPE_INT, 3,
|
||||
2,
|
||||
1, INT32_MAX,
|
||||
-SPA_POD_TYPE_PROP, &f[0], 0), SpaFormat);
|
||||
PROP_U_EN (&f[1], SPA_PROP_ID_AUDIO_FORMAT, SPA_POD_TYPE_INT, 3, SPA_AUDIO_FORMAT_S16,
|
||||
SPA_AUDIO_FORMAT_S16,
|
||||
SPA_AUDIO_FORMAT_S32),
|
||||
PROP_U_MM (&f[1], SPA_PROP_ID_AUDIO_RATE, SPA_POD_TYPE_INT, 44100, 1, INT32_MAX),
|
||||
PROP_U_MM (&f[1], SPA_PROP_ID_AUDIO_CHANNELS, SPA_POD_TYPE_INT, 2, 1, INT32_MAX));
|
||||
break;
|
||||
default:
|
||||
return SPA_RESULT_ENUM_END;
|
||||
}
|
||||
fmt = SPA_POD_BUILDER_DEREF (&b, f[0].ref, SpaFormat);
|
||||
|
||||
spa_pod_builder_init (&b, this->format_buffer, sizeof (this->format_buffer));
|
||||
|
||||
|
|
@ -572,23 +532,27 @@ spa_audiotestsrc_node_port_set_format (SpaNode *node,
|
|||
}
|
||||
|
||||
if (this->have_format) {
|
||||
SpaPODBuilder b = { NULL };
|
||||
SpaPODFrame f[2];
|
||||
|
||||
this->info.maxbuffering = -1;
|
||||
this->info.latency = BYTES_TO_TIME (this, 1024);
|
||||
|
||||
this->info.n_params = 2;
|
||||
this->info.params = this->params;
|
||||
this->params[0] = &this->param_buffers.param;
|
||||
this->param_buffers.param.type = SPA_ALLOC_PARAM_TYPE_BUFFERS;
|
||||
this->param_buffers.param.size = sizeof (this->param_buffers);
|
||||
this->param_buffers.minsize = 1024;
|
||||
this->param_buffers.stride = 1024;
|
||||
this->param_buffers.min_buffers = 2;
|
||||
this->param_buffers.max_buffers = 32;
|
||||
this->param_buffers.align = 16;
|
||||
this->params[1] = &this->param_meta.param;
|
||||
this->param_meta.param.type = SPA_ALLOC_PARAM_TYPE_META_ENABLE;
|
||||
this->param_meta.param.size = sizeof (this->param_meta);
|
||||
this->param_meta.type = SPA_META_TYPE_HEADER;
|
||||
|
||||
spa_pod_builder_init (&b, this->params_buffer, sizeof (this->params_buffer));
|
||||
spa_pod_builder_object (&b, &f[0], 0, SPA_ALLOC_PARAM_TYPE_BUFFERS,
|
||||
PROP (&f[1], SPA_ALLOC_PARAM_BUFFERS_SIZE, SPA_POD_TYPE_INT, 1024),
|
||||
PROP (&f[1], SPA_ALLOC_PARAM_BUFFERS_STRIDE, SPA_POD_TYPE_INT, 1024),
|
||||
PROP_MM (&f[1], SPA_ALLOC_PARAM_BUFFERS_BUFFERS, SPA_POD_TYPE_INT, 32, 2, 32),
|
||||
PROP (&f[1], SPA_ALLOC_PARAM_BUFFERS_ALIGN, SPA_POD_TYPE_INT, 16));
|
||||
this->params[0] = SPA_POD_BUILDER_DEREF (&b, f[0].ref, SpaAllocParam);
|
||||
|
||||
spa_pod_builder_object (&b, &f[0], 0, SPA_ALLOC_PARAM_TYPE_META_ENABLE,
|
||||
PROP (&f[1], SPA_ALLOC_PARAM_META_ENABLE_TYPE, SPA_POD_TYPE_INT, SPA_META_TYPE_HEADER));
|
||||
this->params[1] = SPA_POD_BUILDER_DEREF (&b, f[0].ref, SpaAllocParam);
|
||||
|
||||
this->info.extra = NULL;
|
||||
update_state (this, SPA_NODE_STATE_READY);
|
||||
}
|
||||
|
|
@ -606,7 +570,7 @@ spa_audiotestsrc_node_port_get_format (SpaNode *node,
|
|||
{
|
||||
SpaAudioTestSrc *this;
|
||||
SpaPODBuilder b = { NULL, };
|
||||
SpaPODFrame f;
|
||||
SpaPODFrame f[2];
|
||||
|
||||
if (node == NULL || format == NULL)
|
||||
return SPA_RESULT_INVALID_ARGUMENTS;
|
||||
|
|
@ -620,24 +584,13 @@ spa_audiotestsrc_node_port_get_format (SpaNode *node,
|
|||
return SPA_RESULT_NO_FORMAT;
|
||||
|
||||
spa_pod_builder_init (&b, this->format_buffer, sizeof (this->format_buffer));
|
||||
|
||||
*format = SPA_MEMBER (b.data, spa_pod_builder_format (&b,
|
||||
spa_pod_builder_format (&b, &f[0],
|
||||
SPA_MEDIA_TYPE_AUDIO, SPA_MEDIA_SUBTYPE_RAW,
|
||||
SPA_POD_TYPE_PROP, &f,
|
||||
SPA_PROP_ID_AUDIO_FORMAT, SPA_POD_PROP_FLAG_READWRITE,
|
||||
SPA_POD_TYPE_INT, 1,
|
||||
this->current_format.info.raw.format,
|
||||
-SPA_POD_TYPE_PROP, &f,
|
||||
SPA_POD_TYPE_PROP, &f,
|
||||
SPA_PROP_ID_AUDIO_RATE, SPA_POD_PROP_FLAG_READWRITE,
|
||||
SPA_POD_TYPE_INT, 1,
|
||||
this->current_format.info.raw.rate,
|
||||
-SPA_POD_TYPE_PROP, &f,
|
||||
SPA_POD_TYPE_PROP, &f,
|
||||
SPA_PROP_ID_AUDIO_CHANNELS, SPA_POD_PROP_FLAG_READWRITE,
|
||||
SPA_POD_TYPE_INT, 1,
|
||||
this->current_format.info.raw.channels,
|
||||
-SPA_POD_TYPE_PROP, &f, 0), SpaFormat);
|
||||
PROP (&f[1], SPA_PROP_ID_AUDIO_FORMAT, SPA_POD_TYPE_INT, this->current_format.info.raw.format),
|
||||
PROP (&f[1], SPA_PROP_ID_AUDIO_RATE, SPA_POD_TYPE_INT, this->current_format.info.raw.rate),
|
||||
PROP (&f[1], SPA_PROP_ID_AUDIO_CHANNELS, SPA_POD_TYPE_INT, this->current_format.info.raw.channels));
|
||||
|
||||
*format = SPA_POD_BUILDER_DEREF (&b, f[0].ref, SpaFormat);
|
||||
|
||||
return SPA_RESULT_OK;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue