summaryrefslogtreecommitdiff
path: root/pulseaudiocontroller.h
diff options
context:
space:
mode:
Diffstat (limited to 'pulseaudiocontroller.h')
-rw-r--r--pulseaudiocontroller.h94
1 files changed, 94 insertions, 0 deletions
diff --git a/pulseaudiocontroller.h b/pulseaudiocontroller.h
new file mode 100644
index 0000000..bdef9be
--- /dev/null
+++ b/pulseaudiocontroller.h
@@ -0,0 +1,94 @@
+#ifndef PULSEAUDIOCONTROLLER_H
+#define PULSEAUDIOCONTROLLER_H
+
+#include <QObject>
+#include <QThread>
+#include <QMap>
+#include <QtQml>
+#include <thread>
+#include <pulse/mainloop.h>
+#include <pulse/thread-mainloop.h>
+#include <pulse/context.h>
+#include <pulse/pulseaudio.h>
+#include <pulse/proplist.h>
+
+
+class InternalController;
+
+class PulseLocker {
+public:
+ PulseLocker(pa_threaded_mainloop *mainloop)
+ : mMainloop(mainloop) {
+ pa_threaded_mainloop_lock(mainloop);
+ }
+ ~PulseLocker() {
+ pa_threaded_mainloop_unlock(mMainloop);
+ }
+private:
+ pa_threaded_mainloop *mMainloop;
+};
+
+class PulseAudioController : public QObject
+{
+ Q_OBJECT
+public:
+ explicit PulseAudioController(QObject *parent = 0);
+ void setupController();
+
+
+signals:
+ void sinkInputChanged(QVariantMap sinkinput);
+ void sinkInputRemoved(int index);
+ void sinkInfoChanged(QVariantMap sinkinfo);
+ void sinkInfoRemoved(int index);
+ void clientChanged(QVariantMap client);
+ void clientRemoved(int index);
+
+
+private:
+ InternalController *mController;
+ QThread *mWorker;
+
+
+};
+
+class InternalController : public QObject
+{
+ Q_OBJECT
+public:
+ explicit InternalController(PulseAudioController *parent = 0);
+
+ pa_threaded_mainloop* getMainloop() { return mMainloop; }
+
+ ~InternalController();
+signals:
+ void sinkInputChanged(QVariantMap sinkinput);
+ void sinkInputRemoved(int index);
+ void sinkInfoChanged(QVariantMap sinkinfo);
+ void sinkInfoRemoved(int index);
+ void clientChanged(QVariantMap client);
+ void clientRemoved(int index);
+
+private slots:
+ void connectToContext();
+
+private:
+ PulseAudioController* mParent;
+ pa_threaded_mainloop *mMainloop;
+ pa_mainloop_api* mApi;
+ pa_context* mContext;
+
+ void setupSubscription();
+
+ static void contextStateCallback(pa_context *context, void *userdata);
+ static void contextSubscriptionCallback(pa_context *context, pa_subscription_event_type_t t, uint32_t index, void *userdata);
+ static void sinkInputCallback(pa_context *, const pa_sink_input_info *, int, void *);
+ static void clientCallback(pa_context *, const pa_client_info *, int, void *);
+ static void sinkInfoCallback(pa_context *context, const pa_sink_info *info,int eol, void *userdata);
+ static void contextSuccessCallback(pa_context *context, int success, void *userdata);
+ static void eventCallback(pa_context *context, const char *name, pa_proplist *pl, void *userdata);
+ static int getVolume(pa_cvolume volume, int channel = 0);
+ void waitForOperation(pa_operation *operation);
+};
+
+#endif // PULSEAUDIOCONTROLLER_H