Files
xiaozhi-esp32/main/Application.h

94 lines
2.5 KiB
C
Raw Normal View History

2024-08-31 18:00:23 +08:00
#ifndef _APPLICATION_H_
#define _APPLICATION_H_
#include "WifiStation.h"
#include "AudioDevice.h"
#include "OpusEncoder.h"
#include "WebSocketClient.h"
#include "BuiltinLed.h"
#include "opus.h"
#include "resampler_structs.h"
#include "freertos/event_groups.h"
#include "freertos/queue.h"
#include "freertos/task.h"
#include "esp_afe_sr_models.h"
#include "esp_nsn_models.h"
#include <mutex>
2024-09-03 13:57:18 +08:00
#include <list>
2024-08-31 18:00:23 +08:00
#define DETECTION_RUNNING 1
#define COMMUNICATION_RUNNING 2
2024-09-03 13:57:18 +08:00
#define DETECT_PACKETS_ENCODED 4
2024-08-31 18:00:23 +08:00
enum ChatState {
kChatStateIdle,
kChatStateConnecting,
kChatStateListening,
kChatStateSpeaking,
2024-09-03 13:57:18 +08:00
kChatStateWakeWordDetected
2024-08-31 18:00:23 +08:00
};
class Application {
public:
Application();
~Application();
void Start();
private:
WifiStation wifi_station_;
AudioDevice audio_device_;
BuiltinLed builtin_led_;
std::recursive_mutex mutex_;
WebSocketClient* ws_client_ = nullptr;
esp_afe_sr_data_t* afe_detection_data_ = nullptr;
esp_afe_sr_data_t* afe_communication_data_ = nullptr;
EventGroupHandle_t event_group_;
char* wakenet_model_ = NULL;
char* nsnet_model_ = NULL;
volatile ChatState chat_state_ = kChatStateIdle;
// Audio encode / decode
TaskHandle_t audio_feed_task_ = nullptr;
StaticTask_t audio_encode_task_buffer_;
StackType_t* audio_encode_task_stack_ = nullptr;
QueueHandle_t audio_encode_queue_ = nullptr;
TaskHandle_t audio_decode_task_ = nullptr;
StaticTask_t audio_decode_task_buffer_;
StackType_t* audio_decode_task_stack_ = nullptr;
QueueHandle_t audio_decode_queue_ = nullptr;
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-08-31 18:00:23 +08:00
silk_resampler_state_struct resampler_state_;
2024-09-03 13:57:18 +08:00
TaskHandle_t wake_word_encode_task_ = nullptr;
StaticTask_t wake_word_encode_task_buffer_;
StackType_t* wake_word_encode_task_stack_ = nullptr;
std::list<iovec> wake_word_pcm_;
std::vector<iovec> wake_word_opus_;
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 StartDetection();
void StartCommunication();
void StartWebSocketClient();
2024-09-03 13:57:18 +08:00
void StoreWakeWordData(uint8_t* data, size_t size);
void EncodeWakeWordData();
void SendWakeWordData();
2024-08-31 18:00:23 +08:00
void AudioFeedTask();
void AudioDetectionTask();
void AudioCommunicationTask();
void AudioEncodeTask();
void AudioDecodeTask();
};
#endif // _APPLICATION_H_