mirror of
https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
synced 2025-11-05 13:29:57 -05:00
replace sink/source SET_STATE handlers with callbacks
There are no behaviour changes, the code from almost all the SET_STATE handlers is moved with minimal changes to the newly introduced set_state_in_io_thread() callback. The only exception is module-tunnel, which has to call pa_sink_render() after pa_sink.thread_info.state has been updated. The set_state_in_io_thread() callback is called before updating that variable, so moving the SET_STATE handler code to the callback isn't possible. The purpose of this change is to make it easier to get state change handling right in modules. Hooking to the SET_STATE messages in modules required care in calling pa_sink/source_process_msg() at the right time (or not calling it at all, as was the case on resume failures), and there were a few bugs (fixed before this patch). Now the core takes care of ordering things correctly. Another motivation for this change is that there was some talk about adding a suspend_cause variable to pa_sink/source.thread_info. The variable would be updated in the core SET_STATE handler, but that would not work with the old design, because in case of resume failures modules didn't call the core message handler.
This commit is contained in:
parent
73b8a57078
commit
b2537a8f38
25 changed files with 874 additions and 658 deletions
|
|
@ -142,6 +142,7 @@ static void reset_callbacks(pa_source *s) {
|
|||
pa_assert(s);
|
||||
|
||||
s->set_state_in_main_thread = NULL;
|
||||
s->set_state_in_io_thread = NULL;
|
||||
s->get_volume = NULL;
|
||||
s->set_volume = NULL;
|
||||
s->write_volume = NULL;
|
||||
|
|
@ -2224,6 +2225,13 @@ int pa_source_process_msg(pa_msgobject *object, int code, void *userdata, int64_
|
|||
(s->thread_info.state == PA_SOURCE_SUSPENDED && PA_SOURCE_IS_OPENED(PA_PTR_TO_UINT(userdata))) ||
|
||||
(PA_SOURCE_IS_OPENED(s->thread_info.state) && PA_PTR_TO_UINT(userdata) == PA_SOURCE_SUSPENDED);
|
||||
|
||||
if (s->set_state_in_io_thread) {
|
||||
int r;
|
||||
|
||||
if ((r = s->set_state_in_io_thread(s, PA_PTR_TO_UINT(userdata))) < 0)
|
||||
return r;
|
||||
}
|
||||
|
||||
s->thread_info.state = PA_PTR_TO_UINT(userdata);
|
||||
|
||||
if (suspend_change) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue