1/* 2 * Copyright (C) 2017 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 18#ifndef ANDROID_MEDIA_EFFECTSCONFIG_H 19#define ANDROID_MEDIA_EFFECTSCONFIG_H 20 21/** @file Parses audio effects configuration file to C and C++ structure. 22 * @see audio_effects_conf_V2_0.xsd for documentation on each structure 23 */ 24 25#include <system/audio_effect.h> 26 27#include <map> 28#include <memory> 29#include <string> 30#include <vector> 31 32namespace android { 33namespace effectsConfig { 34 35/** Default path of effect configuration file. */ 36constexpr char DEFAULT_PATH[] = "/vendor/etc/audio_effects.xml"; 37 38/** Directories where the effect libraries will be search for. */ 39constexpr const char* LD_EFFECT_LIBRARY_PATH[] = 40#ifdef __LP64__ 41 {"/odm/lib64/soundfx", "/vendor/lib64/soundfx", "/system/lib64/soundfx"}; 42#else 43 {"/odm/lib/soundfx", "/vendor/lib/soundfx", "/system/lib/soundfx"}; 44#endif 45 46struct Library { 47 std::string name; 48 std::string path; 49}; 50using Libraries = std::vector<Library>; 51 52struct EffectImpl { 53 Library* library; //< Only valid as long as the associated library vector is unmodified 54 effect_uuid_t uuid; 55}; 56 57struct Effect : public EffectImpl { 58 std::string name; 59 bool isProxy; 60 EffectImpl libSw; //< Only valid if isProxy 61 EffectImpl libHw; //< Only valid if isProxy 62}; 63 64using Effects = std::vector<Effect>; 65 66template <class Type> 67struct Stream { 68 Type type; 69 std::vector<std::reference_wrapper<Effect>> effects; 70}; 71using OutputStream = Stream<audio_stream_type_t>; 72using InputStream = Stream<audio_source_t>; 73 74/** Parsed configuration. 75 * Intended to be a transient structure only used for deserialization. 76 * Note: Everything is copied in the configuration from the xml dom. 77 * If copies needed to be avoided due to performance issue, 78 * consider keeping a private handle on the xml dom and replace all strings by dom pointers. 79 * Or even better, use SAX parsing to avoid the allocations all together. 80 */ 81struct Config { 82 float version; 83 Libraries libraries; 84 Effects effects; 85 std::vector<OutputStream> postprocess; 86 std::vector<InputStream> preprocess; 87}; 88 89/** Result of `parse(const char*)` */ 90struct ParsingResult { 91 /** Parsed config, nullptr if the xml lib could not load the file */ 92 std::unique_ptr<Config> parsedConfig; 93 size_t nbSkippedElement; //< Number of skipped invalid library, effect or processing chain 94}; 95 96/** Parses the provided effect configuration. 97 * Parsing do not stop of first invalid element, but continues to the next. 98 * @see ParsingResult::nbSkippedElement 99 */ 100ParsingResult parse(const char* path = DEFAULT_PATH); 101 102} // namespace effectsConfig 103} // namespace android 104#endif // ANDROID_MEDIA_EFFECTSCONFIG_H 105