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

Side by Side Diff: chromeos/dbus/cras_audio_client.cc

Issue 14314002: Implement new audio handler which talks to the new audio dbus apis. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix browser_tests compiling issue. Created 7 years, 8 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 | Annotate | Revision Log
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 "chromeos/dbus/cras_audio_client.h" 5 #include "chromeos/dbus/cras_audio_client.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "dbus/bus.h" 8 #include "dbus/bus.h"
9 #include "dbus/message.h" 9 #include "dbus/message.h"
10 #include "dbus/object_path.h" 10 #include "dbus/object_path.h"
11 #include "dbus/object_proxy.h" 11 #include "dbus/object_proxy.h"
12 #include "third_party/cros_system_api/dbus/service_constants.h" 12 #include "third_party/cros_system_api/dbus/service_constants.h"
13 13
14 namespace chromeos { 14 namespace chromeos {
15 15
16 // The CrasAudioClient implementation used in production. 16 // The CrasAudioClient implementation used in production.
17 class CrasAudioClientImpl : public CrasAudioClient { 17 class CrasAudioClientImpl : public CrasAudioClient {
18 public: 18 public:
19 explicit CrasAudioClientImpl(dbus::Bus* bus) 19 explicit CrasAudioClientImpl(dbus::Bus* bus)
20 : cras_proxy_(NULL), 20 : cras_proxy_(NULL),
21 weak_ptr_factory_(this) { 21 weak_ptr_factory_(this) {
22 cras_proxy_ = bus->GetObjectProxy( 22 cras_proxy_ = bus->GetObjectProxy(
23 cras::kCrasServiceName, 23 cras::kCrasServiceName,
24 dbus::ObjectPath(cras::kCrasServicePath)); 24 dbus::ObjectPath(cras::kCrasServicePath));
25 25
26 // Monitor NameOwnerChanged signal.
27 cras_proxy_->SetNameOwnerChangedCallback(
28 base::Bind(&CrasAudioClientImpl::NameOwnerChangedReceived,
29 weak_ptr_factory_.GetWeakPtr()));
30
26 // Monitor the D-Bus signal for output volume change. 31 // Monitor the D-Bus signal for output volume change.
27 cras_proxy_->ConnectToSignal( 32 cras_proxy_->ConnectToSignal(
28 cras::kCrasControlInterface, 33 cras::kCrasControlInterface,
29 cras::kOutputVolumeChanged, 34 cras::kOutputVolumeChanged,
30 base::Bind(&CrasAudioClientImpl::OutputVolumeChangedReceived, 35 base::Bind(&CrasAudioClientImpl::OutputVolumeChangedReceived,
31 weak_ptr_factory_.GetWeakPtr()), 36 weak_ptr_factory_.GetWeakPtr()),
32 base::Bind(&CrasAudioClientImpl::SignalConnected, 37 base::Bind(&CrasAudioClientImpl::SignalConnected,
33 weak_ptr_factory_.GetWeakPtr())); 38 weak_ptr_factory_.GetWeakPtr()));
34 39
35 // Monitor the D-Bus signal for output mute change. 40 // Monitor the D-Bus signal for output mute change.
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after
191 196
192 private: 197 private:
193 // Called when the cras signal is initially connected. 198 // Called when the cras signal is initially connected.
194 void SignalConnected(const std::string& interface_name, 199 void SignalConnected(const std::string& interface_name,
195 const std::string& signal_name, 200 const std::string& signal_name,
196 bool success) { 201 bool success) {
197 LOG_IF(ERROR, !success) 202 LOG_IF(ERROR, !success)
198 << "Failed to connect to cras signal:" << signal_name; 203 << "Failed to connect to cras signal:" << signal_name;
199 } 204 }
200 205
206 void NameOwnerChangedReceived(dbus::Signal* signal) {
207 FOR_EACH_OBSERVER(Observer, observers_, AudioClientRestarted());
208 }
209
201 // Called when a OutputVolumeChanged signal is received. 210 // Called when a OutputVolumeChanged signal is received.
202 void OutputVolumeChangedReceived(dbus::Signal* signal) { 211 void OutputVolumeChangedReceived(dbus::Signal* signal) {
203 dbus::MessageReader reader(signal); 212 dbus::MessageReader reader(signal);
204 int32 volume; 213 int32 volume;
205 if (!reader.PopInt32(&volume)) { 214 if (!reader.PopInt32(&volume)) {
206 LOG(ERROR) << "Error reading signal from cras:" 215 VLOG(1) << "Error reading signal from cras:"
stevenjb 2013/04/18 17:10:26 These should probably also be LOG(ERROR) or LOG(WA
jennyz 2013/04/18 17:44:21 Done.
207 << signal->ToString(); 216 << signal->ToString();
208 } 217 }
209 FOR_EACH_OBSERVER(Observer, observers_, OutputVolumeChanged(volume)); 218 FOR_EACH_OBSERVER(Observer, observers_, OutputVolumeChanged(volume));
210 } 219 }
211 220
212 // Called when a OutputMuteChanged signal is received. 221 // Called when a OutputMuteChanged signal is received.
213 void OutputMuteChangedReceived(dbus::Signal* signal) { 222 void OutputMuteChangedReceived(dbus::Signal* signal) {
214 dbus::MessageReader reader(signal); 223 dbus::MessageReader reader(signal);
215 bool mute; 224 bool mute;
216 if (!reader.PopBool(&mute)) { 225 if (!reader.PopBool(&mute)) {
217 LOG(ERROR) << "Error reading signal from cras:" 226 VLOG(1) << "Error reading signal from cras:"
218 << signal->ToString(); 227 << signal->ToString();
219 } 228 }
220 FOR_EACH_OBSERVER(Observer, observers_, OutputMuteChanged(mute)); 229 FOR_EACH_OBSERVER(Observer, observers_, OutputMuteChanged(mute));
221 } 230 }
222 231
223 // Called when a InputGainChanged signal is received. 232 // Called when a InputGainChanged signal is received.
224 void InputGainChangedReceived(dbus::Signal* signal) { 233 void InputGainChangedReceived(dbus::Signal* signal) {
225 dbus::MessageReader reader(signal); 234 dbus::MessageReader reader(signal);
226 int32 gain; 235 int32 gain;
227 if (!reader.PopInt32(&gain)) { 236 if (!reader.PopInt32(&gain)) {
228 LOG(ERROR) << "Error reading signal from cras:" 237 VLOG(1) << "Error reading signal from cras:"
229 << signal->ToString(); 238 << signal->ToString();
230 } 239 }
231 FOR_EACH_OBSERVER(Observer, observers_, InputGainChanged(gain)); 240 FOR_EACH_OBSERVER(Observer, observers_, InputGainChanged(gain));
232 } 241 }
233 242
234 // Called when a InputMuteChanged signal is received. 243 // Called when a InputMuteChanged signal is received.
235 void InputMuteChangedReceived(dbus::Signal* signal) { 244 void InputMuteChangedReceived(dbus::Signal* signal) {
236 dbus::MessageReader reader(signal); 245 dbus::MessageReader reader(signal);
237 bool mute; 246 bool mute;
238 if (!reader.PopBool(&mute)) { 247 if (!reader.PopBool(&mute)) {
239 LOG(ERROR) << "Error reading signal from cras:" 248 VLOG(1) << "Error reading signal from cras:"
240 << signal->ToString(); 249 << signal->ToString();
241 } 250 }
242 FOR_EACH_OBSERVER(Observer, observers_, InputMuteChanged(mute)); 251 FOR_EACH_OBSERVER(Observer, observers_, InputMuteChanged(mute));
243 } 252 }
244 253
245 void NodesChangedReceived(dbus::Signal* signal) { 254 void NodesChangedReceived(dbus::Signal* signal) {
246 FOR_EACH_OBSERVER(Observer, observers_, NodesChanged()); 255 FOR_EACH_OBSERVER(Observer, observers_, NodesChanged());
247 } 256 }
248 257
249 void ActiveOutputNodeChangedReceived(dbus::Signal* signal) { 258 void ActiveOutputNodeChangedReceived(dbus::Signal* signal) {
250 dbus::MessageReader reader(signal); 259 dbus::MessageReader reader(signal);
251 uint64 node_id; 260 uint64 node_id;
252 if (!reader.PopUint64(&node_id)) { 261 if (!reader.PopUint64(&node_id)) {
253 LOG(ERROR) << "Error reading signal from cras:" 262 VLOG(1) << "Error reading signal from cras:"
254 << signal->ToString(); 263 << signal->ToString();
255 } 264 }
256 FOR_EACH_OBSERVER(Observer, observers_, ActiveOutputNodeChanged(node_id)); 265 FOR_EACH_OBSERVER(Observer, observers_, ActiveOutputNodeChanged(node_id));
257 } 266 }
258 267
259 void ActiveInputNodeChangedReceived(dbus::Signal* signal) { 268 void ActiveInputNodeChangedReceived(dbus::Signal* signal) {
260 dbus::MessageReader reader(signal); 269 dbus::MessageReader reader(signal);
261 uint64 node_id; 270 uint64 node_id;
262 if (!reader.PopUint64(&node_id)) { 271 if (!reader.PopUint64(&node_id)) {
263 LOG(ERROR) << "Error reading signal from cras:" 272 VLOG(1) << "Error reading signal from cras:"
264 << signal->ToString(); 273 << signal->ToString();
265 } 274 }
266 FOR_EACH_OBSERVER(Observer, observers_, ActiveInputNodeChanged(node_id)); 275 FOR_EACH_OBSERVER(Observer, observers_, ActiveInputNodeChanged(node_id));
267 } 276 }
268 277
269 void OnGetVolumeState(const GetVolumeStateCallback& callback, 278 void OnGetVolumeState(const GetVolumeStateCallback& callback,
270 dbus::Response* response) { 279 dbus::Response* response) {
271 bool success = true; 280 bool success = true;
272 VolumeState volume_state; 281 VolumeState volume_state;
273 if (response) { 282 if (response) {
274 dbus::MessageReader reader(response); 283 dbus::MessageReader reader(response);
275 if (!reader.PopInt32(&volume_state.output_volume) || 284 if (!reader.PopInt32(&volume_state.output_volume) ||
276 !reader.PopBool(&volume_state.output_mute) || 285 !reader.PopBool(&volume_state.output_mute) ||
277 !reader.PopInt32(&volume_state.input_gain) || 286 !reader.PopInt32(&volume_state.input_gain) ||
278 !reader.PopBool(&volume_state.input_mute)) { 287 !reader.PopBool(&volume_state.input_mute)) {
279 success = false; 288 success = false;
280 LOG(ERROR) << "Error reading response from cras: " 289 VLOG(1) << "Error reading response from cras: "
281 << response->ToString(); 290 << response->ToString();
282 } 291 }
283 } else { 292 } else {
284 success = false; 293 success = false;
285 LOG(ERROR) << "Error calling " << cras::kGetVolumeState; 294 VLOG(1) << "Error calling " << cras::kGetVolumeState;
286 } 295 }
287 296
288 callback.Run(volume_state, success); 297 callback.Run(volume_state, success);
289 } 298 }
290 299
291 void OnGetNodes(const GetNodesCallback& callback, 300 void OnGetNodes(const GetNodesCallback& callback,
292 dbus::Response* response) { 301 dbus::Response* response) {
293 bool success = true; 302 bool success = true;
294 AudioNodeList node_list; 303 AudioNodeList node_list;
295 if (response) { 304 if (response) {
296 dbus::MessageReader response_reader(response); 305 dbus::MessageReader response_reader(response);
297 dbus::MessageReader array_reader(response); 306 dbus::MessageReader array_reader(response);
298 while(response_reader.HasMoreData()) { 307 while (response_reader.HasMoreData()) {
299 if (!response_reader.PopArray(&array_reader)) { 308 if (!response_reader.PopArray(&array_reader)) {
300 success = false; 309 success = false;
301 LOG(ERROR) << "Error reading response from cras: " 310 VLOG(1) << "Error reading response from cras: "
302 << response->ToString(); 311 << response->ToString();
303 break; 312 break;
304 } 313 }
305 314
306 AudioNode node; 315 AudioNode node;
307 if (!GetAudioNode(response, &array_reader, &node)) { 316 if (!GetAudioNode(response, &array_reader, &node)) {
308 success = false; 317 success = false;
309 LOG(WARNING) << "Error reading audio node data from cras: " 318 LOG(WARNING) << "Error reading audio node data from cras: "
310 << response->ToString(); 319 << response->ToString();
311 break; 320 break;
312 } 321 }
313 322
314 node_list.push_back(node); 323 node_list.push_back(node);
315 } 324 }
316 } else { 325 } else {
317 success = false; 326 success = false;
318 LOG(ERROR) << "Error calling " << cras::kGetNodes; 327 VLOG(1) << "Error calling " << cras::kGetNodes;
319 } 328 }
320 329
321 callback.Run(node_list, success); 330 callback.Run(node_list, success);
322 } 331 }
323 332
324 bool GetAudioNode(dbus::Response* response, 333 bool GetAudioNode(dbus::Response* response,
325 dbus::MessageReader* array_reader, 334 dbus::MessageReader* array_reader,
326 AudioNode *node) { 335 AudioNode *node) {
327 while (array_reader->HasMoreData()) { 336 while (array_reader->HasMoreData()) {
328 dbus::MessageReader dict_entry_reader(response); 337 dbus::MessageReader dict_entry_reader(response);
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
367 376
368 DISALLOW_COPY_AND_ASSIGN(CrasAudioClientImpl); 377 DISALLOW_COPY_AND_ASSIGN(CrasAudioClientImpl);
369 }; 378 };
370 379
371 // The CrasAudioClient implementation used on Linux desktop, 380 // The CrasAudioClient implementation used on Linux desktop,
372 // which does nothing. 381 // which does nothing.
373 class CrasAudioClientStubImpl : public CrasAudioClient { 382 class CrasAudioClientStubImpl : public CrasAudioClient {
374 public: 383 public:
375 CrasAudioClientStubImpl() { 384 CrasAudioClientStubImpl() {
376 VLOG(1) << "CrasAudioClientStubImpl is created"; 385 VLOG(1) << "CrasAudioClientStubImpl is created";
386
387 // Fake audio nodes.
388 AudioNode node_1;
389 node_1.is_input = false;
390 node_1.id = 10001;
391 node_1.device_name = "Fake Audio Output";
392 node_1.type = "INTERNAL_SPEAKER";
393 node_1.name = "Internal Speaker";
394 node_1.active = true;
395
396 AudioNode node_2;
397 node_2.is_input = true;
398 node_2.id = 10002;
399 node_2.device_name = "Fake Audio Input";
400 node_2.type = "INTERNAL_MIC";
401 node_2.name = "Internal Mic";
402 node_2.active = true;
403
404 node_list_.push_back(node_1);
405 node_list_.push_back(node_2);
377 } 406 }
378 virtual ~CrasAudioClientStubImpl() {} 407 virtual ~CrasAudioClientStubImpl() {
408 }
379 409
380 // CrasAudioClient overrides: 410 // CrasAudioClient overrides:
381 // TODO(jennyz): Implement the observers and callbacks in the stub for UI 411 // TODO(jennyz): Implement the observers and callbacks in the stub for UI
382 // testing. 412 // testing.
383 virtual void AddObserver(Observer* observer) OVERRIDE {} 413 virtual void AddObserver(Observer* observer) OVERRIDE {
384 virtual void RemoveObserver(Observer* observer) OVERRIDE {} 414 observers_.AddObserver(observer);
385 virtual bool HasObserver(Observer* observer) OVERRIDE { return false; } 415 }
416
417 virtual void RemoveObserver(Observer* observer) OVERRIDE {
418 observers_.RemoveObserver(observer);
419 }
420
421 virtual bool HasObserver(Observer* observer) OVERRIDE {
422 return observers_.HasObserver(observer);
423 }
424
386 virtual void GetVolumeState(const GetVolumeStateCallback& callback) OVERRIDE { 425 virtual void GetVolumeState(const GetVolumeStateCallback& callback) OVERRIDE {
426 callback.Run(volume_state_, true);
387 } 427 }
388 virtual void GetNodes(const GetNodesCallback& callback)OVERRIDE {} 428
389 virtual void SetOutputVolume(int32 volume) OVERRIDE {} 429 virtual void GetNodes(const GetNodesCallback& callback)OVERRIDE {
390 virtual void SetOutputMute(bool mute_on) OVERRIDE {} 430 callback.Run(node_list_, true);
391 virtual void SetInputGain(int32 input_gain) OVERRIDE {} 431 }
392 virtual void SetInputMute(bool mute_on) OVERRIDE {} 432
393 virtual void SetActiveOutputNode(uint64 node_id) OVERRIDE {} 433 virtual void SetOutputVolume(int32 volume) OVERRIDE {
394 virtual void SetActiveInputNode(uint64 node_id) OVERRIDE {} 434 VLOG(1) << "CrasAudioClientStubImpl::SetOutputVolume volume=" << volume;
435 volume_state_.output_volume = volume;
436 FOR_EACH_OBSERVER(Observer,
437 observers_,
438 OutputVolumeChanged(volume_state_.output_volume));
439 }
440
441 virtual void SetOutputMute(bool mute_on) OVERRIDE {
442 VLOG(1) << "CrasAudioClientStubImpl::SetOutputMute, mute_on=" << mute_on;
443 volume_state_.output_mute = mute_on;
444 FOR_EACH_OBSERVER(Observer,
445 observers_,
446 OutputMuteChanged(volume_state_.output_mute));
447 }
448
449 virtual void SetInputGain(int32 input_gain) OVERRIDE {
450 volume_state_.input_gain = input_gain;
451 FOR_EACH_OBSERVER(Observer,
452 observers_,
453 InputGainChanged(volume_state_.input_gain));
454 }
455
456 virtual void SetInputMute(bool mute_on) OVERRIDE {
457 volume_state_.input_mute = mute_on;
458 FOR_EACH_OBSERVER(Observer,
459 observers_,
460 InputMuteChanged(volume_state_.input_mute));
461 }
462
463 virtual void SetActiveOutputNode(uint64 node_id) OVERRIDE {
464 active_output_node_id_ = node_id;
465 FOR_EACH_OBSERVER(Observer,
466 observers_,
467 ActiveOutputNodeChanged(node_id));
468 }
469
470 virtual void SetActiveInputNode(uint64 node_id) OVERRIDE {
471 active_input_node_id_ = node_id;
472 FOR_EACH_OBSERVER(Observer,
473 observers_,
474 ActiveInputNodeChanged(node_id));
475 }
395 476
396 private: 477 private:
478 VolumeState volume_state_;
479 AudioNodeList node_list_;
480 uint64 active_input_node_id_;
481 uint64 active_output_node_id_;
482 ObserverList<Observer> observers_;
483
397 DISALLOW_COPY_AND_ASSIGN(CrasAudioClientStubImpl); 484 DISALLOW_COPY_AND_ASSIGN(CrasAudioClientStubImpl);
398 }; 485 };
399 486
400 CrasAudioClient::Observer::~Observer() { 487 CrasAudioClient::Observer::~Observer() {
401 } 488 }
402 489
490 void CrasAudioClient::Observer::AudioClientRestarted() {
491 }
492
403 void CrasAudioClient::Observer::OutputVolumeChanged(int32 volume) { 493 void CrasAudioClient::Observer::OutputVolumeChanged(int32 volume) {
404 } 494 }
405 495
406 void CrasAudioClient::Observer::OutputMuteChanged(bool mute_on) { 496 void CrasAudioClient::Observer::OutputMuteChanged(bool mute_on) {
407 } 497 }
408 498
409 void CrasAudioClient::Observer::InputGainChanged(int gain) { 499 void CrasAudioClient::Observer::InputGainChanged(int gain) {
410 } 500 }
411 501
412 void CrasAudioClient::Observer::InputMuteChanged(bool mute_on) { 502 void CrasAudioClient::Observer::InputMuteChanged(bool mute_on) {
(...skipping 19 matching lines...) Expand all
432 DBusClientImplementationType type, 522 DBusClientImplementationType type,
433 dbus::Bus* bus) { 523 dbus::Bus* bus) {
434 if (type == REAL_DBUS_CLIENT_IMPLEMENTATION) { 524 if (type == REAL_DBUS_CLIENT_IMPLEMENTATION) {
435 return new CrasAudioClientImpl(bus); 525 return new CrasAudioClientImpl(bus);
436 } 526 }
437 DCHECK_EQ(STUB_DBUS_CLIENT_IMPLEMENTATION, type); 527 DCHECK_EQ(STUB_DBUS_CLIENT_IMPLEMENTATION, type);
438 return new CrasAudioClientStubImpl(); 528 return new CrasAudioClientStubImpl();
439 } 529 }
440 530
441 } // namespace chromeos 531 } // namespace chromeos
OLDNEW
« chromeos/audio/cras_audio_handler.cc ('K') | « chromeos/dbus/cras_audio_client.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698