summaryrefslogtreecommitdiffstats
path: root/media/audio/linux/alsa_output.cc
diff options
context:
space:
mode:
Diffstat (limited to 'media/audio/linux/alsa_output.cc')
-rw-r--r--media/audio/linux/alsa_output.cc24
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();