src/pulsecore/sink.c | 24 ++++++++++++++++++++++++ src/pulsecore/sink.h | 1 + 2 files changed, 25 insertions(+)
New commits: commit f28fd722a99cefb93d01c6740750cac811c3d31e Author: Pierre-Louis Bossart <pierre-louis.boss...@linux.intel.com> Date: Mon Aug 28 17:49:16 2017 -0500 sink: force suspend/resume on passthrough transitions A race condition prevents the AES non-audio bit from being set when enabling IEC61937 passthrough on resume with no sink-input connected (pa_sink_is_passthrough returns false). The non-audio bit should really be set when opening the sink. Force the sink to suspend/resume when actually entering passthrough mode, and likewise force a suspend-resume on leaving passthrough mode. Tested with E-AC3 streams which do need the AES bit set for my Onkyon receiver to detect the format instead of playing it as PCM. Signed-off-by: Pierre-Louis Bossart <pierre-louis.boss...@linux.intel.com> diff --git a/src/pulsecore/sink.c b/src/pulsecore/sink.c index 4b45ef94..c0b7cb2c 100644 --- a/src/pulsecore/sink.c +++ b/src/pulsecore/sink.c @@ -1627,6 +1627,11 @@ bool pa_sink_is_passthrough(pa_sink *s) { void pa_sink_enter_passthrough(pa_sink *s) { pa_cvolume volume; + if (s->is_passthrough_set) { + pa_log_debug("Sink %s is already in passthrough mode, nothing to do", s->name); + return; + } + /* disable the monitor in passthrough mode */ if (s->monitor_source) { pa_log_debug("Suspending monitor source %s, because the sink is entering the passthrough mode.", s->monitor_source->name); @@ -1639,10 +1644,23 @@ void pa_sink_enter_passthrough(pa_sink *s) { pa_cvolume_set(&volume, s->sample_spec.channels, PA_MIN(s->base_volume, PA_VOLUME_NORM)); pa_sink_set_volume(s, &volume, true, false); + + pa_log_debug("Suspending/Restarting sink %s to enter passthrough mode", s->name); + + /* force sink to be resumed in passthrough mode */ + pa_sink_suspend(s, true, PA_SUSPEND_INTERNAL); + s->is_passthrough_set = true; + pa_sink_suspend(s, false, PA_SUSPEND_INTERNAL); } /* Called from main context */ void pa_sink_leave_passthrough(pa_sink *s) { + + if (!s->is_passthrough_set) { + pa_log_debug("Sink %s is not in passthrough mode, nothing to do", s->name); + return; + } + /* Unsuspend monitor */ if (s->monitor_source) { pa_log_debug("Resuming monitor source %s, because the sink is leaving the passthrough mode.", s->monitor_source->name); @@ -1654,6 +1672,12 @@ void pa_sink_leave_passthrough(pa_sink *s) { pa_cvolume_init(&s->saved_volume); s->saved_save_volume = false; + + /* force sink to be resumed in non-passthrough mode */ + pa_sink_suspend(s, true, PA_SUSPEND_INTERNAL); + s->is_passthrough_set = false; + pa_sink_suspend(s, false, PA_SUSPEND_INTERNAL); + } /* Called from main context. */ diff --git a/src/pulsecore/sink.h b/src/pulsecore/sink.h index 0e79cf36..7deafdd8 100644 --- a/src/pulsecore/sink.h +++ b/src/pulsecore/sink.h @@ -108,6 +108,7 @@ struct pa_sink { /* Saved volume state while we're in passthrough mode */ pa_cvolume saved_volume; bool saved_save_volume:1; + bool is_passthrough_set:1; pa_asyncmsgq *asyncmsgq; _______________________________________________ pulseaudio-commits mailing list pulseaudio-commits@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/pulseaudio-commits