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