bool CPulseAE::Initialize() { m_Volume = g_settings.m_fVolumeLevel; if ((m_MainLoop = pa_threaded_mainloop_new()) == NULL) { CLog::Log(LOGERROR, "PulseAudio: Failed to allocate main loop"); return false; } if ((m_Context = pa_context_new(pa_threaded_mainloop_get_api(m_MainLoop), "XBMC")) == NULL) { CLog::Log(LOGERROR, "PulseAudio: Failed to allocate context"); return false; } pa_context_set_state_callback(m_Context, ContextStateCallback, m_MainLoop); if (pa_context_connect(m_Context, NULL, (pa_context_flags_t)0, NULL) < 0) { CLog::Log(LOGERROR, "PulseAudio: Failed to connect context"); return false; } pa_threaded_mainloop_lock(m_MainLoop); if (pa_threaded_mainloop_start(m_MainLoop) < 0) { CLog::Log(LOGERROR, "PulseAudio: Failed to start MainLoop"); pa_threaded_mainloop_unlock(m_MainLoop); return false; } /* Wait until the context is ready */ do { pa_threaded_mainloop_wait(m_MainLoop); CLog::Log(LOGDEBUG, "PulseAudio: Context %s", ContextStateToString(pa_context_get_state(m_Context))); } while (pa_context_get_state(m_Context) != PA_CONTEXT_READY && pa_context_get_state(m_Context) != PA_CONTEXT_FAILED); if (pa_context_get_state(m_Context) == PA_CONTEXT_FAILED) { CLog::Log(LOGERROR, "PulseAudio: Waited for the Context but it failed"); pa_threaded_mainloop_unlock(m_MainLoop); return false; } pa_threaded_mainloop_unlock(m_MainLoop); return true; }
bool CAESinkPULSE::SetupContext(const char *host, pa_context **context, pa_threaded_mainloop **mainloop) { if ((*mainloop = pa_threaded_mainloop_new()) == NULL) { CLog::Log(LOGERROR, "PulseAudio: Failed to allocate main loop"); return false; } if (((*context) = pa_context_new(pa_threaded_mainloop_get_api(*mainloop), "Kodi")) == NULL) { CLog::Log(LOGERROR, "PulseAudio: Failed to allocate context"); return false; } pa_context_set_state_callback(*context, ContextStateCallback, *mainloop); if (pa_context_connect(*context, host, (pa_context_flags_t)0, NULL) < 0) { CLog::Log(LOGERROR, "PulseAudio: Failed to connect context"); return false; } pa_threaded_mainloop_lock(*mainloop); if (pa_threaded_mainloop_start(*mainloop) < 0) { CLog::Log(LOGERROR, "PulseAudio: Failed to start MainLoop"); pa_threaded_mainloop_unlock(*mainloop); return false; } /* Wait until the context is ready */ do { pa_threaded_mainloop_wait(*mainloop); CLog::Log(LOGDEBUG, "PulseAudio: Context %s", ContextStateToString(pa_context_get_state(*context))); } while (pa_context_get_state(*context) != PA_CONTEXT_READY && pa_context_get_state(*context) != PA_CONTEXT_FAILED); if (pa_context_get_state(*context) == PA_CONTEXT_FAILED) { CLog::Log(LOGERROR, "PulseAudio: Waited for the Context but it failed"); pa_threaded_mainloop_unlock(*mainloop); return false; } pa_threaded_mainloop_unlock(*mainloop); return true; }