103 lines
2.6 KiB
C++
103 lines
2.6 KiB
C++
//
|
|
// Created by misaki on 2025/12/29.
|
|
//
|
|
#pragma once
|
|
|
|
/**
|
|
* 本类为网络数据流会使用到的数据访问对象封装
|
|
* 目的是便于统一数据访问方式
|
|
* 同时屏蔽了端到端数据交换格式,使得上层调用不再需要关心数据格式,而只需要填入数据即可
|
|
*/
|
|
|
|
/**
|
|
* 简单描述一下Yosuga客户端所需要使用到的数据
|
|
* 主要为音频数据,控制信息,文本信息。
|
|
* 其中文本信息与音频数据为捆绑收发,并且其中还包括了一些特别的信息,例如音频时长等
|
|
* 控制信息与各种业务逻辑相关,例如模拟点击,模拟输入等
|
|
*/
|
|
|
|
#include <QObject>
|
|
#include <QString>
|
|
#include <QByteArray>
|
|
#include <QJsonObject>
|
|
#include <QJsonDocument>
|
|
#include <QScopedPointer>
|
|
#include <QMutex>
|
|
#include <functional>
|
|
|
|
/**
|
|
* 数据传输对象 (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<void(const QString& type, const QJsonObject& data)>;
|
|
|
|
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<NetworkDO> m_instance;
|
|
static QMutex m_mutex;
|
|
|
|
SenderFunc m_sender; // 注入的发送器
|
|
}; |