mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-04 13:30:12 -05:00
link: improve state changes
This commit is contained in:
parent
3d54d31fac
commit
fb0919b8b7
3 changed files with 20 additions and 8 deletions
|
|
@ -663,6 +663,10 @@ check_states (PinosLink *this,
|
||||||
in_state = this->input->state;
|
in_state = this->input->state;
|
||||||
out_state = this->output->state;
|
out_state = this->output->state;
|
||||||
|
|
||||||
|
if (in_state == PINOS_PORT_STATE_STREAMING &&
|
||||||
|
out_state == PINOS_PORT_STATE_STREAMING)
|
||||||
|
return SPA_RESULT_OK;
|
||||||
|
|
||||||
pinos_log_debug ("link %p: input state %d, output state %d", this, in_state, out_state);
|
pinos_log_debug ("link %p: input state %d, output state %d", this, in_state, out_state);
|
||||||
|
|
||||||
if ((res = do_negotiate (this, in_state, out_state)) != SPA_RESULT_OK)
|
if ((res = do_negotiate (this, in_state, out_state)) != SPA_RESULT_OK)
|
||||||
|
|
|
||||||
|
|
@ -323,9 +323,8 @@ on_node_event (SpaNode *node, SpaEvent *event, void *user_data)
|
||||||
SpaEventNodeAsyncComplete *ac = (SpaEventNodeAsyncComplete *) event;
|
SpaEventNodeAsyncComplete *ac = (SpaEventNodeAsyncComplete *) event;
|
||||||
|
|
||||||
pinos_log_debug ("node %p: async complete event %d %d", this, ac->body.seq.value, ac->body.res.value);
|
pinos_log_debug ("node %p: async complete event %d %d", this, ac->body.seq.value, ac->body.res.value);
|
||||||
if (!pinos_work_queue_complete (impl->work, this, ac->body.seq.value, ac->body.res.value)) {
|
pinos_work_queue_complete (impl->work, this, ac->body.seq.value, ac->body.res.value);
|
||||||
pinos_signal_emit (&this->async_complete, this, ac->body.seq.value, ac->body.res.value);
|
pinos_signal_emit (&this->async_complete, this, ac->body.seq.value, ac->body.res.value);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else if (SPA_EVENT_TYPE (event) == this->core->type.event_node.NeedInput) {
|
else if (SPA_EVENT_TYPE (event) == this->core->type.event_node.NeedInput) {
|
||||||
do_pull (this);
|
do_pull (this);
|
||||||
|
|
|
||||||
|
|
@ -44,6 +44,7 @@ typedef struct
|
||||||
|
|
||||||
SpaList work_list;
|
SpaList work_list;
|
||||||
SpaList free_list;
|
SpaList free_list;
|
||||||
|
int n_queued;
|
||||||
} PinosWorkQueueImpl;
|
} PinosWorkQueueImpl;
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -58,19 +59,23 @@ process_work_queue (SpaLoopUtils *utils,
|
||||||
|
|
||||||
spa_list_for_each_safe (item, tmp, &impl->work_list, link) {
|
spa_list_for_each_safe (item, tmp, &impl->work_list, link) {
|
||||||
if (item->seq != SPA_ID_INVALID) {
|
if (item->seq != SPA_ID_INVALID) {
|
||||||
pinos_log_debug ("work-queue %p: waiting for item %p %d", this, item->obj, item->seq);
|
pinos_log_debug ("work-queue %p: %d waiting for item %p %d", this, impl->n_queued,
|
||||||
|
item->obj, item->seq);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (item->res == SPA_RESULT_WAIT_SYNC && item != spa_list_first (&impl->work_list, WorkItem, link)) {
|
if (item->res == SPA_RESULT_WAIT_SYNC && item != spa_list_first (&impl->work_list, WorkItem, link)) {
|
||||||
pinos_log_debug ("work-queue %p: sync item %p not head", this, item->obj);
|
pinos_log_debug ("work-queue %p: %d sync item %p not head", this, impl->n_queued,
|
||||||
|
item->obj);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
spa_list_remove (&item->link);
|
spa_list_remove (&item->link);
|
||||||
|
impl->n_queued--;
|
||||||
|
|
||||||
if (item->func) {
|
if (item->func) {
|
||||||
pinos_log_debug ("work-queue %p: process work item %p %d %d", this, item->obj, item->seq, item->res);
|
pinos_log_debug ("work-queue %p: %d process work item %p %d %d", this, impl->n_queued,
|
||||||
|
item->obj, item->seq, item->res);
|
||||||
item->func (item->obj, item->data, item->res, item->id);
|
item->func (item->obj, item->data, item->res, item->id);
|
||||||
}
|
}
|
||||||
spa_list_insert (impl->free_list.prev, &item->link);
|
spa_list_insert (impl->free_list.prev, &item->link);
|
||||||
|
|
@ -118,9 +123,12 @@ pinos_work_queue_destroy (PinosWorkQueue * queue)
|
||||||
|
|
||||||
pinos_loop_destroy_source (queue->loop, impl->wakeup);
|
pinos_loop_destroy_source (queue->loop, impl->wakeup);
|
||||||
|
|
||||||
spa_list_for_each_safe (item, tmp, &impl->free_list, link)
|
spa_list_for_each_safe (item, tmp, &impl->work_list, link) {
|
||||||
|
pinos_log_warn ("work-queue %p: cancel work item %p %d %d", queue,
|
||||||
|
item->obj, item->seq, item->res);
|
||||||
free (item);
|
free (item);
|
||||||
spa_list_for_each_safe (item, tmp, &impl->work_list, link)
|
}
|
||||||
|
spa_list_for_each_safe (item, tmp, &impl->free_list, link)
|
||||||
free (item);
|
free (item);
|
||||||
|
|
||||||
free (impl);
|
free (impl);
|
||||||
|
|
@ -166,6 +174,7 @@ pinos_work_queue_add (PinosWorkQueue *queue,
|
||||||
pinos_log_debug ("work-queue %p: defer object %p", queue, obj);
|
pinos_log_debug ("work-queue %p: defer object %p", queue, obj);
|
||||||
}
|
}
|
||||||
spa_list_insert (impl->work_list.prev, &item->link);
|
spa_list_insert (impl->work_list.prev, &item->link);
|
||||||
|
impl->n_queued++;
|
||||||
|
|
||||||
if (have_work)
|
if (have_work)
|
||||||
pinos_loop_signal_event (impl->this.loop, impl->wakeup);
|
pinos_loop_signal_event (impl->this.loop, impl->wakeup);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue