aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorfritsch <peter.fruehberger@gmail.com>2013-02-10 20:46:19 +0100
committerS. Davilla <davilla@4pi.com>2013-02-19 11:35:53 -0500
commit74ee9c7da6ce8f1c356cd1fce6558fc8eefedf88 (patch)
treebacd8e788993d32782446e8ed302694c1404de41
parent32b276166ac78fca053d604ce9e40bd415fa029a (diff)
AE: Pulse Audio fix resume between song change without crossfade
-rw-r--r--xbmc/cores/AudioEngine/Engines/PulseAE/PulseAEStream.cpp20
-rw-r--r--xbmc/cores/AudioEngine/Engines/PulseAE/PulseAEStream.h7
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;