Index: content/renderer/media/audio_message_filter.cc |
diff --git a/content/renderer/media/audio_message_filter.cc b/content/renderer/media/audio_message_filter.cc |
index 22915c521c53264ededd36610bf119e14089c95c..4eef36c2d8150240a3efc19a511071763f964cc1 100644 |
--- a/content/renderer/media/audio_message_filter.cc |
+++ b/content/renderer/media/audio_message_filter.cc |
@@ -23,21 +23,22 @@ AudioMessageFilter* AudioMessageFilter::Get() { |
AudioMessageFilter::AudioMessageFilter() |
: next_stream_id_(1), |
- channel_(NULL) { |
+ channel_(NULL), |
+ audio_hardware_config_(NULL) { |
DVLOG(1) << "AudioMessageFilter::AudioMessageFilter()"; |
DCHECK(!filter_); |
filter_ = this; |
} |
int AudioMessageFilter::AddDelegate(media::AudioOutputIPCDelegate* delegate) { |
- base::AutoLock guard(delegates_lock_); |
+ base::AutoLock auto_lock(lock_); |
const int id = next_stream_id_++; |
delegates_.insert(std::make_pair(id, delegate)); |
return id; |
} |
void AudioMessageFilter::RemoveDelegate(int id) { |
- base::AutoLock guard(delegates_lock_); |
+ base::AutoLock auto_lock(lock_); |
delegates_.erase(id); |
} |
@@ -96,6 +97,7 @@ bool AudioMessageFilter::OnMessageReceived(const IPC::Message& message) { |
IPC_BEGIN_MESSAGE_MAP(AudioMessageFilter, message) |
IPC_MESSAGE_HANDLER(AudioMsg_NotifyStreamCreated, OnStreamCreated) |
IPC_MESSAGE_HANDLER(AudioMsg_NotifyStreamStateChanged, OnStreamStateChanged) |
+ IPC_MESSAGE_HANDLER(AudioMsg_NotifyDeviceChanged, OnOutputDeviceChanged) |
IPC_MESSAGE_UNHANDLED(handled = false) |
IPC_END_MESSAGE_MAP() |
return handled; |
@@ -115,7 +117,7 @@ void AudioMessageFilter::OnChannelClosing() { |
DelegateMap zombies; |
{ |
- base::AutoLock guard(delegates_lock_); |
+ base::AutoLock auto_lock(lock_); |
delegates_.swap(zombies); |
} |
@@ -153,7 +155,7 @@ void AudioMessageFilter::OnStreamCreated( |
#endif |
{ |
- base::AutoLock guard(delegates_lock_); |
+ base::AutoLock auto_lock(lock_); |
DelegateMap::const_iterator it = delegates_.find(stream_id); |
if (it != delegates_.end()) { |
it->second->OnStreamCreated(handle, socket_handle, length); |
@@ -169,7 +171,7 @@ void AudioMessageFilter::OnStreamCreated( |
void AudioMessageFilter::OnStreamStateChanged( |
int stream_id, media::AudioOutputIPCDelegate::State state) { |
- base::AutoLock guard(delegates_lock_); |
+ base::AutoLock auto_lock(lock_); |
DelegateMap::const_iterator it = delegates_.find(stream_id); |
DLOG_IF(WARNING, it == delegates_.end()) |
<< "No delegate found for state change. " << state; |
@@ -177,4 +179,24 @@ void AudioMessageFilter::OnStreamStateChanged( |
it->second->OnStateChanged(state); |
} |
+void AudioMessageFilter::OnOutputDeviceChanged(int stream_id, |
+ int new_buffer_size, |
+ int new_sample_rate) { |
+ base::AutoLock auto_lock(lock_); |
+ |
+ // Ignore the message if an audio hardware config hasn't been created; this |
+ // can occur if the renderer is using the high latency audio path. |
+ // TODO(dalecurtis): After http://crbug.com/173435 is fixed, convert to CHECK. |
+ if (!audio_hardware_config_) |
+ return; |
+ |
+ audio_hardware_config_->UpdateOutputConfig(new_buffer_size, new_sample_rate); |
+} |
+ |
+void AudioMessageFilter::SetAudioHardwareConfig( |
+ media::AudioHardwareConfig* config) { |
+ base::AutoLock auto_lock(lock_); |
+ audio_hardware_config_ = config; |
+} |
+ |
} // namespace content |