156ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi/*
256ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi * Copyright (C) 2015 The Android Open Source Project
356ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi *
456ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi * Licensed under the Apache License, Version 2.0 (the "License");
556ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi * you may not use this file except in compliance with the License.
656ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi * You may obtain a copy of the License at
756ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi *
856ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi *      http://www.apache.org/licenses/LICENSE-2.0
956ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi *
1056ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi * Unless required by applicable law or agreed to in writing, software
1156ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi * distributed under the License is distributed on an "AS IS" BASIS,
1256ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1356ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi * See the License for the specific language governing permissions and
1456ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi * limitations under the License.
1556ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi */
1656ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi
17ad3183e2d4cecd02f6261270a7ea1c68be0efa0fFrançois Gaffie#pragma once
18ad3183e2d4cecd02f6261270a7ea1c68be0efa0fFrançois Gaffie
1953615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie#include "DeviceDescriptor.h"
2053615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie#include "HwModule.h"
2153615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie#include "audio_policy_conf.h"
22ad3183e2d4cecd02f6261270a7ea1c68be0efa0fFrançois Gaffie#include <system/audio.h>
2353615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie#include <utils/Log.h>
2453615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie#include <utils/Vector.h>
2553615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie#include <utils/SortedVector.h>
2653615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie#include <cutils/config_utils.h>
2753615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie#include <utils/RefBase.h>
2853615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie#include <system/audio_policy.h>
29ad3183e2d4cecd02f6261270a7ea1c68be0efa0fFrançois Gaffie
3056ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivinamespace android {
3156ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi
3256ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi// ----------------------------------------------------------------------------
3356ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi// Definitions for audio_policy.conf file parsing
3456ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi// ----------------------------------------------------------------------------
3556ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi
3656ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivistruct StringToEnum {
3756ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    const char *name;
3856ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    uint32_t value;
3956ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi};
4056ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi
41f27e2fbfc3284c00a60fa68edc51d436f75b1e32Andy Hung// TODO: move to a separate file. Should be in sync with audio.h.
42f27e2fbfc3284c00a60fa68edc51d436f75b1e32Andy Hung#define STRING_TO_ENUM(string) { #string, (uint32_t)string } // uint32_t cast removes warning
43322b4d25387a04c9afebe998326d005bbdf17edeEric Laurent#define NAME_TO_ENUM(name, value) { name, value }
44ec8930f218fa0c1acde631543b40b5a0b28bfe1fGlenn Kasten#ifndef ARRAY_SIZE
4556ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
46ec8930f218fa0c1acde631543b40b5a0b28bfe1fGlenn Kasten#endif
4756ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi
48322b4d25387a04c9afebe998326d005bbdf17edeEric Laurentconst StringToEnum sDeviceTypeToEnumTable[] = {
4956ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_DEVICE_OUT_EARPIECE),
5056ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_DEVICE_OUT_SPEAKER),
5156ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_DEVICE_OUT_SPEAKER_SAFE),
5256ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_DEVICE_OUT_WIRED_HEADSET),
5356ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_DEVICE_OUT_WIRED_HEADPHONE),
5456ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_DEVICE_OUT_BLUETOOTH_SCO),
5556ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET),
5656ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT),
5756ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_DEVICE_OUT_ALL_SCO),
5856ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_DEVICE_OUT_BLUETOOTH_A2DP),
5956ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES),
6056ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER),
6156ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_DEVICE_OUT_ALL_A2DP),
6256ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_DEVICE_OUT_AUX_DIGITAL),
6356ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_DEVICE_OUT_HDMI),
6456ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET),
6556ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET),
6656ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_DEVICE_OUT_USB_ACCESSORY),
6756ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_DEVICE_OUT_USB_DEVICE),
6856ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_DEVICE_OUT_ALL_USB),
6956ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_DEVICE_OUT_REMOTE_SUBMIX),
7056ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_DEVICE_OUT_TELEPHONY_TX),
7156ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_DEVICE_OUT_LINE),
7256ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_DEVICE_OUT_HDMI_ARC),
7356ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_DEVICE_OUT_SPDIF),
7456ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_DEVICE_OUT_FM),
7556ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_DEVICE_OUT_AUX_LINE),
76b9d73333cce3f9da3a7a0b33589f6bbe0f992a92Eric Laurent    STRING_TO_ENUM(AUDIO_DEVICE_OUT_IP),
7756ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_DEVICE_IN_AMBIENT),
7856ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_DEVICE_IN_BUILTIN_MIC),
7956ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET),
8056ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_DEVICE_IN_ALL_SCO),
8156ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_DEVICE_IN_WIRED_HEADSET),
8256ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_DEVICE_IN_AUX_DIGITAL),
8356ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_DEVICE_IN_HDMI),
8456ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_DEVICE_IN_TELEPHONY_RX),
8556ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_DEVICE_IN_VOICE_CALL),
8656ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_DEVICE_IN_BACK_MIC),
8756ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_DEVICE_IN_REMOTE_SUBMIX),
8856ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_DEVICE_IN_ANLG_DOCK_HEADSET),
8956ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_DEVICE_IN_DGTL_DOCK_HEADSET),
9056ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_DEVICE_IN_USB_ACCESSORY),
9156ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_DEVICE_IN_USB_DEVICE),
9256ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_DEVICE_IN_FM_TUNER),
9356ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_DEVICE_IN_TV_TUNER),
9456ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_DEVICE_IN_LINE),
9556ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_DEVICE_IN_SPDIF),
9656ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_DEVICE_IN_BLUETOOTH_A2DP),
9756ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_DEVICE_IN_LOOPBACK),
98b9d73333cce3f9da3a7a0b33589f6bbe0f992a92Eric Laurent    STRING_TO_ENUM(AUDIO_DEVICE_IN_IP),
9956ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi};
10056ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi
101322b4d25387a04c9afebe998326d005bbdf17edeEric Laurentconst StringToEnum sDeviceNameToEnumTable[] = {
102322b4d25387a04c9afebe998326d005bbdf17edeEric Laurent    NAME_TO_ENUM("Earpiece", AUDIO_DEVICE_OUT_EARPIECE),
103322b4d25387a04c9afebe998326d005bbdf17edeEric Laurent    NAME_TO_ENUM("Speaker", AUDIO_DEVICE_OUT_SPEAKER),
104322b4d25387a04c9afebe998326d005bbdf17edeEric Laurent    NAME_TO_ENUM("Speaker Protected", AUDIO_DEVICE_OUT_SPEAKER_SAFE),
105322b4d25387a04c9afebe998326d005bbdf17edeEric Laurent    NAME_TO_ENUM("Wired Headset", AUDIO_DEVICE_OUT_WIRED_HEADSET),
106322b4d25387a04c9afebe998326d005bbdf17edeEric Laurent    NAME_TO_ENUM("Wired Headphones", AUDIO_DEVICE_OUT_WIRED_HEADPHONE),
107322b4d25387a04c9afebe998326d005bbdf17edeEric Laurent    NAME_TO_ENUM("BT SCO", AUDIO_DEVICE_OUT_BLUETOOTH_SCO),
108322b4d25387a04c9afebe998326d005bbdf17edeEric Laurent    NAME_TO_ENUM("BT SCO Headset", AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET),
109322b4d25387a04c9afebe998326d005bbdf17edeEric Laurent    NAME_TO_ENUM("BT SCO Car Kit", AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT),
110322b4d25387a04c9afebe998326d005bbdf17edeEric Laurent    NAME_TO_ENUM("", AUDIO_DEVICE_OUT_ALL_SCO),
111322b4d25387a04c9afebe998326d005bbdf17edeEric Laurent    NAME_TO_ENUM("BT A2DP Out", AUDIO_DEVICE_OUT_BLUETOOTH_A2DP),
112322b4d25387a04c9afebe998326d005bbdf17edeEric Laurent    NAME_TO_ENUM("BT A2DP Headphones", AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES),
113322b4d25387a04c9afebe998326d005bbdf17edeEric Laurent    NAME_TO_ENUM("BT A2DP Speaker", AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER),
114322b4d25387a04c9afebe998326d005bbdf17edeEric Laurent    NAME_TO_ENUM("", AUDIO_DEVICE_OUT_ALL_A2DP),
115322b4d25387a04c9afebe998326d005bbdf17edeEric Laurent    NAME_TO_ENUM("HDMI Out", AUDIO_DEVICE_OUT_AUX_DIGITAL),
116322b4d25387a04c9afebe998326d005bbdf17edeEric Laurent    NAME_TO_ENUM("HDMI Out", AUDIO_DEVICE_OUT_HDMI),
117322b4d25387a04c9afebe998326d005bbdf17edeEric Laurent    NAME_TO_ENUM("Analog Dock Out", AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET),
118322b4d25387a04c9afebe998326d005bbdf17edeEric Laurent    NAME_TO_ENUM("Digital Dock Out", AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET),
119322b4d25387a04c9afebe998326d005bbdf17edeEric Laurent    NAME_TO_ENUM("USB Host Out", AUDIO_DEVICE_OUT_USB_ACCESSORY),
120322b4d25387a04c9afebe998326d005bbdf17edeEric Laurent    NAME_TO_ENUM("USB Device Out", AUDIO_DEVICE_OUT_USB_DEVICE),
121322b4d25387a04c9afebe998326d005bbdf17edeEric Laurent    NAME_TO_ENUM("", AUDIO_DEVICE_OUT_ALL_USB),
122322b4d25387a04c9afebe998326d005bbdf17edeEric Laurent    NAME_TO_ENUM("Reroute Submix Out", AUDIO_DEVICE_OUT_REMOTE_SUBMIX),
123322b4d25387a04c9afebe998326d005bbdf17edeEric Laurent    NAME_TO_ENUM("Telephony Tx", AUDIO_DEVICE_OUT_TELEPHONY_TX),
124322b4d25387a04c9afebe998326d005bbdf17edeEric Laurent    NAME_TO_ENUM("Line Out", AUDIO_DEVICE_OUT_LINE),
125322b4d25387a04c9afebe998326d005bbdf17edeEric Laurent    NAME_TO_ENUM("HDMI ARC Out", AUDIO_DEVICE_OUT_HDMI_ARC),
126322b4d25387a04c9afebe998326d005bbdf17edeEric Laurent    NAME_TO_ENUM("S/PDIF Out", AUDIO_DEVICE_OUT_SPDIF),
127322b4d25387a04c9afebe998326d005bbdf17edeEric Laurent    NAME_TO_ENUM("FM transceiver Out", AUDIO_DEVICE_OUT_FM),
128322b4d25387a04c9afebe998326d005bbdf17edeEric Laurent    NAME_TO_ENUM("Aux Line Out", AUDIO_DEVICE_OUT_AUX_LINE),
129b9d73333cce3f9da3a7a0b33589f6bbe0f992a92Eric Laurent    NAME_TO_ENUM("IP Out", AUDIO_DEVICE_OUT_IP),
130322b4d25387a04c9afebe998326d005bbdf17edeEric Laurent    NAME_TO_ENUM("Ambient Mic", AUDIO_DEVICE_IN_AMBIENT),
131322b4d25387a04c9afebe998326d005bbdf17edeEric Laurent    NAME_TO_ENUM("Built-In Mic", AUDIO_DEVICE_IN_BUILTIN_MIC),
132322b4d25387a04c9afebe998326d005bbdf17edeEric Laurent    NAME_TO_ENUM("BT SCO Headset Mic", AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET),
133322b4d25387a04c9afebe998326d005bbdf17edeEric Laurent    NAME_TO_ENUM("", AUDIO_DEVICE_IN_ALL_SCO),
134322b4d25387a04c9afebe998326d005bbdf17edeEric Laurent    NAME_TO_ENUM("Wired Headset Mic", AUDIO_DEVICE_IN_WIRED_HEADSET),
135322b4d25387a04c9afebe998326d005bbdf17edeEric Laurent    NAME_TO_ENUM("HDMI In", AUDIO_DEVICE_IN_AUX_DIGITAL),
136322b4d25387a04c9afebe998326d005bbdf17edeEric Laurent    NAME_TO_ENUM("HDMI In", AUDIO_DEVICE_IN_HDMI),
137322b4d25387a04c9afebe998326d005bbdf17edeEric Laurent    NAME_TO_ENUM("Telephony Rx", AUDIO_DEVICE_IN_TELEPHONY_RX),
138322b4d25387a04c9afebe998326d005bbdf17edeEric Laurent    NAME_TO_ENUM("Telephony Rx", AUDIO_DEVICE_IN_VOICE_CALL),
139322b4d25387a04c9afebe998326d005bbdf17edeEric Laurent    NAME_TO_ENUM("Built-In Back Mic", AUDIO_DEVICE_IN_BACK_MIC),
140322b4d25387a04c9afebe998326d005bbdf17edeEric Laurent    NAME_TO_ENUM("Reroute Submix In", AUDIO_DEVICE_IN_REMOTE_SUBMIX),
141322b4d25387a04c9afebe998326d005bbdf17edeEric Laurent    NAME_TO_ENUM("Analog Dock In", AUDIO_DEVICE_IN_ANLG_DOCK_HEADSET),
142322b4d25387a04c9afebe998326d005bbdf17edeEric Laurent    NAME_TO_ENUM("Digital Dock In", AUDIO_DEVICE_IN_DGTL_DOCK_HEADSET),
143322b4d25387a04c9afebe998326d005bbdf17edeEric Laurent    NAME_TO_ENUM("USB Host In", AUDIO_DEVICE_IN_USB_ACCESSORY),
144322b4d25387a04c9afebe998326d005bbdf17edeEric Laurent    NAME_TO_ENUM("USB Device In", AUDIO_DEVICE_IN_USB_DEVICE),
145322b4d25387a04c9afebe998326d005bbdf17edeEric Laurent    NAME_TO_ENUM("FM Tuner In", AUDIO_DEVICE_IN_FM_TUNER),
146322b4d25387a04c9afebe998326d005bbdf17edeEric Laurent    NAME_TO_ENUM("TV Tuner In", AUDIO_DEVICE_IN_TV_TUNER),
147322b4d25387a04c9afebe998326d005bbdf17edeEric Laurent    NAME_TO_ENUM("Line In", AUDIO_DEVICE_IN_LINE),
148322b4d25387a04c9afebe998326d005bbdf17edeEric Laurent    NAME_TO_ENUM("S/PDIF In", AUDIO_DEVICE_IN_SPDIF),
149322b4d25387a04c9afebe998326d005bbdf17edeEric Laurent    NAME_TO_ENUM("BT A2DP In", AUDIO_DEVICE_IN_BLUETOOTH_A2DP),
150322b4d25387a04c9afebe998326d005bbdf17edeEric Laurent    NAME_TO_ENUM("Loopback In", AUDIO_DEVICE_IN_LOOPBACK),
151b9d73333cce3f9da3a7a0b33589f6bbe0f992a92Eric Laurent    NAME_TO_ENUM("IP In", AUDIO_DEVICE_IN_IP),
152322b4d25387a04c9afebe998326d005bbdf17edeEric Laurent};
153322b4d25387a04c9afebe998326d005bbdf17edeEric Laurent
15456ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Triviconst StringToEnum sOutputFlagNameToEnumTable[] = {
15556ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_OUTPUT_FLAG_DIRECT),
15656ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_OUTPUT_FLAG_PRIMARY),
15756ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_OUTPUT_FLAG_FAST),
15856ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_OUTPUT_FLAG_DEEP_BUFFER),
15956ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD),
16056ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_OUTPUT_FLAG_NON_BLOCKING),
16156ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_OUTPUT_FLAG_HW_AV_SYNC),
162e8d55a5d1f6b08cfdabea7628e956063a47fa160Ravi Kumar Alamanda    STRING_TO_ENUM(AUDIO_OUTPUT_FLAG_TTS),
1636631424f66253c4bad94618fa078c97715a65fbcRavi Kumar Alamanda    STRING_TO_ENUM(AUDIO_OUTPUT_FLAG_RAW),
1646631424f66253c4bad94618fa078c97715a65fbcRavi Kumar Alamanda    STRING_TO_ENUM(AUDIO_OUTPUT_FLAG_SYNC),
16556ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi};
16656ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi
16756ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Triviconst StringToEnum sInputFlagNameToEnumTable[] = {
16856ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_INPUT_FLAG_FAST),
16956ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_INPUT_FLAG_HW_HOTWORD),
1706631424f66253c4bad94618fa078c97715a65fbcRavi Kumar Alamanda    STRING_TO_ENUM(AUDIO_INPUT_FLAG_RAW),
1716631424f66253c4bad94618fa078c97715a65fbcRavi Kumar Alamanda    STRING_TO_ENUM(AUDIO_INPUT_FLAG_SYNC),
17256ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi};
17356ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi
17456ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Triviconst StringToEnum sFormatNameToEnumTable[] = {
17556ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_FORMAT_PCM_16_BIT),
17656ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_FORMAT_PCM_8_BIT),
17756ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_FORMAT_PCM_32_BIT),
17856ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_FORMAT_PCM_8_24_BIT),
17956ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_FORMAT_PCM_FLOAT),
18056ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_FORMAT_PCM_24_BIT_PACKED),
18156ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_FORMAT_MP3),
18256ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_FORMAT_AAC),
18356ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_FORMAT_AAC_MAIN),
18456ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_FORMAT_AAC_LC),
18556ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_FORMAT_AAC_SSR),
18656ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_FORMAT_AAC_LTP),
18756ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_FORMAT_AAC_HE_V1),
18856ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_FORMAT_AAC_SCALABLE),
18956ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_FORMAT_AAC_ERLC),
19056ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_FORMAT_AAC_LD),
19156ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_FORMAT_AAC_HE_V2),
19256ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_FORMAT_AAC_ELD),
19356ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_FORMAT_VORBIS),
19456ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_FORMAT_HE_AAC_V1),
19556ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_FORMAT_HE_AAC_V2),
19656ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_FORMAT_OPUS),
19756ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_FORMAT_AC3),
19856ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_FORMAT_E_AC3),
1997d669b3551c20109f5544455ca1555499693e1e1Phil Burk    STRING_TO_ENUM(AUDIO_FORMAT_DTS),
2007d669b3551c20109f5544455ca1555499693e1e1Phil Burk    STRING_TO_ENUM(AUDIO_FORMAT_DTS_HD),
20156ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi};
20256ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi
20356ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Triviconst StringToEnum sOutChannelsNameToEnumTable[] = {
20456ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_CHANNEL_OUT_MONO),
20556ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_CHANNEL_OUT_STEREO),
20656ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_CHANNEL_OUT_QUAD),
20756ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_CHANNEL_OUT_5POINT1),
20856ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_CHANNEL_OUT_7POINT1),
20956ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi};
21056ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi
21156ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Triviconst StringToEnum sInChannelsNameToEnumTable[] = {
21256ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_CHANNEL_IN_MONO),
21356ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_CHANNEL_IN_STEREO),
21456ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_CHANNEL_IN_FRONT_BACK),
21556ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi};
21656ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi
217f27e2fbfc3284c00a60fa68edc51d436f75b1e32Andy Hungconst StringToEnum sIndexChannelsNameToEnumTable[] = {
218f27e2fbfc3284c00a60fa68edc51d436f75b1e32Andy Hung    STRING_TO_ENUM(AUDIO_CHANNEL_INDEX_MASK_1),
219f27e2fbfc3284c00a60fa68edc51d436f75b1e32Andy Hung    STRING_TO_ENUM(AUDIO_CHANNEL_INDEX_MASK_2),
220f27e2fbfc3284c00a60fa68edc51d436f75b1e32Andy Hung    STRING_TO_ENUM(AUDIO_CHANNEL_INDEX_MASK_3),
221f27e2fbfc3284c00a60fa68edc51d436f75b1e32Andy Hung    STRING_TO_ENUM(AUDIO_CHANNEL_INDEX_MASK_4),
222f27e2fbfc3284c00a60fa68edc51d436f75b1e32Andy Hung    STRING_TO_ENUM(AUDIO_CHANNEL_INDEX_MASK_5),
223f27e2fbfc3284c00a60fa68edc51d436f75b1e32Andy Hung    STRING_TO_ENUM(AUDIO_CHANNEL_INDEX_MASK_6),
224f27e2fbfc3284c00a60fa68edc51d436f75b1e32Andy Hung    STRING_TO_ENUM(AUDIO_CHANNEL_INDEX_MASK_7),
225f27e2fbfc3284c00a60fa68edc51d436f75b1e32Andy Hung    STRING_TO_ENUM(AUDIO_CHANNEL_INDEX_MASK_8),
226f27e2fbfc3284c00a60fa68edc51d436f75b1e32Andy Hung};
227f27e2fbfc3284c00a60fa68edc51d436f75b1e32Andy Hung
22856ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Triviconst StringToEnum sGainModeNameToEnumTable[] = {
22956ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_GAIN_MODE_JOINT),
23056ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_GAIN_MODE_CHANNELS),
23156ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    STRING_TO_ENUM(AUDIO_GAIN_MODE_RAMP),
23256ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi};
23356ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi
23456ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Triviclass ConfigParsingUtils
23556ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi{
23656ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivipublic:
23756ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    static uint32_t stringToEnum(const struct StringToEnum *table,
23856ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi            size_t size,
23956ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi            const char *name);
24056ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    static const char *enumToString(const struct StringToEnum *table,
24156ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi            size_t size,
24256ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi            uint32_t value);
24356ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    static bool stringToBool(const char *value);
24456ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    static uint32_t parseOutputFlagNames(char *name);
24556ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    static uint32_t parseInputFlagNames(char *name);
24656ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    static audio_devices_t parseDeviceNames(char *name);
24753615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie
24853615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie    static void loadHwModules(cnode *root, HwModuleCollection &hwModules,
24953615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie                              DeviceVector &availableInputDevices,
25053615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie                              DeviceVector &availableOutputDevices,
25153615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie                              sp<DeviceDescriptor> &defaultOutputDevices,
25253615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie                              bool &isSpeakerDrcEnabled);
25353615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie
25453615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie    static void loadGlobalConfig(cnode *root, const sp<HwModule>& module,
25553615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie                                 DeviceVector &availableInputDevices,
25653615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie                                 DeviceVector &availableOutputDevices,
25753615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie                                 sp<DeviceDescriptor> &defaultOutputDevices,
25853615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie                                 bool &isSpeakerDrcEnabled);
25953615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie
26053615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie    static status_t loadAudioPolicyConfig(const char *path,
26153615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie                                          HwModuleCollection &hwModules,
26253615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie                                          DeviceVector &availableInputDevices,
26353615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie                                          DeviceVector &availableOutputDevices,
26453615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie                                          sp<DeviceDescriptor> &defaultOutputDevices,
26553615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie                                          bool &isSpeakerDrcEnabled);
26653615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie
26753615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffieprivate:
26853615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie    static void loadHwModule(cnode *root, HwModuleCollection &hwModules,
26953615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie                             DeviceVector &availableInputDevices,
27053615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie                             DeviceVector &availableOutputDevices,
27153615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie                             sp<DeviceDescriptor> &defaultOutputDevices,
27253615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie                             bool &isSpeakerDrcEnabled);
27356ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi};
27456ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi
27556ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi}; // namespace android
276