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