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..3b5cc4d1bdfc51ab534edb702b8637b25304d7b7 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(); |
scherkus (not reviewing)
2011/04/11 18:22:39
final question: are we sure this won't clobber any
davejcool
2011/04/13 01:24:05
If there is something in buffer_, it must be from
|
+ |
// 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,13 @@ 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 ((wrapper_->PcmState(playback_handle_) == SND_PCM_STATE_PREPARED) && |
+ GetCurrentDelay() > 0) { |
+ wrapper_->PcmStart(playback_handle_); |
+ } |
} |
} |
@@ -589,6 +608,10 @@ void AlsaPcmOutputStream::WriteTask() { |
return; |
} |
+ if (shared_data_.state() == kIsStopped) { |
+ return; |
+ } |
+ |
bool source_exhausted; |
BufferPacket(&source_exhausted); |
WritePacket(); |