Files
xiaozhi-esp32/main/Application.h

146 lines
3.5 KiB
C
Raw Normal View History

2024-08-31 18:00:23 +08:00
#ifndef _APPLICATION_H_
#define _APPLICATION_H_
#include "AudioDevice.h"
2024-10-03 06:39:22 +08:00
#include <OpusEncoder.h>
#include <OpusResampler.h>
#include <WebSocket.h>
#include <Ml307AtModem.h>
#include <Ml307Http.h>
#include <EspHttp.h>
#include <opus.h>
#include <resampler_structs.h>
#include <freertos/event_groups.h>
#include <freertos/task.h>
2024-08-31 18:00:23 +08:00
#include <mutex>
2024-09-03 13:57:18 +08:00
#include <list>
2024-10-03 06:39:22 +08:00
#include <condition_variable>
#include "Display.h"
#include "FirmwareUpgrade.h"
#ifdef CONFIG_USE_AFE_SR
#include "WakeWordDetect.h"
#include "AudioProcessor.h"
#endif
#include "Button.h"
2024-08-31 18:00:23 +08:00
#define DETECTION_RUNNING 1
#define COMMUNICATION_RUNNING 2
2024-09-25 03:44:28 +08:00
#define PROTOCOL_VERSION 2
struct BinaryProtocol {
uint16_t version;
uint16_t type;
uint32_t reserved;
uint32_t timestamp;
uint32_t payload_size;
uint8_t payload[];
} __attribute__((packed));
2024-08-31 18:00:23 +08:00
2024-10-03 06:39:22 +08:00
enum AudioPacketType {
kAudioPacketTypeUnkonwn = 0,
kAudioPacketTypeStart,
kAudioPacketTypeStop,
kAudioPacketTypeData,
kAudioPacketTypeSentenceStart,
kAudioPacketTypeSentenceEnd
};
struct AudioPacket {
AudioPacketType type = kAudioPacketTypeUnkonwn;
std::string text;
std::vector<uint8_t> opus;
std::vector<int16_t> pcm;
uint32_t timestamp;
};
2024-08-31 18:00:23 +08:00
enum ChatState {
kChatStateIdle,
kChatStateConnecting,
kChatStateListening,
kChatStateSpeaking,
2024-09-14 14:58:03 +08:00
kChatStateWakeWordDetected,
kChatStateUpgrading
2024-08-31 18:00:23 +08:00
};
class Application {
public:
2024-09-10 05:58:56 +08:00
static Application& GetInstance() {
static Application instance;
return instance;
}
2024-08-31 18:00:23 +08:00
void Start();
2024-09-10 05:58:56 +08:00
// 删除拷贝构造函数和赋值运算符
Application(const Application&) = delete;
Application& operator=(const Application&) = delete;
2024-08-31 18:00:23 +08:00
private:
2024-09-10 05:58:56 +08:00
Application();
~Application();
2024-10-03 06:39:22 +08:00
Button button_;
2024-08-31 18:00:23 +08:00
AudioDevice audio_device_;
2024-10-03 06:39:22 +08:00
#ifdef CONFIG_USE_AFE_SR
WakeWordDetect wake_word_detect_;
AudioProcessor audio_processor_;
#endif
2024-10-01 14:16:12 +08:00
#ifdef CONFIG_USE_ML307
Ml307AtModem ml307_at_modem_;
Ml307Http http_;
#else
EspHttp http_;
#endif
2024-09-05 17:22:01 +08:00
FirmwareUpgrade firmware_upgrade_;
2024-10-01 14:16:12 +08:00
#ifdef CONFIG_USE_DISPLAY
Display display_;
#endif
2024-10-03 06:39:22 +08:00
std::mutex mutex_;
std::condition_variable_any cv_;
std::list<std::function<void()>> main_tasks_;
2024-10-01 14:16:12 +08:00
WebSocket* ws_client_ = nullptr;
2024-08-31 18:00:23 +08:00
EventGroupHandle_t event_group_;
volatile ChatState chat_state_ = kChatStateIdle;
2024-10-03 06:39:22 +08:00
volatile bool break_speaking_ = false;
bool skip_to_end_ = false;
2024-08-31 18:00:23 +08:00
// Audio encode / decode
2024-10-03 06:39:22 +08:00
TaskHandle_t audio_encode_task_ = nullptr;
2024-08-31 18:00:23 +08:00
StaticTask_t audio_encode_task_buffer_;
StackType_t* audio_encode_task_stack_ = nullptr;
2024-10-03 06:39:22 +08:00
std::list<std::vector<int16_t>> audio_encode_queue_;
std::list<AudioPacket*> audio_decode_queue_;
std::list<AudioPacket*> audio_play_queue_;
2024-08-31 18:00:23 +08:00
OpusEncoder opus_encoder_;
OpusDecoder* opus_decoder_ = nullptr;
int opus_duration_ms_ = 60;
2024-09-01 13:24:45 +08:00
int opus_decode_sample_rate_ = CONFIG_AUDIO_OUTPUT_SAMPLE_RATE;
2024-09-10 16:04:28 +08:00
OpusResampler opus_resampler_;
2024-10-01 14:16:12 +08:00
TaskHandle_t check_new_version_task_ = nullptr;
StaticTask_t check_new_version_task_buffer_;
StackType_t* check_new_version_task_stack_ = nullptr;
2024-09-03 13:57:18 +08:00
2024-10-03 06:39:22 +08:00
void MainLoop();
void Schedule(std::function<void()> callback);
BinaryProtocol* AllocateBinaryProtocol(const uint8_t* payload, size_t payload_size);
2024-09-01 13:24:45 +08:00
void SetDecodeSampleRate(int sample_rate);
2024-08-31 18:00:23 +08:00
void SetChatState(ChatState state);
void StartWebSocketClient();
void CheckNewVersion();
2024-10-01 14:16:12 +08:00
void UpdateDisplay();
2024-10-03 06:39:22 +08:00
2024-08-31 18:00:23 +08:00
void AudioEncodeTask();
2024-10-03 06:39:22 +08:00
void AudioPlayTask();
void HandleAudioPacket(AudioPacket* packet);
2024-08-31 18:00:23 +08:00
};
#endif // _APPLICATION_H_