mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-07 13:30:09 -05:00
port: also set buffers when 0
This commit is contained in:
parent
4e7af5644b
commit
ee307e9c48
3 changed files with 19 additions and 15 deletions
|
|
@ -80,15 +80,14 @@ struct resource_data {
|
|||
static void node_deactivate(struct pw_node *this)
|
||||
{
|
||||
struct pw_port *port;
|
||||
struct pw_link *link;
|
||||
|
||||
pw_log_debug("node %p: deactivate", this);
|
||||
spa_list_for_each(port, &this->input_ports, link) {
|
||||
struct pw_link *link;
|
||||
spa_list_for_each(link, &port->links, input_link)
|
||||
pw_link_deactivate(link);
|
||||
}
|
||||
spa_list_for_each(port, &this->output_ports, link) {
|
||||
struct pw_link *link;
|
||||
spa_list_for_each(link, &port->links, output_link)
|
||||
pw_link_deactivate(link);
|
||||
}
|
||||
|
|
@ -115,6 +114,7 @@ static int pause_node(struct pw_node *this)
|
|||
|
||||
pw_log_debug("node %p: pause node", this);
|
||||
node_deactivate(this);
|
||||
|
||||
pw_loop_invoke(this->data_loop, do_node_remove, 1, NULL, 0, true, this);
|
||||
|
||||
res = spa_node_send_command(this->node,
|
||||
|
|
|
|||
|
|
@ -848,11 +848,11 @@ int pw_port_set_param(struct pw_port *port, uint32_t mix_id, uint32_t id, uint32
|
|||
if (param == NULL || res < 0) {
|
||||
free_allocation(&port->allocation);
|
||||
port->allocated = false;
|
||||
port_update_state (port, mix, PW_PORT_STATE_CONFIGURE);
|
||||
port_update_state(port, mix, PW_PORT_STATE_CONFIGURE);
|
||||
}
|
||||
else if (!SPA_RESULT_IS_ASYNC(res)) {
|
||||
if (port->state == PW_PORT_STATE_CONFIGURE)
|
||||
port_update_state (port, mix, PW_PORT_STATE_READY);
|
||||
port_update_state(port, mix, PW_PORT_STATE_READY);
|
||||
else if (mix)
|
||||
mix->state = PW_PORT_STATE_READY;
|
||||
}
|
||||
|
|
@ -865,7 +865,7 @@ int pw_port_use_buffers(struct pw_port *port, uint32_t mix_id,
|
|||
{
|
||||
int res = 0;
|
||||
struct pw_node *node = port->node;
|
||||
struct pw_port_mix *mix;
|
||||
struct pw_port_mix *mix = NULL;
|
||||
const struct pw_port_implementation *pi = port->implementation;
|
||||
|
||||
pw_log_debug("port %p: %d:%d.%d: %d buffers %d", port,
|
||||
|
|
@ -877,10 +877,11 @@ int pw_port_use_buffers(struct pw_port *port, uint32_t mix_id,
|
|||
if (n_buffers > 0 && port->state < PW_PORT_STATE_READY)
|
||||
return -EIO;
|
||||
|
||||
if ((mix = pw_map_lookup(&port->mix_port_map, mix_id)) == NULL)
|
||||
if (mix_id != SPA_ID_INVALID &&
|
||||
(mix = pw_map_lookup(&port->mix_port_map, mix_id)) == NULL)
|
||||
return -EIO;
|
||||
|
||||
if (port->mix->port_use_buffers != NULL) {
|
||||
if (mix && port->mix->port_use_buffers != NULL) {
|
||||
struct spa_graph_port *p = &mix->port;
|
||||
res = spa_node_port_use_buffers(port->mix,
|
||||
p->direction, p->port_id, buffers, n_buffers);
|
||||
|
|
@ -888,7 +889,7 @@ int pw_port_use_buffers(struct pw_port *port, uint32_t mix_id,
|
|||
port, res, spa_strerror(res));
|
||||
}
|
||||
|
||||
if (port->state == PW_PORT_STATE_READY) {
|
||||
if (port->state == PW_PORT_STATE_READY || n_buffers == 0) {
|
||||
if (!SPA_FLAG_CHECK(port->mix_flags, PW_PORT_MIX_FLAG_MIX_ONLY)) {
|
||||
res = spa_node_port_use_buffers(node->node,
|
||||
port->direction, port->port_id, buffers, n_buffers);
|
||||
|
|
@ -905,10 +906,10 @@ int pw_port_use_buffers(struct pw_port *port, uint32_t mix_id,
|
|||
n_buffers = 0;
|
||||
|
||||
if (n_buffers == 0)
|
||||
port_update_state (port, mix, PW_PORT_STATE_READY);
|
||||
port_update_state(port, mix, PW_PORT_STATE_READY);
|
||||
else if (!SPA_RESULT_IS_ASYNC(res)) {
|
||||
if (port->state == PW_PORT_STATE_READY)
|
||||
port_update_state (port, mix, PW_PORT_STATE_PAUSED);
|
||||
port_update_state(port, mix, PW_PORT_STATE_PAUSED);
|
||||
else if (mix)
|
||||
mix->state = PW_PORT_STATE_PAUSED;
|
||||
}
|
||||
|
|
@ -957,9 +958,9 @@ int pw_port_alloc_buffers(struct pw_port *port, uint32_t mix_id,
|
|||
}
|
||||
|
||||
if (*n_buffers == 0)
|
||||
port_update_state (port, mix, PW_PORT_STATE_READY);
|
||||
port_update_state(port, mix, PW_PORT_STATE_READY);
|
||||
else if (!SPA_RESULT_IS_ASYNC(res))
|
||||
port_update_state (port, mix, PW_PORT_STATE_PAUSED);
|
||||
port_update_state(port, mix, PW_PORT_STATE_PAUSED);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -953,10 +953,13 @@ static void clear_buffers(struct node_data *data, struct mix *mix)
|
|||
{
|
||||
struct pw_port *port = mix->port;
|
||||
struct buffer *b;
|
||||
int i;
|
||||
int i, res;
|
||||
|
||||
pw_log_debug("port %p: clear buffers", port);
|
||||
pw_port_use_buffers(port, mix->mix_id, NULL, 0);
|
||||
pw_log_debug("port %p: clear buffers %d", port, mix->mix_id);
|
||||
if ((res = pw_port_use_buffers(port, mix->mix_id, NULL, 0)) < 0) {
|
||||
pw_log_error("port %p: error clear buffers %s", port, spa_strerror(res));
|
||||
return;
|
||||
}
|
||||
|
||||
pw_array_for_each(b, &mix->buffers) {
|
||||
for (i = 0; i < b->n_mem; i++) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue