From f7d0bf5c7dfd194b3d286e68c111cf2df2e8ae5b Mon Sep 17 00:00:00 2001 From: Liu Jinchang Date: Fri, 19 Dec 2025 13:46:17 +0800 Subject: [PATCH] fix: [Audio] Unify audio device detection and adapt DBus service for Qt version MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This commit consolidates the duplicate audio device detection logic and adapts the DBus service selection based on Qt version: 1. In iflytek_ai_assistant.cpp: - Add Qt version check to select appropriate DBus service - Qt >= 6.0: uses "org.deepin.dde.Audio1" (new DDE audio service) - Qt < 6.0: uses "com.deepin.daemon.Audio" (legacy audio service) 2. In dtextedit.cpp: - Remove duplicate checkAudioOutputDevice() and checkAudioInputDevice() methods - Update onAudioPortEnabledChanged() to use IflytekAiAssistant's unified methods - Add Qt version check for DBus signal connection to PortEnabledChanged 3. In dtextedit.h: - Remove declarations of checkAudioOutputDevice() and checkAudioInputDevice() This refactoring eliminates code duplication by using IflytekAiAssistant as the single source of truth for audio device detection, improving maintainability and ensuring consistent behavior across the application. 本次提交整合了重复的音频设备检测逻辑,并根据Qt版本适配不同的DBus服务: 1. iflytek_ai_assistant.cpp: - 添加Qt版本判断来选择合适的DBus服务 - Qt >= 6.0: 使用 "org.deepin.dde.Audio1" (新版DDE音频服务) - Qt < 6.0: 使用 "com.deepin.daemon.Audio" (旧版音频服务) 2. dtextedit.cpp: - 删除重复的 checkAudioOutputDevice() 和 checkAudioInputDevice() 方法 - 修改 onAudioPortEnabledChanged() 使用 IflytekAiAssistant 的统一方法 - 为 PortEnabledChanged 信号连接添加Qt版本判断 3. dtextedit.h: - 删除 checkAudioOutputDevice() 和 checkAudioInputDevice() 的声明 此次重构消除了代码重复,使用 IflytekAiAssistant 作为音频设备检测的唯一 入口,提高了代码可维护性并确保应用程序行为的一致性。 Log: fix: [Audio] Unify audio device detection and adapt DBus service for Qt version --- src/common/iflytek_ai_assistant.cpp | 8 ++- src/editor/dtextedit.cpp | 79 +++++------------------------ src/editor/dtextedit.h | 6 +-- 3 files changed, 21 insertions(+), 72 deletions(-) diff --git a/src/common/iflytek_ai_assistant.cpp b/src/common/iflytek_ai_assistant.cpp index e50a53d54..b7a281d65 100644 --- a/src/common/iflytek_ai_assistant.cpp +++ b/src/common/iflytek_ai_assistant.cpp @@ -25,10 +25,16 @@ #include namespace { -// DDE音频服务常量 +// DDE音频服务常量 (根据Qt版本选择不同的DBus服务) +#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)) const QString AUDIO_SERVICE = "org.deepin.dde.Audio1"; const QString AUDIO_PATH = "/org/deepin/dde/Audio1"; const QString AUDIO_INTERFACE = "org.deepin.dde.Audio1"; +#else +const QString AUDIO_SERVICE = "com.deepin.daemon.Audio"; +const QString AUDIO_PATH = "/com/deepin/daemon/Audio"; +const QString AUDIO_INTERFACE = "com.deepin.daemon.Audio"; +#endif // 端口方向枚举 enum PortDirection { diff --git a/src/editor/dtextedit.cpp b/src/editor/dtextedit.cpp index ba5135c4c..7f74a08f4 100644 --- a/src/editor/dtextedit.cpp +++ b/src/editor/dtextedit.cpp @@ -141,11 +141,18 @@ TextEdit::TextEdit(QWidget *parent) break; } - // 连接音频设备状态变化信号 + // 连接音频设备状态变化信号 (根据Qt版本选择不同的DBus服务) +#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)) + dbus.sessionBus().connect("org.deepin.dde.Audio1", + "/org/deepin/dde/Audio1", "org.deepin.dde.Audio1", + "PortEnabledChanged", + this, SLOT(onAudioPortEnabledChanged(quint32, QString, bool))); +#else dbus.sessionBus().connect("com.deepin.daemon.Audio", "/com/deepin/daemon/Audio", "com.deepin.daemon.Audio", "PortEnabledChanged", this, SLOT(onAudioPortEnabledChanged(quint32, QString, bool))); +#endif //初始化右键菜单 initRightClickedMenu(); @@ -9241,77 +9248,17 @@ void TextEdit::onTextContentChanged(int from, int charsRemoved, int charsAdded) } } -bool TextEdit::checkAudioOutputDevice() -{ - QDBusMessage msg = QDBusMessage::createMethodCall("com.deepin.daemon.Audio", - "/com/deepin/daemon/Audio", - "org.freedesktop.DBus.Properties", - "Get"); - msg << QString("com.deepin.daemon.Audio") << QString("CardsWithoutUnavailable"); - - QDBusReply reply = QDBusConnection::sessionBus().call(msg); - if (reply.isValid()) { - QJsonDocument doc = QJsonDocument::fromJson(reply.value().toByteArray()); - QJsonArray cards = doc.array(); - - // 检查是否有启用的输出设备 (Direction=1) - for (const QJsonValue &cardValue : cards) { - QJsonObject card = cardValue.toObject(); - QJsonArray ports = card["Ports"].toArray(); - - for (const QJsonValue &portValue : ports) { - QJsonObject port = portValue.toObject(); - if (port["Direction"].toInt() == 1 && port["Enabled"].toBool()) { - return true; // 找到启用的输出设备 - } - } - } - } - - return false; -} - -bool TextEdit::checkAudioInputDevice() -{ - QDBusMessage msg = QDBusMessage::createMethodCall("com.deepin.daemon.Audio", - "/com/deepin/daemon/Audio", - "org.freedesktop.DBus.Properties", - "Get"); - msg << QString("com.deepin.daemon.Audio") << QString("CardsWithoutUnavailable"); - - QDBusReply reply = QDBusConnection::sessionBus().call(msg); - if (reply.isValid()) { - QJsonDocument doc = QJsonDocument::fromJson(reply.value().toByteArray()); - QJsonArray cards = doc.array(); - - // 检查是否有启用的输出设备 (Direction=2) - for (const QJsonValue &cardValue : cards) { - QJsonObject card = cardValue.toObject(); - QJsonArray ports = card["Ports"].toArray(); - - for (const QJsonValue &portValue : ports) { - QJsonObject port = portValue.toObject(); - if (port["Direction"].toInt() == 2 && port["Enabled"].toBool()) { - return true; // 找到启用的输入设备 - } - } - } - } - - return false; -} - void TextEdit::onAudioPortEnabledChanged(quint32 cardId, const QString &portName, bool enabled) { Q_UNUSED(cardId) Q_UNUSED(portName) - + // 只处理设备被禁用的情况 if (!enabled) { // 检查是否还有可用的输出设备和输入设备 - bool hasOutputDevice = checkAudioOutputDevice(); - bool hasInputDevice = checkAudioInputDevice(); - + bool hasOutputDevice = IflytekAiAssistant::instance()->hasAudioOutputDevice(); + bool hasInputDevice = IflytekAiAssistant::instance()->hasAudioInputDevice(); + // 如果所有输出设备都被禁用,显示输出设备提示 if (!hasOutputDevice) { #ifdef DTKWIDGET_CLASS_DSizeMode @@ -9320,7 +9267,7 @@ void TextEdit::onAudioPortEnabledChanged(quint32 cardId, const QString &portName DMessageManager::instance()->sendMessage(this, QIcon(":/images/warning.svg"), tr("No audio output device was detected. Please ensure your speakers or headphones are properly connected and try again.")); #endif } - + // 如果所有输入设备都被禁用,显示输入设备提示 if (!hasInputDevice) { #ifdef DTKWIDGET_CLASS_DSizeMode diff --git a/src/editor/dtextedit.h b/src/editor/dtextedit.h index f770df0b3..f93dce1cb 100644 --- a/src/editor/dtextedit.h +++ b/src/editor/dtextedit.h @@ -532,11 +532,7 @@ public slots: void slotVoiceReadingAction(bool checked = false); bool slotStopReadingAction(bool checked = false); void slotdictationAction(bool checked = false); - - // 音频设备检测方法 - bool checkAudioOutputDevice(); - bool checkAudioInputDevice(); - + // 音频设备状态监听槽函数 void onAudioPortEnabledChanged(quint32 cardId, const QString &portName, bool enabled); void slotColumnEditAction(bool checked = false);