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