Fixed an issue where the tail of the sound might be truncated in auto mode. (#1675)
This commit is contained in:
@ -823,6 +823,12 @@ void Application::HandleStateChangedEvent() {
|
|||||||
|
|
||||||
// Make sure the audio processor is running
|
// Make sure the audio processor is running
|
||||||
if (!audio_service_.IsAudioProcessorRunning()) {
|
if (!audio_service_.IsAudioProcessorRunning()) {
|
||||||
|
// For auto mode, wait for playback queue to be empty before enabling voice processing
|
||||||
|
// This prevents audio truncation when STOP arrives late due to network jitter
|
||||||
|
if (listening_mode_ == kListeningModeAutoStop) {
|
||||||
|
audio_service_.WaitForPlaybackQueueEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
// Send the start listening command
|
// Send the start listening command
|
||||||
protocol_->SendStartListening(listening_mode_);
|
protocol_->SendStartListening(listening_mode_);
|
||||||
audio_service_.EnableVoiceProcessing(true);
|
audio_service_.EnableVoiceProcessing(true);
|
||||||
|
|||||||
@ -740,6 +740,13 @@ bool AudioService::IsIdle() {
|
|||||||
return audio_encode_queue_.empty() && audio_decode_queue_.empty() && audio_playback_queue_.empty() && audio_testing_queue_.empty();
|
return audio_encode_queue_.empty() && audio_decode_queue_.empty() && audio_playback_queue_.empty() && audio_testing_queue_.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AudioService::WaitForPlaybackQueueEmpty() {
|
||||||
|
std::unique_lock<std::mutex> lock(audio_queue_mutex_);
|
||||||
|
audio_queue_cv_.wait(lock, [this]() {
|
||||||
|
return service_stopped_ || (audio_decode_queue_.empty() && audio_playback_queue_.empty());
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
void AudioService::ResetDecoder() {
|
void AudioService::ResetDecoder() {
|
||||||
std::lock_guard<std::mutex> lock(audio_queue_mutex_);
|
std::lock_guard<std::mutex> lock(audio_queue_mutex_);
|
||||||
std::unique_lock<std::mutex> decoder_lock(decoder_mutex_);
|
std::unique_lock<std::mutex> decoder_lock(decoder_mutex_);
|
||||||
|
|||||||
@ -115,6 +115,7 @@ public:
|
|||||||
const std::string& GetLastWakeWord() const;
|
const std::string& GetLastWakeWord() const;
|
||||||
bool IsVoiceDetected() const { return voice_detected_; }
|
bool IsVoiceDetected() const { return voice_detected_; }
|
||||||
bool IsIdle();
|
bool IsIdle();
|
||||||
|
void WaitForPlaybackQueueEmpty();
|
||||||
bool IsWakeWordRunning() const { return xEventGroupGetBits(event_group_) & AS_EVENT_WAKE_WORD_RUNNING; }
|
bool IsWakeWordRunning() const { return xEventGroupGetBits(event_group_) & AS_EVENT_WAKE_WORD_RUNNING; }
|
||||||
bool IsAudioProcessorRunning() const { return xEventGroupGetBits(event_group_) & AS_EVENT_AUDIO_PROCESSOR_RUNNING; }
|
bool IsAudioProcessorRunning() const { return xEventGroupGetBits(event_group_) & AS_EVENT_AUDIO_PROCESSOR_RUNNING; }
|
||||||
bool IsAfeWakeWord();
|
bool IsAfeWakeWord();
|
||||||
|
|||||||
Reference in New Issue
Block a user