Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 7 additions & 1 deletion src/common/iflytek_ai_assistant.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,19 @@
#include <QJsonArray>
#include <QJsonParseError>

#include <DSysInfo>

Check warning on line 25 in src/common/iflytek_ai_assistant.cpp

View workflow job for this annotation

GitHub Actions / cppcheck

Include file: <DSysInfo> not found. Please note: Cppcheck does not need standard library headers to get proper results.

Check warning on line 25 in src/common/iflytek_ai_assistant.cpp

View workflow job for this annotation

GitHub Actions / static-check / static-check

Include file: <DSysInfo> not found. Please note: Cppcheck does not need standard library headers to get proper results.

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 {
Expand Down
79 changes: 13 additions & 66 deletions src/editor/dtextedit.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down Expand Up @@ -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<QVariant> 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<QVariant> 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
Expand All @@ -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
Expand Down
6 changes: 1 addition & 5 deletions src/editor/dtextedit.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
Loading