Home | History | Annotate | Download | only in managerdefault
      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 #pragma once
     18 
     19 #include <stdint.h>
     20 #include <sys/types.h>
     21 #include <cutils/config_utils.h>
     22 #include <cutils/misc.h>
     23 #include <utils/Timers.h>
     24 #include <utils/Errors.h>
     25 #include <utils/KeyedVector.h>
     26 #include <utils/SortedVector.h>
     27 #include <media/AudioPolicy.h>
     28 #include "AudioPolicyInterface.h"
     29 
     30 #include <AudioPolicyManagerInterface.h>
     31 #include <AudioPolicyManagerObserver.h>
     32 #include <AudioGain.h>
     33 #include <AudioPort.h>
     34 #include <AudioPatch.h>
     35 #include <ConfigParsingUtils.h>
     36 #include <DeviceDescriptor.h>
     37 #include <IOProfile.h>
     38 #include <HwModule.h>
     39 #include <AudioInputDescriptor.h>
     40 #include <AudioOutputDescriptor.h>
     41 #include <AudioPolicyMix.h>
     42 #include <EffectDescriptor.h>
     43 #include <SoundTriggerSession.h>
     44 #include <StreamDescriptor.h>
     45 #include <SessionRoute.h>
     46 
     47 namespace android {
     48 
     49 // ----------------------------------------------------------------------------
     50 
     51 // Attenuation applied to STRATEGY_SONIFICATION streams when a headset is connected: 6dB
     52 #define SONIFICATION_HEADSET_VOLUME_FACTOR 0.5
     53 #define SONIFICATION_HEADSET_VOLUME_FACTOR_DB (-6)
     54 // Min volume for STRATEGY_SONIFICATION streams when limited by music volume: -36dB
     55 #define SONIFICATION_HEADSET_VOLUME_MIN  0.016
     56 #define SONIFICATION_HEADSET_VOLUME_MIN_DB  (-36)
     57 
     58 // Time in milliseconds during which we consider that music is still active after a music
     59 // track was stopped - see computeVolume()
     60 #define SONIFICATION_HEADSET_MUSIC_DELAY  5000
     61 
     62 // Time in milliseconds during witch some streams are muted while the audio path
     63 // is switched
     64 #define MUTE_TIME_MS 2000
     65 
     66 #define NUM_TEST_OUTPUTS 5
     67 
     68 #define NUM_VOL_CURVE_KNEES 2
     69 
     70 // Default minimum length allowed for offloading a compressed track
     71 // Can be overridden by the audio.offload.min.duration.secs property
     72 #define OFFLOAD_DEFAULT_MIN_DURATION_SECS 60
     73 
     74 // ----------------------------------------------------------------------------
     75 // AudioPolicyManager implements audio policy manager behavior common to all platforms.
     76 // ----------------------------------------------------------------------------
     77 
     78 class AudioPolicyManager : public AudioPolicyInterface, public AudioPolicyManagerObserver
     79 
     80 #ifdef AUDIO_POLICY_TEST
     81     , public Thread
     82 #endif //AUDIO_POLICY_TEST
     83 {
     84 
     85 public:
     86                 AudioPolicyManager(AudioPolicyClientInterface *clientInterface);
     87         virtual ~AudioPolicyManager();
     88 
     89         // AudioPolicyInterface
     90         virtual status_t setDeviceConnectionState(audio_devices_t device,
     91                                                           audio_policy_dev_state_t state,
     92                                                           const char *device_address,
     93                                                           const char *device_name);
     94         virtual audio_policy_dev_state_t getDeviceConnectionState(audio_devices_t device,
     95                                                                               const char *device_address);
     96         virtual void setPhoneState(audio_mode_t state);
     97         virtual void setForceUse(audio_policy_force_use_t usage,
     98                                  audio_policy_forced_cfg_t config);
     99         virtual audio_policy_forced_cfg_t getForceUse(audio_policy_force_use_t usage);
    100 
    101         virtual void setSystemProperty(const char* property, const char* value);
    102         virtual status_t initCheck();
    103         virtual audio_io_handle_t getOutput(audio_stream_type_t stream,
    104                                             uint32_t samplingRate,
    105                                             audio_format_t format,
    106                                             audio_channel_mask_t channelMask,
    107                                             audio_output_flags_t flags,
    108                                             const audio_offload_info_t *offloadInfo);
    109         virtual status_t getOutputForAttr(const audio_attributes_t *attr,
    110                                           audio_io_handle_t *output,
    111                                           audio_session_t session,
    112                                           audio_stream_type_t *stream,
    113                                           uid_t uid,
    114                                           uint32_t samplingRate,
    115                                           audio_format_t format,
    116                                           audio_channel_mask_t channelMask,
    117                                           audio_output_flags_t flags,
    118                                           audio_port_handle_t selectedDeviceId,
    119                                           const audio_offload_info_t *offloadInfo);
    120         virtual status_t startOutput(audio_io_handle_t output,
    121                                      audio_stream_type_t stream,
    122                                      audio_session_t session);
    123         virtual status_t stopOutput(audio_io_handle_t output,
    124                                     audio_stream_type_t stream,
    125                                     audio_session_t session);
    126         virtual void releaseOutput(audio_io_handle_t output,
    127                                    audio_stream_type_t stream,
    128                                    audio_session_t session);
    129         virtual status_t getInputForAttr(const audio_attributes_t *attr,
    130                                          audio_io_handle_t *input,
    131                                          audio_session_t session,
    132                                          uid_t uid,
    133                                          uint32_t samplingRate,
    134                                          audio_format_t format,
    135                                          audio_channel_mask_t channelMask,
    136                                          audio_input_flags_t flags,
    137                                          audio_port_handle_t selectedDeviceId,
    138                                          input_type_t *inputType);
    139 
    140         // indicates to the audio policy manager that the input starts being used.
    141         virtual status_t startInput(audio_io_handle_t input,
    142                                     audio_session_t session);
    143 
    144         // indicates to the audio policy manager that the input stops being used.
    145         virtual status_t stopInput(audio_io_handle_t input,
    146                                    audio_session_t session);
    147         virtual void releaseInput(audio_io_handle_t input,
    148                                   audio_session_t session);
    149         virtual void closeAllInputs();
    150         virtual void initStreamVolume(audio_stream_type_t stream,
    151                                                     int indexMin,
    152                                                     int indexMax);
    153         virtual status_t setStreamVolumeIndex(audio_stream_type_t stream,
    154                                               int index,
    155                                               audio_devices_t device);
    156         virtual status_t getStreamVolumeIndex(audio_stream_type_t stream,
    157                                               int *index,
    158                                               audio_devices_t device);
    159 
    160         // return the strategy corresponding to a given stream type
    161         virtual uint32_t getStrategyForStream(audio_stream_type_t stream);
    162         // return the strategy corresponding to the given audio attributes
    163         virtual uint32_t getStrategyForAttr(const audio_attributes_t *attr);
    164 
    165         // return the enabled output devices for the given stream type
    166         virtual audio_devices_t getDevicesForStream(audio_stream_type_t stream);
    167 
    168         virtual audio_io_handle_t getOutputForEffect(const effect_descriptor_t *desc = NULL);
    169         virtual status_t registerEffect(const effect_descriptor_t *desc,
    170                                         audio_io_handle_t io,
    171                                         uint32_t strategy,
    172                                         int session,
    173                                         int id);
    174         virtual status_t unregisterEffect(int id)
    175         {
    176             return mEffects.unregisterEffect(id);
    177         }
    178         virtual status_t setEffectEnabled(int id, bool enabled)
    179         {
    180             return mEffects.setEffectEnabled(id, enabled);
    181         }
    182 
    183         virtual bool isStreamActive(audio_stream_type_t stream, uint32_t inPastMs = 0) const;
    184         // return whether a stream is playing remotely, override to change the definition of
    185         //   local/remote playback, used for instance by notification manager to not make
    186         //   media players lose audio focus when not playing locally
    187         //   For the base implementation, "remotely" means playing during screen mirroring which
    188         //   uses an output for playback with a non-empty, non "0" address.
    189         virtual bool isStreamActiveRemotely(audio_stream_type_t stream,
    190                                             uint32_t inPastMs = 0) const;
    191 
    192         virtual bool isSourceActive(audio_source_t source) const;
    193 
    194         virtual status_t dump(int fd);
    195 
    196         virtual bool isOffloadSupported(const audio_offload_info_t& offloadInfo);
    197 
    198         virtual status_t listAudioPorts(audio_port_role_t role,
    199                                         audio_port_type_t type,
    200                                         unsigned int *num_ports,
    201                                         struct audio_port *ports,
    202                                         unsigned int *generation);
    203         virtual status_t getAudioPort(struct audio_port *port);
    204         virtual status_t createAudioPatch(const struct audio_patch *patch,
    205                                            audio_patch_handle_t *handle,
    206                                            uid_t uid);
    207         virtual status_t releaseAudioPatch(audio_patch_handle_t handle,
    208                                               uid_t uid);
    209         virtual status_t listAudioPatches(unsigned int *num_patches,
    210                                           struct audio_patch *patches,
    211                                           unsigned int *generation);
    212         virtual status_t setAudioPortConfig(const struct audio_port_config *config);
    213 
    214         virtual status_t acquireSoundTriggerSession(audio_session_t *session,
    215                                                audio_io_handle_t *ioHandle,
    216                                                audio_devices_t *device);
    217 
    218         virtual status_t releaseSoundTriggerSession(audio_session_t session)
    219         {
    220             return mSoundTriggerSessions.releaseSession(session);
    221         }
    222 
    223         virtual status_t registerPolicyMixes(Vector<AudioMix> mixes);
    224         virtual status_t unregisterPolicyMixes(Vector<AudioMix> mixes);
    225 
    226         virtual status_t startAudioSource(const struct audio_port_config *source,
    227                                           const audio_attributes_t *attributes,
    228                                           audio_io_handle_t *handle);
    229         virtual status_t stopAudioSource(audio_io_handle_t handle);
    230 
    231         virtual void     releaseResourcesForUid(uid_t uid);
    232 
    233         // Audio policy configuration file parsing (audio_policy.conf)
    234         // TODO candidates to be moved to ConfigParsingUtils
    235                 void defaultAudioPolicyConfig(void);
    236 
    237         // return the strategy corresponding to a given stream type
    238         routing_strategy getStrategy(audio_stream_type_t stream) const;
    239 
    240 protected:
    241         // From AudioPolicyManagerObserver
    242         virtual const AudioPatchCollection &getAudioPatches() const
    243         {
    244             return mAudioPatches;
    245         }
    246         virtual const SoundTriggerSessionCollection &getSoundTriggerSessionCollection() const
    247         {
    248             return mSoundTriggerSessions;
    249         }
    250         virtual const AudioPolicyMixCollection &getAudioPolicyMixCollection() const
    251         {
    252             return mPolicyMixes;
    253         }
    254         virtual const SwAudioOutputCollection &getOutputs() const
    255         {
    256             return mOutputs;
    257         }
    258         virtual const AudioInputCollection &getInputs() const
    259         {
    260             return mInputs;
    261         }
    262         virtual const DeviceVector &getAvailableOutputDevices() const
    263         {
    264             return mAvailableOutputDevices;
    265         }
    266         virtual const DeviceVector &getAvailableInputDevices() const
    267         {
    268             return mAvailableInputDevices;
    269         }
    270         virtual StreamDescriptorCollection &getStreamDescriptors()
    271         {
    272             return mStreams;
    273         }
    274         virtual const sp<DeviceDescriptor> &getDefaultOutputDevice() const
    275         {
    276             return mDefaultOutputDevice;
    277         }
    278 protected:
    279         void addOutput(audio_io_handle_t output, sp<SwAudioOutputDescriptor> outputDesc);
    280         void removeOutput(audio_io_handle_t output);
    281         void addInput(audio_io_handle_t input, sp<AudioInputDescriptor> inputDesc);
    282 
    283         // return appropriate device for streams handled by the specified strategy according to current
    284         // phone state, connected devices...
    285         // if fromCache is true, the device is returned from mDeviceForStrategy[],
    286         // otherwise it is determine by current state
    287         // (device connected,phone state, force use, a2dp output...)
    288         // This allows to:
    289         //  1 speed up process when the state is stable (when starting or stopping an output)
    290         //  2 access to either current device selection (fromCache == true) or
    291         // "future" device selection (fromCache == false) when called from a context
    292         //  where conditions are changing (setDeviceConnectionState(), setPhoneState()...) AND
    293         //  before updateDevicesAndOutputs() is called.
    294         virtual audio_devices_t getDeviceForStrategy(routing_strategy strategy,
    295                                                      bool fromCache);
    296 
    297         bool isStrategyActive(const sp<AudioOutputDescriptor> outputDesc, routing_strategy strategy,
    298                               uint32_t inPastMs = 0, nsecs_t sysTime = 0) const;
    299 
    300         // change the route of the specified output. Returns the number of ms we have slept to
    301         // allow new routing to take effect in certain cases.
    302         virtual uint32_t setOutputDevice(const sp<AudioOutputDescriptor>& outputDesc,
    303                              audio_devices_t device,
    304                              bool force = false,
    305                              int delayMs = 0,
    306                              audio_patch_handle_t *patchHandle = NULL,
    307                              const char* address = NULL);
    308         status_t resetOutputDevice(const sp<AudioOutputDescriptor>& outputDesc,
    309                                    int delayMs = 0,
    310                                    audio_patch_handle_t *patchHandle = NULL);
    311         status_t setInputDevice(audio_io_handle_t input,
    312                                 audio_devices_t device,
    313                                 bool force = false,
    314                                 audio_patch_handle_t *patchHandle = NULL);
    315         status_t resetInputDevice(audio_io_handle_t input,
    316                                   audio_patch_handle_t *patchHandle = NULL);
    317 
    318         // select input device corresponding to requested audio source
    319         virtual audio_devices_t getDeviceForInputSource(audio_source_t inputSource);
    320 
    321         // compute the actual volume for a given stream according to the requested index and a particular
    322         // device
    323         virtual float computeVolume(audio_stream_type_t stream,
    324                                     int index,
    325                                     audio_devices_t device);
    326 
    327         // check that volume change is permitted, compute and send new volume to audio hardware
    328         virtual status_t checkAndSetVolume(audio_stream_type_t stream, int index,
    329                                            const sp<AudioOutputDescriptor>& outputDesc,
    330                                            audio_devices_t device,
    331                                            int delayMs = 0, bool force = false);
    332 
    333         // apply all stream volumes to the specified output and device
    334         void applyStreamVolumes(const sp<AudioOutputDescriptor>& outputDesc,
    335                                 audio_devices_t device, int delayMs = 0, bool force = false);
    336 
    337         // Mute or unmute all streams handled by the specified strategy on the specified output
    338         void setStrategyMute(routing_strategy strategy,
    339                              bool on,
    340                              const sp<AudioOutputDescriptor>& outputDesc,
    341                              int delayMs = 0,
    342                              audio_devices_t device = (audio_devices_t)0);
    343 
    344         // Mute or unmute the stream on the specified output
    345         void setStreamMute(audio_stream_type_t stream,
    346                            bool on,
    347                            const sp<AudioOutputDescriptor>& outputDesc,
    348                            int delayMs = 0,
    349                            audio_devices_t device = (audio_devices_t)0);
    350 
    351         // handle special cases for sonification strategy while in call: mute streams or replace by
    352         // a special tone in the device used for communication
    353         void handleIncallSonification(audio_stream_type_t stream, bool starting, bool stateChange);
    354 
    355         audio_mode_t getPhoneState();
    356 
    357         // true if device is in a telephony or VoIP call
    358         virtual bool isInCall();
    359         // true if given state represents a device in a telephony or VoIP call
    360         virtual bool isStateInCall(int state);
    361 
    362         // when a device is connected, checks if an open output can be routed
    363         // to this device. If none is open, tries to open one of the available outputs.
    364         // Returns an output suitable to this device or 0.
    365         // when a device is disconnected, checks if an output is not used any more and
    366         // returns its handle if any.
    367         // transfers the audio tracks and effects from one output thread to another accordingly.
    368         status_t checkOutputsForDevice(const sp<DeviceDescriptor> devDesc,
    369                                        audio_policy_dev_state_t state,
    370                                        SortedVector<audio_io_handle_t>& outputs,
    371                                        const String8 address);
    372 
    373         status_t checkInputsForDevice(const sp<DeviceDescriptor> devDesc,
    374                                       audio_policy_dev_state_t state,
    375                                       SortedVector<audio_io_handle_t>& inputs,
    376                                       const String8 address);
    377 
    378         // close an output and its companion duplicating output.
    379         void closeOutput(audio_io_handle_t output);
    380 
    381         // close an input.
    382         void closeInput(audio_io_handle_t input);
    383 
    384         // checks and if necessary changes outputs used for all strategies.
    385         // must be called every time a condition that affects the output choice for a given strategy
    386         // changes: connected device, phone state, force use...
    387         // Must be called before updateDevicesAndOutputs()
    388         void checkOutputForStrategy(routing_strategy strategy);
    389 
    390         // Same as checkOutputForStrategy() but for a all strategies in order of priority
    391         void checkOutputForAllStrategies();
    392 
    393         // manages A2DP output suspend/restore according to phone state and BT SCO usage
    394         void checkA2dpSuspend();
    395 
    396         // selects the most appropriate device on output for current state
    397         // must be called every time a condition that affects the device choice for a given output is
    398         // changed: connected device, phone state, force use, output start, output stop..
    399         // see getDeviceForStrategy() for the use of fromCache parameter
    400         audio_devices_t getNewOutputDevice(const sp<AudioOutputDescriptor>& outputDesc,
    401                                            bool fromCache);
    402 
    403         // updates cache of device used by all strategies (mDeviceForStrategy[])
    404         // must be called every time a condition that affects the device choice for a given strategy is
    405         // changed: connected device, phone state, force use...
    406         // cached values are used by getDeviceForStrategy() if parameter fromCache is true.
    407          // Must be called after checkOutputForAllStrategies()
    408         void updateDevicesAndOutputs();
    409 
    410         // selects the most appropriate device on input for current state
    411         audio_devices_t getNewInputDevice(audio_io_handle_t input);
    412 
    413         virtual uint32_t getMaxEffectsCpuLoad()
    414         {
    415             return mEffects.getMaxEffectsCpuLoad();
    416         }
    417 
    418         virtual uint32_t getMaxEffectsMemory()
    419         {
    420             return mEffects.getMaxEffectsMemory();
    421         }
    422 #ifdef AUDIO_POLICY_TEST
    423         virtual     bool        threadLoop();
    424                     void        exit();
    425         int testOutputIndex(audio_io_handle_t output);
    426 #endif //AUDIO_POLICY_TEST
    427 
    428         SortedVector<audio_io_handle_t> getOutputsForDevice(audio_devices_t device,
    429                                                             SwAudioOutputCollection openOutputs);
    430         bool vectorsEqual(SortedVector<audio_io_handle_t>& outputs1,
    431                                            SortedVector<audio_io_handle_t>& outputs2);
    432 
    433         // mute/unmute strategies using an incompatible device combination
    434         // if muting, wait for the audio in pcm buffer to be drained before proceeding
    435         // if unmuting, unmute only after the specified delay
    436         // Returns the number of ms waited
    437         virtual uint32_t  checkDeviceMuteStrategies(sp<AudioOutputDescriptor> outputDesc,
    438                                             audio_devices_t prevDevice,
    439                                             uint32_t delayMs);
    440 
    441         audio_io_handle_t selectOutput(const SortedVector<audio_io_handle_t>& outputs,
    442                                        audio_output_flags_t flags,
    443                                        audio_format_t format);
    444         // samplingRate, format, channelMask are in/out and so may be modified
    445         sp<IOProfile> getInputProfile(audio_devices_t device,
    446                                       String8 address,
    447                                       uint32_t& samplingRate,
    448                                       audio_format_t& format,
    449                                       audio_channel_mask_t& channelMask,
    450                                       audio_input_flags_t flags);
    451         sp<IOProfile> getProfileForDirectOutput(audio_devices_t device,
    452                                                        uint32_t samplingRate,
    453                                                        audio_format_t format,
    454                                                        audio_channel_mask_t channelMask,
    455                                                        audio_output_flags_t flags);
    456 
    457         audio_io_handle_t selectOutputForEffects(const SortedVector<audio_io_handle_t>& outputs);
    458 
    459         virtual status_t addAudioPatch(audio_patch_handle_t handle, const sp<AudioPatch>& patch)
    460         {
    461             return mAudioPatches.addAudioPatch(handle, patch);
    462         }
    463         virtual status_t removeAudioPatch(audio_patch_handle_t handle)
    464         {
    465             return mAudioPatches.removeAudioPatch(handle);
    466         }
    467 
    468         audio_devices_t availablePrimaryOutputDevices() const
    469         {
    470             if (!hasPrimaryOutput()) {
    471                 return AUDIO_DEVICE_NONE;
    472             }
    473             return mPrimaryOutput->supportedDevices() & mAvailableOutputDevices.types();
    474         }
    475         audio_devices_t availablePrimaryInputDevices() const
    476         {
    477             if (!hasPrimaryOutput()) {
    478                 return AUDIO_DEVICE_NONE;
    479             }
    480             return mAvailableInputDevices.getDevicesFromHwModule(mPrimaryOutput->getModuleHandle());
    481         }
    482 
    483         void updateCallRouting(audio_devices_t rxDevice, int delayMs = 0);
    484 
    485         // if argument "device" is different from AUDIO_DEVICE_NONE,  startSource() will force
    486         // the re-evaluation of the output device.
    487         status_t startSource(sp<AudioOutputDescriptor> outputDesc,
    488                              audio_stream_type_t stream,
    489                              audio_devices_t device,
    490                              uint32_t *delayMs);
    491         status_t stopSource(sp<AudioOutputDescriptor> outputDesc,
    492                             audio_stream_type_t stream,
    493                             bool forceDeviceUpdate);
    494 
    495         void clearAudioPatches(uid_t uid);
    496         void clearSessionRoutes(uid_t uid);
    497         void checkStrategyRoute(routing_strategy strategy, audio_io_handle_t ouptutToSkip);
    498 
    499         status_t hasPrimaryOutput() const { return mPrimaryOutput != 0; }
    500 
    501         uid_t mUidCached;
    502         AudioPolicyClientInterface *mpClientInterface;  // audio policy client interface
    503         sp<SwAudioOutputDescriptor> mPrimaryOutput;     // primary output descriptor
    504         // list of descriptors for outputs currently opened
    505 
    506         SwAudioOutputCollection mOutputs;
    507         // copy of mOutputs before setDeviceConnectionState() opens new outputs
    508         // reset to mOutputs when updateDevicesAndOutputs() is called.
    509         SwAudioOutputCollection mPreviousOutputs;
    510         AudioInputCollection mInputs;     // list of input descriptors
    511 
    512         DeviceVector  mAvailableOutputDevices; // all available output devices
    513         DeviceVector  mAvailableInputDevices;  // all available input devices
    514 
    515         SessionRouteMap mOutputRoutes = SessionRouteMap(SessionRouteMap::MAPTYPE_OUTPUT);
    516         SessionRouteMap mInputRoutes = SessionRouteMap(SessionRouteMap::MAPTYPE_INPUT);
    517 
    518         StreamDescriptorCollection mStreams; // stream descriptors for volume control
    519         bool    mLimitRingtoneVolume;        // limit ringtone volume to music volume if headset connected
    520         audio_devices_t mDeviceForStrategy[NUM_STRATEGIES];
    521         float   mLastVoiceVolume;            // last voice volume value sent to audio HAL
    522 
    523         EffectDescriptorCollection mEffects;  // list of registered audio effects
    524         bool    mA2dpSuspended;  // true if A2DP output is suspended
    525         sp<DeviceDescriptor> mDefaultOutputDevice; // output device selected by default at boot time
    526         bool mSpeakerDrcEnabled;// true on devices that use DRC on the DEVICE_CATEGORY_SPEAKER path
    527                                 // to boost soft sounds, used to adjust volume curves accordingly
    528 
    529         HwModuleCollection mHwModules;
    530 
    531         volatile int32_t mAudioPortGeneration;
    532 
    533         AudioPatchCollection mAudioPatches;
    534 
    535         SoundTriggerSessionCollection mSoundTriggerSessions;
    536 
    537         sp<AudioPatch> mCallTxPatch;
    538         sp<AudioPatch> mCallRxPatch;
    539 
    540         // for supporting "beacon" streams, i.e. streams that only play on speaker, and never
    541         // when something other than STREAM_TTS (a.k.a. "Transmitted Through Speaker") is playing
    542         enum {
    543             STARTING_OUTPUT,
    544             STARTING_BEACON,
    545             STOPPING_OUTPUT,
    546             STOPPING_BEACON
    547         };
    548         uint32_t mBeaconMuteRefCount;   // ref count for stream that would mute beacon
    549         uint32_t mBeaconPlayingRefCount;// ref count for the playing beacon streams
    550         bool mBeaconMuted;              // has STREAM_TTS been muted
    551 
    552         AudioPolicyMixCollection mPolicyMixes; // list of registered mixes
    553 
    554 #ifdef AUDIO_POLICY_TEST
    555         Mutex   mLock;
    556         Condition mWaitWorkCV;
    557 
    558         int             mCurOutput;
    559         bool            mDirectOutput;
    560         audio_io_handle_t mTestOutputs[NUM_TEST_OUTPUTS];
    561         int             mTestInput;
    562         uint32_t        mTestDevice;
    563         uint32_t        mTestSamplingRate;
    564         uint32_t        mTestFormat;
    565         uint32_t        mTestChannels;
    566         uint32_t        mTestLatencyMs;
    567 #endif //AUDIO_POLICY_TEST
    568 
    569         uint32_t nextAudioPortGeneration();
    570 
    571         // Audio Policy Engine Interface.
    572         AudioPolicyManagerInterface *mEngine;
    573 private:
    574         // updates device caching and output for streams that can influence the
    575         //    routing of notifications
    576         void handleNotificationRoutingForStream(audio_stream_type_t stream);
    577         // find the outputs on a given output descriptor that have the given address.
    578         // to be called on an AudioOutputDescriptor whose supported devices (as defined
    579         //   in mProfile->mSupportedDevices) matches the device whose address is to be matched.
    580         // see deviceDistinguishesOnAddress(audio_devices_t) for whether the device type is one
    581         //   where addresses are used to distinguish between one connected device and another.
    582         void findIoHandlesByAddress(sp<SwAudioOutputDescriptor> desc /*in*/,
    583                 const audio_devices_t device /*in*/,
    584                 const String8 address /*in*/,
    585                 SortedVector<audio_io_handle_t>& outputs /*out*/);
    586         uint32_t curAudioPortGeneration() const { return mAudioPortGeneration; }
    587         // internal method to return the output handle for the given device and format
    588         audio_io_handle_t getOutputForDevice(
    589                 audio_devices_t device,
    590                 audio_session_t session,
    591                 audio_stream_type_t stream,
    592                 uint32_t samplingRate,
    593                 audio_format_t format,
    594                 audio_channel_mask_t channelMask,
    595                 audio_output_flags_t flags,
    596                 const audio_offload_info_t *offloadInfo);
    597         // internal function to derive a stream type value from audio attributes
    598         audio_stream_type_t streamTypefromAttributesInt(const audio_attributes_t *attr);
    599         // event is one of STARTING_OUTPUT, STARTING_BEACON, STOPPING_OUTPUT, STOPPING_BEACON
    600         // returns 0 if no mute/unmute event happened, the largest latency of the device where
    601         //   the mute/unmute happened
    602         uint32_t handleEventForBeacon(int event);
    603         uint32_t setBeaconMute(bool mute);
    604         bool     isValidAttributes(const audio_attributes_t *paa);
    605 
    606         // select input device corresponding to requested audio source and return associated policy
    607         // mix if any. Calls getDeviceForInputSource().
    608         audio_devices_t getDeviceAndMixForInputSource(audio_source_t inputSource,
    609                                                         AudioMix **policyMix = NULL);
    610 
    611         // Called by setDeviceConnectionState().
    612         status_t setDeviceConnectionStateInt(audio_devices_t device,
    613                                                           audio_policy_dev_state_t state,
    614                                                           const char *device_address,
    615                                                           const char *device_name);
    616 };
    617 
    618 };
    619