From 091bc92282fd07e989747ca23157f7af5113c723 Mon Sep 17 00:00:00 2001 From: luoqing Date: Fri, 8 Sep 2023 15:53:56 +0800 Subject: [PATCH] fix(audio):The Sink/Source device list displays only active ports. The port selection function is temporarily disabled MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 输入输出设备列表只显示目前已激活的端口,暂时禁用选择端口的功能 Related #13261 --- .../audio/src/dbus/audio-device-interface.cpp | 33 +++++++++ .../audio/src/dbus/audio-device-interface.h | 9 +++ plugins/audio/src/plugin/input-page.cpp | 69 +++++++------------ plugins/audio/src/plugin/input-page.h | 1 - plugins/audio/src/plugin/output-page.cpp | 62 ++++++----------- plugins/audio/src/plugin/output-page.h | 1 - 6 files changed, 89 insertions(+), 86 deletions(-) diff --git a/plugins/audio/src/dbus/audio-device-interface.cpp b/plugins/audio/src/dbus/audio-device-interface.cpp index a3a750f..7ec201d 100644 --- a/plugins/audio/src/dbus/audio-device-interface.cpp +++ b/plugins/audio/src/dbus/audio-device-interface.cpp @@ -13,6 +13,7 @@ */ #include "audio-device-interface.h" +#include /* * Implementation of interface class AudioDeviceInterface @@ -28,6 +29,38 @@ AudioDeviceInterface::~AudioDeviceInterface() { } +QList AudioDeviceInterface::getPortsInfo() +{ + QDBusPendingReply getPorts = GetPorts(); + KLOG_DEBUG() << "getPorts:" << getPorts; + + //解析默认sink的端口信息 + QJsonParseError jsonParseError; + QJsonDocument doc = QJsonDocument::fromJson(getPorts.value().toUtf8(), &jsonParseError); + + if((doc.isNull()) || (jsonParseError.error != QJsonParseError::NoError)) + { + return QList(); + } + + QList portInfoList; + if (doc.isArray() && jsonParseError.error == QJsonParseError::NoError) + { + QJsonArray array = doc.array(); + for (int i = 0; i < array.count(); ++i) + { + QJsonObject object = array.at(i).toObject(); + AudioPortInfo portInfo; + portInfo.description = object.value("description").toString(); + portInfo.name = object.value("name").toString(); + portInfo.priority = object.value("priority").toDouble(); + portInfoList << portInfo; + } + } + + return portInfoList; +} + void sendPropertyChangedDetailSignal(AudioDeviceInterface *ptr, const QString &propertyName, QVariant value) { if (propertyName == QStringLiteral("active_port")) diff --git a/plugins/audio/src/dbus/audio-device-interface.h b/plugins/audio/src/dbus/audio-device-interface.h index 29fbe6d..8bea01a 100644 --- a/plugins/audio/src/dbus/audio-device-interface.h +++ b/plugins/audio/src/dbus/audio-device-interface.h @@ -26,6 +26,13 @@ #include #include "audio-device-interface.h" +struct AudioPortInfo +{ + QString description; + QString name; + double priority; +}; + /* * Proxy class for interface com.kylinsec.Kiran.SessionDaemon.Audio.Device */ @@ -103,6 +110,8 @@ public: return qvariant_cast(property("volume")); } + QList getPortsInfo(); + public Q_SLOTS: // METHODS inline QDBusPendingReply GetPorts() { diff --git a/plugins/audio/src/plugin/input-page.cpp b/plugins/audio/src/plugin/input-page.cpp index 8b0ecaa..11275ec 100644 --- a/plugins/audio/src/plugin/input-page.cpp +++ b/plugins/audio/src/plugin/input-page.cpp @@ -198,48 +198,28 @@ void InputPage::initInputDevice() void InputPage::initActivedPort() { - QDBusPendingReply getPorts = m_defaultSource->GetPorts(); - KLOG_DEBUG() << "getPorts:" << getPorts; - //解析默认source的端口信息 - QJsonParseError jsonParseError; - QJsonDocument doc = QJsonDocument::fromJson(getPorts.value().toUtf8(), &jsonParseError); - if (!doc.isNull() && jsonParseError.error == QJsonParseError::NoError) - { - if (doc.isArray() && jsonParseError.error == QJsonParseError::NoError) - { - QJsonArray array = doc.array(); - for (int i = 0; i < array.count(); ++i) - { - KLOG_DEBUG() << "array.at(i)" << array.at(i); - QJsonObject object = array.at(i).toObject(); - QString description = object.value("description").toString(); - QString name = object.value("name").toString(); - double priority = object.value("priority").toDouble(); - KLOG_DEBUG() << "description" << description; - KLOG_DEBUG() << "name" << name; - KLOG_DEBUG() << "priority" << priority; - - ui->inputDevices->insertItem(i, description); - ui->inputDevices->setItemData(i, name, Qt::UserRole); //激活端口所需信息 - //获取已激活的端口在comobox中的index - if (m_defaultSource->active_port() == name) - { - m_defaultDeviceIndex = i; - KLOG_DEBUG() << "m_defaultDeviceIndex" << m_defaultDeviceIndex; - } - } - } - //默认选中已激活的端口 - m_isValidPort = true; - ui->inputDevices->setCurrentIndex(m_defaultDeviceIndex); - ui->inputDevices->setEnabled(true); - ui->volumeSetting->setEnabled(true); - } - else + QList portsInfo = m_defaultSource->getPortsInfo(); + + if(portsInfo.isEmpty()) { KLOG_DEBUG() << "ports is null"; disableSettings(); + return; } + + Q_FOREACH (auto portInfo, portsInfo) + { + if(m_defaultSource->active_port() == portInfo.name) + { + ui->inputDevices->addItem(portInfo.description,portInfo.name); + break; + } + } + + //默认选中已激活的端口 + m_isValidPort = true; + ui->inputDevices->setEnabled(true); + ui->volumeSetting->setEnabled(true); } void InputPage::initInputSettins() @@ -304,13 +284,16 @@ void InputPage::disableSettings() void InputPage::handleActivePortChanged(const QString &value) { KLOG_DEBUG() << "handleActivePortChanged :" << value; - for (int i = 0; i < ui->inputDevices->count(); ++i) + + QList portsInfo = m_defaultSource->getPortsInfo(); + + Q_FOREACH (auto portInfo, portsInfo) { - QString name = ui->inputDevices->itemData(i, Qt::UserRole).toString(); - if (name == value) + if(m_defaultSource->active_port() == portInfo.name) { - ui->inputDevices->setCurrentIndex(i); - KLOG_DEBUG() << "handleActivePortChanged setCurrentIndex " << i; + ui->inputDevices->clear(); + ui->inputDevices->addItem(portInfo.description,portInfo.name); + break; } } } diff --git a/plugins/audio/src/plugin/input-page.h b/plugins/audio/src/plugin/input-page.h index 3b57daf..e9f6909 100644 --- a/plugins/audio/src/plugin/input-page.h +++ b/plugins/audio/src/plugin/input-page.h @@ -91,7 +91,6 @@ private: AudioDeviceInterface *m_activedSource; QMap m_inputDevicesMap; int m_defaultSourceIndex; - int m_defaultDeviceIndex; bool m_isValidPort = false; QAudioInput *m_audioInput = nullptr; diff --git a/plugins/audio/src/plugin/output-page.cpp b/plugins/audio/src/plugin/output-page.cpp index 420cf98..1242b8a 100644 --- a/plugins/audio/src/plugin/output-page.cpp +++ b/plugins/audio/src/plugin/output-page.cpp @@ -93,47 +93,25 @@ void OutputPage::initOutputDevice() void OutputPage::initActivedPort() { - QDBusPendingReply getPorts = m_defaultSink->GetPorts(); - KLOG_DEBUG() << "getPorts:" << getPorts; - - //解析默认sink的端口信息 - QJsonParseError jsonParseError; - QJsonDocument doc = QJsonDocument::fromJson(getPorts.value().toUtf8(), &jsonParseError); - if (!doc.isNull() && jsonParseError.error == QJsonParseError::NoError) - { - if (doc.isArray() && jsonParseError.error == QJsonParseError::NoError) - { - QJsonArray array = doc.array(); - for (int i = 0; i < array.count(); ++i) - { - KLOG_DEBUG() << "array.at(i)" << array.at(i); - QJsonObject object = array.at(i).toObject(); - QString description = object.value("description").toString(); - QString name = object.value("name").toString(); - double priority = object.value("priority").toDouble(); - KLOG_DEBUG() << "description" << description; - KLOG_DEBUG() << "name" << name; - KLOG_DEBUG() << "priority" << priority; - ui->outputDevices->insertItem(i, description); - ui->outputDevices->setItemData(i, name, Qt::UserRole); //激活端口所需信息 - - //获取已激活的端口在comobox中的index - if (m_defaultSink->active_port() == name) - { - m_defaultDeviceIndex = i; - } - } - } - //默认选中已激活的端口 - ui->outputDevices->setCurrentIndex(m_defaultDeviceIndex); - initOutputSettins(); - } - else + QList portsInfo = m_defaultSink->getPortsInfo(); + if(portsInfo.isEmpty()) { //无激活端口则禁用音量设置和平衡 KLOG_DEBUG() << "default sink ports is null"; disableSettings(); + return; } + + Q_FOREACH (auto portInfo, portsInfo) + { + if(m_defaultSink->active_port() == portInfo.name) + { + ui->outputDevices->addItem(portInfo.description,portInfo.name); + break; + } + } + + initOutputSettins(); } void OutputPage::initOutputSettins() @@ -202,13 +180,15 @@ void OutputPage::initConnect() void OutputPage::handleActivePortChanged(const QString &value) { KLOG_DEBUG() << "handleActivePortChanged :" << value; - for (int i = 0; i < ui->outputDevices->count(); ++i) + QList portsInfo = m_defaultSink->getPortsInfo(); + + Q_FOREACH (auto portInfo, portsInfo) { - QString name = ui->outputDevices->itemData(i, Qt::UserRole).toString(); - if (name == value) + if(m_defaultSink->active_port() == portInfo.name) { - ui->outputDevices->setCurrentIndex(i); - KLOG_DEBUG() << "handleActivePortChanged setCurrentIndex " << i; + ui->outputDevices->clear(); + ui->outputDevices->addItem(portInfo.description,portInfo.name); + break; } } } diff --git a/plugins/audio/src/plugin/output-page.h b/plugins/audio/src/plugin/output-page.h index abaf9a1..dea45e7 100644 --- a/plugins/audio/src/plugin/output-page.h +++ b/plugins/audio/src/plugin/output-page.h @@ -61,7 +61,6 @@ private: AudioInterface *m_audioInterface; QMap m_outputDevicesMap; AudioDeviceInterface *m_defaultSink; - int m_defaultDeviceIndex; QDBusServiceWatcher *m_dbusServiceWatcher; }; -- 2.33.0