pulseaudio: process rewind in the realtime loop
It seems to be the standard approach. Let's see if it eliminates assertion failures that are related to rewind processing.
This commit is contained in:
parent
824578f529
commit
7b7f3c48df
@ -267,10 +267,6 @@ static void reconfigure_func(pa_sink *s, pa_sample_spec *ss, bool passthrough) {
|
||||
s->sample_spec.rate = ss->rate;
|
||||
}
|
||||
|
||||
static void process_rewind(pa_sink *s) {
|
||||
pa_sink_process_rewind(s, 0);
|
||||
}
|
||||
|
||||
static void thread_func(void *userdata) {
|
||||
struct userdata *u = userdata;
|
||||
|
||||
@ -282,6 +278,9 @@ static void thread_func(void *userdata) {
|
||||
for (;;) {
|
||||
int ret;
|
||||
|
||||
if (PA_UNLIKELY(u->sink->thread_info.rewind_requested))
|
||||
pa_sink_process_rewind(u->sink, 0);
|
||||
|
||||
if ((ret = pa_rtpoll_run(u->rtpoll)) < 0)
|
||||
goto fail;
|
||||
|
||||
@ -379,7 +378,6 @@ int pa__init(pa_module*m) {
|
||||
u->sink->set_state_in_main_thread = state_func_main;
|
||||
u->sink->set_state_in_io_thread = state_func_io;
|
||||
u->sink->reconfigure = reconfigure_func;
|
||||
u->sink->request_rewind = process_rewind;
|
||||
u->sink->userdata = u;
|
||||
|
||||
pa_sink_set_asyncmsgq(u->sink, u->thread_mq.inq);
|
||||
|
@ -471,20 +471,33 @@ static int pa_init_sles_player(struct userdata *u, pa_sample_spec *ss, pa_channe
|
||||
|
||||
static void thread_func(void *userdata) {
|
||||
struct userdata *u = userdata;
|
||||
|
||||
pa_assert(u);
|
||||
|
||||
pa_log_debug("Thread starting up");
|
||||
pa_thread_mq_install(&u->thread_mq);
|
||||
|
||||
for (;;) {
|
||||
int ret;
|
||||
if ((ret = pa_rtpoll_run(u->rtpoll)) < 0) {
|
||||
pa_asyncmsgq_post(u->thread_mq.outq, PA_MSGOBJECT(u->core), PA_CORE_MESSAGE_UNLOAD_MODULE, u->module, 0, NULL, NULL);
|
||||
pa_asyncmsgq_wait_for(u->thread_mq.inq, PA_MESSAGE_SHUTDOWN);
|
||||
break;
|
||||
}
|
||||
if (ret == 0) {
|
||||
break;
|
||||
}
|
||||
|
||||
if (PA_UNLIKELY(u->sink->thread_info.rewind_requested))
|
||||
pa_sink_process_rewind(u->sink, 0);
|
||||
|
||||
if ((ret = pa_rtpoll_run(u->rtpoll)) < 0)
|
||||
goto fail;
|
||||
|
||||
if (ret == 0)
|
||||
goto finish;
|
||||
}
|
||||
|
||||
fail:
|
||||
/* If this was no regular exit from the loop we have to continue
|
||||
* processing messages until we received PA_MESSAGE_SHUTDOWN */
|
||||
pa_asyncmsgq_post(u->thread_mq.outq, PA_MSGOBJECT(u->core), PA_CORE_MESSAGE_UNLOAD_MODULE, u->module, 0, NULL, NULL);
|
||||
pa_asyncmsgq_wait_for(u->thread_mq.inq, PA_MESSAGE_SHUTDOWN);
|
||||
|
||||
finish:
|
||||
pa_log_debug("Thread shutting down");
|
||||
}
|
||||
|
||||
static int state_func(pa_sink *s, pa_sink_state_t state, pa_suspend_cause_t suspend_cause) {
|
||||
@ -498,10 +511,6 @@ static int state_func(pa_sink *s, pa_sink_state_t state, pa_suspend_cause_t susp
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void process_rewind(pa_sink *s) {
|
||||
pa_sink_process_rewind(s, 0);
|
||||
}
|
||||
|
||||
int pa__init(pa_module*m) {
|
||||
struct userdata *u = NULL;
|
||||
pa_modargs *ma = NULL;
|
||||
@ -568,7 +577,6 @@ int pa__init(pa_module*m) {
|
||||
u->sink->userdata = u;
|
||||
u->sink->parent.process_msg = sink_process_msg;
|
||||
u->sink->set_state_in_main_thread = state_func;
|
||||
u->sink->request_rewind = process_rewind;
|
||||
|
||||
pa_sink_set_asyncmsgq(u->sink, u->thread_mq.inq);
|
||||
pa_sink_set_rtpoll(u->sink, u->rtpoll);
|
||||
|
Loading…
Reference in New Issue
Block a user