Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mumble-voip/mumble.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Adam <dev@robert-adam.de>2021-07-13 21:13:16 +0300
committerGitHub <noreply@github.com>2021-07-13 21:13:16 +0300
commitccbfa5fd5ec7ef377c7e4ced56e27b0611450878 (patch)
tree657c55a90eab713da1784f4b90fa415493fabbae
parent3bffc76843e2cfbe5f0d275e743115ca729629b1 (diff)
parentad4813410046be13bac6b0ed6b8485d00c653f07 (diff)
Merge PR #5184: Backport "FIX(client, audio): PulseAudio not initializing (#5183)" to 1.4.x
-rw-r--r--src/mumble/PulseAudio.cpp17
-rw-r--r--src/mumble/PulseAudio.h7
2 files changed, 24 insertions, 0 deletions
diff --git a/src/mumble/PulseAudio.cpp b/src/mumble/PulseAudio.cpp
index b52fd0644..521ea1e73 100644
--- a/src/mumble/PulseAudio.cpp
+++ b/src/mumble/PulseAudio.cpp
@@ -118,6 +118,14 @@ PulseAudioSystem::PulseAudioSystem() {
m_pulseAudio.threaded_mainloop_start(pam);
bRunning = true;
+
+ std::unique_lock< std::mutex > guard(m_initLock);
+ if (!m_initialized) {
+ // The mutex is atomically released as soon as this thread starts waiting and will be
+ // re-acquired when waking up.
+ // Spurious wake-ups are avoided by checking m_initialized in the given predicate
+ m_initWaiter.wait(guard, [this]() { return m_initialized; });
+ }
}
PulseAudioSystem::~PulseAudioSystem() {
@@ -869,8 +877,17 @@ void PulseAudioSystem::contextCallback(pa_context *c) {
qWarning("PulseAudio: Connection failure: %s", m_pulseAudio.strerror(m_pulseAudio.context_errno(c)));
break;
default:
+ // These are other status callbacks we don't care about. However we explicitly want to wait until
+ // one of the status flags listed above are emitted before claiming we are initialized (this callback
+ // will be called multiple times).
return;
}
+
+ {
+ std::unique_lock< std::mutex > guard(m_initLock);
+ m_initialized = true;
+ }
+ m_initWaiter.notify_all();
}
PulseAudioInputRegistrar::PulseAudioInputRegistrar() : AudioInputRegistrar(QLatin1String("PulseAudio"), 10) {
diff --git a/src/mumble/PulseAudio.h b/src/mumble/PulseAudio.h
index 920d4ac18..baee89713 100644
--- a/src/mumble/PulseAudio.h
+++ b/src/mumble/PulseAudio.h
@@ -24,6 +24,9 @@
#include <pulse/thread-mainloop.h>
#include <pulse/volume.h>
+#include <condition_variable>
+#include <mutex>
+
struct PulseAttenuation {
uint32_t index;
QString name;
@@ -119,6 +122,10 @@ private:
Q_OBJECT
Q_DISABLE_COPY(PulseAudioSystem)
protected:
+ bool m_initialized = false;
+ std::mutex m_initLock;
+ std::condition_variable m_initWaiter;
+
void wakeup();
PulseAudio m_pulseAudio;