diff options
author | fritsch <peter.fruehberger@gmail.com> | 2013-02-10 20:46:19 +0100 |
---|---|---|
committer | S. Davilla <davilla@4pi.com> | 2013-02-19 11:35:53 -0500 |
commit | 74ee9c7da6ce8f1c356cd1fce6558fc8eefedf88 (patch) | |
tree | bacd8e788993d32782446e8ed302694c1404de41 | |
parent | 32b276166ac78fca053d604ce9e40bd415fa029a (diff) |
AE: Pulse Audio fix resume between song change without crossfade
-rw-r--r-- | xbmc/cores/AudioEngine/Engines/PulseAE/PulseAEStream.cpp | 20 | ||||
-rw-r--r-- | xbmc/cores/AudioEngine/Engines/PulseAE/PulseAEStream.h | 7 |
2 files changed, 23 insertions, 4 deletions
diff --git a/xbmc/cores/AudioEngine/Engines/PulseAE/PulseAEStream.cpp b/xbmc/cores/AudioEngine/Engines/PulseAE/PulseAEStream.cpp index d261217e6a..f46cb1baaa 100644 --- a/xbmc/cores/AudioEngine/Engines/PulseAE/PulseAEStream.cpp +++ b/xbmc/cores/AudioEngine/Engines/PulseAE/PulseAEStream.cpp @@ -53,6 +53,7 @@ CPulseAEStream::CPulseAEStream(pa_context *context, pa_threaded_mainloop *mainLo m_Destroyed = false; m_Initialized = false; m_Paused = false; + m_ResumeCallback = false; m_Stream = NULL; m_Context = context; @@ -350,13 +351,16 @@ bool CPulseAEStream::IsDraining() pa_operation_unref(m_DrainOperation); m_DrainOperation = NULL; } - + ProcessCallbacks(); return false; } bool CPulseAEStream::IsDrained() { - return m_DrainOperation == NULL; + bool ret = (m_DrainOperation == NULL); + ProcessCallbacks(); + + return ret; } bool CPulseAEStream::IsDestroyed() @@ -551,11 +555,19 @@ void CPulseAEStream::StreamUnderflowCallback(pa_stream *s, void *userdata) void CPulseAEStream::StreamDrainComplete(pa_stream *s, int success, void *userdata) { CPulseAEStream *stream = (CPulseAEStream *)userdata; - if (stream->m_slave) - stream->m_slave->Resume(); + if(stream) + stream->SetDrained(); pa_threaded_mainloop_signal(stream->m_MainLoop, 0); } +void CPulseAEStream::ProcessCallbacks() +{ + if(m_ResumeCallback && m_slave) + m_slave->Resume(); + + m_ResumeCallback = false; +} + inline bool CPulseAEStream::WaitForOperation(pa_operation *op, pa_threaded_mainloop *mainloop, const char *LogEntry = "") { if (op == NULL) diff --git a/xbmc/cores/AudioEngine/Engines/PulseAE/PulseAEStream.h b/xbmc/cores/AudioEngine/Engines/PulseAE/PulseAEStream.h index 89bf74bc76..1914a1f2cd 100644 --- a/xbmc/cores/AudioEngine/Engines/PulseAE/PulseAEStream.h +++ b/xbmc/cores/AudioEngine/Engines/PulseAE/PulseAEStream.h @@ -79,6 +79,12 @@ public: /* trigger the stream to update its volume relative to AE */ void UpdateVolume(float max); + /* used to prepare a stream for resume */ + void SetDrained() { m_ResumeCallback = true; }; + + /* Process the Resume of streams */ + void ProcessCallbacks(); + virtual void RegisterSlave(IAEStream *stream); private: static void StreamRequestCallback(pa_stream *s, size_t length, void *userdata); @@ -93,6 +99,7 @@ private: bool m_Destroyed; bool m_Initialized; bool m_Paused; + bool m_ResumeCallback; pa_stream *m_Stream; pa_sample_spec m_SampleSpec; |