diff --git a/pinos/client/introspect.h b/pinos/client/introspect.h index da14cb882..50ae9c3e6 100644 --- a/pinos/client/introspect.h +++ b/pinos/client/introspect.h @@ -45,8 +45,6 @@ typedef struct _PinosLinkInfo PinosLinkInfo; * @PINOS_NODE_STATE_CREATING: the node is being created * @PINOS_NODE_STATE_SUSPENDED: the node is suspended, the device might * be closed - * @PINOS_NODE_STATE_INITIALIZING: the node is initializing, the device is - * being opened and the capabilities are queried * @PINOS_NODE_STATE_IDLE: the node is running but there is no active * port * @PINOS_NODE_STATE_RUNNING: the node is running diff --git a/pinos/server/link.c b/pinos/server/link.c index 254fed596..907371c69 100644 --- a/pinos/server/link.c +++ b/pinos/server/link.c @@ -924,22 +924,24 @@ do_link_remove_done (SpaLoop *loop, spa_list_remove (&this->input_link); this->input->node->n_used_input_links--; + clear_port_buffers (this, this->input); + if (this->input->node->n_used_input_links == 0 && this->input->node->n_used_output_links == 0) pinos_node_set_state (this->input->node, PINOS_NODE_STATE_IDLE); - clear_port_buffers (this, this->input); this->input = NULL; } if (this->output) { spa_list_remove (&this->output_link); this->output->node->n_used_output_links--; + clear_port_buffers (this, this->output); + if (this->output->node->n_used_input_links == 0 && this->output->node->n_used_output_links == 0) pinos_node_set_state (this->output->node, PINOS_NODE_STATE_IDLE); - clear_port_buffers (this, this->output); this->output = NULL; } if (--impl->refcount == 0) diff --git a/pinos/server/node.c b/pinos/server/node.c index f9c7d1a57..b0a6fdd78 100644 --- a/pinos/server/node.c +++ b/pinos/server/node.c @@ -162,8 +162,10 @@ pause_node (PinosNode *this) SpaResult res; SpaNodeCommand cmd; - pinos_log_debug ("node %p: pause node", this); + if (this->node->state <= SPA_NODE_STATE_PAUSED) + return SPA_RESULT_OK; + pinos_log_debug ("node %p: pause node", this); cmd.type = SPA_NODE_COMMAND_PAUSE; cmd.size = sizeof (cmd); if ((res = spa_node_send_command (this->node, &cmd)) < 0) @@ -179,7 +181,6 @@ start_node (PinosNode *this) SpaNodeCommand cmd; pinos_log_debug ("node %p: start node", this); - cmd.type = SPA_NODE_COMMAND_START; cmd.size = sizeof (cmd); if ((res = spa_node_send_command (this->node, &cmd)) < 0) diff --git a/pinos/server/port.c b/pinos/server/port.c index 6cf4c04cd..6c2f7c72d 100644 --- a/pinos/server/port.c +++ b/pinos/server/port.c @@ -243,11 +243,6 @@ do_remove_link_done (SpaLoop *loop, } } - if (node->n_used_output_links == 0 && - node->n_used_input_links == 0) { - pinos_node_update_state (node, PINOS_NODE_STATE_IDLE, NULL); - } - if (!port->allocated) { pinos_log_debug ("port %p: clear buffers on port", port); spa_node_port_use_buffers (port->node->node, @@ -258,6 +253,11 @@ do_remove_link_done (SpaLoop *loop, port->n_buffers = 0; } + if (node->n_used_output_links == 0 && + node->n_used_input_links == 0) { + pinos_node_update_state (node, PINOS_NODE_STATE_IDLE, NULL); + } + return SPA_RESULT_OK; } diff --git a/spa/plugins/alsa/alsa-utils.c b/spa/plugins/alsa/alsa-utils.c index a31b0e2d5..5f03ed635 100644 --- a/spa/plugins/alsa/alsa-utils.c +++ b/spa/plugins/alsa/alsa-utils.c @@ -166,16 +166,22 @@ spa_alsa_set_format (SpaALSAState *state, SpaFormatAudio *fmt, SpaPortFormatFlag state->frame_size = info->channels * 2; period_size = props->period_size; - CHECK (snd_pcm_hw_params_set_period_size_near (hndl, params, &period_size, &dir), "set_period_size"); + periods = props->periods; + + spa_log_info (state->log, "trying period frames %zd and periods %u", period_size, periods); + + dir = 0; + CHECK (snd_pcm_hw_params_set_period_size_near (hndl, params, &period_size, &dir), "set_period_size_near"); state->period_frames = period_size; - periods = props->periods; + dir = 0; CHECK (snd_pcm_hw_params_set_periods_near (hndl, params, &periods, &dir), "set_periods_near"); state->buffer_frames = periods * state->period_frames; CHECK (snd_pcm_hw_params_set_buffer_size (hndl, params, state->buffer_frames), "set_buffer_size"); - spa_log_info (state->log, "buffer frames %zd, period frames %zd", state->buffer_frames, state->period_frames); + spa_log_info (state->log, "buffer frames %zd, period frames %zd, periods %u", + state->buffer_frames, state->period_frames, periods); /* write the parameters to device */ CHECK (snd_pcm_hw_params (hndl, params), "set_hw_params");