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)#ifndef CHROMEOS_AUDIO_AUDIO_DEVICE_H_
6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define CHROMEOS_AUDIO_AUDIO_DEVICE_H_
7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include <map>
9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <string>
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <vector>
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/basictypes.h"
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/chromeos_export.h"
14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/dbus/audio_node.h"
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace chromeos {
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Ordered from the highest priority to the lowest.
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)enum AudioDeviceType {
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AUDIO_TYPE_HEADPHONE,
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AUDIO_TYPE_MIC,
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AUDIO_TYPE_USB,
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AUDIO_TYPE_BLUETOOTH,
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AUDIO_TYPE_HDMI,
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AUDIO_TYPE_INTERNAL_SPEAKER,
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AUDIO_TYPE_INTERNAL_MIC,
275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  AUDIO_TYPE_KEYBOARD_MIC,
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AUDIO_TYPE_OTHER,
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)struct CHROMEOS_EXPORT AudioDevice {
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  AudioDevice();
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  explicit AudioDevice(const AudioNode& node);
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string ToString() const;
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Converts between the string type sent via D-Bus and AudioDeviceType.
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Static so they can be used by tests.
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  static std::string GetTypeString(chromeos::AudioDeviceType type);
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  static chromeos::AudioDeviceType GetAudioType(const std::string& node_type);
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool is_input;
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  uint64 id;
43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  std::string display_name;
443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  std::string device_name;
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AudioDeviceType type;
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  uint8 priority;
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool active;
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  uint64 plugged_time;
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)typedef std::vector<AudioDevice> AudioDeviceList;
52eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochtypedef std::map<uint64, AudioDevice> AudioDeviceMap;
53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)struct AudioDeviceCompare {
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Rules used to discern which device is higher,
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // 1.) Device Type:
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  //       [Headphones/USB/Bluetooh > HDMI > Internal Speakers]
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  //       [External Mic/USB Mic/Bluetooth > Internal Mic]
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // 2.) Device Plugged in Time:
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  //       [Later > Earlier]
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool operator()(const chromeos::AudioDevice& a,
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                  const chromeos::AudioDevice& b) const {
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (a.priority < b.priority) {
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return true;
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    } else if (b.priority < a.priority) {
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return false;
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    } else if (a.plugged_time < b.plugged_time) {
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return true;
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    } else {
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return false;
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace chromeos
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif  // CHROMEOS_AUDIO_AUDIO_DEVICE_H_
78