diff options
author | Matt Porter <mporter@konsulko.com> | 2017-04-15 09:18:25 -0400 |
---|---|---|
committer | Matt Porter <mporter@konsulko.com> | 2017-04-20 22:00:09 -0400 |
commit | 3fd71f4b6bc026f2f9054140f7bf612855e45d7d (patch) | |
tree | 202cb27d30a55843e44d828b9f8043dd9697eddf /app/paclient.h | |
parent | 392effc544e3d94b82f806378d4ac1d11a185422 (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.h | 89 |
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; +}; |