protocol.h 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. #ifndef PROTOCOL_H
  2. #define PROTOCOL_H
  3. #include <cJSON.h>
  4. #include <string>
  5. #include <functional>
  6. #include <chrono>
  7. #include <vector>
  8. struct AudioStreamPacket {
  9. int sample_rate = 0;
  10. int frame_duration = 0;
  11. uint32_t timestamp = 0;
  12. std::vector<uint8_t> payload;
  13. };
  14. struct BinaryProtocol2 {
  15. uint16_t version;
  16. uint16_t type; // Message type (0: OPUS, 1: JSON)
  17. uint32_t reserved; // Reserved for future use
  18. uint32_t timestamp; // Timestamp in milliseconds (used for server-side AEC)
  19. uint32_t payload_size; // Payload size in bytes
  20. uint8_t payload[]; // Payload data
  21. } __attribute__((packed));
  22. struct BinaryProtocol3 {
  23. uint8_t type;
  24. uint8_t reserved;
  25. uint16_t payload_size;
  26. uint8_t payload[];
  27. } __attribute__((packed));
  28. enum AbortReason {
  29. kAbortReasonNone,
  30. kAbortReasonWakeWordDetected
  31. };
  32. enum ListeningMode {
  33. kListeningModeAutoStop,
  34. kListeningModeManualStop,
  35. kListeningModeRealtime // 需要 AEC 支持
  36. };
  37. class Protocol {
  38. public:
  39. virtual ~Protocol() = default;
  40. inline int server_sample_rate() const {
  41. return server_sample_rate_;
  42. }
  43. inline int server_frame_duration() const {
  44. return server_frame_duration_;
  45. }
  46. inline const std::string& session_id() const {
  47. return session_id_;
  48. }
  49. void OnIncomingAudio(std::function<void(std::unique_ptr<AudioStreamPacket> packet)> callback);
  50. void OnIncomingJson(std::function<void(const cJSON* root)> callback);
  51. void OnAudioChannelOpened(std::function<void()> callback);
  52. void OnAudioChannelClosed(std::function<void()> callback);
  53. void OnNetworkError(std::function<void(const std::string& message)> callback);
  54. virtual bool Start() = 0;
  55. virtual bool OpenAudioChannel() = 0;
  56. virtual void CloseAudioChannel() = 0;
  57. virtual bool IsAudioChannelOpened() const = 0;
  58. virtual bool SendAudio(std::unique_ptr<AudioStreamPacket> packet) = 0;
  59. virtual void SendWakeWordDetected(const std::string& wake_word);
  60. virtual void SendStartListening(ListeningMode mode);
  61. virtual void SendStopListening();
  62. virtual void SendAbortSpeaking(AbortReason reason);
  63. virtual void SendMcpMessage(const std::string& message);
  64. protected:
  65. std::function<void(const cJSON* root)> on_incoming_json_;
  66. std::function<void(std::unique_ptr<AudioStreamPacket> packet)> on_incoming_audio_;
  67. std::function<void()> on_audio_channel_opened_;
  68. std::function<void()> on_audio_channel_closed_;
  69. std::function<void(const std::string& message)> on_network_error_;
  70. int server_sample_rate_ = 24000;
  71. int server_frame_duration_ = 60;
  72. bool error_occurred_ = false;
  73. std::string session_id_;
  74. std::chrono::time_point<std::chrono::steady_clock> last_incoming_time_;
  75. virtual bool SendText(const std::string& text) = 0;
  76. virtual void SetError(const std::string& message);
  77. virtual bool IsTimeout() const;
  78. };
  79. #endif // PROTOCOL_H