summaryrefslogtreecommitdiffstats
path: root/app/paclient.h
diff options
context:
space:
mode:
authorMatt Porter <mporter@konsulko.com>2017-04-15 09:18:25 -0400
committerMatt Porter <mporter@konsulko.com>2017-04-20 22:00:09 -0400
commit3fd71f4b6bc026f2f9054140f7bf612855e45d7d (patch)
tree202cb27d30a55843e44d828b9f8043dd9697eddf /app/paclient.h
parent392effc544e3d94b82f806378d4ac1d11a185422 (diff)
Rewrite PulseAudio backend into a threaded class
Converts the Mixer PulseAudio backend from a C library to a PaClient class which runs in its own QThread. This faciliates isolation of PaControlModel updates to the QML thread where they belong. It also provides the foundation for runtime updates of the model and reuse of the PaClient class in other apps. AGL-Bug: SPEC-548 Change-Id: I13c4c220fde2fd4bc4aea2e04f39152a963b5fa0 Signed-off-by: Matt Porter <mporter@konsulko.com>
Diffstat (limited to 'app/paclient.h')
-rw-r--r--app/paclient.h89
1 files changed, 89 insertions, 0 deletions
diff --git a/app/paclient.h b/app/paclient.h
new file mode 100644
index 0000000..1367e81
--- /dev/null
+++ b/app/paclient.h
@@ -0,0 +1,89 @@
+/*
+ * Copyright (C) 2016,2017 Konsulko Group
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <pulse/pulseaudio.h>
+
+#include <QtCore/QObject>
+
+const char * const channel_position_string[] =
+{
+ "Mono",
+ "Front Left",
+ "Front Right",
+ "Center",
+ "Rear Center",
+ "Rear Left",
+ "Rear Right",
+ "LFE",
+ "Left Center",
+ "Right Center",
+ "Side Left",
+ "Side Right",
+};
+
+enum control_type
+{
+ C_SOURCE,
+ C_SINK
+};
+
+typedef struct
+{
+ uint32_t type;
+ uint32_t index;
+ pa_cvolume cvolume;
+} CState;
+
+class PaClient : public QObject
+{
+ Q_OBJECT
+ public:
+ PaClient();
+ ~PaClient();
+
+ void init();
+ void close();
+
+ inline pa_context *context() const
+ {
+ return m_ctx;
+ }
+
+ inline void lock()
+ {
+ pa_threaded_mainloop_lock(m_ml);
+ }
+
+ inline void unlock()
+ {
+ pa_threaded_mainloop_unlock(m_ml);
+ }
+
+ void addOneControlState(int type, int index, const pa_cvolume *cvolume);
+
+ public slots:
+ void setVolume(uint32_t type, uint32_t index, uint32_t channel, uint32_t volume);
+
+ signals:
+ void controlAdded(int cindex, QString desc, int type, int channel, const char *cdesc, int volume);
+
+ private:
+ bool m_init;
+ pa_threaded_mainloop *m_ml;
+ pa_mainloop_api *m_mlapi;
+ pa_context *m_ctx;
+ QList<CState *> m_cstatelist;
+};