AudioPolicyEffects.h revision ba2b43990a7b4f0f2c425cf6cdfc63376a45772c
1ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu/*
2ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu * Copyright (C) 2014 The Android Open Source Project
3ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu *
4ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu * Licensed under the Apache License, Version 2.0 (the "License");
5ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu * you may not use this file except in compliance with the License.
6ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu * You may obtain a copy of the License at
7ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu *
8ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu *      http://www.apache.org/licenses/LICENSE-2.0
9ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu *
10ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu * Unless required by applicable law or agreed to in writing, software
11ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu * distributed under the License is distributed on an "AS IS" BASIS,
12ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu * See the License for the specific language governing permissions and
14ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu * limitations under the License.
15ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu */
16ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu
17ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu#ifndef ANDROID_AUDIOPOLICYEFFECTS_H
18ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu#define ANDROID_AUDIOPOLICYEFFECTS_H
19ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu
20ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu#include <stdlib.h>
21ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu#include <stdio.h>
22ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu#include <string.h>
23ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu#include <cutils/misc.h>
24ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu#include <media/AudioEffect.h>
25ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu#include <system/audio.h>
26ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu#include <hardware/audio_effect.h>
27ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu#include <utils/Vector.h>
28ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu#include <utils/SortedVector.h>
29ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu
30ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liunamespace android {
31ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu
32ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu// ----------------------------------------------------------------------------
33ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu
34ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu// AudioPolicyEffects class
35ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu// This class will manage all effects attached to input and output streams in
36ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu// AudioPolicyService as configured in audio_effects.conf.
37ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liuclass AudioPolicyEffects : public RefBase
38ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu{
39ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu
40ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liupublic:
41ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu
42ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu    // The constructor will parse audio_effects.conf
43ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu    // First it will look whether vendor specific file exists,
44ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu    // otherwise it will parse the system default file.
45ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu	         AudioPolicyEffects();
46ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu    virtual ~AudioPolicyEffects();
47ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu
48ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu    // Return a list of effect descriptors for default input effects
49ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu    // associated with audioSession
50ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu    status_t queryDefaultInputEffects(int audioSession,
51ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu                             effect_descriptor_t *descriptors,
52ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu                             uint32_t *count);
53ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu
54ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu    // Add all input effects associated with this input
55ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu    // Effects are attached depending on the audio_source_t
56ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu    status_t addInputEffects(audio_io_handle_t input,
57ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu                             audio_source_t inputSource,
58ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu                             int audioSession);
59ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu
60ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu    // Add all input effects associated to this input
61ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu    status_t releaseInputEffects(audio_io_handle_t input);
62ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu
63ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu
64ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu    // Return a list of effect descriptors for default output effects
65ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu    // associated with audioSession
66ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu    status_t queryDefaultOutputSessionEffects(int audioSession,
67ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu                             effect_descriptor_t *descriptors,
68ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu                             uint32_t *count);
69ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu
70ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu    // Add all output effects associated to this output
71ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu    // Effects are attached depending on the audio_stream_type_t
72ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu    status_t addOutputSessionEffects(audio_io_handle_t output,
73ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu                             audio_stream_type_t stream,
74ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu                             int audioSession);
75ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu
76ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu    // release all output effects associated with this output stream and audiosession
77ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu    status_t releaseOutputSessionEffects(audio_io_handle_t output,
78ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu                             audio_stream_type_t stream,
79ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu                             int audioSession);
80ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu
81ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liuprivate:
82ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu
83ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu    // class to store the description of an effects and its parameters
84ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu    // as defined in audio_effects.conf
85ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu    class EffectDesc {
86ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu    public:
87ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu        EffectDesc(const char *name, const effect_uuid_t& uuid) :
88ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu                        mName(strdup(name)),
89ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu                        mUuid(uuid) { }
90ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu        EffectDesc(const EffectDesc& orig) :
91ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu                        mName(strdup(orig.mName)),
92ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu                        mUuid(orig.mUuid) {
93ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu                            // deep copy mParams
94ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu                            for (size_t k = 0; k < orig.mParams.size(); k++) {
95ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu                                effect_param_t *origParam = orig.mParams[k];
96ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu                                // psize and vsize are rounded up to an int boundary for allocation
97ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu                                size_t origSize = sizeof(effect_param_t) +
98ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu                                                  ((origParam->psize + 3) & ~3) +
99ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu                                                  ((origParam->vsize + 3) & ~3);
100ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu                                effect_param_t *dupParam = (effect_param_t *) malloc(origSize);
101ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu                                memcpy(dupParam, origParam, origSize);
102ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu                                // This works because the param buffer allocation is also done by
103ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu                                // multiples of 4 bytes originally. In theory we should memcpy only
104ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu                                // the actual param size, that is without rounding vsize.
105ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu                                mParams.add(dupParam);
106ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu                            }
107ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu                        }
108ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu        /*virtual*/ ~EffectDesc() {
109ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu            free(mName);
110ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu            for (size_t k = 0; k < mParams.size(); k++) {
111ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu                free(mParams[k]);
112ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu            }
113ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu        }
114ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu        char *mName;
115ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu        effect_uuid_t mUuid;
116ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu        Vector <effect_param_t *> mParams;
117ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu    };
118ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu
119ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu    // class to store voctor of EffectDesc
120ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu    class EffectDescVector {
121ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu    public:
122ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu        EffectDescVector() {}
123ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu        /*virtual*/ ~EffectDescVector() {
124ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu            for (size_t j = 0; j < mEffects.size(); j++) {
125ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu                delete mEffects[j];
126ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu            }
127ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu        }
128ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu        Vector <EffectDesc *> mEffects;
129ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu    };
130ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu
131ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu    // class to store voctor of AudioEffects
132ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu    class EffectVector {
133ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu    public:
134ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu        EffectVector(int session) : mSessionId(session) {}
135ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu        /*virtual*/ ~EffectVector() {}
136ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu        const int mSessionId;
137ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu        Vector< sp<AudioEffect> >mEffects;
138ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu    };
139ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu
140ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu
141ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu    static const char * const kInputSourceNames[AUDIO_SOURCE_CNT -1];
142ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu    audio_source_t inputSourceNameToEnum(const char *name);
143ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu
144ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu    static const char *kStreamNames[AUDIO_STREAM_CNT+1]; //+1 required as streams start from -1
145ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu    audio_stream_type_t streamNameToEnum(const char *name);
146ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu
147ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu    // Enable or disable all effects in effect vector
148ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu    void setProcessorEnabled(const EffectVector *effectVector, bool enabled);
149ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu
150ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu    // Parse audio_effects.conf
151ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu    status_t loadAudioEffectConfig(const char *path);
152ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu
153ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu    // Load all effects descriptors in configuration file
154ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu    status_t loadEffects(cnode *root, Vector <EffectDesc *>& effects);
155ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu    EffectDesc *loadEffect(cnode *root);
156ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu
157ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu    // Load all automatic effect configurations
158ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu    status_t loadInputEffectConfigurations(cnode *root, const Vector <EffectDesc *>& effects);
159ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu    status_t loadStreamEffectConfigurations(cnode *root, const Vector <EffectDesc *>& effects);
160ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu    EffectDescVector *loadEffectConfig(cnode *root, const Vector <EffectDesc *>& effects);
161ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu
162ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu    // Load all automatic effect parameters
163ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu    void loadEffectParameters(cnode *root, Vector <effect_param_t *>& params);
164ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu    effect_param_t *loadEffectParameter(cnode *root);
165ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu    size_t readParamValue(cnode *node,
166ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu                          char *param,
167ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu                          size_t *curSize,
168ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu                          size_t *totSize);
169ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu    size_t growParamSize(char *param,
170ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu                         size_t size,
171ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu                         size_t *curSize,
172ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu                         size_t *totSize);
173ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu
174ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu    // Automatic input effects are configured per audio_source_t
175ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu    KeyedVector< audio_source_t, EffectDescVector* > mInputSources;
176ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu    // Automatic input effects are unique for audio_io_handle_t
177ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu    KeyedVector< audio_io_handle_t, EffectVector* > mInputs;
178ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu
179ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu    // Automatic output effects are organized per audio_stream_type_t
180ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu    KeyedVector< audio_stream_type_t, EffectDescVector* > mOutputStreams;
181ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu    // Automatic output effects are unique for audiosession ID
182ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu    KeyedVector< int32_t, EffectVector* > mOutputSessions;
183ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu};
184ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu
185ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu}; // namespace android
186ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu
187ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu#endif // ANDROID_AUDIOPOLICYEFFECTS_H
188