| Index: media/audio/virtual_audio_input_stream.cc | 
| diff --git a/media/audio/virtual_audio_input_stream.cc b/media/audio/virtual_audio_input_stream.cc | 
| index 4f2f9bd04fb84a4619766597777c75665b5641c6..705271c7926ddd7228cf5ef977b74cc5be48484c 100644 | 
| --- a/media/audio/virtual_audio_input_stream.cc | 
| +++ b/media/audio/virtual_audio_input_stream.cc | 
| @@ -59,8 +59,8 @@ VirtualAudioInputStream::VirtualAudioInputStream( | 
| : audio_manager_(manager), | 
| message_loop_(message_loop), | 
| callback_(NULL), | 
| -      buffer_duration_ms_(base::TimeDelta::FromMilliseconds( | 
| -          params.frames_per_buffer() * base::Time::kMillisecondsPerSecond / | 
| +      buffer_duration_(base::TimeDelta::FromMicroseconds( | 
| +          params.frames_per_buffer() * base::Time::kMicrosecondsPerSecond / | 
| static_cast<float>(params.sample_rate()))), | 
| buffer_(new uint8[params.GetBytesPerBuffer()]), | 
| params_(params), | 
| @@ -85,6 +85,7 @@ bool VirtualAudioInputStream::Open() { | 
| void VirtualAudioInputStream::Start(AudioInputCallback* callback) { | 
| DCHECK(message_loop_->BelongsToCurrentThread()); | 
| callback_ = callback; | 
| +  next_read_time_ = base::Time::Now(); | 
| on_more_data_cb_.Reset(base::Bind(&VirtualAudioInputStream::ReadAudio, | 
| base::Unretained(this))); | 
| audio_manager_->GetMessageLoop()->PostTask(FROM_HERE, | 
| @@ -139,9 +140,21 @@ void VirtualAudioInputStream::ReadAudio() { | 
| params_.GetBytesPerBuffer(), | 
| 1.0); | 
|  | 
| +  // Need to account for time spent here due to renderer side mixing as well as | 
| +  // the imprecision of PostDelayedTask. | 
| +  next_read_time_ += buffer_duration_; | 
| +  base::Time now = base::Time::Now(); | 
| +  base::TimeDelta delay = next_read_time_ - now; | 
| +  if (delay < base::TimeDelta()) { | 
| +    // Reset the next read time if we end up getting too far behind. We'll just | 
| +    // slow down playback to avoid using up all the CPU. | 
| +    delay = buffer_duration_; | 
| +    next_read_time_ = now; | 
| +  } | 
| + | 
| message_loop_->PostDelayedTask(FROM_HERE, | 
| on_more_data_cb_.callback(), | 
| -                                 buffer_duration_ms_); | 
| +                                 delay); | 
| } | 
|  | 
| void VirtualAudioInputStream::Close() { | 
|  |