#ifndef PROTOCOL_H #define PROTOCOL_H #include #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, kListeningModeRealtime // 需要 AEC 支持 }; class Protocol { public: virtual ~Protocol() = default; inline int server_sample_rate() const { return server_sample_rate_; } inline int server_frame_duration() const { return server_frame_duration_; } inline const std::string& session_id() const { return session_id_; } void OnIncomingAudio(std::function&& data)> callback); void OnIncomingJson(std::function callback); void OnAudioChannelOpened(std::function callback); void OnAudioChannelClosed(std::function callback); void OnNetworkError(std::function callback); virtual void Start() = 0; virtual bool OpenAudioChannel() = 0; virtual void CloseAudioChannel() = 0; virtual bool IsAudioChannelOpened() const = 0; virtual bool IsAudioChannelBusy() const; virtual void SendAudio(const std::vector& data) = 0; virtual void SendWakeWordDetected(const std::string& wake_word); virtual void SendStartListening(ListeningMode mode); virtual void SendStopListening(); virtual void SendAbortSpeaking(AbortReason reason); virtual void SendIotDescriptors(const std::string& descriptors); virtual void SendIotStates(const std::string& states); protected: std::function on_incoming_json_; std::function&& data)> on_incoming_audio_; std::function on_audio_channel_opened_; std::function on_audio_channel_closed_; std::function on_network_error_; int server_sample_rate_ = 24000; int server_frame_duration_ = 60; bool error_occurred_ = false; bool busy_sending_audio_ = false; std::string session_id_; std::chrono::time_point last_incoming_time_; virtual bool SendText(const std::string& text) = 0; virtual void SetError(const std::string& message); virtual bool IsTimeout() const; }; #endif // PROTOCOL_H