199 lines
4.9 KiB
C++
199 lines
4.9 KiB
C++
#ifndef CCAudio_H
|
||
#define CCAudio_H
|
||
#pragma once
|
||
#include "basic/CC.h"
|
||
#include "portaudio.h"
|
||
|
||
|
||
/**
|
||
* 音频设备信息结构体
|
||
*/
|
||
struct AudioDeviceInfo {
|
||
std::string name;
|
||
unsigned int index;
|
||
unsigned int Channels;
|
||
PaDeviceInfo * deviceInfo = nullptr;
|
||
};
|
||
|
||
/**
|
||
* 音频类型枚举
|
||
*/
|
||
enum AudioType
|
||
{
|
||
Capture,
|
||
Render
|
||
};
|
||
|
||
/**
|
||
* 音频流和参数的类型定义
|
||
*/
|
||
typedef PaStream AudioStream;
|
||
typedef PaStreamParameters AudioParameter;
|
||
|
||
/**
|
||
* CCMultimedia命名空间,包含音频处理相关类和函数
|
||
*/
|
||
namespace CTL::Multimedia {
|
||
/**
|
||
* 初始化音频系统
|
||
* @return 成功返回true,否则返回false
|
||
*/
|
||
bool Init();
|
||
|
||
/**
|
||
* 释放音频系统资源
|
||
*/
|
||
void Release();
|
||
|
||
struct StreamParameters {
|
||
PaDeviceIndex device = 0;
|
||
int channelCount = 1;
|
||
PaSampleFormat sampleFormat = paInt16;
|
||
PaTime suggestedLatency{};
|
||
void *hostApiSpecificStreamInfo = nullptr;
|
||
};
|
||
struct StreamInfo {
|
||
PaStreamCallback *streamCallback = nullptr;
|
||
double sampleRate = 48000;
|
||
unsigned long framesPerBuffer = 2048;
|
||
PaStreamFlags streamFlags = paNoFlag;
|
||
void *userData = nullptr;
|
||
};
|
||
enum Format {
|
||
F32 = paFloat32,
|
||
I16 = paInt16,
|
||
I24 = paInt24,
|
||
I32 = paInt32,
|
||
U8 = paUInt8,
|
||
I8 = paInt8,
|
||
S8_U8 = paCustomFormat,
|
||
};
|
||
|
||
/**
|
||
* CCAudio类,处理音频捕获和回放
|
||
*/
|
||
class Audio
|
||
{
|
||
// 计算两个字符串的Levenshtein距离
|
||
static int CalculateLevenshteinDistance(const std::string& s1, const std::string& s2);
|
||
// 检查两个设备名称是否相似
|
||
static bool IsDeviceNameSimilar(const std::string& name1, const std::string& name2, int threshold = 3);
|
||
public:
|
||
Audio() = default;
|
||
|
||
/**
|
||
* 构造函数,指定音频类型
|
||
* @param type 音频类型,Capture或Render
|
||
*/
|
||
explicit Audio(AudioType type);
|
||
|
||
/**
|
||
* 析构函数
|
||
*/
|
||
~Audio();
|
||
|
||
/**
|
||
* 打开音频流
|
||
* @param info 流信息
|
||
* @return 成功返回true,否则返回false
|
||
*/
|
||
bool SetStream(const StreamInfo* info);
|
||
|
||
/**
|
||
* 启动音频流
|
||
* @param info 流信息
|
||
* @return 成功返回true,否则返回false
|
||
*/
|
||
bool Start(const StreamInfo* info = nullptr);
|
||
|
||
/**
|
||
* 停止音频流
|
||
* @return 成功返回true,否则返回false
|
||
*/
|
||
bool Stop();
|
||
|
||
/**
|
||
* 从音频流读取数据
|
||
* @param buffer 数据缓冲区
|
||
* @param frames 帧数
|
||
* @return 成功返回true,否则返回false
|
||
*/
|
||
bool ReadStream(void *buffer,unsigned long frames);
|
||
|
||
/**
|
||
* 向音频流写入数据
|
||
* @param buffer 数据缓冲区
|
||
* @param frames 帧数
|
||
* @return 成功返回true,否则返回false
|
||
*/
|
||
bool WriteStream(void *buffer,unsigned long frames);
|
||
|
||
/**
|
||
* 获取音频流错误信息
|
||
* @return 错误信息字符串
|
||
*/
|
||
String GetStreamError();
|
||
|
||
/**
|
||
* 设置音频类型
|
||
* @param Type 音频类型,Capture或Render
|
||
*/
|
||
void SetMode(AudioType Type);
|
||
|
||
/**
|
||
* 设置睡眠时间
|
||
* @param ms 睡眠时间,单位毫秒,默认50
|
||
*/
|
||
void SetSleep(long ms = 50);
|
||
|
||
/**
|
||
* 设置音频流参数
|
||
* @param parameters 参数
|
||
*/
|
||
void SetStreamParameters(const StreamParameters* parameters);
|
||
|
||
/**
|
||
* 获取设备数量
|
||
* @return 设备数量
|
||
*/
|
||
static unsigned int GetDeviceCount();
|
||
|
||
/**
|
||
* 获取默认设备索引
|
||
* @param Type 音频类型,Capture或Render
|
||
* @return 默认设备索引
|
||
*/
|
||
static int GetDefaultDevice(AudioType Type);
|
||
|
||
/**
|
||
* 获取过滤后的音频设备信息列表
|
||
* @param type 音频类型,Capture或Render
|
||
* @return 音频设备信息列表
|
||
*/
|
||
static std::vector<AudioDeviceInfo> GetDevices(AudioType type);
|
||
|
||
/**
|
||
* 获取所有音频设备信息列表
|
||
* @param type 音频类型,Capture或Render
|
||
* @return 音频设备信息列表
|
||
*/
|
||
static std::vector<AudioDeviceInfo> GetDeviceAll(AudioType type);
|
||
|
||
/**
|
||
* 快速初始化流参数
|
||
* @param info 设备信息
|
||
* @return StreamParameters 流参数
|
||
*/
|
||
static StreamParameters GetParameters(const AudioDeviceInfo& info);
|
||
|
||
private:
|
||
PaStream *Stream{}; // 录音流和播放流
|
||
PaStreamParameters Parameters{};
|
||
AudioType Type = Render;
|
||
bool BassStart = false;
|
||
PaError error_{};
|
||
};
|
||
}
|
||
|
||
#endif
|