diff options
-rw-r--r-- | media/audio/fake_audio_input_stream.cc | 66 | ||||
-rw-r--r-- | media/audio/fake_audio_input_stream.h | 6 |
2 files changed, 50 insertions, 22 deletions
diff --git a/media/audio/fake_audio_input_stream.cc b/media/audio/fake_audio_input_stream.cc index 384adcb..74ac579 100644 --- a/media/audio/fake_audio_input_stream.cc +++ b/media/audio/fake_audio_input_stream.cc @@ -26,11 +26,31 @@ 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), automatic(true) {} - base::Lock beep_lock; - bool beep_once; - bool automatic; +class BeepContext { + public: + BeepContext() : beep_once_(false), automatic_beep_(true) {} + + void SetBeepOnce(bool enable) { + base::AutoLock auto_lock(lock_); + beep_once_ = enable; + + // Disable the automatic beep if users explicit set |beep_once_| to true. + if (enable) + automatic_beep_ = false; + } + bool beep_once() const { + base::AutoLock auto_lock(lock_); + return beep_once_; + } + bool automatic_beep() const { + base::AutoLock auto_lock(lock_); + return automatic_beep_; + } + + private: + mutable base::Lock lock_; + bool beep_once_; + bool automatic_beep_; }; static base::LazyInstance<BeepContext> g_beep_context = @@ -52,7 +72,7 @@ FakeAudioInputStream::FakeAudioInputStream(AudioManagerBase* manager, params.frames_per_buffer()) / 8), params_(params), - thread_("FakeAudioRecordingThread"), + task_runner_(manager->GetTaskRunner()), callback_interval_(base::TimeDelta::FromMilliseconds( (params.frames_per_buffer() * 1000) / params.sample_rate())), beep_duration_in_buffers_(kBeepDurationMilliseconds * @@ -62,12 +82,15 @@ FakeAudioInputStream::FakeAudioInputStream(AudioManagerBase* manager, beep_generated_in_buffers_(0), beep_period_in_frames_(params.sample_rate() / kBeepFrequency), frames_elapsed_(0), - audio_bus_(AudioBus::Create(params)) { + audio_bus_(AudioBus::Create(params)), + weak_factory_(this) { + DCHECK(audio_manager_->GetTaskRunner()->BelongsToCurrentThread()); } FakeAudioInputStream::~FakeAudioInputStream() {} bool FakeAudioInputStream::Open() { + DCHECK(audio_manager_->GetTaskRunner()->BelongsToCurrentThread()); buffer_.reset(new uint8[buffer_size_]); memset(buffer_.get(), 0, buffer_size_); audio_bus_->Zero(); @@ -75,14 +98,13 @@ bool FakeAudioInputStream::Open() { } void FakeAudioInputStream::Start(AudioInputCallback* callback) { - DCHECK(!thread_.IsRunning()); + DCHECK(audio_manager_->GetTaskRunner()->BelongsToCurrentThread()); DCHECK(!callback_); callback_ = callback; last_callback_time_ = TimeTicks::Now(); - thread_.Start(); - thread_.message_loop()->PostDelayedTask( + task_runner_->PostDelayedTask( FROM_HERE, - base::Bind(&FakeAudioInputStream::DoCallback, base::Unretained(this)), + base::Bind(&FakeAudioInputStream::DoCallback, weak_factory_.GetWeakPtr()), callback_interval_); } @@ -108,8 +130,7 @@ void FakeAudioInputStream::DoCallback() { bool should_beep = false; { BeepContext* beep_context = g_beep_context.Pointer(); - base::AutoLock auto_lock(beep_context->beep_lock); - if (beep_context->automatic) { + if (beep_context->automatic_beep()) { base::TimeDelta delta = interval_from_last_beep_ - TimeDelta::FromMilliseconds(kAutomaticBeepIntervalInMs); if (delta > base::TimeDelta()) { @@ -117,8 +138,8 @@ void FakeAudioInputStream::DoCallback() { interval_from_last_beep_ = delta; } } else { - should_beep = beep_context->beep_once; - beep_context->beep_once = false; + should_beep = beep_context->beep_once(); + beep_context->SetBeepOnce(false); } } @@ -151,29 +172,34 @@ void FakeAudioInputStream::DoCallback() { callback_->OnData(this, audio_bus_.get(), buffer_size_, 1.0); frames_elapsed_ += params_.frames_per_buffer(); - thread_.message_loop()->PostDelayedTask( + task_runner_->PostDelayedTask( FROM_HERE, - base::Bind(&FakeAudioInputStream::DoCallback, base::Unretained(this)), + base::Bind(&FakeAudioInputStream::DoCallback, weak_factory_.GetWeakPtr()), next_callback_time); } void FakeAudioInputStream::Stop() { - thread_.Stop(); + DCHECK(audio_manager_->GetTaskRunner()->BelongsToCurrentThread()); + weak_factory_.InvalidateWeakPtrs(); callback_ = NULL; } void FakeAudioInputStream::Close() { + DCHECK(audio_manager_->GetTaskRunner()->BelongsToCurrentThread()); audio_manager_->ReleaseInputStream(this); } double FakeAudioInputStream::GetMaxVolume() { + DCHECK(audio_manager_->GetTaskRunner()->BelongsToCurrentThread()); return 1.0; } void FakeAudioInputStream::SetVolume(double volume) { + DCHECK(audio_manager_->GetTaskRunner()->BelongsToCurrentThread()); } double FakeAudioInputStream::GetVolume() { + DCHECK(audio_manager_->GetTaskRunner()->BelongsToCurrentThread()); return 1.0; } @@ -186,9 +212,7 @@ bool FakeAudioInputStream::GetAutomaticGainControl() { // static 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; + beep_context->SetBeepOnce(true); } } // namespace media diff --git a/media/audio/fake_audio_input_stream.h b/media/audio/fake_audio_input_stream.h index e6c625e..4c3c24c 100644 --- a/media/audio/fake_audio_input_stream.h +++ b/media/audio/fake_audio_input_stream.h @@ -61,7 +61,7 @@ class MEDIA_EXPORT FakeAudioInputStream scoped_ptr<uint8[]> buffer_; int buffer_size_; AudioParameters params_; - base::Thread thread_; + const scoped_refptr<base::SingleThreadTaskRunner> task_runner_; base::TimeTicks last_callback_time_; base::TimeDelta callback_interval_; base::TimeDelta interval_from_last_beep_; @@ -71,6 +71,10 @@ class MEDIA_EXPORT FakeAudioInputStream int frames_elapsed_; scoped_ptr<media::AudioBus> audio_bus_; + // Allows us to run tasks on the FakeAudioInputStream instance which are + // bound by its lifetime. + base::WeakPtrFactory<FakeAudioInputStream> weak_factory_; + DISALLOW_COPY_AND_ASSIGN(FakeAudioInputStream); }; |