Index: content/renderer/media/audio_device.cc |
=================================================================== |
--- content/renderer/media/audio_device.cc (revision 88939) |
+++ content/renderer/media/audio_device.cc (working copy) |
@@ -12,43 +12,11 @@ |
#include "content/renderer/render_thread.h" |
#include "media/audio/audio_util.h" |
-scoped_refptr<AudioMessageFilter> AudioDevice::filter_; |
- |
-namespace { |
- |
-// AudioMessageFilterCreator is intended to be used as a singleton so we can |
-// get access to a shared AudioMessageFilter. |
-// Example usage: |
-// AudioMessageFilter* filter = AudioMessageFilterCreator::SharedFilter(); |
- |
-class AudioMessageFilterCreator { |
- public: |
- AudioMessageFilterCreator() { |
- int routing_id; |
- RenderThread::current()->Send( |
- new ViewHostMsg_GenerateRoutingID(&routing_id)); |
- filter_ = new AudioMessageFilter(routing_id); |
- RenderThread::current()->AddFilter(filter_); |
- } |
- |
- static AudioMessageFilter* SharedFilter() { |
- return GetInstance()->filter_.get(); |
- } |
- |
- static AudioMessageFilterCreator* GetInstance() { |
- return Singleton<AudioMessageFilterCreator>::get(); |
- } |
- |
- private: |
- scoped_refptr<AudioMessageFilter> filter_; |
-}; |
- |
-} // namespace |
- |
AudioDevice::AudioDevice(size_t buffer_size, |
int channels, |
double sample_rate, |
- RenderCallback* callback) |
+ RenderCallback* callback, |
+ AudioMessageFilter* filter) |
: buffer_size_(buffer_size), |
channels_(channels), |
bits_per_sample_(16), |
@@ -56,14 +24,15 @@ |
callback_(callback), |
audio_delay_milliseconds_(0), |
volume_(1.0), |
- stream_id_(0) { |
+ stream_id_(0), |
+ filter_(filter), |
+ io_loop_(filter->message_loop()) { |
+ DCHECK(io_loop_); |
audio_data_.reserve(channels); |
for (int i = 0; i < channels; ++i) { |
float* channel_data = new float[buffer_size]; |
audio_data_.push_back(channel_data); |
} |
- // Lazily create the message filter and share across AudioDevice instances. |
- filter_ = AudioMessageFilterCreator::SharedFilter(); |
} |
AudioDevice::~AudioDevice() { |
@@ -87,18 +56,9 @@ |
params.bits_per_sample = bits_per_sample_; |
params.samples_per_packet = buffer_size_; |
- // Ensure that the initialization task is posted on the I/O thread by |
- // accessing the I/O message loop directly. This approach avoids a race |
- // condition which could exist if the message loop of the filter was |
- // used instead. |
- DCHECK(ChildProcess::current()) << "Must be in the renderer"; |
- MessageLoop* message_loop = ChildProcess::current()->io_message_loop(); |
- if (!message_loop) |
- return false; |
+ io_loop_->PostTask(FROM_HERE, |
+ NewRunnableMethod(this, &AudioDevice::InitializeTask, params)); |
- message_loop->PostTask(FROM_HERE, |
- NewRunnableMethod(this, &AudioDevice::InitializeOnIOThread, params)); |
- |
return true; |
} |
@@ -106,8 +66,8 @@ |
if (!stream_id_) |
return false; |
- filter_->message_loop()->PostTask(FROM_HERE, |
- NewRunnableMethod(this, &AudioDevice::ShutDownOnIOThread)); |
+ io_loop_->PostTask(FROM_HERE, |
+ NewRunnableMethod(this, &AudioDevice::ShutDownTask)); |
if (audio_thread_.get()) { |
socket_->Close(); |
@@ -124,8 +84,8 @@ |
if (volume < 0 || volume > 1.0) |
return false; |
- filter_->message_loop()->PostTask(FROM_HERE, |
- NewRunnableMethod(this, &AudioDevice::SetVolumeOnIOThread, volume)); |
+ io_loop_->PostTask(FROM_HERE, |
+ NewRunnableMethod(this, &AudioDevice::SetVolumeTask, volume)); |
volume_ = volume; |
@@ -142,27 +102,31 @@ |
return true; |
} |
-void AudioDevice::InitializeOnIOThread(const AudioParameters& params) { |
+void AudioDevice::InitializeTask(const AudioParameters& params) { |
+ DCHECK(MessageLoop::current() == io_loop_); |
stream_id_ = filter_->AddDelegate(this); |
filter_->Send(new AudioHostMsg_CreateStream(0, stream_id_, params, true)); |
} |
-void AudioDevice::StartOnIOThread() { |
+void AudioDevice::StartTask() { |
+ DCHECK(MessageLoop::current() == io_loop_); |
if (stream_id_) |
filter_->Send(new AudioHostMsg_PlayStream(0, stream_id_)); |
} |
-void AudioDevice::ShutDownOnIOThread() { |
+void AudioDevice::ShutDownTask() { |
+ DCHECK(MessageLoop::current() == io_loop_); |
// Make sure we don't call shutdown more than once. |
if (!stream_id_) |
return; |
- filter_->Send(new AudioHostMsg_CloseStream(0, stream_id_)); |
filter_->RemoveDelegate(stream_id_); |
+ filter_->Send(new AudioHostMsg_CloseStream(0, stream_id_)); |
stream_id_ = 0; |
} |
-void AudioDevice::SetVolumeOnIOThread(double volume) { |
+void AudioDevice::SetVolumeTask(double volume) { |
+ DCHECK(MessageLoop::current() == io_loop_); |
if (stream_id_) |
filter_->Send(new AudioHostMsg_SetVolume(0, stream_id_, volume)); |
} |
@@ -213,7 +177,7 @@ |
if (filter_) { |
filter_->message_loop()->PostTask(FROM_HERE, |
- NewRunnableMethod(this, &AudioDevice::StartOnIOThread)); |
+ NewRunnableMethod(this, &AudioDevice::StartTask)); |
} |
} |