mirror of
https://github.com/esphome/esphome.git
synced 2024-11-23 23:48:11 +01:00
[voice_assistant] Bugfix: Fix crash on start (#7662)
This commit is contained in:
parent
dd8d25e43f
commit
fdebf04196
2 changed files with 34 additions and 26 deletions
|
@ -433,16 +433,18 @@ void VoiceAssistant::loop() {
|
||||||
|
|
||||||
#ifdef USE_SPEAKER
|
#ifdef USE_SPEAKER
|
||||||
void VoiceAssistant::write_speaker_() {
|
void VoiceAssistant::write_speaker_() {
|
||||||
if (this->speaker_buffer_size_ > 0) {
|
if ((this->speaker_ != nullptr) && (this->speaker_buffer_ != nullptr)) {
|
||||||
size_t write_chunk = std::min<size_t>(this->speaker_buffer_size_, 4 * 1024);
|
if (this->speaker_buffer_size_ > 0) {
|
||||||
size_t written = this->speaker_->play(this->speaker_buffer_, write_chunk);
|
size_t write_chunk = std::min<size_t>(this->speaker_buffer_size_, 4 * 1024);
|
||||||
if (written > 0) {
|
size_t written = this->speaker_->play(this->speaker_buffer_, write_chunk);
|
||||||
memmove(this->speaker_buffer_, this->speaker_buffer_ + written, this->speaker_buffer_size_ - written);
|
if (written > 0) {
|
||||||
this->speaker_buffer_size_ -= written;
|
memmove(this->speaker_buffer_, this->speaker_buffer_ + written, this->speaker_buffer_size_ - written);
|
||||||
this->speaker_buffer_index_ -= written;
|
this->speaker_buffer_size_ -= written;
|
||||||
this->set_timeout("speaker-timeout", 5000, [this]() { this->speaker_->stop(); });
|
this->speaker_buffer_index_ -= written;
|
||||||
} else {
|
this->set_timeout("speaker-timeout", 5000, [this]() { this->speaker_->stop(); });
|
||||||
ESP_LOGV(TAG, "Speaker buffer full, trying again next loop");
|
} else {
|
||||||
|
ESP_LOGV(TAG, "Speaker buffer full, trying again next loop");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -772,16 +774,20 @@ void VoiceAssistant::on_event(const api::VoiceAssistantEventResponse &msg) {
|
||||||
}
|
}
|
||||||
case api::enums::VOICE_ASSISTANT_TTS_STREAM_START: {
|
case api::enums::VOICE_ASSISTANT_TTS_STREAM_START: {
|
||||||
#ifdef USE_SPEAKER
|
#ifdef USE_SPEAKER
|
||||||
this->wait_for_stream_end_ = true;
|
if (this->speaker_ != nullptr) {
|
||||||
ESP_LOGD(TAG, "TTS stream start");
|
this->wait_for_stream_end_ = true;
|
||||||
this->defer([this] { this->tts_stream_start_trigger_->trigger(); });
|
ESP_LOGD(TAG, "TTS stream start");
|
||||||
|
this->defer([this] { this->tts_stream_start_trigger_->trigger(); });
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case api::enums::VOICE_ASSISTANT_TTS_STREAM_END: {
|
case api::enums::VOICE_ASSISTANT_TTS_STREAM_END: {
|
||||||
#ifdef USE_SPEAKER
|
#ifdef USE_SPEAKER
|
||||||
this->stream_ended_ = true;
|
if (this->speaker_ != nullptr) {
|
||||||
ESP_LOGD(TAG, "TTS stream end");
|
this->stream_ended_ = true;
|
||||||
|
ESP_LOGD(TAG, "TTS stream end");
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -802,14 +808,16 @@ void VoiceAssistant::on_event(const api::VoiceAssistantEventResponse &msg) {
|
||||||
|
|
||||||
void VoiceAssistant::on_audio(const api::VoiceAssistantAudio &msg) {
|
void VoiceAssistant::on_audio(const api::VoiceAssistantAudio &msg) {
|
||||||
#ifdef USE_SPEAKER // We should never get to this function if there is no speaker anyway
|
#ifdef USE_SPEAKER // We should never get to this function if there is no speaker anyway
|
||||||
if (this->speaker_buffer_index_ + msg.data.length() < SPEAKER_BUFFER_SIZE) {
|
if ((this->speaker_ != nullptr) && (this->speaker_buffer_ != nullptr)) {
|
||||||
memcpy(this->speaker_buffer_ + this->speaker_buffer_index_, msg.data.data(), msg.data.length());
|
if (this->speaker_buffer_index_ + msg.data.length() < SPEAKER_BUFFER_SIZE) {
|
||||||
this->speaker_buffer_index_ += msg.data.length();
|
memcpy(this->speaker_buffer_ + this->speaker_buffer_index_, msg.data.data(), msg.data.length());
|
||||||
this->speaker_buffer_size_ += msg.data.length();
|
this->speaker_buffer_index_ += msg.data.length();
|
||||||
this->speaker_bytes_received_ += msg.data.length();
|
this->speaker_buffer_size_ += msg.data.length();
|
||||||
ESP_LOGV(TAG, "Received audio: %u bytes from API", msg.data.length());
|
this->speaker_bytes_received_ += msg.data.length();
|
||||||
} else {
|
ESP_LOGV(TAG, "Received audio: %u bytes from API", msg.data.length());
|
||||||
ESP_LOGE(TAG, "Cannot receive audio, buffer is full");
|
} else {
|
||||||
|
ESP_LOGE(TAG, "Cannot receive audio, buffer is full");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
|
@ -250,7 +250,7 @@ class VoiceAssistant : public Component {
|
||||||
#ifdef USE_SPEAKER
|
#ifdef USE_SPEAKER
|
||||||
void write_speaker_();
|
void write_speaker_();
|
||||||
speaker::Speaker *speaker_{nullptr};
|
speaker::Speaker *speaker_{nullptr};
|
||||||
uint8_t *speaker_buffer_;
|
uint8_t *speaker_buffer_{nullptr};
|
||||||
size_t speaker_buffer_index_{0};
|
size_t speaker_buffer_index_{0};
|
||||||
size_t speaker_buffer_size_{0};
|
size_t speaker_buffer_size_{0};
|
||||||
size_t speaker_bytes_received_{0};
|
size_t speaker_bytes_received_{0};
|
||||||
|
@ -282,8 +282,8 @@ class VoiceAssistant : public Component {
|
||||||
float volume_multiplier_;
|
float volume_multiplier_;
|
||||||
uint32_t conversation_timeout_;
|
uint32_t conversation_timeout_;
|
||||||
|
|
||||||
uint8_t *send_buffer_;
|
uint8_t *send_buffer_{nullptr};
|
||||||
int16_t *input_buffer_;
|
int16_t *input_buffer_{nullptr};
|
||||||
|
|
||||||
bool continuous_{false};
|
bool continuous_{false};
|
||||||
bool silence_detection_;
|
bool silence_detection_;
|
||||||
|
|
Loading…
Reference in a new issue