AE: Pulse Audio fix resume between song change without crossfade
authorfritsch <peter.fruehberger@gmail.com>
Sun, 10 Feb 2013 19:46:19 +0000 (20:46 +0100)
committerfritsch <peter.fruehberger@gmail.com>
Sun, 10 Feb 2013 19:46:19 +0000 (20:46 +0100)
xbmc/cores/AudioEngine/Engines/PulseAE/PulseAEStream.cpp
xbmc/cores/AudioEngine/Engines/PulseAE/PulseAEStream.h

index cc544e0..2322b47 100644 (file)
@@ -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)
index e142441..51aeda8 100644 (file)
@@ -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;