这是一次长久的提交:
1. 应用界面增加了返回主页的按钮 2. 修复了gif渲染内存泄漏的严重bug 3. 将PetDao当中的cJSON API替换为cpp_json,完美通过测试 4. 整合已经实现的各种上层建筑,实现了一个宠物对话基本业务应用,用于样品测试展示用 5. 重构了音频播放类,使其更modern,更加便于移植和拓展
This commit is contained in:
@@ -1,14 +1,12 @@
|
||||
//
|
||||
// Created by misaki on 2025/9/9.
|
||||
//
|
||||
|
||||
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <mutex>
|
||||
#include <functional>
|
||||
#include <string>
|
||||
#include <hal/i2s_types.h>
|
||||
|
||||
#include "ThreadManager.h"
|
||||
#include "SDFileManager.h"
|
||||
|
||||
@@ -88,7 +86,7 @@ public:
|
||||
* @param fileName 文件名
|
||||
* @param callback 回调函数
|
||||
*/
|
||||
void playAsync(const char* directory, const char* fileName, AudioCallback callback = nullptr);
|
||||
void playAsync(const char* directory, const char* fileName, const AudioCallback& callback = nullptr);
|
||||
|
||||
/**
|
||||
* 暂停播放
|
||||
@@ -175,6 +173,58 @@ public:
|
||||
*/
|
||||
bool isFinished() const;
|
||||
|
||||
/**
|
||||
* 播放 PCM 文件(阻塞)
|
||||
* @param filePath PCM 文件路径
|
||||
* @param sampleRate 采样率
|
||||
* @param bits 数据位宽
|
||||
* @param ch 插槽模式
|
||||
* @return 是否成功
|
||||
*/
|
||||
bool playPcmFile(const char* filePath,
|
||||
uint32_t sampleRate = 16000,
|
||||
i2s_data_bit_width_t bits = I2S_DATA_BIT_WIDTH_16BIT,
|
||||
i2s_slot_mode_t ch = I2S_SLOT_MODE_MONO);
|
||||
|
||||
// 异步播放 PCM 文件
|
||||
void playPcmFileAsync(const char* filePath,
|
||||
uint32_t sampleRate = 16000,
|
||||
i2s_data_bit_width_t bits = I2S_DATA_BIT_WIDTH_16BIT,
|
||||
i2s_slot_mode_t ch = I2S_SLOT_MODE_MONO,
|
||||
const AudioCallback& cb = nullptr);
|
||||
/**
|
||||
* 播放内存 PCM 流(阻塞)
|
||||
* @param pcmData PCM 数据
|
||||
* @param dataBytes 数据字节数
|
||||
* @param sampleRate 采样率
|
||||
* @param bits 数据位宽
|
||||
* @param ch 插槽模式
|
||||
* @return 是否成功
|
||||
*/
|
||||
bool playPcmStream(const uint8_t* pcmData,
|
||||
size_t dataBytes,
|
||||
uint32_t sampleRate = 16000,
|
||||
i2s_data_bit_width_t bits = I2S_DATA_BIT_WIDTH_16BIT,
|
||||
i2s_slot_mode_t ch = I2S_SLOT_MODE_MONO);
|
||||
|
||||
// 异步播放 PCM 流
|
||||
void playPcmStreamAsync(const uint8_t* pcmData,
|
||||
size_t dataBytes,
|
||||
uint32_t sampleRate = 16000,
|
||||
i2s_data_bit_width_t bits = I2S_DATA_BIT_WIDTH_16BIT,
|
||||
i2s_slot_mode_t ch = I2S_SLOT_MODE_MONO,
|
||||
const AudioCallback& cb = nullptr);
|
||||
|
||||
private:
|
||||
// 通用 PCM 播放实现
|
||||
void playPcmCommon(const void* source,
|
||||
size_t bytes,
|
||||
bool isFile,
|
||||
uint32_t sampleRate,
|
||||
i2s_data_bit_width_t bits,
|
||||
i2s_slot_mode_t ch,
|
||||
const AudioCallback& cb);
|
||||
|
||||
private:
|
||||
// 私有构造函数
|
||||
AudioOutput();
|
||||
@@ -184,7 +234,7 @@ private:
|
||||
ThreadConfig getThreadConfig(const char* operation);
|
||||
|
||||
// 内部播放实现
|
||||
void playInternal(const char* directory, const char* fileName, AudioCallback callback);
|
||||
void playInternal(const char* directory, const char* fileName, const AudioCallback& callback);
|
||||
|
||||
// 状态转换辅助方法
|
||||
void setState(AudioState newState);
|
||||
|
||||
Reference in New Issue
Block a user