Chromium Code Reviews| Index: media/audio/fake_audio_input_stream.cc |
| diff --git a/media/audio/fake_audio_input_stream.cc b/media/audio/fake_audio_input_stream.cc |
| index 5ec09a45c870b16995d0aaa1545beb9fe4e13d2e..e05b257997e300db425736f5b380deeb2b250a4b 100644 |
| --- a/media/audio/fake_audio_input_stream.cc |
| +++ b/media/audio/fake_audio_input_stream.cc |
| @@ -20,10 +20,16 @@ namespace { |
| const int kBeepDurationMilliseconds = 20; |
| const int kBeepFrequency = 400; |
| +// Intervals between two automatic beeps. |
| +const int kAutomaticBeepIntervalInMs = 500; |
| + |
| +// Automatic beep will be triggered every |kAutomaticBeepIntervalInMs| unless |
| +// users explicitly call BeepOnce(), which will disable the automatic beep. |
| struct BeepContext { |
| - BeepContext() : beep_once(false) {} |
| + BeepContext() : beep_once(false), automatic(true) {} |
|
no longer working on chromium
2014/05/02 14:30:47
Alpha, could you please take a look at this code t
|
| base::Lock beep_lock; |
| bool beep_once; |
| + bool automatic; |
| }; |
| static base::LazyInstance<BeepContext> g_beep_context = |
| @@ -78,14 +84,37 @@ void FakeAudioInputStream::Start(AudioInputCallback* callback) { |
| void FakeAudioInputStream::DoCallback() { |
| DCHECK(callback_); |
| + const TimeTicks now = TimeTicks::Now(); |
| + base::TimeDelta next_callback_time = |
| + last_callback_time_ + callback_interval_ * 2 - now; |
| + |
| + // If we are falling behind, try to catch up as much as we can in the next |
| + // callback. |
| + if (next_callback_time < base::TimeDelta()) |
| + next_callback_time = base::TimeDelta(); |
| + |
| + // Accumulate the time from the last beep. |
| + interval_from_last_beep_ += now - last_callback_time_; |
| + |
| + last_callback_time_ = now; |
| + |
| memset(buffer_.get(), 0, buffer_size_); |
| bool should_beep = false; |
| { |
| BeepContext* beep_context = g_beep_context.Pointer(); |
| base::AutoLock auto_lock(beep_context->beep_lock); |
| - should_beep = beep_context->beep_once; |
| - beep_context->beep_once = false; |
| + if (beep_context->automatic) { |
| + base::TimeDelta delta = interval_from_last_beep_ - |
| + TimeDelta::FromMilliseconds(kAutomaticBeepIntervalInMs); |
| + if (delta > base::TimeDelta()) { |
| + should_beep = true; |
| + interval_from_last_beep_ = delta; |
| + } |
| + } else { |
| + should_beep = beep_context->beep_once; |
| + beep_context->beep_once = false; |
| + } |
| } |
| // If this object was instructed to generate a beep or has started to |
| @@ -103,7 +132,6 @@ void FakeAudioInputStream::DoCallback() { |
| while (position + high_bytes <= buffer_size_) { |
| // Write high values first. |
| memset(buffer_.get() + position, 128, high_bytes); |
| - |
| // Then leave low values in the buffer with |high_bytes|. |
| position += high_bytes * 2; |
| } |
| @@ -116,16 +144,6 @@ void FakeAudioInputStream::DoCallback() { |
| callback_->OnData(this, buffer_.get(), buffer_size_, buffer_size_, 1.0); |
| frames_elapsed_ += params_.frames_per_buffer(); |
| - const TimeTicks now = TimeTicks::Now(); |
| - base::TimeDelta next_callback_time = |
| - last_callback_time_ + callback_interval_ * 2 - now; |
| - |
| - // If we are falling behind, try to catch up as much as we can in the next |
| - // callback. |
| - if (next_callback_time < base::TimeDelta()) |
| - next_callback_time = base::TimeDelta(); |
| - |
| - last_callback_time_ = now; |
| thread_.message_loop()->PostDelayedTask( |
| FROM_HERE, |
| base::Bind(&FakeAudioInputStream::DoCallback, base::Unretained(this)), |
| @@ -163,6 +181,7 @@ void FakeAudioInputStream::BeepOnce() { |
| BeepContext* beep_context = g_beep_context.Pointer(); |
| base::AutoLock auto_lock(beep_context->beep_lock); |
| beep_context->beep_once = true; |
| + beep_context->automatic = false; |
| } |
| } // namespace media |