Chromium Code Reviews| 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(); |