builder: make methods to save and restore state

This commit is contained in:
Wim Taymans 2017-11-13 12:30:48 +01:00
parent 737b428077
commit cd5e697e9f
20 changed files with 120 additions and 112 deletions

View file

@ -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;

View file

@ -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, &param->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, &param->pod, &filter->pod) == 0)
break;
spa_pod_builder_reset(builder, offset);
spa_pod_builder_reset(builder, &state);
}
return 1;
}

View file

@ -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;

View file

@ -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)

View file

@ -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,