Index: media/audio/linux/alsa_output.cc |
diff --git a/media/audio/linux/alsa_output.cc b/media/audio/linux/alsa_output.cc |
index d8e502cf7699b60b49c794be0faa2c289f8b0408..8c5762b643e1a92248acfde4cb64a7d827cd34b6 100644 |
--- a/media/audio/linux/alsa_output.cc |
+++ b/media/audio/linux/alsa_output.cc |
@@ -395,6 +395,14 @@ void AlsaPcmOutputStream::StartTask() { |
return; |
} |
+ if (shared_data_.state() != kIsPlaying) { |
+ return; |
+ } |
+ |
+ // Before starting, the buffer might have audio from previous user of this |
+ // device. |
+ buffer_->Clear(); |
+ |
// When starting again, drop all packets in the device and prepare it again |
// incase we are restarting from a pause state and need to flush old data. |
int error = wrapper_->PcmDrop(playback_handle_); |
@@ -538,6 +546,10 @@ void AlsaPcmOutputStream::WritePacket() { |
return; |
} |
+ if (shared_data_.state() == kIsStopped) { |
+ return; |
+ } |
+ |
CHECK_EQ(buffer_->forward_bytes() % bytes_per_output_frame_, 0u); |
const uint8* buffer_data; |
@@ -579,6 +591,14 @@ void AlsaPcmOutputStream::WritePacket() { |
// Seek forward in the buffer after we've written some data to ALSA. |
buffer_->Seek(frames_written * bytes_per_output_frame_); |
} |
+ } else { |
+ // If nothing left to write and playback hasn't started yet, start it now. |
+ // This ensures that shorter sounds will still play. |
+ if (playback_handle_ && |
+ (wrapper_->PcmState(playback_handle_) == SND_PCM_STATE_PREPARED) && |
+ GetCurrentDelay() > 0) { |
+ wrapper_->PcmStart(playback_handle_); |
+ } |
} |
} |
@@ -589,6 +609,10 @@ void AlsaPcmOutputStream::WriteTask() { |
return; |
} |
+ if (shared_data_.state() == kIsStopped) { |
+ return; |
+ } |
+ |
bool source_exhausted; |
BufferPacket(&source_exhausted); |
WritePacket(); |