| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/browser/renderer_host/media/audio_input_device_manager.h" | 5 #include "content/browser/renderer_host/media/audio_input_device_manager.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/memory/scoped_ptr.h" | 8 #include "base/memory/scoped_ptr.h" |
| 9 #include "content/browser/renderer_host/media/audio_input_device_manager_event_h
andler.h" | 9 #include "content/browser/renderer_host/media/audio_input_device_manager_event_h
andler.h" |
| 10 #include "content/public/browser/browser_thread.h" | 10 #include "content/public/browser/browser_thread.h" |
| 11 #include "content/public/common/media_stream_request.h" |
| 11 #include "media/audio/audio_input_ipc.h" | 12 #include "media/audio/audio_input_ipc.h" |
| 12 #include "media/audio/audio_manager_base.h" | 13 #include "media/audio/audio_manager_base.h" |
| 13 | 14 |
| 14 using content::BrowserThread; | 15 using content::BrowserThread; |
| 15 | 16 |
| 16 namespace media_stream { | 17 namespace media_stream { |
| 17 | 18 |
| 19 namespace { |
| 20 const char kStubTabAudioDeviceId[] = "<<tab audio id here>>"; |
| 21 } |
| 22 |
| 18 const int AudioInputDeviceManager::kFakeOpenSessionId = 1; | 23 const int AudioInputDeviceManager::kFakeOpenSessionId = 1; |
| 19 | 24 |
| 20 // Starting id for the first capture session. | 25 // Starting id for the first capture session. |
| 21 const int kFirstSessionId = AudioInputDeviceManager::kFakeOpenSessionId + 1; | 26 const int kFirstSessionId = AudioInputDeviceManager::kFakeOpenSessionId + 1; |
| 22 | 27 |
| 23 AudioInputDeviceManager::AudioInputDeviceManager( | 28 AudioInputDeviceManager::AudioInputDeviceManager( |
| 24 media::AudioManager* audio_manager) | 29 media::AudioManager* audio_manager, |
| 25 : listener_(NULL), | 30 media_stream::MediaStreamType device_type) |
| 31 : device_type_(device_type), |
| 32 listener_(NULL), |
| 26 next_capture_session_id_(kFirstSessionId), | 33 next_capture_session_id_(kFirstSessionId), |
| 27 audio_manager_(audio_manager) { | 34 audio_manager_(audio_manager) { |
| 35 DCHECK(content::IsAudioMediaStreamDeviceType(device_type_)); |
| 28 } | 36 } |
| 29 | 37 |
| 30 AudioInputDeviceManager::~AudioInputDeviceManager() { | 38 AudioInputDeviceManager::~AudioInputDeviceManager() { |
| 31 } | 39 } |
| 32 | 40 |
| 33 void AudioInputDeviceManager::Register( | 41 void AudioInputDeviceManager::Register( |
| 34 MediaStreamProviderListener* listener, | 42 MediaStreamProviderListener* listener, |
| 35 base::MessageLoopProxy* device_thread_loop) { | 43 base::MessageLoopProxy* device_thread_loop) { |
| 36 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 44 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 37 DCHECK(!listener_); | 45 DCHECK(!listener_); |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 77 } | 85 } |
| 78 | 86 |
| 79 device_loop_->PostTask( | 87 device_loop_->PostTask( |
| 80 FROM_HERE, | 88 FROM_HERE, |
| 81 base::Bind(&AudioInputDeviceManager::CloseOnDeviceThread, | 89 base::Bind(&AudioInputDeviceManager::CloseOnDeviceThread, |
| 82 this, session_id)); | 90 this, session_id)); |
| 83 } | 91 } |
| 84 | 92 |
| 85 void AudioInputDeviceManager::EnumerateOnDeviceThread() { | 93 void AudioInputDeviceManager::EnumerateOnDeviceThread() { |
| 86 DCHECK(IsOnDeviceThread()); | 94 DCHECK(IsOnDeviceThread()); |
| 87 // AudioManager is guaranteed to outlive MediaStreamManager in | |
| 88 // BrowserMainloop. | |
| 89 media::AudioDeviceNames device_names; | |
| 90 audio_manager_->GetAudioInputDeviceNames(&device_names); | |
| 91 | 95 |
| 92 StreamDeviceInfoArray* devices = new StreamDeviceInfoArray; | 96 StreamDeviceInfoArray* devices = new StreamDeviceInfoArray; |
| 93 for (media::AudioDeviceNames::iterator it = device_names.begin(); | 97 switch (device_type_) { |
| 94 it != device_names.end(); | 98 case content::MEDIA_STREAM_DEVICE_TYPE_USER_AUDIO_CAPTURE: { |
| 95 ++it) { | 99 // AudioManager is guaranteed to outlive MediaStreamManager in |
| 96 devices->push_back(StreamDeviceInfo( | 100 // BrowserMainloop. |
| 97 content::MEDIA_STREAM_DEVICE_TYPE_AUDIO_CAPTURE, it->device_name, | 101 media::AudioDeviceNames device_names; |
| 98 it->unique_id, false)); | 102 audio_manager_->GetAudioInputDeviceNames(&device_names); |
| 103 for (media::AudioDeviceNames::iterator it = device_names.begin(); |
| 104 it != device_names.end(); ++it) { |
| 105 devices->push_back(StreamDeviceInfo( |
| 106 device_type_, it->device_name, it->unique_id, false)); |
| 107 } |
| 108 break; |
| 109 } |
| 110 case content::MEDIA_STREAM_DEVICE_TYPE_TAB_AUDIO_CAPTURE: |
| 111 // TODO(miu): Replace this stub with the actual implementation. |
| 112 devices->push_back(StreamDeviceInfo( |
| 113 device_type_, "Stub Tab Audio Capture", kStubTabAudioDeviceId, |
| 114 false)); |
| 115 break; |
| 116 default: |
| 117 NOTIMPLEMENTED(); |
| 118 break; |
| 99 } | 119 } |
| 100 | 120 |
| 101 // Returns the device list through the listener by posting a task on | 121 // Returns the device list through the listener by posting a task on |
| 102 // IO thread since MediaStreamManager handles the callback asynchronously. | 122 // IO thread since MediaStreamManager handles the callback asynchronously. |
| 103 BrowserThread::PostTask( | 123 BrowserThread::PostTask( |
| 104 BrowserThread::IO, | 124 BrowserThread::IO, |
| 105 FROM_HERE, | 125 FROM_HERE, |
| 106 base::Bind(&AudioInputDeviceManager::DevicesEnumeratedOnIOThread, | 126 base::Bind(&AudioInputDeviceManager::DevicesEnumeratedOnIOThread, |
| 107 this, | 127 this, |
| 108 devices)); | 128 devices)); |
| 109 } | 129 } |
| 110 | 130 |
| 111 void AudioInputDeviceManager::OpenOnDeviceThread( | 131 void AudioInputDeviceManager::OpenOnDeviceThread( |
| 112 int session_id, const StreamDeviceInfo& device) { | 132 int session_id, const StreamDeviceInfo& device) { |
| 113 DCHECK(IsOnDeviceThread()); | 133 DCHECK(IsOnDeviceThread()); |
| 114 DCHECK(devices_.find(session_id) == devices_.end()); | 134 DCHECK(devices_.find(session_id) == devices_.end()); |
| 115 | 135 |
| 116 // Adds the session_id and device to the list. | 136 // Adds the session_id and device to the list. |
| 117 media::AudioDeviceName target_device(device.name, device.device_id); | 137 media::AudioDeviceName target_device(device.name, device.device_id); |
| 118 devices_[session_id] = target_device; | 138 devices_[session_id] = target_device; |
| 139 // TODO(miu): Complete the implementation (i.e., actually open a device). |
| 119 | 140 |
| 120 // Returns the |session_id| through the listener by posting a task on | 141 // Returns the |session_id| through the listener by posting a task on |
| 121 // IO thread since MediaStreamManager handles the callback asynchronously. | 142 // IO thread since MediaStreamManager handles the callback asynchronously. |
| 122 BrowserThread::PostTask(BrowserThread::IO, | 143 BrowserThread::PostTask(BrowserThread::IO, |
| 123 FROM_HERE, | 144 FROM_HERE, |
| 124 base::Bind(&AudioInputDeviceManager::OpenedOnIOThread, | 145 base::Bind(&AudioInputDeviceManager::OpenedOnIOThread, |
| 125 this, | 146 this, |
| 126 session_id)); | 147 session_id)); |
| 127 } | 148 } |
| 128 | 149 |
| 129 void AudioInputDeviceManager::CloseOnDeviceThread(int session_id) { | 150 void AudioInputDeviceManager::CloseOnDeviceThread(int session_id) { |
| 130 DCHECK(IsOnDeviceThread()); | 151 DCHECK(IsOnDeviceThread()); |
| 131 | 152 |
| 132 if (devices_.find(session_id) != devices_.end()) | 153 if (devices_.find(session_id) != devices_.end()) |
| 133 devices_.erase(session_id); | 154 devices_.erase(session_id); |
| 155 // TODO(miu): Complete the implementation (i.e., actually close a device). |
| 134 | 156 |
| 135 // Posts a callback through the listener on IO thread since | 157 // Posts a callback through the listener on IO thread since |
| 136 // MediaStreamManager handles the callback asynchronously. | 158 // MediaStreamManager handles the callback asynchronously. |
| 137 BrowserThread::PostTask(BrowserThread::IO, | 159 BrowserThread::PostTask(BrowserThread::IO, |
| 138 FROM_HERE, | 160 FROM_HERE, |
| 139 base::Bind(&AudioInputDeviceManager::ClosedOnIOThread, | 161 base::Bind(&AudioInputDeviceManager::ClosedOnIOThread, |
| 140 this, | 162 this, |
| 141 session_id)); | 163 session_id)); |
| 142 } | 164 } |
| 143 | 165 |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 178 // Erases the event handler referenced by the session_id. | 200 // Erases the event handler referenced by the session_id. |
| 179 event_handlers_.erase(session_id); | 201 event_handlers_.erase(session_id); |
| 180 } | 202 } |
| 181 | 203 |
| 182 void AudioInputDeviceManager::DevicesEnumeratedOnIOThread( | 204 void AudioInputDeviceManager::DevicesEnumeratedOnIOThread( |
| 183 StreamDeviceInfoArray* devices) { | 205 StreamDeviceInfoArray* devices) { |
| 184 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 206 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 185 // Ensures that |devices| gets deleted on exit. | 207 // Ensures that |devices| gets deleted on exit. |
| 186 scoped_ptr<StreamDeviceInfoArray> devices_array(devices); | 208 scoped_ptr<StreamDeviceInfoArray> devices_array(devices); |
| 187 if (listener_) { | 209 if (listener_) { |
| 188 listener_->DevicesEnumerated( | 210 listener_->DevicesEnumerated(device_type_, *devices_array); |
| 189 content::MEDIA_STREAM_DEVICE_TYPE_AUDIO_CAPTURE, | |
| 190 *devices_array); | |
| 191 } | 211 } |
| 192 } | 212 } |
| 193 | 213 |
| 194 void AudioInputDeviceManager::OpenedOnIOThread(int session_id) { | 214 void AudioInputDeviceManager::OpenedOnIOThread(int session_id) { |
| 195 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 215 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 196 if (listener_) | 216 if (listener_) |
| 197 listener_->Opened(content::MEDIA_STREAM_DEVICE_TYPE_AUDIO_CAPTURE, | 217 listener_->Opened(device_type_, session_id); |
| 198 session_id); | |
| 199 } | 218 } |
| 200 | 219 |
| 201 void AudioInputDeviceManager::ClosedOnIOThread(int session_id) { | 220 void AudioInputDeviceManager::ClosedOnIOThread(int session_id) { |
| 202 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 221 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 203 if (listener_) | 222 if (listener_) |
| 204 listener_->Closed(content::MEDIA_STREAM_DEVICE_TYPE_AUDIO_CAPTURE, | 223 listener_->Closed(device_type_, session_id); |
| 205 session_id); | |
| 206 } | 224 } |
| 207 | 225 |
| 208 bool AudioInputDeviceManager::IsOnDeviceThread() const { | 226 bool AudioInputDeviceManager::IsOnDeviceThread() const { |
| 209 return device_loop_->BelongsToCurrentThread(); | 227 return device_loop_->BelongsToCurrentThread(); |
| 210 } | 228 } |
| 211 | 229 |
| 212 } // namespace media_stream | 230 } // namespace media_stream |
| OLD | NEW |