mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-07 13:30:09 -05:00
buffer: make data and meta types dynamic
Use dynamic types for the data and meta types. Move the meta into a separate header. Remove port state, we can keep track of that ourselves. Add size to MetaDataEnable params
This commit is contained in:
parent
ed273ec465
commit
b51d3e4862
36 changed files with 543 additions and 553 deletions
|
|
@ -244,7 +244,7 @@ typedef struct {
|
|||
SpaDirection direction,
|
||||
uint32_t port_id,
|
||||
uint32_t mem_id,
|
||||
SpaDataType type,
|
||||
uint32_t type,
|
||||
int memfd,
|
||||
uint32_t flags,
|
||||
uint32_t offset,
|
||||
|
|
|
|||
|
|
@ -510,6 +510,7 @@ client_node_marshal_port_update (void *object,
|
|||
spa_pod_builder_add (&b.b,
|
||||
SPA_POD_TYPE_STRUCT, &f[1],
|
||||
SPA_POD_TYPE_INT, info->flags,
|
||||
SPA_POD_TYPE_INT, info->rate,
|
||||
SPA_POD_TYPE_LONG, info->maxbuffering,
|
||||
SPA_POD_TYPE_LONG, info->latency,
|
||||
SPA_POD_TYPE_INT, info->n_params,
|
||||
|
|
@ -718,11 +719,12 @@ client_node_demarshal_add_mem (void *object,
|
|||
int memfd;
|
||||
|
||||
if (!spa_pod_iter_struct (&it, data, size) ||
|
||||
!pinos_pod_remap_data (SPA_POD_TYPE_STRUCT, data, size, &proxy->context->types) ||
|
||||
!spa_pod_iter_get (&it,
|
||||
SPA_POD_TYPE_INT, &direction,
|
||||
SPA_POD_TYPE_INT, &port_id,
|
||||
SPA_POD_TYPE_INT, &mem_id,
|
||||
SPA_POD_TYPE_INT, &type,
|
||||
SPA_POD_TYPE_ID, &type,
|
||||
SPA_POD_TYPE_INT, &memfd_idx,
|
||||
SPA_POD_TYPE_INT, &flags,
|
||||
SPA_POD_TYPE_INT, &offset,
|
||||
|
|
@ -756,6 +758,7 @@ client_node_demarshal_use_buffers (void *object,
|
|||
int i, j;
|
||||
|
||||
if (!spa_pod_iter_struct (&it, data, size) ||
|
||||
!pinos_pod_remap_data (SPA_POD_TYPE_STRUCT, data, size, &proxy->context->types) ||
|
||||
!spa_pod_iter_get (&it,
|
||||
SPA_POD_TYPE_INT, &seq,
|
||||
SPA_POD_TYPE_INT, &direction,
|
||||
|
|
@ -781,7 +784,7 @@ client_node_demarshal_use_buffers (void *object,
|
|||
SpaMeta *m = &buf->metas[j];
|
||||
|
||||
if (!spa_pod_iter_get (&it,
|
||||
SPA_POD_TYPE_INT, &m->type,
|
||||
SPA_POD_TYPE_ID, &m->type,
|
||||
SPA_POD_TYPE_INT, &m->size, 0))
|
||||
return false;
|
||||
}
|
||||
|
|
@ -793,7 +796,7 @@ client_node_demarshal_use_buffers (void *object,
|
|||
SpaData *d = &buf->datas[j];
|
||||
|
||||
if (!spa_pod_iter_get (&it,
|
||||
SPA_POD_TYPE_INT, &d->type,
|
||||
SPA_POD_TYPE_ID, &d->type,
|
||||
SPA_POD_TYPE_INT, &data_id,
|
||||
SPA_POD_TYPE_INT, &d->flags,
|
||||
SPA_POD_TYPE_INT, &d->mapoffset,
|
||||
|
|
|
|||
|
|
@ -62,8 +62,6 @@ typedef struct
|
|||
{
|
||||
PinosStream this;
|
||||
|
||||
uint32_t port_state;
|
||||
|
||||
uint32_t n_possible_formats;
|
||||
SpaFormat **possible_formats;
|
||||
|
||||
|
|
@ -230,7 +228,6 @@ pinos_stream_new (PinosContext *context,
|
|||
|
||||
this->state = PINOS_STREAM_STATE_UNCONNECTED;
|
||||
|
||||
impl->port_state = SPA_PORT_STATE_INIT;
|
||||
pinos_array_init (&impl->mem_ids, 64);
|
||||
pinos_array_ensure_size (&impl->mem_ids, sizeof (MemId) * 64);
|
||||
pinos_array_init (&impl->buffer_ids, 32);
|
||||
|
|
@ -741,7 +738,7 @@ client_node_add_mem (void *object,
|
|||
SpaDirection direction,
|
||||
uint32_t port_id,
|
||||
uint32_t mem_id,
|
||||
SpaDataType type,
|
||||
uint32_t type,
|
||||
int memfd,
|
||||
uint32_t flags,
|
||||
uint32_t offset,
|
||||
|
|
@ -856,26 +853,20 @@ client_node_use_buffers (void *object,
|
|||
memcpy (d, &buffers[i].buffer->datas[j], sizeof (SpaData));
|
||||
d->chunk = SPA_MEMBER (bid->buf_ptr, offset + sizeof (SpaChunk) * j, SpaChunk);
|
||||
|
||||
switch (d->type) {
|
||||
case SPA_DATA_TYPE_ID:
|
||||
{
|
||||
MemId *bmid = find_mem (stream, SPA_PTR_TO_UINT32 (d->data));
|
||||
d->type = SPA_DATA_TYPE_MEMFD;
|
||||
d->data = NULL;
|
||||
d->fd = bmid->fd;
|
||||
pinos_log_debug (" data %d %u -> fd %d", j, bmid->id, bmid->fd);
|
||||
break;
|
||||
}
|
||||
case SPA_DATA_TYPE_MEMPTR:
|
||||
{
|
||||
d->data = SPA_MEMBER (bid->buf_ptr, SPA_PTR_TO_INT (d->data), void);
|
||||
d->fd = -1;
|
||||
pinos_log_debug (" data %d %u -> mem %p", j, bid->id, d->data);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
pinos_log_warn ("unknown buffer data type %d", d->type);
|
||||
break;
|
||||
if (d->type == stream->context->type.data.Id) {
|
||||
MemId *bmid = find_mem (stream, SPA_PTR_TO_UINT32 (d->data));
|
||||
d->type = stream->context->type.data.MemFd;
|
||||
d->data = NULL;
|
||||
d->fd = bmid->fd;
|
||||
pinos_log_debug (" data %d %u -> fd %d", j, bmid->id, bmid->fd);
|
||||
}
|
||||
else if (d->type == stream->context->type.data.MemPtr) {
|
||||
d->data = SPA_MEMBER (bid->buf_ptr, SPA_PTR_TO_INT (d->data), void);
|
||||
d->fd = -1;
|
||||
pinos_log_debug (" data %d %u -> mem %p", j, bid->id, d->data);
|
||||
}
|
||||
else {
|
||||
pinos_log_warn ("unknown buffer data type %d", d->type);
|
||||
}
|
||||
}
|
||||
pinos_signal_emit (&stream->add_buffer, stream, bid->id);
|
||||
|
|
|
|||
|
|
@ -44,8 +44,9 @@ typedef enum {
|
|||
const char * pinos_stream_state_as_string (PinosStreamState state);
|
||||
|
||||
typedef enum {
|
||||
PINOS_STREAM_FLAG_NONE = 0,
|
||||
PINOS_STREAM_FLAG_AUTOCONNECT = (1 << 0),
|
||||
PINOS_STREAM_FLAG_NONE = 0,
|
||||
PINOS_STREAM_FLAG_AUTOCONNECT = (1 << 0),
|
||||
PINOS_STREAM_FLAG_CLOCK_UPDATE = (1 << 1),
|
||||
} PinosStreamFlags;
|
||||
|
||||
typedef enum {
|
||||
|
|
|
|||
|
|
@ -51,6 +51,8 @@ pinos_type_init (PinosType *type)
|
|||
type->spa_format = spa_type_map_get_id (type->map, SPA_TYPE__Format);
|
||||
type->spa_props = spa_type_map_get_id (type->map, SPA_TYPE__Props);
|
||||
|
||||
spa_type_meta_map (type->map, &type->meta);
|
||||
spa_type_data_map (type->map, &type->data);
|
||||
spa_type_event_node_map (type->map, &type->event_node);
|
||||
spa_type_command_node_map (type->map, &type->command_node);
|
||||
spa_type_monitor_map (type->map, &type->monitor);
|
||||
|
|
|
|||
|
|
@ -56,6 +56,8 @@ struct _PinosType {
|
|||
SpaType spa_format;
|
||||
SpaType spa_props;
|
||||
|
||||
SpaTypeMeta meta;
|
||||
SpaTypeData data;
|
||||
SpaTypeEventNode event_node;
|
||||
SpaTypeCommandNode command_node;
|
||||
SpaTypeMonitor monitor;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue