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..c9107f1e19c791da8e44c47e2ec12401ad8bd8ec 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) {} |
|
DaleCurtis
2014/04/29 17:30:56
Shouldn't this default to false? Isn't this used i
no longer working on chromium
2014/05/02 14:30:47
That is good point, I honestly have no idea how th
|
| 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) { |
| + int delta_ms = interval_from_last_beep_.InMilliseconds() - |
| + kAutomaticBeepIntervalInMs; |
| + if (delta_ms > 0) { |
|
DaleCurtis
2014/04/29 17:30:56
just use > base::TimeDelta to avoid converting bac
no longer working on chromium
2014/05/02 14:30:47
Done.
|
| + should_beep = true; |
| + interval_from_last_beep_ = TimeDelta::FromMilliseconds(delta_ms); |
| + } |
| + } 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 |