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