Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(62)

Side by Side Diff: chrome/browser/extensions/api/audio/audio_service_chromeos.cc

Issue 596603002: Supports multiple active input/output audio nodes in CrasAudioHandler. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Minor change for code review comments. Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2013 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 "chrome/browser/extensions/api/audio/audio_service.h" 5 #include "chrome/browser/extensions/api/audio/audio_service.h"
6 6
7 #include "base/callback.h" 7 #include "base/callback.h"
8 #include "base/memory/weak_ptr.h" 8 #include "base/memory/weak_ptr.h"
9 #include "base/strings/string_number_conversions.h" 9 #include "base/strings/string_number_conversions.h"
10 #include "chromeos/audio/audio_device.h" 10 #include "chromeos/audio/audio_device.h"
11 #include "chromeos/audio/cras_audio_handler.h" 11 #include "chromeos/audio/cras_audio_handler.h"
12 #include "chromeos/dbus/cras_audio_client.h"
13 #include "chromeos/dbus/dbus_thread_manager.h"
14 #include "content/public/browser/browser_thread.h" 12 #include "content/public/browser/browser_thread.h"
15 13
16 using content::BrowserThread; 14 using content::BrowserThread;
17 15
18 namespace extensions { 16 namespace extensions {
19 17
20 using api::audio::OutputDeviceInfo; 18 using api::audio::OutputDeviceInfo;
21 using api::audio::InputDeviceInfo; 19 using api::audio::InputDeviceInfo;
22 20
23 class AudioServiceImpl : public AudioService, 21 class AudioServiceImpl : public AudioService,
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
130 } 128 }
131 } 129 }
132 callback.Run(output_info, input_info, true); 130 callback.Run(output_info, input_info, true);
133 } 131 }
134 132
135 void AudioServiceImpl::SetActiveDevices(const DeviceIdList& device_list) { 133 void AudioServiceImpl::SetActiveDevices(const DeviceIdList& device_list) {
136 DCHECK(cras_audio_handler_); 134 DCHECK(cras_audio_handler_);
137 if (!cras_audio_handler_) 135 if (!cras_audio_handler_)
138 return; 136 return;
139 137
140 // De-activate all the nodes with RemoveActive{Input/Output}Node API. This is 138 cras_audio_handler_->RemoveAllActiveNodes();
141 // kind of hacky, but we don't know which set of nodes are active from
142 // CrasAudioHandler.
143 // TODO(rkc): Fix it in http://crbug.com/402072.
144 chromeos::AudioDeviceList devices;
145 cras_audio_handler_->GetAudioDevices(&devices);
146 for (size_t i = 0; i < devices.size(); ++i) {
147 if (devices[i].is_input) {
148 chromeos::DBusThreadManager::Get()
149 ->GetCrasAudioClient()
150 ->RemoveActiveInputNode(devices[i].id);
151 } else { // output
152 chromeos::DBusThreadManager::Get()
153 ->GetCrasAudioClient()
154 ->RemoveActiveOutputNode(devices[i].id);
155 }
156 }
157 139
158 bool input_device_set = false;
159 bool output_device_set = false;
160 std::string active_input_node_ids, active_output_node_ids;
161 for (size_t i = 0; i < device_list.size(); ++i) { 140 for (size_t i = 0; i < device_list.size(); ++i) {
162 chromeos::AudioDevice device; 141 chromeos::AudioDevice device;
163 bool found = FindDevice(GetIdFromStr(device_list[i]), &device); 142 if (FindDevice(GetIdFromStr(device_list[i]), &device))
164 if (found) { 143 cras_audio_handler_->AddActiveNode(device.id);
165 if (device.is_input) {
166 if (!input_device_set) {
167 cras_audio_handler_->SwitchToDevice(device);
168 input_device_set = true;
169 } else {
170 active_input_node_ids.push_back(device.id);
171 }
172 } else { // output device
173 if (!output_device_set) {
174 cras_audio_handler_->SwitchToDevice(device);
175 output_device_set = true;
176 } else {
177 active_output_node_ids.push_back(device.id);
178 }
179 }
180 }
181 }
182
183 // Once we have set our devices to active and all the inactive ones have been
184 // set correctly to inactive, go through our active devices again and set
185 // them to active using the AddActiveNode API.
186 // TODO(rkc):Fix this ugly hack in http://crbug.com/402072.
187 for (size_t i = 0; i < active_input_node_ids.size(); ++i) {
188 chromeos::DBusThreadManager::Get()
189 ->GetCrasAudioClient()
190 ->AddActiveInputNode(active_input_node_ids[i]);
191 }
192 for (size_t i = 0; i < active_output_node_ids.size(); ++i) {
193 chromeos::DBusThreadManager::Get()
194 ->GetCrasAudioClient()
195 ->AddActiveOutputNode(active_output_node_ids[i]);
196 } 144 }
197 } 145 }
198 146
199 bool AudioServiceImpl::SetDeviceProperties(const std::string& device_id, 147 bool AudioServiceImpl::SetDeviceProperties(const std::string& device_id,
200 bool muted, 148 bool muted,
201 int volume, 149 int volume,
202 int gain) { 150 int gain) {
203 DCHECK(cras_audio_handler_); 151 DCHECK(cras_audio_handler_);
204 if (!cras_audio_handler_) 152 if (!cras_audio_handler_)
205 return false; 153 return false;
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
273 221
274 void AudioServiceImpl::NotifyDeviceChanged() { 222 void AudioServiceImpl::NotifyDeviceChanged() {
275 FOR_EACH_OBSERVER(AudioService::Observer, observer_list_, OnDeviceChanged()); 223 FOR_EACH_OBSERVER(AudioService::Observer, observer_list_, OnDeviceChanged());
276 } 224 }
277 225
278 AudioService* AudioService::CreateInstance() { 226 AudioService* AudioService::CreateInstance() {
279 return new AudioServiceImpl; 227 return new AudioServiceImpl;
280 } 228 }
281 229
282 } // namespace extensions 230 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698