Skip to content

Commit

Permalink
AE: Pulse Audio fix resume between song change without crossfade
Browse files Browse the repository at this point in the history
  • Loading branch information
fritsch committed Feb 10, 2013
1 parent e207e61 commit 794a7ce
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 4 deletions.
20 changes: 16 additions & 4 deletions xbmc/cores/AudioEngine/Engines/PulseAE/PulseAEStream.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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()
Expand Down Expand Up @@ -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)
Expand Down
7 changes: 7 additions & 0 deletions xbmc/cores/AudioEngine/Engines/PulseAE/PulseAEStream.h
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,12 @@ class CPulseAEStream : public IAEStream
/* 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);
Expand All @@ -93,6 +99,7 @@ class CPulseAEStream : public IAEStream
bool m_Destroyed;
bool m_Initialized;
bool m_Paused;
bool m_ResumeCallback;

pa_stream *m_Stream;
pa_sample_spec m_SampleSpec;
Expand Down

0 comments on commit 794a7ce

Please sign in to comment.