/* Called from main context */ static int sink_set_state_cb(pa_sink *s, pa_sink_state_t state) { struct userdata *u; pa_sink_assert_ref(s); pa_assert_se(u = s->userdata); if (!PA_SINK_IS_LINKED(state)) { return 0; } if (state == PA_SINK_RUNNING) { /* need to wake-up source if it was suspended */ pa_source_suspend(u->source, FALSE, PA_SUSPEND_ALL); /* FIXME: if there's no client connected, the source will suspend and playback will be stuck. You'd want to prevent the source from sleeping when the uplink sink is active; even if the audio is discarded at least the app isn't stuck */ } else { /* nothing to do, if the sink becomes idle or suspended let module-suspend-idle handle the sources later */ } return 0; }
static void resume(struct device_info *d) { pa_assert(d); d->userdata->core->mainloop->time_restart(d->time_event, NULL); if (d->sink) { pa_log_debug("Sink %s becomes busy, resuming.", d->sink->name); pa_sink_suspend(d->sink, false, PA_SUSPEND_IDLE); } if (d->source) { pa_log_debug("Source %s becomes busy, resuming.", d->source->name); pa_source_suspend(d->source, false, PA_SUSPEND_IDLE); } }
static void timeout_cb(pa_mainloop_api*a, pa_time_event* e, const struct timeval *t, void *userdata) { struct device_info *d = userdata; pa_assert(d); d->userdata->core->mainloop->time_restart(d->time_event, NULL); if (d->sink && pa_sink_check_suspend(d->sink) <= 0 && !(d->sink->suspend_cause & PA_SUSPEND_IDLE)) { pa_log_info("Sink %s idle for too long, suspending ...", d->sink->name); pa_sink_suspend(d->sink, TRUE, PA_SUSPEND_IDLE); } if (d->source && pa_source_check_suspend(d->source) <= 0 && !(d->source->suspend_cause & PA_SUSPEND_IDLE)) { pa_log_info("Source %s idle for too long, suspending ...", d->source->name); pa_source_suspend(d->source, TRUE, PA_SUSPEND_IDLE); } }