4#ifndef QPULSEAUDIO_CONTEXTMANAGER_P_H
5#define QPULSEAUDIO_CONTEXTMANAGER_P_H
18#include <QtCore/qmap.h>
19#include <QtCore/qbytearray.h>
20#include <QtCore/qreadwritelock.h>
21#include <pulse/pulseaudio.h>
23#include <qaudioformat.h>
39 pa_threaded_mainloop *
mainloop() {
return m_mainLoop.get(); }
40 pa_context *
context() {
return m_context.get(); }
45 pa_threaded_mainloop_lock(m_mainLoop.get());
51 pa_threaded_mainloop_unlock(m_mainLoop.get());
54 void wait(
const PAOperationHandle &op)
56 while (m_mainLoop && pa_operation_get_state(op.get()) == PA_OPERATION_RUNNING)
57 pa_threaded_mainloop_wait(m_mainLoop.get());
65 return m_mainLoop && pa_threaded_mainloop_in_thread(m_mainLoop.get());
82 void onContextFailed();
85 static void serverInfoCallback(pa_context *context,
const pa_server_info *info,
void *userdata);
86 static void sinkInfoCallback(pa_context *context,
const pa_sink_info *info,
int isLast,
88 static void sourceInfoCallback(pa_context *context,
const pa_source_info *info,
int isLast,
90 static void eventCallback(pa_context *context, pa_subscription_event_type_t t, uint32_t index,
92 static void contextStateCallbackInit(pa_context *context,
void *userdata);
93 static void contextStateCallback(pa_context *c,
void *userdata);
98 QMap<
int, QAudioDevice> m_sinks;
99 QMap<
int, QAudioDevice> m_sources;
101 QByteArray m_defaultSink;
102 QByteArray m_defaultSource;
104 mutable QReadWriteLock m_sinkLock;
105 mutable QReadWriteLock m_sourceLock;
106 mutable QReadWriteLock m_serverLock;
108 pa_mainloop_api *m_mainLoopApi{};
109 std::unique_ptr<pa_threaded_mainloop, QPulseAudioInternal::PaMainLoopDeleter> m_mainLoop;
110 PAContextHandle m_context;
113 QString m_serverName;
~QPulseAudioContextManager() override
bool isInMainLoop() const
void wait(const PAOperationHandle &op)
QByteArray defaultDevice(QAudioDevice::Mode mode) const
static QPulseAudioContextManager * instance()
bool waitForAsyncOperation(const PAOperationHandle &)
pa_context_state_t getContextState()
bool waitForAsyncOperation(pa_operation *op)
pa_threaded_mainloop * mainloop()
QList< QAudioDevice > availableDevices(QAudioDevice::Mode mode) const
QPulseAudioContextManager(QObject *parent=nullptr)
void audioOutputsChanged()
static bool updateDevicesMap(QReadWriteLock &lock, const QByteArray &defaultDeviceId, QMap< int, QAudioDevice > &devices, QAudioDevice::Mode mode, const Info &info)
Q_GLOBAL_STATIC(QPulseAudioContextManager, pulseEngine)
static std::unique_ptr< QAudioDevicePrivate > makeQAudioDevicePrivate(const char *device, const char *desc, bool isDef, QAudioDevice::Mode mode, const pa_channel_map &map, const pa_sample_spec &spec)
static bool updateDevicesMap(QReadWriteLock &lock, const QByteArray &defaultDeviceId, QMap< int, QAudioDevice > &devices)