| Index: chromecast/media/cma/backend/alsa/audio_decoder_alsa.cc | 
| diff --git a/chromecast/media/cma/backend/alsa/audio_decoder_alsa.cc b/chromecast/media/cma/backend/alsa/audio_decoder_alsa.cc | 
| index a83d6a45a13caf64f0f5db535da7c40304d055c0..e288cc5ebba93dcfdc66851dbec7947fbec5e881 100644 | 
| --- a/chromecast/media/cma/backend/alsa/audio_decoder_alsa.cc | 
| +++ b/chromecast/media/cma/backend/alsa/audio_decoder_alsa.cc | 
| @@ -153,10 +153,18 @@ bool AudioDecoderAlsa::SetPlaybackRate(float rate) { | 
| } | 
| LOG(INFO) << "SetPlaybackRate to " << rate; | 
|  | 
| -  while (!rate_shifter_info_.empty() && | 
| -         rate_shifter_info_.back().input_frames == 0) { | 
| -    rate_shifter_info_.pop_back(); | 
| +  // Remove info for rates that have no pending output left. | 
| +  while (!rate_shifter_info_.empty()) { | 
| +    RateShifterInfo* rate_info = &rate_shifter_info_.back(); | 
| +    int64_t possible_output_frames = rate_info->input_frames / rate_info->rate; | 
| +    DCHECK_GE(possible_output_frames, rate_info->output_frames); | 
| +    if (rate_info->output_frames == possible_output_frames) { | 
| +      rate_shifter_info_.pop_back(); | 
| +    } else { | 
| +      break; | 
| +    } | 
| } | 
| + | 
| rate_shifter_info_.push_back(RateShifterInfo(rate)); | 
| return true; | 
| } | 
| @@ -351,7 +359,8 @@ void AudioDecoderAlsa::OnBufferDecoded( | 
| // Bypass rate shifter if the rate is 1.0, and there are no frames queued | 
| // in the rate shifter. | 
| if (rate_info->rate == 1.0 && rate_shifter_->frames_buffered() == 0 && | 
| -        pending_output_frames_ == kNoPendingOutput) { | 
| +        pending_output_frames_ == kNoPendingOutput && | 
| +        rate_shifter_info_.size() == 1) { | 
| DCHECK_EQ(rate_info->output_frames, rate_info->input_frames); | 
| pending_output_frames_ = input_frames; | 
| if (got_eos_) { | 
| @@ -463,7 +472,7 @@ void AudioDecoderAlsa::PushRateShifted() { | 
| mixer_input_->WritePcm(output_buffer); | 
|  | 
| if (rate_shifter_info_.size() > 1 && | 
| -      possible_output_frames == rate_info->output_frames) { | 
| +      rate_info->output_frames == possible_output_frames) { | 
| double remaining_input_frames = | 
| rate_info->input_frames - (rate_info->output_frames * rate_info->rate); | 
| rate_shifter_info_.pop_front(); | 
|  |