Index: content/renderer/media/audio_device.cc |
diff --git a/content/renderer/media/audio_device.cc b/content/renderer/media/audio_device.cc |
index b252d852f7efd130d25caf15824e6e1e34438f11..53ee88dd9497cd7dff6dff8e860ec36d04c0f44f 100644 |
--- a/content/renderer/media/audio_device.cc |
+++ b/content/renderer/media/audio_device.cc |
@@ -106,17 +106,11 @@ void AudioDevice::Start() { |
void AudioDevice::Stop() { |
DCHECK(MessageLoop::current() != ChildProcess::current()->io_message_loop()); |
- base::WaitableEvent completion(false, false); |
+ // Stop and shutdown the audio thread from the IO thread. |
ChildProcess::current()->io_message_loop()->PostTask( |
FROM_HERE, |
- base::Bind(&AudioDevice::ShutDownOnIOThread, this, &completion)); |
- |
- // We wait here for the IO task to be completed to remove race conflicts |
- // with OnLowLatencyCreated() and to ensure that Stop() acts as a synchronous |
- // function call. |
- completion.Wait(); |
- ShutDownAudioThread(); |
+ base::Bind(&AudioDevice::ShutDownOnIOThread, this)); |
} |
void AudioDevice::Play() { |
@@ -150,7 +144,7 @@ void AudioDevice::GetVolume(double* volume) { |
} |
void AudioDevice::InitializeOnIOThread(const AudioParameters& params) { |
- DCHECK(MessageLoop::current() == ChildProcess::current()->io_message_loop()); |
+ DCHECK_EQ(MessageLoop::current(), ChildProcess::current()->io_message_loop()); |
// Make sure we don't create the stream more than once. |
DCHECK_EQ(0, stream_id_); |
if (stream_id_) |
@@ -161,7 +155,7 @@ void AudioDevice::InitializeOnIOThread(const AudioParameters& params) { |
} |
void AudioDevice::PlayOnIOThread() { |
- DCHECK(MessageLoop::current() == ChildProcess::current()->io_message_loop()); |
+ DCHECK_EQ(MessageLoop::current(), ChildProcess::current()->io_message_loop()); |
if (stream_id_ && is_started_) |
Send(new AudioHostMsg_PlayStream(stream_id_)); |
else |
@@ -169,7 +163,7 @@ void AudioDevice::PlayOnIOThread() { |
} |
void AudioDevice::PauseOnIOThread(bool flush) { |
- DCHECK(MessageLoop::current() == ChildProcess::current()->io_message_loop()); |
+ DCHECK_EQ(MessageLoop::current(), ChildProcess::current()->io_message_loop()); |
if (stream_id_ && is_started_) { |
Send(new AudioHostMsg_PauseStream(stream_id_)); |
if (flush) |
@@ -181,27 +175,24 @@ void AudioDevice::PauseOnIOThread(bool flush) { |
} |
} |
-void AudioDevice::ShutDownOnIOThread(base::WaitableEvent* completion) { |
- DCHECK(MessageLoop::current() == ChildProcess::current()->io_message_loop()); |
- is_started_ = false; |
+void AudioDevice::ShutDownOnIOThread() { |
+ DCHECK_EQ(MessageLoop::current(), ChildProcess::current()->io_message_loop()); |
// Make sure we don't call shutdown more than once. |
- if (!stream_id_) { |
- if (completion) |
- completion->Signal(); |
+ if (!stream_id_) |
return; |
- } |
+ |
+ is_started_ = false; |
filter_->RemoveDelegate(stream_id_); |
Send(new AudioHostMsg_CloseStream(stream_id_)); |
stream_id_ = 0; |
- if (completion) |
- completion->Signal(); |
+ ShutDownAudioThread(); |
} |
void AudioDevice::SetVolumeOnIOThread(double volume) { |
- DCHECK(MessageLoop::current() == ChildProcess::current()->io_message_loop()); |
+ DCHECK_EQ(MessageLoop::current(), ChildProcess::current()->io_message_loop()); |
if (stream_id_) |
Send(new AudioHostMsg_SetVolume(stream_id_, volume)); |
} |
@@ -225,7 +216,8 @@ void AudioDevice::OnLowLatencyCreated( |
base::SharedMemoryHandle handle, |
base::SyncSocket::Handle socket_handle, |
uint32 length) { |
- DCHECK(MessageLoop::current() == ChildProcess::current()->io_message_loop()); |
+ DCHECK_EQ(MessageLoop::current(), ChildProcess::current()->io_message_loop()); |
+ DCHECK_GE(length, buffer_size_ * sizeof(int16) * channels_); |
#if defined(OS_WIN) |
DCHECK(handle); |
DCHECK(socket_handle); |
@@ -233,8 +225,6 @@ void AudioDevice::OnLowLatencyCreated( |
DCHECK_GE(handle.fd, 0); |
DCHECK_GE(socket_handle, 0); |
#endif |
- DCHECK(length); |
- DCHECK(!audio_thread_.get()); |
// Takes care of the case when Stop() is called before OnLowLatencyCreated(). |
if (!stream_id_) { |
@@ -246,19 +236,11 @@ void AudioDevice::OnLowLatencyCreated( |
shared_memory_handle_ = handle; |
memory_length_ = length; |
- |
- DCHECK_GE(length, buffer_size_ * sizeof(int16) * channels_); |
- |
audio_socket_ = new AudioSocket(socket_handle); |
- { |
- // Synchronize with ShutDownAudioThread(). |
- base::AutoLock auto_lock(lock_); |
- |
- DCHECK(!audio_thread_.get()); |
- audio_thread_.reset( |
- new base::DelegateSimpleThread(this, "renderer_audio_thread")); |
- audio_thread_->Start(); |
- } |
+ |
+ audio_thread_.reset( |
+ new base::DelegateSimpleThread(this, "renderer_audio_thread")); |
+ audio_thread_->Start(); |
// We handle the case where Play() and/or Pause() may have been called |
// multiple times before OnLowLatencyCreated() gets called. |
@@ -333,12 +315,13 @@ size_t AudioDevice::FireRenderCallback(int16* data) { |
} |
void AudioDevice::ShutDownAudioThread() { |
- // Synchronize with OnLowLatencyCreated(). |
- base::AutoLock auto_lock(lock_); |
+ DCHECK_EQ(MessageLoop::current(), ChildProcess::current()->io_message_loop()); |
+ |
if (audio_thread_.get()) { |
// Close the socket to terminate the main thread function in the |
// audio thread. |
audio_socket_->Close(); |
+ audio_socket_ = NULL; |
audio_thread_->Join(); |
audio_thread_.reset(NULL); |
} |