1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file.
4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/audio/audio_device.h"
6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/format_macros.h"
8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/strings/string_number_conversions.h"
9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h"
10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace {
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Get the priority for a particular device type. The priority returned
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// will be between 0 to 3, the higher number meaning a higher priority.
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)uint8 GetDevicePriority(chromeos::AudioDeviceType type) {
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  switch (type) {
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Fall through.
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case chromeos::AUDIO_TYPE_HEADPHONE:
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case chromeos::AUDIO_TYPE_MIC:
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case chromeos::AUDIO_TYPE_USB:
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case chromeos::AUDIO_TYPE_BLUETOOTH:
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return 3;
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case chromeos::AUDIO_TYPE_HDMI:
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return 2;
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      // Fall through.
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case chromeos::AUDIO_TYPE_INTERNAL_SPEAKER:
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case chromeos::AUDIO_TYPE_INTERNAL_MIC:
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return 1;
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      // Fall through.
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case chromeos::AUDIO_TYPE_OTHER:
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    default:
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return 0;
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)std::string GetTypeString(chromeos::AudioDeviceType type) {
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  switch (type) {
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case chromeos::AUDIO_TYPE_HEADPHONE:
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return "HEADPHONE";
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case chromeos::AUDIO_TYPE_MIC:
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return "MIC";
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case chromeos::AUDIO_TYPE_USB:
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return "USB";
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case chromeos::AUDIO_TYPE_BLUETOOTH:
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return "BLUETOOTH";
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case chromeos::AUDIO_TYPE_HDMI:
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return "HDMI";
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case chromeos::AUDIO_TYPE_INTERNAL_SPEAKER:
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return "INTERNAL_SPEAKER";
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case chromeos::AUDIO_TYPE_INTERNAL_MIC:
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return "INTERNAL_MIC";
53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case chromeos::AUDIO_TYPE_OTHER:
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    default:
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return "OTHER";
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)chromeos::AudioDeviceType GetAudioType(const std::string& node_type) {
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (node_type.find("HEADPHONE") != std::string::npos)
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return chromeos::AUDIO_TYPE_HEADPHONE;
62868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  else if (node_type.find("INTERNAL_MIC") != std::string::npos)
63868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return chromeos::AUDIO_TYPE_INTERNAL_MIC;
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  else if (node_type.find("MIC") != std::string::npos)
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return chromeos::AUDIO_TYPE_MIC;
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  else if (node_type.find("USB") != std::string::npos)
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return chromeos::AUDIO_TYPE_USB;
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  else if (node_type.find("BLUETOOTH") != std::string::npos)
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return chromeos::AUDIO_TYPE_BLUETOOTH;
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  else if (node_type.find("HDMI") != std::string::npos)
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return chromeos::AUDIO_TYPE_HDMI;
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  else if (node_type.find("INTERNAL_SPEAKER") != std::string::npos)
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return chromeos::AUDIO_TYPE_INTERNAL_SPEAKER;
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  else
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return chromeos::AUDIO_TYPE_OTHER;
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace chromeos {
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)AudioDevice::AudioDevice()
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : is_input(false),
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      id(0),
85ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      display_name(""),
86ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      type(AUDIO_TYPE_OTHER),
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      priority(0),
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      active(false),
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      plugged_time(0) {
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)AudioDevice::AudioDevice(const AudioNode& node) {
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  is_input = node.is_input;
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  id = node.id;
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  type = GetAudioType(node.type);
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!node.name.empty() && node.name != "(default)")
97eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    display_name = node.name;
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  else
99eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    display_name = node.device_name;
1003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  device_name = node.device_name;
101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  priority = GetDevicePriority(type);
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  active = node.active;
103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  plugged_time = node.plugged_time;
104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)std::string AudioDevice::ToString() const {
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::string result;
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::StringAppendF(&result,
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                      "is_input = %s ",
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                      is_input ? "true" : "false");
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::StringAppendF(&result,
112a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                      "id = 0x%" PRIx64 " ",
1137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                      id);
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::StringAppendF(&result,
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                      "display_name = %s ",
116eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                      display_name.c_str());
117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::StringAppendF(&result,
1183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                      "device_name = %s ",
1193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                      device_name.c_str());
1203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  base::StringAppendF(&result,
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                      "type = %s ",
122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                      GetTypeString(type).c_str());
123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::StringAppendF(&result,
124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                      "active = %s ",
125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                      active ? "true" : "false");
126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::StringAppendF(&result,
127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                      "plugged_time= %s ",
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                      base::Uint64ToString(plugged_time).c_str());
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return result;
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace chromeos
134