mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-02 09:01:50 -05:00
builder: make methods to save and restore state
This commit is contained in:
parent
737b428077
commit
cd5e697e9f
20 changed files with 120 additions and 112 deletions
|
|
@ -531,10 +531,10 @@ handle_audio_fields (ConvertData *d)
|
|||
static uint32_t
|
||||
write_pod (struct spa_pod_builder *b, const void *data, uint32_t size)
|
||||
{
|
||||
uint32_t ref = b->offset;
|
||||
uint32_t ref = b->state.offset;
|
||||
|
||||
if (b->size <= b->offset) {
|
||||
b->size = SPA_ROUND_UP_N (b->offset + size, 512);
|
||||
if (b->size <= ref) {
|
||||
b->size = SPA_ROUND_UP_N (ref + size, 512);
|
||||
b->data = realloc (b->data, b->size);
|
||||
if (b->data == NULL)
|
||||
return -1;
|
||||
|
|
|
|||
|
|
@ -156,7 +156,7 @@ static int spa_proxy_node_enum_params(struct spa_node *node,
|
|||
struct spa_pod_builder *builder)
|
||||
{
|
||||
struct proxy *this;
|
||||
uint32_t offset;
|
||||
struct spa_pod_builder_state state;
|
||||
|
||||
spa_return_val_if_fail(node != NULL, -EINVAL);
|
||||
spa_return_val_if_fail(index != NULL, -EINVAL);
|
||||
|
|
@ -164,7 +164,7 @@ static int spa_proxy_node_enum_params(struct spa_node *node,
|
|||
|
||||
this = SPA_CONTAINER_OF(node, struct proxy, node);
|
||||
|
||||
offset = builder->offset;
|
||||
spa_pod_builder_get_state(builder, &state);
|
||||
|
||||
while (true) {
|
||||
struct spa_pod_object *param;
|
||||
|
|
@ -180,7 +180,7 @@ static int spa_proxy_node_enum_params(struct spa_node *node,
|
|||
if (spa_pod_filter(builder, ¶m->pod, &filter->pod) == 0)
|
||||
break;
|
||||
|
||||
spa_pod_builder_reset(builder, offset);
|
||||
spa_pod_builder_reset(builder, &state);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
|
@ -456,7 +456,7 @@ spa_proxy_node_port_enum_params(struct spa_node *node,
|
|||
{
|
||||
struct proxy *this;
|
||||
struct proxy_port *port;
|
||||
uint32_t offset;
|
||||
struct spa_pod_builder_state state;
|
||||
|
||||
spa_return_val_if_fail(node != NULL, -EINVAL);
|
||||
spa_return_val_if_fail(index != NULL, -EINVAL);
|
||||
|
|
@ -468,7 +468,8 @@ spa_proxy_node_port_enum_params(struct spa_node *node,
|
|||
|
||||
port = GET_PORT(this, direction, port_id);
|
||||
|
||||
offset = builder->offset;
|
||||
spa_pod_builder_get_state(builder, &state);
|
||||
|
||||
while (true) {
|
||||
struct spa_pod_object *param;
|
||||
|
||||
|
|
@ -483,7 +484,7 @@ spa_proxy_node_port_enum_params(struct spa_node *node,
|
|||
if (spa_pod_filter(builder, ¶m->pod, &filter->pod) == 0)
|
||||
break;
|
||||
|
||||
spa_pod_builder_reset(builder, offset);
|
||||
spa_pod_builder_reset(builder, &state);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -447,10 +447,10 @@ static int port_enum_params(struct spa_node *node,
|
|||
struct node_data *nd = SPA_CONTAINER_OF(node, struct node_data, node_impl);
|
||||
struct type *t = &nd->type;
|
||||
struct spa_pod *param;
|
||||
uint32_t offset;
|
||||
struct spa_pod_builder_state state;
|
||||
int res;
|
||||
|
||||
offset = builder->offset;
|
||||
spa_pod_builder_get_state(builder, &state);
|
||||
|
||||
next:
|
||||
if (id == t->param.idEnumFormat) {
|
||||
|
|
@ -466,7 +466,7 @@ static int port_enum_params(struct spa_node *node,
|
|||
|
||||
(*index)++;
|
||||
|
||||
spa_pod_builder_reset(builder, offset);
|
||||
spa_pod_builder_reset(builder, &state);
|
||||
if ((res = spa_pod_filter(builder, param, (struct spa_pod*)filter)) < 0)
|
||||
goto next;
|
||||
|
||||
|
|
|
|||
|
|
@ -348,12 +348,10 @@ static inline void *begin_write(struct pw_protocol_native_connection *conn, uint
|
|||
static uint32_t write_pod(struct spa_pod_builder *b, const void *data, uint32_t size)
|
||||
{
|
||||
struct impl *impl = SPA_CONTAINER_OF(b, struct impl, builder);
|
||||
uint32_t ref = b->offset;
|
||||
uint32_t ref = b->state.offset;
|
||||
|
||||
ref = b->offset;
|
||||
|
||||
if (b->size <= b->offset) {
|
||||
b->size = SPA_ROUND_UP_N(b->offset + size, 4096);
|
||||
if (b->size <= ref) {
|
||||
b->size = SPA_ROUND_UP_N(ref + size, 4096);
|
||||
b->data = begin_write(&impl->this, b->size);
|
||||
}
|
||||
memcpy(b->data + ref, data, size);
|
||||
|
|
@ -385,7 +383,7 @@ pw_protocol_native_connection_begin_resource(struct pw_protocol_native_connectio
|
|||
|
||||
impl->dest_id = resource->id;
|
||||
impl->opcode = opcode;
|
||||
impl->builder = (struct spa_pod_builder) { NULL, 0, 0, write_pod };
|
||||
impl->builder = (struct spa_pod_builder) { NULL, 0, write_pod };
|
||||
|
||||
return &impl->builder;
|
||||
}
|
||||
|
|
@ -414,7 +412,7 @@ pw_protocol_native_connection_begin_proxy(struct pw_protocol_native_connection *
|
|||
|
||||
impl->dest_id = proxy->id;
|
||||
impl->opcode = opcode;
|
||||
impl->builder = (struct spa_pod_builder) { NULL, 0, 0, write_pod };
|
||||
impl->builder = (struct spa_pod_builder) { NULL, 0, write_pod };
|
||||
|
||||
return &impl->builder;
|
||||
}
|
||||
|
|
@ -424,7 +422,7 @@ pw_protocol_native_connection_end(struct pw_protocol_native_connection *conn,
|
|||
struct spa_pod_builder *builder)
|
||||
{
|
||||
struct impl *impl = SPA_CONTAINER_OF(conn, struct impl, this);
|
||||
uint32_t *p, size = builder->offset;
|
||||
uint32_t *p, size = builder->state.offset;
|
||||
struct buffer *buf = &impl->out;
|
||||
|
||||
if ((p = connection_ensure_size(conn, buf, 8 + size)) == NULL)
|
||||
|
|
|
|||
|
|
@ -422,7 +422,7 @@ param_filter(struct pw_link *this,
|
|||
for (oidx = 0;;) {
|
||||
uint32_t offset;
|
||||
|
||||
offset = result->offset;
|
||||
offset = result->state.offset;
|
||||
|
||||
pw_log_debug("oparam %d %d", oidx, offset);
|
||||
if (spa_node_port_enum_params(out_port->node->node, out_port->direction,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue