小智聊天机器人应用层头文件application.h解析

  1. 小智聊天机器人应用层头文件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_

  1. 这段代码是一个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_EVENT1(二进制 0001
  • AUDIO_INPUT_READY_EVENT2(二进制 0010
  • AUDIO_OUTPUT_READY_EVENT4(二进制 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 类,它是一个单例类,负责管理设备状态、音频处理、任务调度等功能。通过宏定义、枚举类型和私有成员变量,代码实现了对设备状态的管理、音频的编码解码、任务的调度等功能。公共成员函数提供了对外的接口,而私有成员函数和变量则用于内部实现。