Home | History | Annotate | Download | only in audiopolicy
      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);
    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);
    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();
    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:
    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 
    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;
    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:
    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 
    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 
    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;
    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;
    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();
    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