diff --git a/src/mumble/PulseAudio.cpp b/src/mumble/PulseAudio.cpp index 808d3c929..0a1e2c0aa 100644 --- a/src/mumble/PulseAudio.cpp +++ b/src/mumble/PulseAudio.cpp @@ -88,6 +88,9 @@ PulseAudioSystem::PulseAudioSystem() { pa_mainloop_api *api = pa_mainloop_get_api(pam); pacContext = pa_context_new(api, "Mumble"); + + pa_context_set_subscribe_callback(pacContext, subscribe_callback, this); + pa_context_set_state_callback(pacContext, context_state_callback, this); pa_context_connect(pacContext, NULL, PA_CONTEXT_NOAUTOSPAWN, NULL); @@ -127,6 +130,7 @@ void PulseAudioSystem::defer_event_callback(pa_mainloop_api *a, pa_defer_event * pas->eventCallback(a, e); } + void PulseAudioSystem::eventCallback(pa_mainloop_api *api, pa_defer_event *evt) { Q_ASSERT(pade == evt); api->defer_enable(pade, false); @@ -292,6 +296,12 @@ void PulseAudioSystem::context_state_callback(pa_context *c, void *userdata) { pas->contextCallback(c); } +void PulseAudioSystem::subscribe_callback(pa_context *c, pa_subscription_event_type t, unsigned int idx, void *userdata) { + PulseAudioSystem *pas = reinterpret_cast(userdata); + qWarning("PulseAudio: Sinks or inputs changed (inserted or removed sound card)"); + pas->query(); +} + void PulseAudioSystem::sink_callback(pa_context *, const pa_sink_info *i, int eol, void *userdata) { PulseAudioSystem *pas = reinterpret_cast(userdata); if (!i || eol) { @@ -457,6 +467,8 @@ void PulseAudioSystem::contextCallback(pa_context *c) { Q_ASSERT(c == pacContext); switch (pa_context_get_state(c)) { case PA_CONTEXT_READY: + pa_operation_unref(pa_context_subscribe(pacContext, PA_SUBSCRIPTION_MASK_SOURCE, NULL, this)); + pa_operation_unref(pa_context_subscribe(pacContext, PA_SUBSCRIPTION_MASK_SINK, NULL, this)); query(); break; case PA_CONTEXT_TERMINATED: diff --git a/src/mumble/PulseAudio.h b/src/mumble/PulseAudio.h index 6ba994588..319ab1cb6 100644 --- a/src/mumble/PulseAudio.h +++ b/src/mumble/PulseAudio.h @@ -81,6 +81,7 @@ class PulseAudioSystem : public QThread { static void defer_event_callback(pa_mainloop_api *a, pa_defer_event *e, void *userdata); static void context_state_callback(pa_context *c, void *userdata); + static void subscribe_callback(pa_context *c, pa_subscription_event_type_t t, uint32_t idx, void *userdata); static void sink_callback(pa_context *c, const pa_sink_info *i, int eol, void *userdata); static void source_callback(pa_context *c, const pa_source_info *i, int eol, void *userdata); static void server_callback(pa_context *c, const pa_server_info *i, void *userdata);