diff --git a/src/devices/speaker/ffmpeg_speaker/ffmpeg_speaker.cpp b/src/devices/speaker/ffmpeg_speaker/ffmpeg_speaker.cpp index 0c50eedb..22302ecf 100644 --- a/src/devices/speaker/ffmpeg_speaker/ffmpeg_speaker.cpp +++ b/src/devices/speaker/ffmpeg_speaker/ffmpeg_speaker.cpp @@ -78,16 +78,17 @@ void ffmpegSpeaker::start() { } void ffmpegSpeaker::resetPlayState() { - state_.is_decoding = false; - state_.is_running = false; - state_.is_paused = false; - audio_path_.clear(); - if (pcm_handle_) { snd_pcm_drain(pcm_handle_); snd_pcm_close(pcm_handle_); pcm_handle_ = nullptr; } + state_.is_decoding = false; + state_.is_running = false; + state_.is_paused = false; + audio_path_.clear(); + + LOG(INFO) << "[ffmpegSpeaker] (resetPlayState): Success, id=" << id_; } @@ -346,7 +347,12 @@ void ffmpegSpeaker::play_audio_() { else { //音频数据队列为空且解码已经结束,退出 if (!state_.is_decoding) { - break; + if (pcm_handle_) { + // 停止播放,清空缓存,否则结束会有杂音 + snd_pcm_drop(pcm_handle_); + LOG(INFO) << "[ffmpegSpeaker] ALSA buffer cleared"; + break; + } } this_thread::sleep_for(chrono::seconds(1)); // 空队列等待 }