AudioPolicyManager.h revision 4dc680607181e6a76f4e91a39366c4f5dfb7b03e
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 "AudioPolicyInterface.h"
27
28
29namespace android {
30
31// ----------------------------------------------------------------------------
32
33// Attenuation applied to STRATEGY_SONIFICATION streams when a headset is connected: 6dB
34#define SONIFICATION_HEADSET_VOLUME_FACTOR 0.5
35// Min volume for STRATEGY_SONIFICATION streams when limited by music volume: -36dB
36#define SONIFICATION_HEADSET_VOLUME_MIN  0.016
37// Time in milliseconds during which we consider that music is still active after a music
38// track was stopped - see computeVolume()
39#define SONIFICATION_HEADSET_MUSIC_DELAY  5000
40// Time in milliseconds after media stopped playing during which we consider that the
41// sonification should be as unobtrusive as during the time media was playing.
42#define SONIFICATION_RESPECTFUL_AFTER_MUSIC_DELAY 5000
43// Time in milliseconds during witch some streams are muted while the audio path
44// is switched
45#define MUTE_TIME_MS 2000
46
47#define NUM_TEST_OUTPUTS 5
48
49#define NUM_VOL_CURVE_KNEES 2
50
51// Default minimum length allowed for offloading a compressed track
52// Can be overridden by the audio.offload.min.duration.secs property
53#define OFFLOAD_DEFAULT_MIN_DURATION_SECS 60
54
55#define MAX_MIXER_SAMPLING_RATE 48000
56#define MAX_MIXER_CHANNEL_COUNT 2
57// See AudioPort::compareFormats()
58#define WORST_MIXER_FORMAT AUDIO_FORMAT_PCM_16_BIT
59#define BEST_MIXER_FORMAT AUDIO_FORMAT_PCM_24_BIT_PACKED
60
61// ----------------------------------------------------------------------------
62// AudioPolicyManager implements audio policy manager behavior common to all platforms.
63// ----------------------------------------------------------------------------
64
65class AudioPolicyManager: public AudioPolicyInterface
66#ifdef AUDIO_POLICY_TEST
67    , public Thread
68#endif //AUDIO_POLICY_TEST
69{
70
71public:
72                AudioPolicyManager(AudioPolicyClientInterface *clientInterface);
73        virtual ~AudioPolicyManager();
74
75        // AudioPolicyInterface
76        virtual status_t setDeviceConnectionState(audio_devices_t device,
77                                                          audio_policy_dev_state_t state,
78                                                          const char *device_address);
79        virtual audio_policy_dev_state_t getDeviceConnectionState(audio_devices_t device,
80                                                                              const char *device_address);
81        virtual void setPhoneState(audio_mode_t state);
82        virtual void setForceUse(audio_policy_force_use_t usage,
83                                 audio_policy_forced_cfg_t config);
84        virtual audio_policy_forced_cfg_t getForceUse(audio_policy_force_use_t usage);
85        virtual void setSystemProperty(const char* property, const char* value);
86        virtual status_t initCheck();
87        virtual audio_io_handle_t getOutput(audio_stream_type_t stream,
88                                            uint32_t samplingRate,
89                                            audio_format_t format,
90                                            audio_channel_mask_t channelMask,
91                                            audio_output_flags_t flags,
92                                            const audio_offload_info_t *offloadInfo);
93        virtual audio_io_handle_t getOutputForAttr(const audio_attributes_t *attr,
94                                            uint32_t samplingRate,
95                                            audio_format_t format,
96                                            audio_channel_mask_t channelMask,
97                                            audio_output_flags_t flags,
98                                            const audio_offload_info_t *offloadInfo);
99        virtual status_t startOutput(audio_io_handle_t output,
100                                     audio_stream_type_t stream,
101                                     int session = 0);
102        virtual status_t stopOutput(audio_io_handle_t output,
103                                    audio_stream_type_t stream,
104                                    int session = 0);
105        virtual void releaseOutput(audio_io_handle_t output);
106        virtual audio_io_handle_t getInput(audio_source_t inputSource,
107                                            uint32_t samplingRate,
108                                            audio_format_t format,
109                                            audio_channel_mask_t channelMask,
110                                            audio_session_t session,
111                                            audio_input_flags_t flags);
112
113        // indicates to the audio policy manager that the input starts being used.
114        virtual status_t startInput(audio_io_handle_t input,
115                                    audio_session_t session);
116
117        // indicates to the audio policy manager that the input stops being used.
118        virtual status_t stopInput(audio_io_handle_t input,
119                                   audio_session_t session);
120        virtual void releaseInput(audio_io_handle_t input,
121                                  audio_session_t session);
122        virtual void closeAllInputs();
123        virtual void initStreamVolume(audio_stream_type_t stream,
124                                                    int indexMin,
125                                                    int indexMax);
126        virtual status_t setStreamVolumeIndex(audio_stream_type_t stream,
127                                              int index,
128                                              audio_devices_t device);
129        virtual status_t getStreamVolumeIndex(audio_stream_type_t stream,
130                                              int *index,
131                                              audio_devices_t device);
132
133        // return the strategy corresponding to a given stream type
134        virtual uint32_t getStrategyForStream(audio_stream_type_t stream);
135        // return the strategy corresponding to the given audio attributes
136        virtual uint32_t getStrategyForAttr(const audio_attributes_t *attr);
137
138        // return the enabled output devices for the given stream type
139        virtual audio_devices_t getDevicesForStream(audio_stream_type_t stream);
140
141        virtual audio_io_handle_t getOutputForEffect(const effect_descriptor_t *desc = NULL);
142        virtual status_t registerEffect(const effect_descriptor_t *desc,
143                                        audio_io_handle_t io,
144                                        uint32_t strategy,
145                                        int session,
146                                        int id);
147        virtual status_t unregisterEffect(int id);
148        virtual status_t setEffectEnabled(int id, bool enabled);
149
150        virtual bool isStreamActive(audio_stream_type_t stream, uint32_t inPastMs = 0) const;
151        // return whether a stream is playing remotely, override to change the definition of
152        //   local/remote playback, used for instance by notification manager to not make
153        //   media players lose audio focus when not playing locally
154        virtual bool isStreamActiveRemotely(audio_stream_type_t stream, uint32_t inPastMs = 0) const;
155        virtual bool isSourceActive(audio_source_t source) const;
156
157        virtual status_t dump(int fd);
158
159        virtual bool isOffloadSupported(const audio_offload_info_t& offloadInfo);
160
161        virtual status_t listAudioPorts(audio_port_role_t role,
162                                        audio_port_type_t type,
163                                        unsigned int *num_ports,
164                                        struct audio_port *ports,
165                                        unsigned int *generation);
166        virtual status_t getAudioPort(struct audio_port *port);
167        virtual status_t createAudioPatch(const struct audio_patch *patch,
168                                           audio_patch_handle_t *handle,
169                                           uid_t uid);
170        virtual status_t releaseAudioPatch(audio_patch_handle_t handle,
171                                              uid_t uid);
172        virtual status_t listAudioPatches(unsigned int *num_patches,
173                                          struct audio_patch *patches,
174                                          unsigned int *generation);
175        virtual status_t setAudioPortConfig(const struct audio_port_config *config);
176        virtual void clearAudioPatches(uid_t uid);
177
178protected:
179
180        enum routing_strategy {
181            STRATEGY_MEDIA,
182            STRATEGY_PHONE,
183            STRATEGY_SONIFICATION,
184            STRATEGY_SONIFICATION_RESPECTFUL,
185            STRATEGY_DTMF,
186            STRATEGY_ENFORCED_AUDIBLE,
187            NUM_STRATEGIES
188        };
189
190        // 4 points to define the volume attenuation curve, each characterized by the volume
191        // index (from 0 to 100) at which they apply, and the attenuation in dB at that index.
192        // we use 100 steps to avoid rounding errors when computing the volume in volIndexToAmpl()
193
194        enum { VOLMIN = 0, VOLKNEE1 = 1, VOLKNEE2 = 2, VOLMAX = 3, VOLCNT = 4};
195
196        class VolumeCurvePoint
197        {
198        public:
199            int mIndex;
200            float mDBAttenuation;
201        };
202
203        // device categories used for volume curve management.
204        enum device_category {
205            DEVICE_CATEGORY_HEADSET,
206            DEVICE_CATEGORY_SPEAKER,
207            DEVICE_CATEGORY_EARPIECE,
208            DEVICE_CATEGORY_CNT
209        };
210
211        class HwModule;
212
213        class AudioGain: public RefBase
214        {
215        public:
216            AudioGain(int index, bool useInChannelMask);
217            virtual ~AudioGain() {}
218
219            void dump(int fd, int spaces, int index) const;
220
221            void getDefaultConfig(struct audio_gain_config *config);
222            status_t checkConfig(const struct audio_gain_config *config);
223            int               mIndex;
224            struct audio_gain mGain;
225            bool              mUseInChannelMask;
226        };
227
228        class AudioPort: public virtual RefBase
229        {
230        public:
231            AudioPort(const String8& name, audio_port_type_t type,
232                      audio_port_role_t role, const sp<HwModule>& module);
233            virtual ~AudioPort() {}
234
235            virtual void toAudioPort(struct audio_port *port) const;
236
237            void loadSamplingRates(char *name);
238            void loadFormats(char *name);
239            void loadOutChannels(char *name);
240            void loadInChannels(char *name);
241
242            audio_gain_mode_t loadGainMode(char *name);
243            void loadGain(cnode *root, int index);
244            void loadGains(cnode *root);
245
246            // searches for an exact match
247            status_t checkExactSamplingRate(uint32_t samplingRate) const;
248            // searches for a compatible match, and returns the best match via updatedSamplingRate
249            status_t checkCompatibleSamplingRate(uint32_t samplingRate,
250                    uint32_t *updatedSamplingRate) const;
251            // searches for an exact match
252            status_t checkExactChannelMask(audio_channel_mask_t channelMask) const;
253            // searches for a compatible match, currently implemented for input channel masks only
254            status_t checkCompatibleChannelMask(audio_channel_mask_t channelMask) const;
255            status_t checkFormat(audio_format_t format) const;
256            status_t checkGain(const struct audio_gain_config *gainConfig, int index) const;
257
258            uint32_t pickSamplingRate() const;
259            audio_channel_mask_t pickChannelMask() const;
260            audio_format_t pickFormat() const;
261
262            static const audio_format_t sPcmFormatCompareTable[];
263            static int compareFormats(audio_format_t format1, audio_format_t format2);
264
265            void dump(int fd, int spaces) const;
266
267            String8           mName;
268            audio_port_type_t mType;
269            audio_port_role_t mRole;
270            bool              mUseInChannelMask;
271            // by convention, "0' in the first entry in mSamplingRates, mChannelMasks or mFormats
272            // indicates the supported parameters should be read from the output stream
273            // after it is opened for the first time
274            Vector <uint32_t> mSamplingRates; // supported sampling rates
275            Vector <audio_channel_mask_t> mChannelMasks; // supported channel masks
276            Vector <audio_format_t> mFormats; // supported audio formats
277            Vector < sp<AudioGain> > mGains; // gain controllers
278            sp<HwModule> mModule;                 // audio HW module exposing this I/O stream
279            audio_output_flags_t mFlags; // attribute flags (e.g primary output,
280                                                // direct output...). For outputs only.
281        };
282
283        class AudioPortConfig: public virtual RefBase
284        {
285        public:
286            AudioPortConfig();
287            virtual ~AudioPortConfig() {}
288
289            status_t applyAudioPortConfig(const struct audio_port_config *config,
290                                          struct audio_port_config *backupConfig = NULL);
291            virtual void toAudioPortConfig(struct audio_port_config *dstConfig,
292                                   const struct audio_port_config *srcConfig = NULL) const = 0;
293            sp<AudioPort> mAudioPort;
294            uint32_t mSamplingRate;
295            audio_format_t mFormat;
296            audio_channel_mask_t mChannelMask;
297            struct audio_gain_config mGain;
298        };
299
300
301        class AudioPatch: public RefBase
302        {
303        public:
304            AudioPatch(audio_patch_handle_t handle,
305                       const struct audio_patch *patch, uid_t uid) :
306                           mHandle(handle), mPatch(*patch), mUid(uid), mAfPatchHandle(0) {}
307
308            audio_patch_handle_t mHandle;
309            struct audio_patch mPatch;
310            uid_t mUid;
311            audio_patch_handle_t mAfPatchHandle;
312        };
313
314        class DeviceDescriptor: public AudioPort, public AudioPortConfig
315        {
316        public:
317            DeviceDescriptor(const String8& name, audio_devices_t type);
318
319            virtual ~DeviceDescriptor() {}
320
321            bool equals(const sp<DeviceDescriptor>& other) const;
322            virtual void toAudioPortConfig(struct audio_port_config *dstConfig,
323                                   const struct audio_port_config *srcConfig = NULL) const;
324
325            virtual void toAudioPort(struct audio_port *port) const;
326
327            status_t dump(int fd, int spaces, int index) const;
328
329            audio_devices_t mDeviceType;
330            String8 mAddress;
331            audio_port_handle_t mId;
332        };
333
334        class DeviceVector : public SortedVector< sp<DeviceDescriptor> >
335        {
336        public:
337            DeviceVector() : SortedVector(), mDeviceTypes(AUDIO_DEVICE_NONE) {}
338
339            ssize_t         add(const sp<DeviceDescriptor>& item);
340            ssize_t         remove(const sp<DeviceDescriptor>& item);
341            ssize_t         indexOf(const sp<DeviceDescriptor>& item) const;
342
343            audio_devices_t types() const { return mDeviceTypes; }
344
345            void loadDevicesFromType(audio_devices_t types);
346            void loadDevicesFromName(char *name, const DeviceVector& declaredDevices);
347
348            sp<DeviceDescriptor> getDevice(audio_devices_t type, String8 address) const;
349            DeviceVector getDevicesFromType(audio_devices_t types) const;
350            sp<DeviceDescriptor> getDeviceFromId(audio_port_handle_t id) const;
351            sp<DeviceDescriptor> getDeviceFromName(const String8& name) const;
352            DeviceVector getDevicesFromTypeAddr(audio_devices_t type, String8 address)
353                    const;
354
355        private:
356            void refreshTypes();
357            audio_devices_t mDeviceTypes;
358        };
359
360        // the IOProfile class describes the capabilities of an output or input stream.
361        // It is currently assumed that all combination of listed parameters are supported.
362        // It is used by the policy manager to determine if an output or input is suitable for
363        // a given use case,  open/close it accordingly and connect/disconnect audio tracks
364        // to/from it.
365        class IOProfile : public AudioPort
366        {
367        public:
368            IOProfile(const String8& name, audio_port_role_t role, const sp<HwModule>& module);
369            virtual ~IOProfile();
370
371            // This method is used for both output and input.
372            // If parameter updatedSamplingRate is non-NULL, it is assigned the actual sample rate.
373            // For input, flags is interpreted as audio_input_flags_t.
374            // TODO: merge audio_output_flags_t and audio_input_flags_t.
375            bool isCompatibleProfile(audio_devices_t device,
376                                     uint32_t samplingRate,
377                                     uint32_t *updatedSamplingRate,
378                                     audio_format_t format,
379                                     audio_channel_mask_t channelMask,
380                                     audio_output_flags_t flags) const;
381
382            void dump(int fd);
383            void log();
384
385            DeviceVector  mSupportedDevices; // supported devices
386                                             // (devices this output can be routed to)
387        };
388
389        class HwModule : public RefBase
390        {
391        public:
392                    HwModule(const char *name);
393                    ~HwModule();
394
395            status_t loadOutput(cnode *root);
396            status_t loadInput(cnode *root);
397            status_t loadDevice(cnode *root);
398
399            void dump(int fd);
400
401            const char *const        mName; // base name of the audio HW module (primary, a2dp ...)
402            uint32_t                 mHalVersion; // audio HAL API version
403            audio_module_handle_t    mHandle;
404            Vector < sp<IOProfile> > mOutputProfiles; // output profiles exposed by this module
405            Vector < sp<IOProfile> > mInputProfiles;  // input profiles exposed by this module
406            DeviceVector             mDeclaredDevices; // devices declared in audio_policy.conf
407
408        };
409
410        // default volume curve
411        static const VolumeCurvePoint sDefaultVolumeCurve[AudioPolicyManager::VOLCNT];
412        // default volume curve for media strategy
413        static const VolumeCurvePoint sDefaultMediaVolumeCurve[AudioPolicyManager::VOLCNT];
414        // volume curve for media strategy on speakers
415        static const VolumeCurvePoint sSpeakerMediaVolumeCurve[AudioPolicyManager::VOLCNT];
416        static const VolumeCurvePoint sSpeakerMediaVolumeCurveDrc[AudioPolicyManager::VOLCNT];
417        // volume curve for sonification strategy on speakers
418        static const VolumeCurvePoint sSpeakerSonificationVolumeCurve[AudioPolicyManager::VOLCNT];
419        static const VolumeCurvePoint sSpeakerSonificationVolumeCurveDrc[AudioPolicyManager::VOLCNT];
420        static const VolumeCurvePoint sDefaultSystemVolumeCurve[AudioPolicyManager::VOLCNT];
421        static const VolumeCurvePoint sDefaultSystemVolumeCurveDrc[AudioPolicyManager::VOLCNT];
422        static const VolumeCurvePoint sHeadsetSystemVolumeCurve[AudioPolicyManager::VOLCNT];
423        static const VolumeCurvePoint sDefaultVoiceVolumeCurve[AudioPolicyManager::VOLCNT];
424        static const VolumeCurvePoint sSpeakerVoiceVolumeCurve[AudioPolicyManager::VOLCNT];
425        // default volume curves per stream and device category. See initializeVolumeCurves()
426        static const VolumeCurvePoint *sVolumeProfiles[AUDIO_STREAM_CNT][DEVICE_CATEGORY_CNT];
427
428        // descriptor for audio outputs. Used to maintain current configuration of each opened audio output
429        // and keep track of the usage of this output by each audio stream type.
430        class AudioOutputDescriptor: public AudioPortConfig
431        {
432        public:
433            AudioOutputDescriptor(const sp<IOProfile>& profile);
434
435            status_t    dump(int fd);
436
437            audio_devices_t device() const;
438            void changeRefCount(audio_stream_type_t stream, int delta);
439
440            bool isDuplicated() const { return (mOutput1 != NULL && mOutput2 != NULL); }
441            audio_devices_t supportedDevices();
442            uint32_t latency();
443            bool sharesHwModuleWith(const sp<AudioOutputDescriptor> outputDesc);
444            bool isActive(uint32_t inPastMs = 0) const;
445            bool isStreamActive(audio_stream_type_t stream,
446                                uint32_t inPastMs = 0,
447                                nsecs_t sysTime = 0) const;
448            bool isStrategyActive(routing_strategy strategy,
449                             uint32_t inPastMs = 0,
450                             nsecs_t sysTime = 0) const;
451
452            virtual void toAudioPortConfig(struct audio_port_config *dstConfig,
453                                   const struct audio_port_config *srcConfig = NULL) const;
454            void toAudioPort(struct audio_port *port) const;
455
456            audio_port_handle_t mId;
457            audio_io_handle_t mIoHandle;              // output handle
458            uint32_t mLatency;                  //
459            audio_output_flags_t mFlags;   //
460            audio_devices_t mDevice;                   // current device this output is routed to
461            audio_patch_handle_t mPatchHandle;
462            uint32_t mRefCount[AUDIO_STREAM_CNT]; // number of streams of each type using this output
463            nsecs_t mStopTime[AUDIO_STREAM_CNT];
464            sp<AudioOutputDescriptor> mOutput1;    // used by duplicated outputs: first output
465            sp<AudioOutputDescriptor> mOutput2;    // used by duplicated outputs: second output
466            float mCurVolume[AUDIO_STREAM_CNT];   // current stream volume
467            int mMuteCount[AUDIO_STREAM_CNT];     // mute request counter
468            const sp<IOProfile> mProfile;          // I/O profile this output derives from
469            bool mStrategyMutedByDevice[NUM_STRATEGIES]; // strategies muted because of incompatible
470                                                // device selection. See checkDeviceMuteStrategies()
471            uint32_t mDirectOpenCount; // number of clients using this output (direct outputs only)
472        };
473
474        // descriptor for audio inputs. Used to maintain current configuration of each opened audio input
475        // and keep track of the usage of this input.
476        class AudioInputDescriptor: public AudioPortConfig
477        {
478        public:
479            AudioInputDescriptor(const sp<IOProfile>& profile);
480
481            status_t    dump(int fd);
482
483            audio_port_handle_t mId;
484            audio_io_handle_t mIoHandle;              // input handle
485            audio_devices_t mDevice;                    // current device this input is routed to
486            audio_patch_handle_t mPatchHandle;
487            uint32_t mRefCount;                         // number of AudioRecord clients using this output
488            uint32_t mOpenRefCount;
489            audio_source_t mInputSource;                // input source selected by application (mediarecorder.h)
490            const sp<IOProfile> mProfile;                  // I/O profile this output derives from
491            SortedVector<audio_session_t> mSessions;  // audio sessions attached to this input
492
493            virtual void toAudioPortConfig(struct audio_port_config *dstConfig,
494                                   const struct audio_port_config *srcConfig = NULL) const;
495            void toAudioPort(struct audio_port *port) const;
496        };
497
498        // stream descriptor used for volume control
499        class StreamDescriptor
500        {
501        public:
502            StreamDescriptor();
503
504            int getVolumeIndex(audio_devices_t device);
505            void dump(int fd);
506
507            int mIndexMin;      // min volume index
508            int mIndexMax;      // max volume index
509            KeyedVector<audio_devices_t, int> mIndexCur;   // current volume index per device
510            bool mCanBeMuted;   // true is the stream can be muted
511
512            const VolumeCurvePoint *mVolumeCurve[DEVICE_CATEGORY_CNT];
513        };
514
515        // stream descriptor used for volume control
516        class EffectDescriptor : public RefBase
517        {
518        public:
519
520            status_t dump(int fd);
521
522            int mIo;                // io the effect is attached to
523            routing_strategy mStrategy; // routing strategy the effect is associated to
524            int mSession;               // audio session the effect is on
525            effect_descriptor_t mDesc;  // effect descriptor
526            bool mEnabled;              // enabled state: CPU load being used or not
527        };
528
529        void addOutput(audio_io_handle_t output, sp<AudioOutputDescriptor> outputDesc);
530        void addInput(audio_io_handle_t input, sp<AudioInputDescriptor> inputDesc);
531
532        // return the strategy corresponding to a given stream type
533        static routing_strategy getStrategy(audio_stream_type_t stream);
534
535        // return appropriate device for streams handled by the specified strategy according to current
536        // phone state, connected devices...
537        // if fromCache is true, the device is returned from mDeviceForStrategy[],
538        // otherwise it is determine by current state
539        // (device connected,phone state, force use, a2dp output...)
540        // This allows to:
541        //  1 speed up process when the state is stable (when starting or stopping an output)
542        //  2 access to either current device selection (fromCache == true) or
543        // "future" device selection (fromCache == false) when called from a context
544        //  where conditions are changing (setDeviceConnectionState(), setPhoneState()...) AND
545        //  before updateDevicesAndOutputs() is called.
546        virtual audio_devices_t getDeviceForStrategy(routing_strategy strategy,
547                                                     bool fromCache);
548
549        // change the route of the specified output. Returns the number of ms we have slept to
550        // allow new routing to take effect in certain cases.
551        uint32_t setOutputDevice(audio_io_handle_t output,
552                             audio_devices_t device,
553                             bool force = false,
554                             int delayMs = 0,
555                             audio_patch_handle_t *patchHandle = NULL,
556                             const char* address = NULL);
557        status_t resetOutputDevice(audio_io_handle_t output,
558                                   int delayMs = 0,
559                                   audio_patch_handle_t *patchHandle = NULL);
560        status_t setInputDevice(audio_io_handle_t input,
561                                audio_devices_t device,
562                                bool force = false,
563                                audio_patch_handle_t *patchHandle = NULL);
564        status_t resetInputDevice(audio_io_handle_t input,
565                                  audio_patch_handle_t *patchHandle = NULL);
566
567        // select input device corresponding to requested audio source
568        virtual audio_devices_t getDeviceForInputSource(audio_source_t inputSource);
569
570        // return io handle of active input or 0 if no input is active
571        //    Only considers inputs from physical devices (e.g. main mic, headset mic) when
572        //    ignoreVirtualInputs is true.
573        audio_io_handle_t getActiveInput(bool ignoreVirtualInputs = true);
574
575        // initialize volume curves for each strategy and device category
576        void initializeVolumeCurves();
577
578        // compute the actual volume for a given stream according to the requested index and a particular
579        // device
580        virtual float computeVolume(audio_stream_type_t stream, int index,
581                                    audio_io_handle_t output, audio_devices_t device);
582
583        // check that volume change is permitted, compute and send new volume to audio hardware
584        status_t checkAndSetVolume(audio_stream_type_t stream, int index, audio_io_handle_t output,
585                                   audio_devices_t device, int delayMs = 0, bool force = false);
586
587        // apply all stream volumes to the specified output and device
588        void applyStreamVolumes(audio_io_handle_t output, audio_devices_t device, int delayMs = 0, bool force = false);
589
590        // Mute or unmute all streams handled by the specified strategy on the specified output
591        void setStrategyMute(routing_strategy strategy,
592                             bool on,
593                             audio_io_handle_t output,
594                             int delayMs = 0,
595                             audio_devices_t device = (audio_devices_t)0);
596
597        // Mute or unmute the stream on the specified output
598        void setStreamMute(audio_stream_type_t stream,
599                           bool on,
600                           audio_io_handle_t output,
601                           int delayMs = 0,
602                           audio_devices_t device = (audio_devices_t)0);
603
604        // handle special cases for sonification strategy while in call: mute streams or replace by
605        // a special tone in the device used for communication
606        void handleIncallSonification(audio_stream_type_t stream, bool starting, bool stateChange);
607
608        // true if device is in a telephony or VoIP call
609        virtual bool isInCall();
610
611        // true if given state represents a device in a telephony or VoIP call
612        virtual bool isStateInCall(int state);
613
614        // when a device is connected, checks if an open output can be routed
615        // to this device. If none is open, tries to open one of the available outputs.
616        // Returns an output suitable to this device or 0.
617        // when a device is disconnected, checks if an output is not used any more and
618        // returns its handle if any.
619        // transfers the audio tracks and effects from one output thread to another accordingly.
620        status_t checkOutputsForDevice(audio_devices_t device,
621                                       audio_policy_dev_state_t state,
622                                       SortedVector<audio_io_handle_t>& outputs,
623                                       const String8 address);
624
625        status_t checkInputsForDevice(audio_devices_t device,
626                                      audio_policy_dev_state_t state,
627                                      SortedVector<audio_io_handle_t>& inputs,
628                                      const String8 address);
629
630        // close an output and its companion duplicating output.
631        void closeOutput(audio_io_handle_t output);
632
633        // checks and if necessary changes outputs used for all strategies.
634        // must be called every time a condition that affects the output choice for a given strategy
635        // changes: connected device, phone state, force use...
636        // Must be called before updateDevicesAndOutputs()
637        void checkOutputForStrategy(routing_strategy strategy);
638
639        // Same as checkOutputForStrategy() but for a all strategies in order of priority
640        void checkOutputForAllStrategies();
641
642        // manages A2DP output suspend/restore according to phone state and BT SCO usage
643        void checkA2dpSuspend();
644
645        // returns the A2DP output handle if it is open or 0 otherwise
646        audio_io_handle_t getA2dpOutput();
647
648        // selects the most appropriate device on output for current state
649        // must be called every time a condition that affects the device choice for a given output is
650        // changed: connected device, phone state, force use, output start, output stop..
651        // see getDeviceForStrategy() for the use of fromCache parameter
652        audio_devices_t getNewOutputDevice(audio_io_handle_t output, bool fromCache);
653
654        // updates cache of device used by all strategies (mDeviceForStrategy[])
655        // must be called every time a condition that affects the device choice for a given strategy is
656        // changed: connected device, phone state, force use...
657        // cached values are used by getDeviceForStrategy() if parameter fromCache is true.
658         // Must be called after checkOutputForAllStrategies()
659        void updateDevicesAndOutputs();
660
661        // selects the most appropriate device on input for current state
662        audio_devices_t getNewInputDevice(audio_io_handle_t input);
663
664        virtual uint32_t getMaxEffectsCpuLoad();
665        virtual uint32_t getMaxEffectsMemory();
666#ifdef AUDIO_POLICY_TEST
667        virtual     bool        threadLoop();
668                    void        exit();
669        int testOutputIndex(audio_io_handle_t output);
670#endif //AUDIO_POLICY_TEST
671
672        status_t setEffectEnabled(const sp<EffectDescriptor>& effectDesc, bool enabled);
673
674        // returns the category the device belongs to with regard to volume curve management
675        static device_category getDeviceCategory(audio_devices_t device);
676
677        // extract one device relevant for volume control from multiple device selection
678        static audio_devices_t getDeviceForVolume(audio_devices_t device);
679
680        SortedVector<audio_io_handle_t> getOutputsForDevice(audio_devices_t device,
681                        DefaultKeyedVector<audio_io_handle_t, sp<AudioOutputDescriptor> > openOutputs);
682        bool vectorsEqual(SortedVector<audio_io_handle_t>& outputs1,
683                                           SortedVector<audio_io_handle_t>& outputs2);
684
685        // mute/unmute strategies using an incompatible device combination
686        // if muting, wait for the audio in pcm buffer to be drained before proceeding
687        // if unmuting, unmute only after the specified delay
688        // Returns the number of ms waited
689        uint32_t  checkDeviceMuteStrategies(sp<AudioOutputDescriptor> outputDesc,
690                                            audio_devices_t prevDevice,
691                                            uint32_t delayMs);
692
693        audio_io_handle_t selectOutput(const SortedVector<audio_io_handle_t>& outputs,
694                                       audio_output_flags_t flags);
695        // samplingRate parameter is an in/out and so may be modified
696        sp<IOProfile> getInputProfile(audio_devices_t device,
697                                   uint32_t& samplingRate,
698                                   audio_format_t format,
699                                   audio_channel_mask_t channelMask,
700                                   audio_input_flags_t flags);
701        sp<IOProfile> getProfileForDirectOutput(audio_devices_t device,
702                                                       uint32_t samplingRate,
703                                                       audio_format_t format,
704                                                       audio_channel_mask_t channelMask,
705                                                       audio_output_flags_t flags);
706
707        audio_io_handle_t selectOutputForEffects(const SortedVector<audio_io_handle_t>& outputs);
708
709        bool isNonOffloadableEffectEnabled();
710
711        status_t addAudioPatch(audio_patch_handle_t handle,
712                               const sp<AudioPatch>& patch);
713        status_t removeAudioPatch(audio_patch_handle_t handle);
714
715        sp<AudioOutputDescriptor> getOutputFromId(audio_port_handle_t id) const;
716        sp<AudioInputDescriptor> getInputFromId(audio_port_handle_t id) const;
717        sp<HwModule> getModuleForDevice(audio_devices_t device) const;
718        sp<HwModule> getModuleFromName(const char *name) const;
719        //
720        // Audio policy configuration file parsing (audio_policy.conf)
721        //
722        static uint32_t stringToEnum(const struct StringToEnum *table,
723                                     size_t size,
724                                     const char *name);
725        static const char *enumToString(const struct StringToEnum *table,
726                                      size_t size,
727                                      uint32_t value);
728        static bool stringToBool(const char *value);
729        static audio_output_flags_t parseFlagNames(char *name);
730        static audio_devices_t parseDeviceNames(char *name);
731        void loadHwModule(cnode *root);
732        void loadHwModules(cnode *root);
733        void loadGlobalConfig(cnode *root, const sp<HwModule>& module);
734        status_t loadAudioPolicyConfig(const char *path);
735        void defaultAudioPolicyConfig(void);
736
737
738        uid_t mUidCached;
739        AudioPolicyClientInterface *mpClientInterface;  // audio policy client interface
740        audio_io_handle_t mPrimaryOutput;              // primary output handle
741        // list of descriptors for outputs currently opened
742        DefaultKeyedVector<audio_io_handle_t, sp<AudioOutputDescriptor> > mOutputs;
743        // copy of mOutputs before setDeviceConnectionState() opens new outputs
744        // reset to mOutputs when updateDevicesAndOutputs() is called.
745        DefaultKeyedVector<audio_io_handle_t, sp<AudioOutputDescriptor> > mPreviousOutputs;
746        DefaultKeyedVector<audio_io_handle_t, sp<AudioInputDescriptor> > mInputs;     // list of input descriptors
747        DeviceVector  mAvailableOutputDevices; // all available output devices
748        DeviceVector  mAvailableInputDevices;  // all available input devices
749        int mPhoneState;                                                    // current phone state
750        audio_policy_forced_cfg_t mForceUse[AUDIO_POLICY_FORCE_USE_CNT];   // current forced use configuration
751
752        StreamDescriptor mStreams[AUDIO_STREAM_CNT];           // stream descriptors for volume control
753        bool    mLimitRingtoneVolume;                                       // limit ringtone volume to music volume if headset connected
754        audio_devices_t mDeviceForStrategy[NUM_STRATEGIES];
755        float   mLastVoiceVolume;                                           // last voice volume value sent to audio HAL
756
757        // Maximum CPU load allocated to audio effects in 0.1 MIPS (ARMv5TE, 0 WS memory) units
758        static const uint32_t MAX_EFFECTS_CPU_LOAD = 1000;
759        // Maximum memory allocated to audio effects in KB
760        static const uint32_t MAX_EFFECTS_MEMORY = 512;
761        uint32_t mTotalEffectsCpuLoad; // current CPU load used by effects
762        uint32_t mTotalEffectsMemory;  // current memory used by effects
763        KeyedVector<int, sp<EffectDescriptor> > mEffects;  // list of registered audio effects
764        bool    mA2dpSuspended;  // true if A2DP output is suspended
765        sp<DeviceDescriptor> mDefaultOutputDevice; // output device selected by default at boot time
766        bool mSpeakerDrcEnabled;// true on devices that use DRC on the DEVICE_CATEGORY_SPEAKER path
767                                // to boost soft sounds, used to adjust volume curves accordingly
768
769        Vector < sp<HwModule> > mHwModules;
770        volatile int32_t mNextUniqueId;
771        volatile int32_t mAudioPortGeneration;
772
773        DefaultKeyedVector<audio_patch_handle_t, sp<AudioPatch> > mAudioPatches;
774
775#ifdef AUDIO_POLICY_TEST
776        Mutex   mLock;
777        Condition mWaitWorkCV;
778
779        int             mCurOutput;
780        bool            mDirectOutput;
781        audio_io_handle_t mTestOutputs[NUM_TEST_OUTPUTS];
782        int             mTestInput;
783        uint32_t        mTestDevice;
784        uint32_t        mTestSamplingRate;
785        uint32_t        mTestFormat;
786        uint32_t        mTestChannels;
787        uint32_t        mTestLatencyMs;
788#endif //AUDIO_POLICY_TEST
789
790private:
791        static float volIndexToAmpl(audio_devices_t device, const StreamDescriptor& streamDesc,
792                int indexInUi);
793        // updates device caching and output for streams that can influence the
794        //    routing of notifications
795        void handleNotificationRoutingForStream(audio_stream_type_t stream);
796        static bool isVirtualInputDevice(audio_devices_t device);
797        static bool deviceDistinguishesOnAddress(audio_devices_t device);
798        // find the outputs on a given output descriptor that have the given address.
799        // to be called on an AudioOutputDescriptor whose supported devices (as defined
800        //   in mProfile->mSupportedDevices) matches the device whose address is to be matched.
801        // see deviceDistinguishesOnAddress(audio_devices_t) for whether the device type is one
802        //   where addresses are used to distinguish between one connected device and another.
803        void findIoHandlesByAddress(sp<AudioOutputDescriptor> desc /*in*/,
804                const String8 address /*in*/,
805                SortedVector<audio_io_handle_t>& outputs /*out*/);
806        uint32_t nextUniqueId();
807        uint32_t nextAudioPortGeneration();
808        uint32_t curAudioPortGeneration() const { return mAudioPortGeneration; }
809        // internal method to return the output handle for the given device and format
810        audio_io_handle_t getOutputForDevice(
811                audio_devices_t device,
812                audio_stream_type_t stream,
813                uint32_t samplingRate,
814                audio_format_t format,
815                audio_channel_mask_t channelMask,
816                audio_output_flags_t flags,
817                const audio_offload_info_t *offloadInfo);
818        // internal function to derive a stream type value from audio attributes
819        audio_stream_type_t streamTypefromAttributesInt(const audio_attributes_t *attr);
820};
821
822};
823