- 小智聊天机器人应用层头文件application.h解析:
#define SCHEDULE_EVENT (1 << 0)
#define AUDIO_INPUT_READY_EVENT (1 << 1)
#define AUDIO_OUTPUT_READY_EVENT (1 << 2)
enum DeviceState {
kDeviceStateUnknown,
kDeviceStateStarting,
kDeviceStateWifiConfiguring,
kDeviceStateIdle,
kDeviceStateConnecting,
kDeviceStateListening,
kDeviceStateSpeaking,
kDeviceStateUpgrading,
kDeviceStateActivating,
kDeviceStateFatalError
};
#define OPUS_FRAME_DURATION_MS 60
class Application {
public:
static Application& GetInstance() {
static Application instance;
return instance;
}
// 删除拷贝构造函数和赋值运算符
Application(const Application&) = delete;
Application& operator=(const Application&) = delete;
void Start();
DeviceState GetDeviceState() const {
return device_state_; }
bool IsVoiceDetected() const {
return voice_detected_; }
void Schedule(std::function<void()> callback);
void SetDeviceState(DeviceState state);
void Alert(const char* status, const char* message, const char* emotion = "", const std::string_view& sound = "");
void AbortSpeaking(AbortReason reason);
void ToggleChatState();
void StartListening();
void StopListening();
void UpdateIotStates();
void Reboot();
void WakeWordInvoke(const std::string& wake_word);
private:
Application();
~Application();
#if CONFIG_USE_AUDIO_PROCESSING
WakeWordDetect wake_word_detect_;
AudioProcessor audio_processor_;
#endif
Ota ota_;
std::mutex mutex_;
std::list<std::function<void()>> main_tasks_;
std::unique_ptr<Protocol> protocol_;
EventGroupHandle_t event_group_;
volatile DeviceState device_state_ = kDeviceStateUnknown;
bool keep_listening_ = false;
bool aborted_ = false;
bool voice_detected_ = false;
std::string last_iot_states_;
// Audio encode / decode
BackgroundTask* background_task_ = nullptr;
std::chrono::steady_clock::time_point last_output_time_;
std::list<std::vector<uint8_t>> audio_decode_queue_;
std::unique_ptr<OpusEncoderWrapper> opus_encoder_;
std::unique_ptr<OpusDecoderWrapper> opus_decoder_;
int opus_decode_sample_rate_ = -1;
OpusResampler input_resampler_;
OpusResampler reference_resampler_;
OpusResampler output_resampler_;
void MainLoop();
void InputAudio();
void OutputAudio();
void ResetDecoder();
void SetDecodeSampleRate(int sample_rate);
void CheckNewVersion();
void ShowActivationCode();
void PlayLocalFile(const char* data, size_t size);
};
#endif // _APPLICATION_H_
- 这段代码是一个C++类的定义,名为
Application
,它似乎是一个应用程序的核心类,负责管理设备状态、音频处理、任务调度等功能。下面我将详细解释代码的各个部分。
宏定义
#define SCHEDULE_EVENT (1 << 0)
#define AUDIO_INPUT_READY_EVENT (1 << 1)
#define AUDIO_OUTPUT_READY_EVENT (1 << 2)
这些宏定义用于表示不同的事件标志。1 << n
表示将数字1左移n位,因此:
SCHEDULE_EVENT
是1
(二进制0001
)AUDIO_INPUT_READY_EVENT
是2
(二进制0010
)AUDIO_OUTPUT_READY_EVENT
是4
(二进制0100
)
这些标志通常用于事件处理或状态管理中,可以通过位操作来设置或检查这些标志。
枚举类型 DeviceState
enum DeviceState {
kDeviceStateUnknown,
kDeviceStateStarting,
kDeviceStateWifiConfiguring,
kDeviceStateIdle,
kDeviceStateConnecting,
kDeviceStateListening,
kDeviceStateSpeaking,
kDeviceStateUpgrading,
kDeviceStateActivating,
kDeviceStateFatalError
};
这个枚举类型定义了设备可能的状态。每个状态表示设备在某个特定时刻的行为或状态,例如:
kDeviceStateUnknown
:设备状态未知。kDeviceStateStarting
:设备正在启动。kDeviceStateListening
:设备正在监听音频输入。kDeviceStateFatalError
:设备遇到致命错误。
宏定义 OPUS_FRAME_DURATION_MS
#define OPUS_FRAME_DURATION_MS 60
这个宏定义了Opus编码器的帧持续时间,单位为毫秒。Opus是一种音频编码格式,通常用于语音和音频压缩。
Application
类
Application
类是一个单例类,负责管理应用程序的核心功能。
单例模式
static Application& GetInstance() {
static Application instance;
return instance;
}
GetInstance
方法返回 Application
类的唯一实例。由于 instance
是静态的,因此它只会在第一次调用 GetInstance
时被创建,并在程序结束时销毁。
删除拷贝构造函数和赋值运算符
Application(const Application&) = delete;
Application& operator=(const Application&) = delete;
这两行代码删除了拷贝构造函数和赋值运算符,确保 Application
类不能被复制或赋值,进一步保证了单例模式的正确性。
公共成员函数
void Start();
DeviceState GetDeviceState() const {
return device_state_; }
bool IsVoiceDetected() const {
return voice_detected_; }
void Schedule(std::function<void()> callback);
void SetDeviceState(DeviceState state);
void Alert(const char* status, const char* message, const char* emotion = "", const std::string_view& sound = "");
void AbortSpeaking(AbortReason reason);
void ToggleChatState();
void StartListening();
void StopListening();
void UpdateIotStates();
void Reboot();
void WakeWordInvoke(const std::string& wake_word);
这些是 Application
类的公共成员函数,提供了对外的接口,例如:
Start()
:启动应用程序。GetDeviceState()
:获取当前设备状态。Schedule()
:调度一个任务,该任务将在主循环中执行。SetDeviceState()
:设置设备状态。Alert()
:触发一个警报,可能用于通知用户某些事件。AbortSpeaking()
:中止当前的语音输出。ToggleChatState()
:切换聊天状态。StartListening()
和StopListening()
:开始或停止监听音频输入。Reboot()
:重启设备。WakeWordInvoke()
:触发唤醒词检测。
私有成员变量
private:
Application();
~Application();
#if CONFIG_USE_AUDIO_PROCESSING
WakeWordDetect wake_word_detect_;
AudioProcessor audio_processor_;
#endif
Ota ota_;
std::mutex mutex_;
std::list<std::function<void()>> main_tasks_;
std::unique_ptr<Protocol> protocol_;
EventGroupHandle_t event_group_;
volatile DeviceState device_state_ = kDeviceStateUnknown;
bool keep_listening_ = false;
bool aborted_ = false;
bool voice_detected_ = false;
std::string last_iot_states_;
// Audio encode / decode
BackgroundTask* background_task_ = nullptr;
std::chrono::steady_clock::time_point last_output_time_;
std::list<std::vector<uint8_t>> audio_decode_queue_;
std::unique_ptr<OpusEncoderWrapper> opus_encoder_;
std::unique_ptr<OpusDecoderWrapper> opus_decoder_;
int opus_decode_sample_rate_ = -1;
OpusResampler input_resampler_;
OpusResampler reference_resampler_;
OpusResampler output_resampler_;
这些是 Application
类的私有成员变量,包括:
wake_word_detect_
和audio_processor_
:用于音频处理的组件,仅在CONFIG_USE_AUDIO_PROCESSING
宏定义时存在。ota_
:用于固件升级的对象。mutex_
:用于线程同步的互斥锁。main_tasks_
:存储主循环中待执行的任务列表。protocol_
:用于通信协议的抽象。event_group_
:用于事件管理的事件组句柄。device_state_
:当前设备状态。voice_detected_
:表示是否检测到语音。opus_encoder_
和opus_decoder_
:用于Opus音频编码和解码的封装类。opus_decode_sample_rate_
:解码器的采样率。input_resampler_
、reference_resampler_
和output_resampler_
:用于音频重采样的对象。
私有成员函数
void MainLoop();
void InputAudio();
void OutputAudio();
void ResetDecoder();
void SetDecodeSampleRate(int sample_rate);
void CheckNewVersion();
void ShowActivationCode();
void PlayLocalFile(const char* data, size_t size);
这些是 Application
类的私有成员函数,通常用于内部实现,例如:
MainLoop()
:主循环,负责处理任务和事件。InputAudio()
和OutputAudio()
:处理音频输入和输出。ResetDecoder()
:重置音频解码器。CheckNewVersion()
:检查是否有新版本可用。ShowActivationCode()
:显示激活码。PlayLocalFile()
:播放本地音频文件。
总结
这段代码定义了一个 Application
类,它是一个单例类,负责管理设备状态、音频处理、任务调度等功能。通过宏定义、枚举类型和私有成员变量,代码实现了对设备状态的管理、音频的编码解码、任务的调度等功能。公共成员函数提供了对外的接口,而私有成员函数和变量则用于内部实现。