summaryrefslogtreecommitdiffstats
path: root/app/pacontrolmodel.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'app/pacontrolmodel.cpp')
-rw-r--r--app/pacontrolmodel.cpp172
1 files changed, 172 insertions, 0 deletions
diff --git a/app/pacontrolmodel.cpp b/app/pacontrolmodel.cpp
new file mode 100644
index 0000000..520233b
--- /dev/null
+++ b/app/pacontrolmodel.cpp
@@ -0,0 +1,172 @@
+/*
+ * Copyright (C) 2016 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 "pacontrolmodel.h"
+#include "pac.h"
+
+PaControl::PaControl(const quint32 &cindex, const QString &desc, const quint32 &type, const quint32 &channel, const QString &cdesc, const quint32 &volume)
+ : m_cindex(cindex), m_desc(desc), m_type(type), m_channel(channel), m_cdesc(cdesc), m_volume(volume)
+{
+}
+
+quint32 PaControl::cindex() const
+{
+ return m_cindex;
+}
+
+QString PaControl::desc() const
+{
+ return m_desc;
+}
+
+quint32 PaControl::type() const
+{
+ return m_type;
+}
+
+quint32 PaControl::channel() const
+{
+ return m_channel;
+}
+
+QString PaControl::cdesc() const
+{
+ return m_cdesc;
+}
+
+
+quint32 PaControl::volume() const
+{
+ return m_volume;
+}
+
+// FIXME: Not all of these should be editable roles
+void PaControl::setCIndex(const QVariant &cindex)
+{
+ m_cindex = cindex.toUInt();
+}
+
+void PaControl::setDesc(const QVariant &desc)
+{
+ m_desc = desc.toString();
+}
+
+void PaControl::setType(const QVariant &type)
+{
+ m_type = type.toUInt();
+}
+
+void PaControl::setChannel(const QVariant &channel)
+{
+ m_channel = channel.toUInt();
+}
+
+void PaControl::setCDesc(const QVariant &cdesc)
+{
+ m_cdesc = cdesc.toString();
+}
+
+void PaControl::setVolume(pa_context *pa_ctx, const QVariant &volume)
+{
+ if (volume != m_volume) {
+ m_volume = volume.toUInt();
+ pac_set_volume(pa_ctx, type(), cindex(), channel(), m_volume);
+ }
+}
+
+PaControlModel::PaControlModel(QObject *parent)
+ : QAbstractListModel(parent)
+{
+ pa_ctx = pac_init(this, "Mixer");
+}
+
+void PaControlModel::addControl(const PaControl &control)
+{
+ beginInsertRows(QModelIndex(), rowCount(), rowCount());
+ m_controls << control;
+ endInsertRows();
+}
+
+void add_one_control(void *ctx, int cindex, const char *desc, int type, int channel, const char *cdesc, int volume)
+{
+ // Get the PaControlModel object from the opaque pointer context
+ PaControlModel *pacm = static_cast<PaControlModel*>(ctx);
+ pacm->addControl(PaControl(cindex, desc, type, channel, cdesc, volume));
+}
+
+int PaControlModel::rowCount(const QModelIndex & parent) const {
+ Q_UNUSED(parent);
+ return m_controls.count();
+}
+
+bool PaControlModel::setData(const QModelIndex &index, const QVariant &value, int role) {
+ if (index.row() < 0 || index.row() >= m_controls.count())
+ return false;
+ PaControl &control = m_controls[index.row()];
+ if (role == CIndexRole)
+ control.setCIndex(value);
+ else if (role == DescRole)
+ control.setDesc(value);
+ else if (role == TypeRole)
+ control.setType(value);
+ else if (role == ChannelRole)
+ control.setChannel(value);
+ else if (role == CDescRole)
+ control.setCDesc(value);
+ else if (role == VolumeRole)
+ control.setVolume(pa_ctx, value);
+ emit dataChanged(index, index);
+ return true;
+}
+
+QVariant PaControlModel::data(const QModelIndex & index, int role) const {
+ if (index.row() < 0 || index.row() >= m_controls.count())
+ return QVariant();
+
+ const PaControl &control = m_controls[index.row()];
+ if (role == CIndexRole)
+ return control.cindex();
+ else if (role == DescRole)
+ return control.desc();
+ else if (role == TypeRole)
+ return control.type();
+ else if (role == ChannelRole)
+ return control.channel();
+ else if (role == CDescRole)
+ return control.cdesc();
+ else if (role == VolumeRole)
+ return control.volume();
+ return QVariant();
+}
+
+Qt::ItemFlags PaControlModel::flags(const QModelIndex &index) const
+{
+ if (!index.isValid())
+ return Qt::ItemIsEnabled;
+
+ return QAbstractListModel::flags(index) | Qt::ItemIsEditable;
+}
+
+QHash<int, QByteArray> PaControlModel::roleNames() const {
+ QHash<int, QByteArray> roles;
+ roles[CIndexRole] = "cindex";
+ roles[DescRole] = "desc";
+ roles[TypeRole] = "type";
+ roles[ChannelRole] = "channel";
+ roles[CDescRole] = "cdesc";
+ roles[VolumeRole] = "volume";
+ return roles;
+}