Index: content/browser/renderer_host/media/audio_input_device_manager.cc |
diff --git a/content/browser/renderer_host/media/audio_input_device_manager.cc b/content/browser/renderer_host/media/audio_input_device_manager.cc |
index 00e37f9a5c5f8cec6f6950a7ff1cb1add97d0a5b..76eca28b9da41615a46b7c140bf97edfa2d09f28 100644 |
--- a/content/browser/renderer_host/media/audio_input_device_manager.cc |
+++ b/content/browser/renderer_host/media/audio_input_device_manager.cc |
@@ -31,10 +31,14 @@ AudioInputDeviceManager::AudioInputDeviceManager( |
AudioInputDeviceManager::~AudioInputDeviceManager() { |
} |
-void AudioInputDeviceManager::Register(MediaStreamProviderListener* listener) { |
+void AudioInputDeviceManager::Register( |
+ MediaStreamProviderListener* listener, |
+ base::MessageLoopProxy* device_thread_loop) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
DCHECK(!listener_); |
+ DCHECK(!device_loop_); |
listener_ = listener; |
+ device_loop_ = device_thread_loop; |
} |
void AudioInputDeviceManager::Unregister() { |
@@ -47,6 +51,36 @@ void AudioInputDeviceManager::EnumerateDevices() { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
DCHECK(listener_); |
+ device_loop_->PostTask( |
+ FROM_HERE, |
+ base::Bind(&AudioInputDeviceManager::EnumerateOnDeviceThread, this)); |
+} |
+ |
+int AudioInputDeviceManager::Open(const StreamDeviceInfo& device) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
+ // Generates a new id for this device. |
+ int session_id = next_capture_session_id_++; |
+ device_loop_->PostTask( |
+ FROM_HERE, |
+ base::Bind(&AudioInputDeviceManager::OpenOnDeviceThread, |
+ this, session_id, device)); |
+ |
+ return session_id; |
+} |
+ |
+void AudioInputDeviceManager::Close(int session_id) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
+ DCHECK(listener_); |
+ device_loop_->PostTask( |
+ FROM_HERE, |
+ base::Bind(&AudioInputDeviceManager::CloseOnDeviceThread, |
+ this, session_id)); |
+} |
+ |
+void AudioInputDeviceManager::EnumerateOnDeviceThread() { |
+ DCHECK(IsOnDeviceThread()); |
+ // AudioManager is guaranteed to outlive MediaStreamManager in |
+ // BrowserMainloop. |
media::AudioDeviceNames device_names; |
audio_manager_->GetAudioInputDeviceNames(&device_names); |
@@ -69,19 +103,14 @@ void AudioInputDeviceManager::EnumerateDevices() { |
devices)); |
} |
-int AudioInputDeviceManager::Open(const StreamDeviceInfo& device) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- |
- // Generates a new id for this device. |
- int session_id = next_capture_session_id_++; |
+void AudioInputDeviceManager::OpenOnDeviceThread( |
+ int session_id, const StreamDeviceInfo& device) { |
+ DCHECK(IsOnDeviceThread()); |
DCHECK(devices_.find(session_id) == devices_.end()); |
- media::AudioDeviceName audio_input_device_name; |
- audio_input_device_name.device_name = device.name; |
- audio_input_device_name.unique_id = device.device_id; |
- |
// Adds the session_id and device to the list. |
- devices_[session_id] = audio_input_device_name; |
+ media::AudioDeviceName target_device(device.name, device.device_id); |
+ devices_[session_id] = target_device; |
// Returns the |session_id| through the listener by posting a task on |
// IO thread since MediaStreamManager handles the callback asynchronously. |
@@ -90,13 +119,10 @@ int AudioInputDeviceManager::Open(const StreamDeviceInfo& device) { |
base::Bind(&AudioInputDeviceManager::OpenedOnIOThread, |
this, |
session_id)); |
- |
- return session_id; |
} |
-void AudioInputDeviceManager::Close(int session_id) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- DCHECK(listener_); |
+void AudioInputDeviceManager::CloseOnDeviceThread(int session_id) { |
+ DCHECK(IsOnDeviceThread()); |
if (devices_.find(session_id) != devices_.end()) |
devices_.erase(session_id); |
@@ -181,4 +207,8 @@ void AudioInputDeviceManager::ClosedOnIOThread(int session_id) { |
session_id); |
} |
+bool AudioInputDeviceManager::IsOnDeviceThread() const { |
+ return device_loop_->BelongsToCurrentThread(); |
+} |
+ |
} // namespace media_stream |