m_Destroyed = false;
m_Initialized = false;
m_Paused = false;
+ m_ResumeCallback = false;
m_Stream = NULL;
m_Context = context;
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()
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)
/* 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);
bool m_Destroyed;
bool m_Initialized;
bool m_Paused;
+ bool m_ResumeCallback;
pa_stream *m_Stream;
pa_sample_spec m_SampleSpec;