mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-06 13:30:01 -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)
|
static void node_deactivate(struct pw_node *this)
|
||||||
{
|
{
|
||||||
struct pw_port *port;
|
struct pw_port *port;
|
||||||
|
struct pw_link *link;
|
||||||
|
|
||||||
pw_log_debug("node %p: deactivate", this);
|
pw_log_debug("node %p: deactivate", this);
|
||||||
spa_list_for_each(port, &this->input_ports, link) {
|
spa_list_for_each(port, &this->input_ports, link) {
|
||||||
struct pw_link *link;
|
|
||||||
spa_list_for_each(link, &port->links, input_link)
|
spa_list_for_each(link, &port->links, input_link)
|
||||||
pw_link_deactivate(link);
|
pw_link_deactivate(link);
|
||||||
}
|
}
|
||||||
spa_list_for_each(port, &this->output_ports, link) {
|
spa_list_for_each(port, &this->output_ports, link) {
|
||||||
struct pw_link *link;
|
|
||||||
spa_list_for_each(link, &port->links, output_link)
|
spa_list_for_each(link, &port->links, output_link)
|
||||||
pw_link_deactivate(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);
|
pw_log_debug("node %p: pause node", this);
|
||||||
node_deactivate(this);
|
node_deactivate(this);
|
||||||
|
|
||||||
pw_loop_invoke(this->data_loop, do_node_remove, 1, NULL, 0, true, this);
|
pw_loop_invoke(this->data_loop, do_node_remove, 1, NULL, 0, true, this);
|
||||||
|
|
||||||
res = spa_node_send_command(this->node,
|
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) {
|
if (param == NULL || res < 0) {
|
||||||
free_allocation(&port->allocation);
|
free_allocation(&port->allocation);
|
||||||
port->allocated = false;
|
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)) {
|
else if (!SPA_RESULT_IS_ASYNC(res)) {
|
||||||
if (port->state == PW_PORT_STATE_CONFIGURE)
|
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)
|
else if (mix)
|
||||||
mix->state = PW_PORT_STATE_READY;
|
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;
|
int res = 0;
|
||||||
struct pw_node *node = port->node;
|
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;
|
const struct pw_port_implementation *pi = port->implementation;
|
||||||
|
|
||||||
pw_log_debug("port %p: %d:%d.%d: %d buffers %d", port,
|
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)
|
if (n_buffers > 0 && port->state < PW_PORT_STATE_READY)
|
||||||
return -EIO;
|
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;
|
return -EIO;
|
||||||
|
|
||||||
if (port->mix->port_use_buffers != NULL) {
|
if (mix && port->mix->port_use_buffers != NULL) {
|
||||||
struct spa_graph_port *p = &mix->port;
|
struct spa_graph_port *p = &mix->port;
|
||||||
res = spa_node_port_use_buffers(port->mix,
|
res = spa_node_port_use_buffers(port->mix,
|
||||||
p->direction, p->port_id, buffers, n_buffers);
|
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));
|
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)) {
|
if (!SPA_FLAG_CHECK(port->mix_flags, PW_PORT_MIX_FLAG_MIX_ONLY)) {
|
||||||
res = spa_node_port_use_buffers(node->node,
|
res = spa_node_port_use_buffers(node->node,
|
||||||
port->direction, port->port_id, buffers, n_buffers);
|
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;
|
n_buffers = 0;
|
||||||
|
|
||||||
if (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)) {
|
else if (!SPA_RESULT_IS_ASYNC(res)) {
|
||||||
if (port->state == PW_PORT_STATE_READY)
|
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)
|
else if (mix)
|
||||||
mix->state = PW_PORT_STATE_PAUSED;
|
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)
|
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))
|
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;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -953,10 +953,13 @@ static void clear_buffers(struct node_data *data, struct mix *mix)
|
||||||
{
|
{
|
||||||
struct pw_port *port = mix->port;
|
struct pw_port *port = mix->port;
|
||||||
struct buffer *b;
|
struct buffer *b;
|
||||||
int i;
|
int i, res;
|
||||||
|
|
||||||
pw_log_debug("port %p: clear buffers", port);
|
pw_log_debug("port %p: clear buffers %d", port, mix->mix_id);
|
||||||
pw_port_use_buffers(port, mix->mix_id, NULL, 0);
|
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) {
|
pw_array_for_each(b, &mix->buffers) {
|
||||||
for (i = 0; i < b->n_mem; i++) {
|
for (i = 0; i < b->n_mem; i++) {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue