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). | |
no longer working on chromium
2012/08/31 13:38:23
I am not sure if we should actually open a device
miu
2012/09/01 01:32:00
Thanks for the explanation. I've removed this TOD
| |
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). | |
no longer working on chromium
2012/08/31 13:38:23
Stop() has already close the device, not sure if w
miu
2012/09/01 01:32:00
Removed this comment too.
| |
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 |