/* * Copyright (C) 2015 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #pragma once #include "DeviceDescriptor.h" #include "HwModule.h" #include "audio_policy_conf.h" #include #include #include #include #include #include #include namespace android { // ---------------------------------------------------------------------------- // Definitions for audio_policy.conf file parsing // ---------------------------------------------------------------------------- struct StringToEnum { const char *name; uint32_t value; }; #define STRING_TO_ENUM(string) { #string, string } #ifndef ARRAY_SIZE #define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) #endif const StringToEnum sDeviceNameToEnumTable[] = { STRING_TO_ENUM(AUDIO_DEVICE_OUT_EARPIECE), STRING_TO_ENUM(AUDIO_DEVICE_OUT_SPEAKER), STRING_TO_ENUM(AUDIO_DEVICE_OUT_SPEAKER_SAFE), STRING_TO_ENUM(AUDIO_DEVICE_OUT_WIRED_HEADSET), STRING_TO_ENUM(AUDIO_DEVICE_OUT_WIRED_HEADPHONE), STRING_TO_ENUM(AUDIO_DEVICE_OUT_BLUETOOTH_SCO), STRING_TO_ENUM(AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET), STRING_TO_ENUM(AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT), STRING_TO_ENUM(AUDIO_DEVICE_OUT_ALL_SCO), STRING_TO_ENUM(AUDIO_DEVICE_OUT_BLUETOOTH_A2DP), STRING_TO_ENUM(AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES), STRING_TO_ENUM(AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER), STRING_TO_ENUM(AUDIO_DEVICE_OUT_ALL_A2DP), STRING_TO_ENUM(AUDIO_DEVICE_OUT_AUX_DIGITAL), STRING_TO_ENUM(AUDIO_DEVICE_OUT_HDMI), STRING_TO_ENUM(AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET), STRING_TO_ENUM(AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET), STRING_TO_ENUM(AUDIO_DEVICE_OUT_USB_ACCESSORY), STRING_TO_ENUM(AUDIO_DEVICE_OUT_USB_DEVICE), STRING_TO_ENUM(AUDIO_DEVICE_OUT_ALL_USB), STRING_TO_ENUM(AUDIO_DEVICE_OUT_REMOTE_SUBMIX), STRING_TO_ENUM(AUDIO_DEVICE_OUT_TELEPHONY_TX), STRING_TO_ENUM(AUDIO_DEVICE_OUT_LINE), STRING_TO_ENUM(AUDIO_DEVICE_OUT_HDMI_ARC), STRING_TO_ENUM(AUDIO_DEVICE_OUT_SPDIF), STRING_TO_ENUM(AUDIO_DEVICE_OUT_FM), STRING_TO_ENUM(AUDIO_DEVICE_OUT_AUX_LINE), STRING_TO_ENUM(AUDIO_DEVICE_IN_AMBIENT), STRING_TO_ENUM(AUDIO_DEVICE_IN_BUILTIN_MIC), STRING_TO_ENUM(AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET), STRING_TO_ENUM(AUDIO_DEVICE_IN_ALL_SCO), STRING_TO_ENUM(AUDIO_DEVICE_IN_WIRED_HEADSET), STRING_TO_ENUM(AUDIO_DEVICE_IN_AUX_DIGITAL), STRING_TO_ENUM(AUDIO_DEVICE_IN_HDMI), STRING_TO_ENUM(AUDIO_DEVICE_IN_TELEPHONY_RX), STRING_TO_ENUM(AUDIO_DEVICE_IN_VOICE_CALL), STRING_TO_ENUM(AUDIO_DEVICE_IN_BACK_MIC), STRING_TO_ENUM(AUDIO_DEVICE_IN_REMOTE_SUBMIX), STRING_TO_ENUM(AUDIO_DEVICE_IN_ANLG_DOCK_HEADSET), STRING_TO_ENUM(AUDIO_DEVICE_IN_DGTL_DOCK_HEADSET), STRING_TO_ENUM(AUDIO_DEVICE_IN_USB_ACCESSORY), STRING_TO_ENUM(AUDIO_DEVICE_IN_USB_DEVICE), STRING_TO_ENUM(AUDIO_DEVICE_IN_FM_TUNER), STRING_TO_ENUM(AUDIO_DEVICE_IN_TV_TUNER), STRING_TO_ENUM(AUDIO_DEVICE_IN_LINE), STRING_TO_ENUM(AUDIO_DEVICE_IN_SPDIF), STRING_TO_ENUM(AUDIO_DEVICE_IN_BLUETOOTH_A2DP), STRING_TO_ENUM(AUDIO_DEVICE_IN_LOOPBACK), }; const StringToEnum sOutputFlagNameToEnumTable[] = { STRING_TO_ENUM(AUDIO_OUTPUT_FLAG_DIRECT), STRING_TO_ENUM(AUDIO_OUTPUT_FLAG_PRIMARY), STRING_TO_ENUM(AUDIO_OUTPUT_FLAG_FAST), STRING_TO_ENUM(AUDIO_OUTPUT_FLAG_DEEP_BUFFER), STRING_TO_ENUM(AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD), STRING_TO_ENUM(AUDIO_OUTPUT_FLAG_NON_BLOCKING), STRING_TO_ENUM(AUDIO_OUTPUT_FLAG_HW_AV_SYNC), }; const StringToEnum sInputFlagNameToEnumTable[] = { STRING_TO_ENUM(AUDIO_INPUT_FLAG_FAST), STRING_TO_ENUM(AUDIO_INPUT_FLAG_HW_HOTWORD), }; const StringToEnum sFormatNameToEnumTable[] = { STRING_TO_ENUM(AUDIO_FORMAT_PCM_16_BIT), STRING_TO_ENUM(AUDIO_FORMAT_PCM_8_BIT), STRING_TO_ENUM(AUDIO_FORMAT_PCM_32_BIT), STRING_TO_ENUM(AUDIO_FORMAT_PCM_8_24_BIT), STRING_TO_ENUM(AUDIO_FORMAT_PCM_FLOAT), STRING_TO_ENUM(AUDIO_FORMAT_PCM_24_BIT_PACKED), STRING_TO_ENUM(AUDIO_FORMAT_MP3), STRING_TO_ENUM(AUDIO_FORMAT_AAC), STRING_TO_ENUM(AUDIO_FORMAT_AAC_MAIN), STRING_TO_ENUM(AUDIO_FORMAT_AAC_LC), STRING_TO_ENUM(AUDIO_FORMAT_AAC_SSR), STRING_TO_ENUM(AUDIO_FORMAT_AAC_LTP), STRING_TO_ENUM(AUDIO_FORMAT_AAC_HE_V1), STRING_TO_ENUM(AUDIO_FORMAT_AAC_SCALABLE), STRING_TO_ENUM(AUDIO_FORMAT_AAC_ERLC), STRING_TO_ENUM(AUDIO_FORMAT_AAC_LD), STRING_TO_ENUM(AUDIO_FORMAT_AAC_HE_V2), STRING_TO_ENUM(AUDIO_FORMAT_AAC_ELD), STRING_TO_ENUM(AUDIO_FORMAT_VORBIS), STRING_TO_ENUM(AUDIO_FORMAT_HE_AAC_V1), STRING_TO_ENUM(AUDIO_FORMAT_HE_AAC_V2), STRING_TO_ENUM(AUDIO_FORMAT_OPUS), STRING_TO_ENUM(AUDIO_FORMAT_AC3), STRING_TO_ENUM(AUDIO_FORMAT_E_AC3), }; const StringToEnum sOutChannelsNameToEnumTable[] = { STRING_TO_ENUM(AUDIO_CHANNEL_OUT_MONO), STRING_TO_ENUM(AUDIO_CHANNEL_OUT_STEREO), STRING_TO_ENUM(AUDIO_CHANNEL_OUT_QUAD), STRING_TO_ENUM(AUDIO_CHANNEL_OUT_5POINT1), STRING_TO_ENUM(AUDIO_CHANNEL_OUT_7POINT1), }; const StringToEnum sInChannelsNameToEnumTable[] = { STRING_TO_ENUM(AUDIO_CHANNEL_IN_MONO), STRING_TO_ENUM(AUDIO_CHANNEL_IN_STEREO), STRING_TO_ENUM(AUDIO_CHANNEL_IN_FRONT_BACK), }; const StringToEnum sGainModeNameToEnumTable[] = { STRING_TO_ENUM(AUDIO_GAIN_MODE_JOINT), STRING_TO_ENUM(AUDIO_GAIN_MODE_CHANNELS), STRING_TO_ENUM(AUDIO_GAIN_MODE_RAMP), }; class ConfigParsingUtils { public: static uint32_t stringToEnum(const struct StringToEnum *table, size_t size, const char *name); static const char *enumToString(const struct StringToEnum *table, size_t size, uint32_t value); static bool stringToBool(const char *value); static uint32_t parseOutputFlagNames(char *name); static uint32_t parseInputFlagNames(char *name); static audio_devices_t parseDeviceNames(char *name); static void loadHwModules(cnode *root, HwModuleCollection &hwModules, DeviceVector &availableInputDevices, DeviceVector &availableOutputDevices, sp &defaultOutputDevices, bool &isSpeakerDrcEnabled); static void loadGlobalConfig(cnode *root, const sp& module, DeviceVector &availableInputDevices, DeviceVector &availableOutputDevices, sp &defaultOutputDevices, bool &isSpeakerDrcEnabled); static status_t loadAudioPolicyConfig(const char *path, HwModuleCollection &hwModules, DeviceVector &availableInputDevices, DeviceVector &availableOutputDevices, sp &defaultOutputDevices, bool &isSpeakerDrcEnabled); private: static void loadHwModule(cnode *root, HwModuleCollection &hwModules, DeviceVector &availableInputDevices, DeviceVector &availableOutputDevices, sp &defaultOutputDevices, bool &isSpeakerDrcEnabled); }; }; // namespace android