Add suport for clocks

Add a clock interface to get raw clocking information from an element
Make events and commands to request and configure clock updates.
Add support for passing events and commands in control
Set the size of the buffers in pinossrc
This commit is contained in:
Wim Taymans 2016-09-09 16:05:58 +02:00
parent a5f21576fa
commit 0b380dd43e
20 changed files with 712 additions and 268 deletions

View file

@ -477,6 +477,28 @@ iter_parse_use_buffers (struct stack_iter *si, SpaControlCmdUseBuffers *cmd)
}
}
static void
iter_parse_node_event (struct stack_iter *si, SpaControlCmdNodeEvent *cmd)
{
void *p = si->data;
memcpy (cmd, p, sizeof (SpaControlCmdNodeEvent));
if (cmd->event)
cmd->event = SPA_MEMBER (p, SPA_PTR_TO_INT (cmd->event), SpaNodeEvent);
if (cmd->event->data)
cmd->event->data = SPA_MEMBER (p, SPA_PTR_TO_INT (cmd->event->data), void);
}
static void
iter_parse_node_command (struct stack_iter *si, SpaControlCmdNodeCommand *cmd)
{
void *p = si->data;
memcpy (cmd, p, sizeof (SpaControlCmdNodeCommand));
if (cmd->command)
cmd->command = SPA_MEMBER (p, SPA_PTR_TO_INT (cmd->command), SpaNodeCommand);
if (cmd->command->data)
cmd->command->data = SPA_MEMBER (p, SPA_PTR_TO_INT (cmd->command->data), void);
}
SpaResult
spa_control_iter_parse_cmd (SpaControlIter *iter,
void *command)
@ -503,28 +525,10 @@ spa_control_iter_parse_cmd (SpaControlIter *iter,
memcpy (command, si->data, sizeof (SpaControlCmdPortRemoved));
break;
case SPA_CONTROL_CMD_STATE_CHANGE:
if (si->size < sizeof (SpaControlCmdStateChange))
return SPA_RESULT_ERROR;
memcpy (command, si->data, sizeof (SpaControlCmdStateChange));
break;
case SPA_CONTROL_CMD_PORT_STATUS_CHANGE:
fprintf (stderr, "implement iter of %d\n", si->cmd);
break;
case SPA_CONTROL_CMD_NEED_INPUT:
if (si->size < sizeof (SpaControlCmdNeedInput))
return SPA_RESULT_ERROR;
memcpy (command, si->data, sizeof (SpaControlCmdNeedInput));
break;
case SPA_CONTROL_CMD_HAVE_OUTPUT:
if (si->size < sizeof (SpaControlCmdHaveOutput))
return SPA_RESULT_ERROR;
memcpy (command, si->data, sizeof (SpaControlCmdHaveOutput));
break;
/* S -> C */
case SPA_CONTROL_CMD_ADD_PORT:
if (si->size < sizeof (SpaControlCmdAddPort))
@ -546,10 +550,6 @@ spa_control_iter_parse_cmd (SpaControlIter *iter,
fprintf (stderr, "implement iter of %d\n", si->cmd);
break;
case SPA_CONTROL_CMD_START:
case SPA_CONTROL_CMD_PAUSE:
break;
/* bidirectional */
case SPA_CONTROL_CMD_ADD_MEM:
if (si->size < sizeof (SpaControlCmdAddMem))
@ -573,10 +573,12 @@ spa_control_iter_parse_cmd (SpaControlIter *iter,
memcpy (command, si->data, sizeof (SpaControlCmdProcessBuffer));
break;
case SPA_CONTROL_CMD_REUSE_BUFFER:
if (si->size < sizeof (SpaControlCmdReuseBuffer))
return SPA_RESULT_ERROR;
memcpy (command, si->data, sizeof (SpaControlCmdReuseBuffer));
case SPA_CONTROL_CMD_NODE_EVENT:
iter_parse_node_event (si, command);
break;
case SPA_CONTROL_CMD_NODE_COMMAND:
iter_parse_node_command (si, command);
break;
case SPA_CONTROL_CMD_INVALID:
@ -1135,6 +1137,61 @@ builder_add_use_buffers (struct stack_builder *sb, SpaControlCmdUseBuffers *ub)
}
}
static void
builder_add_node_event (struct stack_builder *sb, SpaControlCmdNodeEvent *ev)
{
size_t len;
void *p;
SpaControlCmdNodeEvent *d;
SpaNodeEvent *ne;
/* calculate length */
len = sizeof (SpaControlCmdNodeEvent);
len += sizeof (SpaNodeEvent);
len += ev->event->size;
p = builder_add_cmd (sb, SPA_CONTROL_CMD_NODE_EVENT, len);
memcpy (p, ev, sizeof (SpaControlCmdNodeEvent));
d = p;
p = SPA_MEMBER (d, sizeof (SpaControlCmdNodeEvent), void);
d->event = SPA_INT_TO_PTR (SPA_PTRDIFF (p, d));
ne = p;
memcpy (p, ev->event, sizeof (SpaNodeEvent));
p = SPA_MEMBER (p, sizeof (SpaNodeEvent), void);
ne->data = SPA_INT_TO_PTR (SPA_PTRDIFF (p, d));
memcpy (p, ev->event->data, ev->event->size);
}
static void
builder_add_node_command (struct stack_builder *sb, SpaControlCmdNodeCommand *cm)
{
size_t len;
void *p;
SpaControlCmdNodeCommand *d;
SpaNodeCommand *nc;
/* calculate length */
len = sizeof (SpaControlCmdNodeCommand);
len += sizeof (SpaNodeCommand);
len += cm->command->size;
p = builder_add_cmd (sb, SPA_CONTROL_CMD_NODE_COMMAND, len);
memcpy (p, cm, sizeof (SpaControlCmdNodeCommand));
d = p;
p = SPA_MEMBER (d, sizeof (SpaControlCmdNodeCommand), void);
d->command = SPA_INT_TO_PTR (SPA_PTRDIFF (p, d));
nc = p;
memcpy (p, cm->command, sizeof (SpaNodeCommand));
p = SPA_MEMBER (p, sizeof (SpaNodeCommand), void);
nc->data = SPA_INT_TO_PTR (SPA_PTRDIFF (p, d));
memcpy (p, cm->command->data, cm->command->size);
}
/**
* spa_control_builder_add_cmd:
* @builder: a #SpaControlBuilder
@ -1172,25 +1229,10 @@ spa_control_builder_add_cmd (SpaControlBuilder *builder,
memcpy (p, command, sizeof (SpaControlCmdPortRemoved));
break;
case SPA_CONTROL_CMD_STATE_CHANGE:
p = builder_add_cmd (sb, cmd, sizeof (SpaControlCmdStateChange));
memcpy (p, command, sizeof (SpaControlCmdStateChange));
break;
case SPA_CONTROL_CMD_PORT_STATUS_CHANGE:
p = builder_add_cmd (sb, cmd, 0);
break;
case SPA_CONTROL_CMD_NEED_INPUT:
p = builder_add_cmd (sb, cmd, sizeof (SpaControlCmdNeedInput));
memcpy (p, command, sizeof (SpaControlCmdNeedInput));
break;
case SPA_CONTROL_CMD_HAVE_OUTPUT:
p = builder_add_cmd (sb, cmd, sizeof (SpaControlCmdHaveOutput));
memcpy (p, command, sizeof (SpaControlCmdHaveOutput));
break;
/* S -> C */
case SPA_CONTROL_CMD_ADD_PORT:
p = builder_add_cmd (sb, cmd, sizeof (SpaControlCmdAddPort));
@ -1210,11 +1252,6 @@ spa_control_builder_add_cmd (SpaControlBuilder *builder,
fprintf (stderr, "implement builder of %d\n", cmd);
break;
case SPA_CONTROL_CMD_START:
case SPA_CONTROL_CMD_PAUSE:
p = builder_add_cmd (sb, cmd, 0);
break;
/* bidirectional */
case SPA_CONTROL_CMD_ADD_MEM:
p = builder_add_cmd (sb, cmd, sizeof (SpaControlCmdAddMem));
@ -1235,9 +1272,12 @@ spa_control_builder_add_cmd (SpaControlBuilder *builder,
memcpy (p, command, sizeof (SpaControlCmdProcessBuffer));
break;
case SPA_CONTROL_CMD_REUSE_BUFFER:
p = builder_add_cmd (sb, cmd, sizeof (SpaControlCmdReuseBuffer));
memcpy (p, command, sizeof (SpaControlCmdReuseBuffer));
case SPA_CONTROL_CMD_NODE_EVENT:
builder_add_node_event (sb, command);
break;
case SPA_CONTROL_CMD_NODE_COMMAND:
builder_add_node_command (sb, command);
break;
default: