diff options
Diffstat (limited to 'media/audio/linux/alsa_output.cc')
-rw-r--r-- | media/audio/linux/alsa_output.cc | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/media/audio/linux/alsa_output.cc b/media/audio/linux/alsa_output.cc index d8e502c..8c5762b 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(); |