#ifndef PROTOCOL_H #define PROTOCOL_H #include #include #include struct BinaryProtocol3 { uint8_t type; uint8_t reserved; uint16_t payload_size; uint8_t payload[]; } __attribute__((packed)); enum AbortReason { kAbortReasonNone, kAbortReasonWakeWordDetected }; enum ListeningMode { kListeningModeAutoStop, kListeningModeManualStop, kListeningModeAlwaysOn // 需要 AEC 支持 }; class Protocol { public: virtual ~Protocol() = default; inline int server_sample_rate() const { return server_sample_rate_; } void OnIncomingAudio(std::function callback); void OnIncomingJson(std::function callback); void OnAudioChannelOpened(std::function callback); void OnAudioChannelClosed(std::function callback); void OnNetworkError(std::function callback); virtual bool OpenAudioChannel() = 0; virtual void CloseAudioChannel() = 0; virtual bool IsAudioChannelOpened() const = 0; virtual void SendAudio(const std::string& data) = 0; virtual void SendWakeWordDetected(const std::string& wake_word); virtual void SendStartListening(ListeningMode mode); virtual void SendStopListening(); virtual void SendAbortSpeaking(AbortReason reason); protected: std::function on_incoming_json_; std::function on_incoming_audio_; std::function on_audio_channel_opened_; std::function on_audio_channel_closed_; std::function on_network_error_; int server_sample_rate_ = 16000; std::string session_id_; virtual void SendText(const std::string& text) = 0; }; #endif // PROTOCOL_H