Import Cobalt 6.18971 Change-Id: I0928329c9b9a5825331ab996d05476a6fe2c174f
diff --git a/src/cobalt/build/build.id b/src/cobalt/build/build.id index 66145f8..9765737 100644 --- a/src/cobalt/build/build.id +++ b/src/cobalt/build/build.id
@@ -1 +1 @@ -18938 \ No newline at end of file +18971 \ No newline at end of file
diff --git a/src/starboard/shared/alsa/alsa_audio_sink_type.cc b/src/starboard/shared/alsa/alsa_audio_sink_type.cc index 1556242..4c91f52 100644 --- a/src/starboard/shared/alsa/alsa_audio_sink_type.cc +++ b/src/starboard/shared/alsa/alsa_audio_sink_type.cc
@@ -225,6 +225,8 @@ bool AlsaAudioSink::IdleLoop() { SB_DLOG(INFO) << "alsa::AlsaAudioSink enters idle loop"; + bool drain = true; + for (;;) { { ScopedLock lock(mutex_); @@ -239,12 +241,12 @@ if (is_playing && frames_in_buffer > 0) { return true; } - int delayed_frame = AlsaGetBufferedFrames(playback_handle_); - if (delayed_frame < kMinimumFramesInALSA) { + if (drain) { + drain = false; AlsaWriteFrames(playback_handle_, silence_frames_, kFramesPerRequest); - } else { - SbThreadSleep(time_to_wait_); + AlsaDrain(playback_handle_); } + SbThreadSleep(time_to_wait_); } return false;
diff --git a/src/starboard/shared/alsa/alsa_util.cc b/src/starboard/shared/alsa/alsa_util.cc index 0568156..b99c848 100644 --- a/src/starboard/shared/alsa/alsa_util.cc +++ b/src/starboard/shared/alsa/alsa_util.cc
@@ -172,15 +172,16 @@ return 0; } + int error; + snd_pcm_t* handle = reinterpret_cast<snd_pcm_t*>(playback_handle); + int frames = 0; for (;;) { - frames = snd_pcm_writei(reinterpret_cast<snd_pcm_t*>(playback_handle), - buffer, frames_to_write); + frames = snd_pcm_writei(handle, buffer, frames_to_write); if (frames > 0) { return frames; } else if (frames == -EPIPE) { - int error = - snd_pcm_prepare(reinterpret_cast<snd_pcm_t*>(playback_handle)); + error = snd_pcm_prepare(handle); ALSA_CHECK(error, snd_pcm_prepare, 0); } else { ALSA_CHECK(frames, snd_pcm_writei, 0); @@ -195,13 +196,16 @@ int AlsaGetBufferedFrames(void* playback_handle) { int error; snd_pcm_t* handle = reinterpret_cast<snd_pcm_t*>(playback_handle); - // snd_pcm_delay() isn't able to catch xrun, so we explicitly check for xrun. - if (snd_pcm_state(handle) == SND_PCM_STATE_XRUN) { + int state = snd_pcm_state(handle); + // snd_pcm_delay() isn't able to catch xrun or setup, so we explicitly check + // for them. + if (state == SND_PCM_STATE_XRUN || state == SND_PCM_STATE_SETUP) { error = snd_pcm_prepare(handle); ALSA_CHECK(error, snd_pcm_prepare, -1); // The buffer has already been reset, so the delay is 0. return 0; } + snd_pcm_sframes_t delay; error = snd_pcm_delay(handle, &delay); if (error == 0) { @@ -223,6 +227,16 @@ } } +void AlsaDrain(void* playback_handle) { + if (playback_handle) { + snd_pcm_t* handle = reinterpret_cast<snd_pcm_t*>(playback_handle); + + int error; + error = snd_pcm_drain(handle); + SB_DCHECK(error >= 0); + } +} + } // namespace alsa } // namespace shared } // namespace starboard
diff --git a/src/starboard/shared/alsa/alsa_util.h b/src/starboard/shared/alsa/alsa_util.h index bbbe04f..c0d068f 100644 --- a/src/starboard/shared/alsa/alsa_util.h +++ b/src/starboard/shared/alsa/alsa_util.h
@@ -36,6 +36,7 @@ int frames_to_write); int AlsaGetBufferedFrames(void* playback_handle); void AlsaCloseDevice(void* playback_handle); +void AlsaDrain(void* playback_handle); } // namespace alsa } // namespace shared