130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// Copyright (c) 2013 The Chromium Authors. All rights reserved. 230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// Use of this source code is governed by a BSD-style license that can be 330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// found in the LICENSE file. 430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "chromeos/dbus/cras_audio_client_stub_impl.h" 630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunnamespace chromeos { 830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunCrasAudioClientStubImpl::CrasAudioClientStubImpl() 1030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun : active_input_node_id_(0), 1130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun active_output_node_id_(0) { 1230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 1330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 1430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunCrasAudioClientStubImpl::~CrasAudioClientStubImpl() { 1530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 1630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 1730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunvoid CrasAudioClientStubImpl::Init(dbus::Bus* bus) { 1830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun VLOG(1) << "CrasAudioClientStubImpl is created"; 1930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 2030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Fake audio output nodes. 2130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun AudioNode node_1; 2230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun node_1.is_input = false; 2330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun node_1.id = 10001; 2430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun node_1.device_name = "Fake Speaker"; 2530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun node_1.type = "INTERNAL_SPEAKER"; 2630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun node_1.name = "Speaker"; 2730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun node_list_.push_back(node_1); 2830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 2930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun AudioNode node_2; 3030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun node_2.is_input = false; 3130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun node_2.id = 10002; 3230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun node_2.device_name = "Fake Headphone"; 3330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun node_2.type = "HEADPHONE"; 3430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun node_2.name = "Headphone"; 3530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun node_list_.push_back(node_2); 3630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 3730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun AudioNode node_3; 3830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun node_3.is_input = false; 3930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun node_3.id = 10003; 4030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun node_3.device_name = "Fake Bluetooth Headphone"; 4130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun node_3.type = "BLUETOOTH"; 4230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun node_3.name = "Headphone"; 4330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun node_list_.push_back(node_3); 4430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 4530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Fake audio input ndoes 4630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun AudioNode node_4; 4730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun node_4.is_input = true; 4830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun node_4.id = 10004; 4930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun node_4.device_name = "Fake Internal Mic"; 5030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun node_4.type = "INTERNAL_MIC"; 5130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun node_4.name = "Internal Mic"; 5230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun node_list_.push_back(node_4); 5330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 5430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun AudioNode node_5; 5530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun node_5.is_input = true; 5630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun node_5.id = 10005; 5730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun node_5.device_name = "Fake USB Mic"; 5830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun node_5.type = "USB"; 5930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun node_5.name = "Mic"; 6030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun node_list_.push_back(node_5); 6130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 6230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 6330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunvoid CrasAudioClientStubImpl::AddObserver(Observer* observer) { 6430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun observers_.AddObserver(observer); 6530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 6630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 6730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunvoid CrasAudioClientStubImpl::RemoveObserver(Observer* observer) { 6830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun observers_.RemoveObserver(observer); 6930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 7030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 7130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunbool CrasAudioClientStubImpl::HasObserver(Observer* observer) { 7230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return observers_.HasObserver(observer); 7330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 7430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 7530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunvoid CrasAudioClientStubImpl::GetVolumeState( 7630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun const GetVolumeStateCallback& callback) { 7730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun callback.Run(volume_state_, true); 7830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 7930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 8030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunvoid CrasAudioClientStubImpl::GetNodes(const GetNodesCallback& callback, 8130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun const ErrorCallback& error_callback) { 8230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun callback.Run(node_list_, true); 8330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 8430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 8530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunvoid CrasAudioClientStubImpl::SetOutputNodeVolume(uint64 node_id, 8630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32 volume) { 8730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 8830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 8930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunvoid CrasAudioClientStubImpl::SetOutputUserMute(bool mute_on) { 9030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun volume_state_.output_user_mute = mute_on; 9130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun FOR_EACH_OBSERVER(Observer, 9230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun observers_, 9330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun OutputMuteChanged(volume_state_.output_user_mute)); 9430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 9530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 9630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunvoid CrasAudioClientStubImpl::SetInputNodeGain(uint64 node_id, 9730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32 input_gain) { 9830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 9930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 10030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunvoid CrasAudioClientStubImpl::SetInputMute(bool mute_on) { 10130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun volume_state_.input_mute = mute_on; 10230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun FOR_EACH_OBSERVER(Observer, 10330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun observers_, 10430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun InputMuteChanged(volume_state_.input_mute)); 10530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 10630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 10730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunvoid CrasAudioClientStubImpl::SetActiveOutputNode(uint64 node_id) { 10830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun if (active_output_node_id_ == node_id) 10930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return; 11030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 11130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun for (size_t i = 0; i < node_list_.size(); ++i) { 11230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun if (node_list_[i].id == active_output_node_id_) 11330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun node_list_[i].active = false; 11430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun else if (node_list_[i].id == node_id) 11530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun node_list_[i].active = true; 11630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 11730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun active_output_node_id_ = node_id; 11830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun FOR_EACH_OBSERVER(Observer, 11930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun observers_, 12030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun ActiveOutputNodeChanged(node_id)); 12130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 12230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 12330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunvoid CrasAudioClientStubImpl::SetActiveInputNode(uint64 node_id) { 12430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun if (active_input_node_id_ == node_id) 12530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return; 12630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 12730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun for (size_t i = 0; i < node_list_.size(); ++i) { 12830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun if (node_list_[i].id == active_input_node_id_) 12930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun node_list_[i].active = false; 13030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun else if (node_list_[i].id == node_id) 13130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun node_list_[i].active = true; 13230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 13330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun active_input_node_id_ = node_id; 13430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun FOR_EACH_OBSERVER(Observer, 13530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun observers_, 13630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun ActiveInputNodeChanged(node_id)); 13730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 13830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 13930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunvoid CrasAudioClientStubImpl::AddActiveInputNode(uint64 node_id) { 14030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun for (size_t i = 0; i < node_list_.size(); ++i) { 14130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun if (node_list_[i].id == node_id) 14230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun node_list_[i].active = true; 14330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 14430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 14530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 14630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunvoid CrasAudioClientStubImpl::RemoveActiveInputNode(uint64 node_id) { 14730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun for (size_t i = 0; i < node_list_.size(); ++i) { 14830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun if (node_list_[i].id == node_id) 14930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun node_list_[i].active = false; 15030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 15130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 15230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 15330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunvoid CrasAudioClientStubImpl::AddActiveOutputNode(uint64 node_id) { 15430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun for (size_t i = 0; i < node_list_.size(); ++i) { 15530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun if (node_list_[i].id == node_id) 15630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun node_list_[i].active = true; 15730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 15830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 15930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 16030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunvoid CrasAudioClientStubImpl::RemoveActiveOutputNode(uint64 node_id) { 16130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun for (size_t i = 0; i < node_list_.size(); ++i) { 16230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun if (node_list_[i].id == node_id) 16330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun node_list_[i].active = false; 16430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 16530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 16630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 16730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunvoid CrasAudioClientStubImpl::SetAudioNodesForTesting( 16830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun const AudioNodeList& audio_nodes) { 16930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun node_list_ = audio_nodes; 17030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 17130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 17230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunvoid CrasAudioClientStubImpl::SetAudioNodesAndNotifyObserversForTesting( 17330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun const AudioNodeList& new_nodes) { 17430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun SetAudioNodesForTesting(new_nodes); 17530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun FOR_EACH_OBSERVER(Observer, observers_, NodesChanged()); 17630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 17730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 17830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} // namespace chromeos 17930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun