Index: content/renderer/media/audio_device.cc |
diff --git a/content/renderer/media/audio_device.cc b/content/renderer/media/audio_device.cc |
index 19349c9116169543d521b6fd4fd336726bdcb294..1d0796c98fe1ad0c089a4a757f61034d2e0b985a 100644 |
--- a/content/renderer/media/audio_device.cc |
+++ b/content/renderer/media/audio_device.cc |
@@ -4,7 +4,6 @@ |
#include "content/renderer/media/audio_device.h" |
-#include "base/bind.h" |
#include "base/debug/trace_event.h" |
#include "base/message_loop.h" |
#include "base/threading/thread_restrictions.h" |
@@ -17,7 +16,9 @@ |
#include "media/audio/audio_util.h" |
AudioDevice::AudioDevice() |
- : buffer_size_(0), |
+ : AudioDeviceIOLoopObserver<AudioDevice>( |
+ ChildProcess::current()->io_message_loop()), |
+ buffer_size_(0), |
channels_(0), |
bits_per_sample_(16), |
sample_rate_(0), |
@@ -38,7 +39,9 @@ AudioDevice::AudioDevice(size_t buffer_size, |
int channels, |
double sample_rate, |
RenderCallback* callback) |
- : bits_per_sample_(16), |
+ : AudioDeviceIOLoopObserver<AudioDevice>( |
+ ChildProcess::current()->io_message_loop()), |
+ bits_per_sample_(16), |
is_initialized_(false), |
audio_delay_milliseconds_(0), |
volume_(1.0), |
@@ -100,13 +103,12 @@ void AudioDevice::Start() { |
params.bits_per_sample = bits_per_sample_; |
params.samples_per_packet = buffer_size_; |
- ChildProcess::current()->io_message_loop()->PostTask( |
- FROM_HERE, |
+ loop()->PostTask(FROM_HERE, |
base::Bind(&AudioDevice::InitializeOnIOThread, this, params)); |
} |
void AudioDevice::Stop() { |
- DCHECK(MessageLoop::current() != ChildProcess::current()->io_message_loop()); |
+ DCHECK(!loop()->BelongsToCurrentThread()); |
// Stop and shutdown the audio thread from the IO thread. |
// This operation must be synchronous for now since the |callback_| pointer |
@@ -114,21 +116,19 @@ void AudioDevice::Stop() { |
// returns (and FireRenderCallback might dereference a bogus pointer). |
// TODO(tommi): Add an Uninitialize() method to AudioRendererSink? |
base::WaitableEvent done(true, false); |
- ChildProcess::current()->io_message_loop()->PostTask( |
- FROM_HERE, |
- base::Bind(&AudioDevice::ShutDownOnIOThread, this, &done)); |
- done.Wait(); |
+ if (loop()->PostTask(FROM_HERE, |
+ base::Bind(&AudioDevice::ShutDownOnIOThread, this, &done))) { |
+ done.Wait(); |
+ } |
} |
void AudioDevice::Play() { |
- ChildProcess::current()->io_message_loop()->PostTask( |
- FROM_HERE, |
+ loop()->PostTask(FROM_HERE, |
base::Bind(&AudioDevice::PlayOnIOThread, this)); |
} |
void AudioDevice::Pause(bool flush) { |
- ChildProcess::current()->io_message_loop()->PostTask( |
- FROM_HERE, |
+ loop()->PostTask(FROM_HERE, |
base::Bind(&AudioDevice::PauseOnIOThread, this, flush)); |
} |
@@ -136,9 +136,10 @@ bool AudioDevice::SetVolume(double volume) { |
if (volume < 0 || volume > 1.0) |
return false; |
- ChildProcess::current()->io_message_loop()->PostTask( |
- FROM_HERE, |
- base::Bind(&AudioDevice::SetVolumeOnIOThread, this, volume)); |
+ if (!loop()->PostTask(FROM_HERE, |
+ base::Bind(&AudioDevice::SetVolumeOnIOThread, this, volume))) { |
+ return false; |
+ } |
volume_ = volume; |
@@ -151,7 +152,7 @@ void AudioDevice::GetVolume(double* volume) { |
} |
void AudioDevice::InitializeOnIOThread(const AudioParameters& params) { |
- DCHECK_EQ(MessageLoop::current(), ChildProcess::current()->io_message_loop()); |
+ DCHECK(loop()->BelongsToCurrentThread()); |
// Make sure we don't create the stream more than once. |
DCHECK_EQ(0, stream_id_); |
if (stream_id_) |
@@ -162,7 +163,7 @@ void AudioDevice::InitializeOnIOThread(const AudioParameters& params) { |
} |
void AudioDevice::PlayOnIOThread() { |
- DCHECK_EQ(MessageLoop::current(), ChildProcess::current()->io_message_loop()); |
+ DCHECK(loop()->BelongsToCurrentThread()); |
if (stream_id_ && is_started_) |
Send(new AudioHostMsg_PlayStream(stream_id_)); |
else |
@@ -170,7 +171,7 @@ void AudioDevice::PlayOnIOThread() { |
} |
void AudioDevice::PauseOnIOThread(bool flush) { |
- DCHECK_EQ(MessageLoop::current(), ChildProcess::current()->io_message_loop()); |
+ DCHECK(loop()->BelongsToCurrentThread()); |
if (stream_id_ && is_started_) { |
Send(new AudioHostMsg_PauseStream(stream_id_)); |
if (flush) |
@@ -183,7 +184,7 @@ void AudioDevice::PauseOnIOThread(bool flush) { |
} |
void AudioDevice::ShutDownOnIOThread(base::WaitableEvent* signal) { |
- DCHECK_EQ(MessageLoop::current(), ChildProcess::current()->io_message_loop()); |
+ DCHECK(loop()->BelongsToCurrentThread()); |
// Make sure we don't call shutdown more than once. |
if (stream_id_) { |
@@ -196,11 +197,12 @@ void AudioDevice::ShutDownOnIOThread(base::WaitableEvent* signal) { |
ShutDownAudioThread(); |
} |
- signal->Signal(); |
+ if (signal) |
+ signal->Signal(); |
} |
void AudioDevice::SetVolumeOnIOThread(double volume) { |
- DCHECK_EQ(MessageLoop::current(), ChildProcess::current()->io_message_loop()); |
+ DCHECK(loop()->BelongsToCurrentThread()); |
if (stream_id_) |
Send(new AudioHostMsg_SetVolume(stream_id_, volume)); |
} |
@@ -216,8 +218,7 @@ void AudioDevice::OnStateChanged(AudioStreamState state) { |
} |
} |
-void AudioDevice::OnCreated( |
- base::SharedMemoryHandle handle, uint32 length) { |
+void AudioDevice::OnCreated(base::SharedMemoryHandle handle, uint32 length) { |
// Not needed in this simple implementation. |
} |
@@ -225,7 +226,7 @@ void AudioDevice::OnLowLatencyCreated( |
base::SharedMemoryHandle handle, |
base::SyncSocket::Handle socket_handle, |
uint32 length) { |
- DCHECK_EQ(MessageLoop::current(), ChildProcess::current()->io_message_loop()); |
+ DCHECK(loop()->BelongsToCurrentThread()); |
DCHECK_GE(length, buffer_size_ * sizeof(int16) * channels_); |
#if defined(OS_WIN) |
DCHECK(handle); |
@@ -328,7 +329,7 @@ size_t AudioDevice::FireRenderCallback(int16* data) { |
} |
void AudioDevice::ShutDownAudioThread() { |
- DCHECK_EQ(MessageLoop::current(), ChildProcess::current()->io_message_loop()); |
+ DCHECK(loop()->BelongsToCurrentThread()); |
if (audio_thread_.get()) { |
// Close the socket to terminate the main thread function in the |