1/*
2 * Copyright (C) 2009 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#include <stdint.h>
19#include <sys/types.h>
20#include <cutils/config_utils.h>
21#include <cutils/misc.h>
22#include <utils/Timers.h>
23#include <utils/Errors.h>
24#include <utils/KeyedVector.h>
25#include <utils/SortedVector.h>
26#include <hardware_legacy/AudioPolicyInterface.h>
27
28
29namespace android_audio_legacy {
30    using android::KeyedVector;
31    using android::DefaultKeyedVector;
32    using android::SortedVector;
33
34// ----------------------------------------------------------------------------
35
36#define MAX_DEVICE_ADDRESS_LEN 20
37// Attenuation applied to STRATEGY_SONIFICATION streams when a headset is connected: 6dB
38#define SONIFICATION_HEADSET_VOLUME_FACTOR 0.5
39// Min volume for STRATEGY_SONIFICATION streams when limited by music volume: -36dB
40#define SONIFICATION_HEADSET_VOLUME_MIN  0.016
41// Time in milliseconds during which we consider that music is still active after a music
42// track was stopped - see computeVolume()
43#define SONIFICATION_HEADSET_MUSIC_DELAY  5000
44// Time in milliseconds after media stopped playing during which we consider that the
45// sonification should be as unobtrusive as during the time media was playing.
46#define SONIFICATION_RESPECTFUL_AFTER_MUSIC_DELAY 5000
47// Time in milliseconds during witch some streams are muted while the audio path
48// is switched
49#define MUTE_TIME_MS 2000
50
51#define NUM_TEST_OUTPUTS 5
52
53#define NUM_VOL_CURVE_KNEES 2
54
55// ----------------------------------------------------------------------------
56// AudioPolicyManagerBase implements audio policy manager behavior common to all platforms.
57// Each platform must implement an AudioPolicyManager class derived from AudioPolicyManagerBase
58// and override methods for which the platform specific behavior differs from the implementation
59// in AudioPolicyManagerBase. Even if no specific behavior is required, the AudioPolicyManager
60// class must be implemented as well as the class factory function createAudioPolicyManager()
61// and provided in a shared library libaudiopolicy.so.
62// ----------------------------------------------------------------------------
63
64class AudioPolicyManagerBase: public AudioPolicyInterface
65#ifdef AUDIO_POLICY_TEST
66    , public Thread
67#endif //AUDIO_POLICY_TEST
68{
69
70public:
71                AudioPolicyManagerBase(AudioPolicyClientInterface *clientInterface);
72        virtual ~AudioPolicyManagerBase();
73
74        // AudioPolicyInterface
75        virtual status_t setDeviceConnectionState(audio_devices_t device,
76                                                          AudioSystem::device_connection_state state,
77                                                          const char *device_address);
78        virtual AudioSystem::device_connection_state getDeviceConnectionState(audio_devices_t device,
79                                                                              const char *device_address);
80        virtual void setPhoneState(int state);
81        virtual void setForceUse(AudioSystem::force_use usage, AudioSystem::forced_config config);
82        virtual AudioSystem::forced_config getForceUse(AudioSystem::force_use usage);
83        virtual void setSystemProperty(const char* property, const char* value);
84        virtual status_t initCheck();
85        virtual audio_io_handle_t getOutput(AudioSystem::stream_type stream,
86                                            uint32_t samplingRate = 0,
87                                            uint32_t format = AudioSystem::FORMAT_DEFAULT,
88                                            uint32_t channels = 0,
89                                            AudioSystem::output_flags flags =
90                                                    AudioSystem::OUTPUT_FLAG_INDIRECT);
91        virtual status_t startOutput(audio_io_handle_t output,
92                                     AudioSystem::stream_type stream,
93                                     int session = 0);
94        virtual status_t stopOutput(audio_io_handle_t output,
95                                    AudioSystem::stream_type stream,
96                                    int session = 0);
97        virtual void releaseOutput(audio_io_handle_t output);
98        virtual audio_io_handle_t getInput(int inputSource,
99                                            uint32_t samplingRate,
100                                            uint32_t format,
101                                            uint32_t channels,
102                                            AudioSystem::audio_in_acoustics acoustics);
103
104        // indicates to the audio policy manager that the input starts being used.
105        virtual status_t startInput(audio_io_handle_t input);
106
107        // indicates to the audio policy manager that the input stops being used.
108        virtual status_t stopInput(audio_io_handle_t input);
109        virtual void releaseInput(audio_io_handle_t input);
110        virtual void initStreamVolume(AudioSystem::stream_type stream,
111                                                    int indexMin,
112                                                    int indexMax);
113        virtual status_t setStreamVolumeIndex(AudioSystem::stream_type stream,
114                                              int index,
115                                              audio_devices_t device);
116        virtual status_t getStreamVolumeIndex(AudioSystem::stream_type stream,
117                                              int *index,
118                                              audio_devices_t device);
119
120        // return the strategy corresponding to a given stream type
121        virtual uint32_t getStrategyForStream(AudioSystem::stream_type stream);
122
123        // return the enabled output devices for the given stream type
124        virtual audio_devices_t getDevicesForStream(AudioSystem::stream_type stream);
125
126        virtual audio_io_handle_t getOutputForEffect(const effect_descriptor_t *desc);
127        virtual status_t registerEffect(const effect_descriptor_t *desc,
128                                        audio_io_handle_t io,
129                                        uint32_t strategy,
130                                        int session,
131                                        int id);
132        virtual status_t unregisterEffect(int id);
133        virtual status_t setEffectEnabled(int id, bool enabled);
134
135        virtual bool isStreamActive(int stream, uint32_t inPastMs = 0) const;
136        // return whether a stream is playing remotely, override to change the definition of
137        //   local/remote playback, used for instance by notification manager to not make
138        //   media players lose audio focus when not playing locally
139        virtual bool isStreamActiveRemotely(int stream, uint32_t inPastMs = 0) const;
140        virtual bool isSourceActive(audio_source_t source) const;
141
142        virtual status_t dump(int fd);
143
144protected:
145
146        enum routing_strategy {
147            STRATEGY_MEDIA,
148            STRATEGY_PHONE,
149            STRATEGY_SONIFICATION,
150            STRATEGY_SONIFICATION_RESPECTFUL,
151            STRATEGY_DTMF,
152            STRATEGY_ENFORCED_AUDIBLE,
153            NUM_STRATEGIES
154        };
155
156        // 4 points to define the volume attenuation curve, each characterized by the volume
157        // index (from 0 to 100) at which they apply, and the attenuation in dB at that index.
158        // we use 100 steps to avoid rounding errors when computing the volume in volIndexToAmpl()
159
160        enum { VOLMIN = 0, VOLKNEE1 = 1, VOLKNEE2 = 2, VOLMAX = 3, VOLCNT = 4};
161
162        class VolumeCurvePoint
163        {
164        public:
165            int mIndex;
166            float mDBAttenuation;
167        };
168
169        // device categories used for volume curve management.
170        enum device_category {
171            DEVICE_CATEGORY_HEADSET,
172            DEVICE_CATEGORY_SPEAKER,
173            DEVICE_CATEGORY_EARPIECE,
174            DEVICE_CATEGORY_CNT
175        };
176
177        class IOProfile;
178
179        class HwModule {
180        public:
181                    HwModule(const char *name);
182                    ~HwModule();
183
184            void dump(int fd);
185
186            const char *const mName; // base name of the audio HW module (primary, a2dp ...)
187            audio_module_handle_t mHandle;
188            Vector <IOProfile *> mOutputProfiles; // output profiles exposed by this module
189            Vector <IOProfile *> mInputProfiles;  // input profiles exposed by this module
190        };
191
192        // the IOProfile class describes the capabilities of an output or input stream.
193        // It is currently assumed that all combination of listed parameters are supported.
194        // It is used by the policy manager to determine if an output or input is suitable for
195        // a given use case,  open/close it accordingly and connect/disconnect audio tracks
196        // to/from it.
197        class IOProfile
198        {
199        public:
200            IOProfile(HwModule *module);
201            ~IOProfile();
202
203            bool isCompatibleProfile(audio_devices_t device,
204                                     uint32_t samplingRate,
205                                     uint32_t format,
206                                     uint32_t channelMask,
207                                     audio_output_flags_t flags) const;
208
209            void dump(int fd);
210
211            // by convention, "0' in the first entry in mSamplingRates, mChannelMasks or mFormats
212            // indicates the supported parameters should be read from the output stream
213            // after it is opened for the first time
214            Vector <uint32_t> mSamplingRates; // supported sampling rates
215            Vector <audio_channel_mask_t> mChannelMasks; // supported channel masks
216            Vector <audio_format_t> mFormats; // supported audio formats
217            audio_devices_t mSupportedDevices; // supported devices (devices this output can be
218                                               // routed to)
219            audio_output_flags_t mFlags; // attribute flags (e.g primary output,
220                                                // direct output...). For outputs only.
221            HwModule *mModule;                     // audio HW module exposing this I/O stream
222        };
223
224        // default volume curve
225        static const VolumeCurvePoint sDefaultVolumeCurve[AudioPolicyManagerBase::VOLCNT];
226        // default volume curve for media strategy
227        static const VolumeCurvePoint sDefaultMediaVolumeCurve[AudioPolicyManagerBase::VOLCNT];
228        // volume curve for media strategy on speakers
229        static const VolumeCurvePoint sSpeakerMediaVolumeCurve[AudioPolicyManagerBase::VOLCNT];
230        // volume curve for sonification strategy on speakers
231        static const VolumeCurvePoint sSpeakerSonificationVolumeCurve[AudioPolicyManagerBase::VOLCNT];
232        static const VolumeCurvePoint sDefaultSystemVolumeCurve[AudioPolicyManagerBase::VOLCNT];
233        static const VolumeCurvePoint sHeadsetSystemVolumeCurve[AudioPolicyManagerBase::VOLCNT];
234        static const VolumeCurvePoint sDefaultVoiceVolumeCurve[AudioPolicyManagerBase::VOLCNT];
235        static const VolumeCurvePoint sSpeakerVoiceVolumeCurve[AudioPolicyManagerBase::VOLCNT];
236        // default volume curves per stream and device category. See initializeVolumeCurves()
237        static const VolumeCurvePoint *sVolumeProfiles[AUDIO_STREAM_CNT][DEVICE_CATEGORY_CNT];
238
239        // descriptor for audio outputs. Used to maintain current configuration of each opened audio output
240        // and keep track of the usage of this output by each audio stream type.
241        class AudioOutputDescriptor
242        {
243        public:
244            AudioOutputDescriptor(const IOProfile *profile);
245
246            status_t    dump(int fd);
247
248            audio_devices_t device() const;
249            void changeRefCount(AudioSystem::stream_type stream, int delta);
250            bool isDuplicated() const { return (mOutput1 != NULL && mOutput2 != NULL); }
251            audio_devices_t supportedDevices();
252            uint32_t latency();
253            bool sharesHwModuleWith(const AudioOutputDescriptor *outputDesc);
254            bool isActive(uint32_t inPastMs = 0) const;
255            bool isStreamActive(AudioSystem::stream_type stream,
256                                uint32_t inPastMs = 0,
257                                nsecs_t sysTime = 0) const;
258            bool isStrategyActive(routing_strategy strategy,
259                             uint32_t inPastMs = 0,
260                             nsecs_t sysTime = 0) const;
261
262            audio_io_handle_t mId;              // output handle
263            uint32_t mSamplingRate;             //
264            audio_format_t mFormat;             //
265            audio_channel_mask_t mChannelMask;     // output configuration
266            uint32_t mLatency;                  //
267            audio_output_flags_t mFlags;   //
268            audio_devices_t mDevice;                   // current device this output is routed to
269            uint32_t mRefCount[AudioSystem::NUM_STREAM_TYPES]; // number of streams of each type using this output
270            nsecs_t mStopTime[AudioSystem::NUM_STREAM_TYPES];
271            AudioOutputDescriptor *mOutput1;    // used by duplicated outputs: first output
272            AudioOutputDescriptor *mOutput2;    // used by duplicated outputs: second output
273            float mCurVolume[AudioSystem::NUM_STREAM_TYPES];   // current stream volume
274            int mMuteCount[AudioSystem::NUM_STREAM_TYPES];     // mute request counter
275            const IOProfile *mProfile;          // I/O profile this output derives from
276            bool mStrategyMutedByDevice[NUM_STRATEGIES]; // strategies muted because of incompatible
277                                                // device selection. See checkDeviceMuteStrategies()
278            uint32_t mDirectOpenCount; // number of clients using this output (direct outputs only)
279        };
280
281        // descriptor for audio inputs. Used to maintain current configuration of each opened audio input
282        // and keep track of the usage of this input.
283        class AudioInputDescriptor
284        {
285        public:
286            AudioInputDescriptor(const IOProfile *profile);
287
288            status_t    dump(int fd);
289
290            uint32_t mSamplingRate;                     //
291            audio_format_t mFormat;                     // input configuration
292            audio_channel_mask_t mChannelMask;             //
293            audio_devices_t mDevice;                    // current device this input is routed to
294            uint32_t mRefCount;                         // number of AudioRecord clients using this output
295            int      mInputSource;                      // input source selected by application (mediarecorder.h)
296            const IOProfile *mProfile;                  // I/O profile this output derives from
297        };
298
299        // stream descriptor used for volume control
300        class StreamDescriptor
301        {
302        public:
303            StreamDescriptor();
304
305            int getVolumeIndex(audio_devices_t device);
306            void dump(int fd);
307
308            int mIndexMin;      // min volume index
309            int mIndexMax;      // max volume index
310            KeyedVector<audio_devices_t, int> mIndexCur;   // current volume index per device
311            bool mCanBeMuted;   // true is the stream can be muted
312
313            const VolumeCurvePoint *mVolumeCurve[DEVICE_CATEGORY_CNT];
314        };
315
316        // stream descriptor used for volume control
317        class EffectDescriptor
318        {
319        public:
320
321            status_t dump(int fd);
322
323            int mIo;                // io the effect is attached to
324            routing_strategy mStrategy; // routing strategy the effect is associated to
325            int mSession;               // audio session the effect is on
326            effect_descriptor_t mDesc;  // effect descriptor
327            bool mEnabled;              // enabled state: CPU load being used or not
328        };
329
330        void addOutput(audio_io_handle_t id, AudioOutputDescriptor *outputDesc);
331
332        // return the strategy corresponding to a given stream type
333        static routing_strategy getStrategy(AudioSystem::stream_type stream);
334
335        // return appropriate device for streams handled by the specified strategy according to current
336        // phone state, connected devices...
337        // if fromCache is true, the device is returned from mDeviceForStrategy[],
338        // otherwise it is determine by current state
339        // (device connected,phone state, force use, a2dp output...)
340        // This allows to:
341        //  1 speed up process when the state is stable (when starting or stopping an output)
342        //  2 access to either current device selection (fromCache == true) or
343        // "future" device selection (fromCache == false) when called from a context
344        //  where conditions are changing (setDeviceConnectionState(), setPhoneState()...) AND
345        //  before updateDevicesAndOutputs() is called.
346        virtual audio_devices_t getDeviceForStrategy(routing_strategy strategy,
347                                                     bool fromCache);
348
349        // change the route of the specified output. Returns the number of ms we have slept to
350        // allow new routing to take effect in certain cases.
351        uint32_t setOutputDevice(audio_io_handle_t output,
352                             audio_devices_t device,
353                             bool force = false,
354                             int delayMs = 0);
355
356        // select input device corresponding to requested audio source
357        virtual audio_devices_t getDeviceForInputSource(int inputSource);
358
359        // return io handle of active input or 0 if no input is active
360        //    Only considers inputs from physical devices (e.g. main mic, headset mic) when
361        //    ignoreVirtualInputs is true.
362        audio_io_handle_t getActiveInput(bool ignoreVirtualInputs = true);
363
364        // initialize volume curves for each strategy and device category
365        void initializeVolumeCurves();
366
367        // compute the actual volume for a given stream according to the requested index and a particular
368        // device
369        virtual float computeVolume(int stream, int index, audio_io_handle_t output, audio_devices_t device);
370
371        // check that volume change is permitted, compute and send new volume to audio hardware
372        status_t checkAndSetVolume(int stream, int index, audio_io_handle_t output, audio_devices_t device, int delayMs = 0, bool force = false);
373
374        // apply all stream volumes to the specified output and device
375        void applyStreamVolumes(audio_io_handle_t output, audio_devices_t device, int delayMs = 0, bool force = false);
376
377        // Mute or unmute all streams handled by the specified strategy on the specified output
378        void setStrategyMute(routing_strategy strategy,
379                             bool on,
380                             audio_io_handle_t output,
381                             int delayMs = 0,
382                             audio_devices_t device = (audio_devices_t)0);
383
384        // Mute or unmute the stream on the specified output
385        void setStreamMute(int stream,
386                           bool on,
387                           audio_io_handle_t output,
388                           int delayMs = 0,
389                           audio_devices_t device = (audio_devices_t)0);
390
391        // handle special cases for sonification strategy while in call: mute streams or replace by
392        // a special tone in the device used for communication
393        void handleIncallSonification(int stream, bool starting, bool stateChange);
394
395        // true if device is in a telephony or VoIP call
396        virtual bool isInCall();
397
398        // true if given state represents a device in a telephony or VoIP call
399        virtual bool isStateInCall(int state);
400
401        // when a device is connected, checks if an open output can be routed
402        // to this device. If none is open, tries to open one of the available outputs.
403        // Returns an output suitable to this device or 0.
404        // when a device is disconnected, checks if an output is not used any more and
405        // returns its handle if any.
406        // transfers the audio tracks and effects from one output thread to another accordingly.
407        status_t checkOutputsForDevice(audio_devices_t device,
408                                       AudioSystem::device_connection_state state,
409                                       SortedVector<audio_io_handle_t>& outputs);
410
411        // close an output and its companion duplicating output.
412        void closeOutput(audio_io_handle_t output);
413
414        // checks and if necessary changes outputs used for all strategies.
415        // must be called every time a condition that affects the output choice for a given strategy
416        // changes: connected device, phone state, force use...
417        // Must be called before updateDevicesAndOutputs()
418        void checkOutputForStrategy(routing_strategy strategy);
419
420        // Same as checkOutputForStrategy() but for a all strategies in order of priority
421        void checkOutputForAllStrategies();
422
423        // manages A2DP output suspend/restore according to phone state and BT SCO usage
424        void checkA2dpSuspend();
425
426        // returns the A2DP output handle if it is open or 0 otherwise
427        audio_io_handle_t getA2dpOutput();
428
429        // selects the most appropriate device on output for current state
430        // must be called every time a condition that affects the device choice for a given output is
431        // changed: connected device, phone state, force use, output start, output stop..
432        // see getDeviceForStrategy() for the use of fromCache parameter
433
434        audio_devices_t getNewDevice(audio_io_handle_t output, bool fromCache);
435        // updates cache of device used by all strategies (mDeviceForStrategy[])
436        // must be called every time a condition that affects the device choice for a given strategy is
437        // changed: connected device, phone state, force use...
438        // cached values are used by getDeviceForStrategy() if parameter fromCache is true.
439         // Must be called after checkOutputForAllStrategies()
440
441        void updateDevicesAndOutputs();
442
443        // true if current platform requires a specific output to be opened for this particular
444        // set of parameters. This function is called by getOutput() and is implemented by platform
445        // specific audio policy manager.
446        virtual bool needsDirectOuput(audio_stream_type_t stream,
447                                      uint32_t samplingRate,
448                                      audio_format_t format,
449                                      audio_channel_mask_t channelMask,
450                                      audio_output_flags_t flags,
451                                      audio_devices_t device);
452
453        virtual uint32_t getMaxEffectsCpuLoad();
454        virtual uint32_t getMaxEffectsMemory();
455#ifdef AUDIO_POLICY_TEST
456        virtual     bool        threadLoop();
457                    void        exit();
458        int testOutputIndex(audio_io_handle_t output);
459#endif //AUDIO_POLICY_TEST
460
461        status_t setEffectEnabled(EffectDescriptor *pDesc, bool enabled);
462
463        // returns the category the device belongs to with regard to volume curve management
464        static device_category getDeviceCategory(audio_devices_t device);
465
466        // extract one device relevant for volume control from multiple device selection
467        static audio_devices_t getDeviceForVolume(audio_devices_t device);
468
469        SortedVector<audio_io_handle_t> getOutputsForDevice(audio_devices_t device,
470                        DefaultKeyedVector<audio_io_handle_t, AudioOutputDescriptor *> openOutputs);
471        bool vectorsEqual(SortedVector<audio_io_handle_t>& outputs1,
472                                           SortedVector<audio_io_handle_t>& outputs2);
473
474        // mute/unmute strategies using an incompatible device combination
475        // if muting, wait for the audio in pcm buffer to be drained before proceeding
476        // if unmuting, unmute only after the specified delay
477        // Returns the number of ms waited
478        uint32_t  checkDeviceMuteStrategies(AudioOutputDescriptor *outputDesc,
479                                            audio_devices_t prevDevice,
480                                            uint32_t delayMs);
481
482        audio_io_handle_t selectOutput(const SortedVector<audio_io_handle_t>& outputs,
483                                       AudioSystem::output_flags flags);
484        IOProfile *getInputProfile(audio_devices_t device,
485                                   uint32_t samplingRate,
486                                   uint32_t format,
487                                   uint32_t channelMask);
488        IOProfile *getProfileForDirectOutput(audio_devices_t device,
489                                                       uint32_t samplingRate,
490                                                       uint32_t format,
491                                                       uint32_t channelMask,
492                                                       audio_output_flags_t flags);
493        //
494        // Audio policy configuration file parsing (audio_policy.conf)
495        //
496        static uint32_t stringToEnum(const struct StringToEnum *table,
497                                     size_t size,
498                                     const char *name);
499        static audio_output_flags_t parseFlagNames(char *name);
500        static audio_devices_t parseDeviceNames(char *name);
501        void loadSamplingRates(char *name, IOProfile *profile);
502        void loadFormats(char *name, IOProfile *profile);
503        void loadOutChannels(char *name, IOProfile *profile);
504        void loadInChannels(char *name, IOProfile *profile);
505        status_t loadOutput(cnode *root,  HwModule *module);
506        status_t loadInput(cnode *root,  HwModule *module);
507        void loadHwModule(cnode *root);
508        void loadHwModules(cnode *root);
509        void loadGlobalConfig(cnode *root);
510        status_t loadAudioPolicyConfig(const char *path);
511        void defaultAudioPolicyConfig(void);
512
513
514        AudioPolicyClientInterface *mpClientInterface;  // audio policy client interface
515        audio_io_handle_t mPrimaryOutput;              // primary output handle
516        // list of descriptors for outputs currently opened
517        DefaultKeyedVector<audio_io_handle_t, AudioOutputDescriptor *> mOutputs;
518        // copy of mOutputs before setDeviceConnectionState() opens new outputs
519        // reset to mOutputs when updateDevicesAndOutputs() is called.
520        DefaultKeyedVector<audio_io_handle_t, AudioOutputDescriptor *> mPreviousOutputs;
521        DefaultKeyedVector<audio_io_handle_t, AudioInputDescriptor *> mInputs;     // list of input descriptors
522        audio_devices_t mAvailableOutputDevices; // bit field of all available output devices
523        audio_devices_t mAvailableInputDevices; // bit field of all available input devices
524                                                // without AUDIO_DEVICE_BIT_IN to allow direct bit
525                                                // field comparisons
526        int mPhoneState;                                                    // current phone state
527        AudioSystem::forced_config mForceUse[AudioSystem::NUM_FORCE_USE];   // current forced use configuration
528
529        StreamDescriptor mStreams[AudioSystem::NUM_STREAM_TYPES];           // stream descriptors for volume control
530        String8 mA2dpDeviceAddress;                                         // A2DP device MAC address
531        String8 mScoDeviceAddress;                                          // SCO device MAC address
532        String8 mUsbCardAndDevice; // USB audio ALSA card and device numbers:
533                                   // card=<card_number>;device=<><device_number>
534        bool    mLimitRingtoneVolume;                                       // limit ringtone volume to music volume if headset connected
535        audio_devices_t mDeviceForStrategy[NUM_STRATEGIES];
536        float   mLastVoiceVolume;                                           // last voice volume value sent to audio HAL
537
538        // Maximum CPU load allocated to audio effects in 0.1 MIPS (ARMv5TE, 0 WS memory) units
539        static const uint32_t MAX_EFFECTS_CPU_LOAD = 1000;
540        // Maximum memory allocated to audio effects in KB
541        static const uint32_t MAX_EFFECTS_MEMORY = 512;
542        uint32_t mTotalEffectsCpuLoad; // current CPU load used by effects
543        uint32_t mTotalEffectsMemory;  // current memory used by effects
544        KeyedVector<int, EffectDescriptor *> mEffects;  // list of registered audio effects
545        bool    mA2dpSuspended;  // true if A2DP output is suspended
546        bool mHasA2dp; // true on platforms with support for bluetooth A2DP
547        bool mHasUsb; // true on platforms with support for USB audio
548        bool mHasRemoteSubmix; // true on platforms with support for remote presentation of a submix
549        audio_devices_t mAttachedOutputDevices; // output devices always available on the platform
550        audio_devices_t mDefaultOutputDevice; // output device selected by default at boot time
551                                              // (must be in mAttachedOutputDevices)
552
553        Vector <HwModule *> mHwModules;
554
555#ifdef AUDIO_POLICY_TEST
556        Mutex   mLock;
557        Condition mWaitWorkCV;
558
559        int             mCurOutput;
560        bool            mDirectOutput;
561        audio_io_handle_t mTestOutputs[NUM_TEST_OUTPUTS];
562        int             mTestInput;
563        uint32_t        mTestDevice;
564        uint32_t        mTestSamplingRate;
565        uint32_t        mTestFormat;
566        uint32_t        mTestChannels;
567        uint32_t        mTestLatencyMs;
568#endif //AUDIO_POLICY_TEST
569
570private:
571        static float volIndexToAmpl(audio_devices_t device, const StreamDescriptor& streamDesc,
572                int indexInUi);
573        // updates device caching and output for streams that can influence the
574        //    routing of notifications
575        void handleNotificationRoutingForStream(AudioSystem::stream_type stream);
576        static bool isVirtualInputDevice(audio_devices_t device);
577};
578
579};
580