// // Created by misaki on 2025/12/29. // #pragma once /** * 本类为网络数据流会使用到的数据访问对象封装 * 目的是便于统一数据访问方式 * 同时屏蔽了端到端数据交换格式,使得上层调用不再需要关心数据格式,而只需要填入数据即可 */ /** * 简单描述一下Yosuga客户端所需要使用到的数据 * 主要为音频数据,控制信息,文本信息。 * 其中文本信息与音频数据为捆绑收发,并且其中还包括了一些特别的信息,例如音频时长等 * 控制信息与各种业务逻辑相关,例如模拟点击,模拟输入等 */ #include #include #include #include #include #include #include #include /** * 数据传输对象 (DTO) 定义 */ // 音频文本捆绑数据结构 struct AudioDataPacket { QString text; // 文本内容 QByteArray audioData; // 音频原始数据 (二进制) int sampleRate; // 采样率 int channels; // 通道数 qint64 duration; // 时长 (ms) AudioDataPacket() : sampleRate(16000), channels(1), duration(0) {} }; // 控制指令数据结构 (预留) enum class ControlType { Click, Input, Scroll }; struct ControlDataPacket { ControlType action; int x; int y; QString extraData; }; /** * NetworkDO */ class NetworkDO final : public QObject { Q_OBJECT Q_DISABLE_COPY(NetworkDO) // 禁用拷贝 public: // 单例访问点 static NetworkDO* getInstance(); // 显式销毁 static void destroy(); // 定义发送回调函数类型 using SenderFunc = std::function; public: // 注入发送接口 void registerSender(SenderFunc sender); // 业务发送函数 void sendAudioPacket(const AudioDataPacket& packet); void sendControlPacket(const ControlDataPacket& packet); signals: // 业务接收信号 void audioPacketReceived(const AudioDataPacket& packet); void controlPacketReceived(const ControlDataPacket& packet); void errorOccurred(const QString& errorMsg); public slots: // 接收底层 JSON 数据 void onDataReceived(const QString& type, const QJsonObject& data); public: ~NetworkDO() override; private: // 构造/析构函数私有化 explicit NetworkDO(QObject *parent = nullptr); // 内部处理逻辑 void handleAudioMessage(const QJsonObject& data); static QScopedPointer m_instance; static QMutex m_mutex; SenderFunc m_sender; // 注入的发送器 };