AudioPolicyManager.cpp revision ff155c642fe7d342a3110444c6103f788230af53
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#define LOG_TAG "APM::AudioPolicyManager"
18//#define LOG_NDEBUG 0
19
20//#define VERY_VERBOSE_LOGGING
21#ifdef VERY_VERBOSE_LOGGING
22#define ALOGVV ALOGV
23#else
24#define ALOGVV(a...) do { } while(0)
25#endif
26
27#define AUDIO_POLICY_XML_CONFIG_FILE "/system/etc/audio_policy_configuration.xml"
28
29#include <inttypes.h>
30#include <math.h>
31
32#include <AudioPolicyManagerInterface.h>
33#include <AudioPolicyEngineInstance.h>
34#include <cutils/properties.h>
35#include <utils/Log.h>
36#include <hardware/audio.h>
37#include <hardware/audio_effect.h>
38#include <media/AudioParameter.h>
39#include <media/AudioPolicyHelper.h>
40#include <soundtrigger/SoundTrigger.h>
41#include "AudioPolicyManager.h"
42#ifndef USE_XML_AUDIO_POLICY_CONF
43#include <ConfigParsingUtils.h>
44#include <StreamDescriptor.h>
45#endif
46#include <Serializer.h>
47#include "TypeConverter.h"
48#include <policy.h>
49
50namespace android {
51
52// ----------------------------------------------------------------------------
53// AudioPolicyInterface implementation
54// ----------------------------------------------------------------------------
55
56status_t AudioPolicyManager::setDeviceConnectionState(audio_devices_t device,
57                                                      audio_policy_dev_state_t state,
58                                                      const char *device_address,
59                                                      const char *device_name)
60{
61    return setDeviceConnectionStateInt(device, state, device_address, device_name);
62}
63
64status_t AudioPolicyManager::setDeviceConnectionStateInt(audio_devices_t device,
65                                                         audio_policy_dev_state_t state,
66                                                         const char *device_address,
67                                                         const char *device_name)
68{
69    ALOGV("setDeviceConnectionStateInt() device: 0x%X, state %d, address %s name %s",
70-            device, state, device_address, device_name);
71
72    // connect/disconnect only 1 device at a time
73    if (!audio_is_output_device(device) && !audio_is_input_device(device)) return BAD_VALUE;
74
75    sp<DeviceDescriptor> devDesc =
76            mHwModules.getDeviceDescriptor(device, device_address, device_name);
77
78    // handle output devices
79    if (audio_is_output_device(device)) {
80        SortedVector <audio_io_handle_t> outputs;
81
82        ssize_t index = mAvailableOutputDevices.indexOf(devDesc);
83
84        // save a copy of the opened output descriptors before any output is opened or closed
85        // by checkOutputsForDevice(). This will be needed by checkOutputForAllStrategies()
86        mPreviousOutputs = mOutputs;
87        switch (state)
88        {
89        // handle output device connection
90        case AUDIO_POLICY_DEVICE_STATE_AVAILABLE: {
91            if (index >= 0) {
92                ALOGW("setDeviceConnectionState() device already connected: %x", device);
93                return INVALID_OPERATION;
94            }
95            ALOGV("setDeviceConnectionState() connecting device %x", device);
96
97            // register new device as available
98            index = mAvailableOutputDevices.add(devDesc);
99            if (index >= 0) {
100                sp<HwModule> module = mHwModules.getModuleForDevice(device);
101                if (module == 0) {
102                    ALOGD("setDeviceConnectionState() could not find HW module for device %08x",
103                          device);
104                    mAvailableOutputDevices.remove(devDesc);
105                    return INVALID_OPERATION;
106                }
107                mAvailableOutputDevices[index]->attach(module);
108            } else {
109                return NO_MEMORY;
110            }
111
112            if (checkOutputsForDevice(devDesc, state, outputs, devDesc->mAddress) != NO_ERROR) {
113                mAvailableOutputDevices.remove(devDesc);
114                return INVALID_OPERATION;
115            }
116            // Propagate device availability to Engine
117            mEngine->setDeviceConnectionState(devDesc, state);
118
119            // outputs should never be empty here
120            ALOG_ASSERT(outputs.size() != 0, "setDeviceConnectionState():"
121                    "checkOutputsForDevice() returned no outputs but status OK");
122            ALOGV("setDeviceConnectionState() checkOutputsForDevice() returned %zu outputs",
123                  outputs.size());
124
125            // Send connect to HALs
126            AudioParameter param = AudioParameter(devDesc->mAddress);
127            param.addInt(String8(AUDIO_PARAMETER_DEVICE_CONNECT), device);
128            mpClientInterface->setParameters(AUDIO_IO_HANDLE_NONE, param.toString());
129
130            } break;
131        // handle output device disconnection
132        case AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE: {
133            if (index < 0) {
134                ALOGW("setDeviceConnectionState() device not connected: %x", device);
135                return INVALID_OPERATION;
136            }
137
138            ALOGV("setDeviceConnectionState() disconnecting output device %x", device);
139
140            // Send Disconnect to HALs
141            AudioParameter param = AudioParameter(devDesc->mAddress);
142            param.addInt(String8(AUDIO_PARAMETER_DEVICE_DISCONNECT), device);
143            mpClientInterface->setParameters(AUDIO_IO_HANDLE_NONE, param.toString());
144
145            // remove device from available output devices
146            mAvailableOutputDevices.remove(devDesc);
147
148            checkOutputsForDevice(devDesc, state, outputs, devDesc->mAddress);
149
150            // Propagate device availability to Engine
151            mEngine->setDeviceConnectionState(devDesc, state);
152            } break;
153
154        default:
155            ALOGE("setDeviceConnectionState() invalid state: %x", state);
156            return BAD_VALUE;
157        }
158
159        // checkA2dpSuspend must run before checkOutputForAllStrategies so that A2DP
160        // output is suspended before any tracks are moved to it
161        checkA2dpSuspend();
162        checkOutputForAllStrategies();
163        // outputs must be closed after checkOutputForAllStrategies() is executed
164        if (!outputs.isEmpty()) {
165            for (size_t i = 0; i < outputs.size(); i++) {
166                sp<SwAudioOutputDescriptor> desc = mOutputs.valueFor(outputs[i]);
167                // close unused outputs after device disconnection or direct outputs that have been
168                // opened by checkOutputsForDevice() to query dynamic parameters
169                if ((state == AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE) ||
170                        (((desc->mFlags & AUDIO_OUTPUT_FLAG_DIRECT) != 0) &&
171                         (desc->mDirectOpenCount == 0))) {
172                    closeOutput(outputs[i]);
173                }
174            }
175            // check again after closing A2DP output to reset mA2dpSuspended if needed
176            checkA2dpSuspend();
177        }
178
179        updateDevicesAndOutputs();
180        if (mEngine->getPhoneState() == AUDIO_MODE_IN_CALL && hasPrimaryOutput()) {
181            audio_devices_t newDevice = getNewOutputDevice(mPrimaryOutput, false /*fromCache*/);
182            updateCallRouting(newDevice);
183        }
184        for (size_t i = 0; i < mOutputs.size(); i++) {
185            sp<SwAudioOutputDescriptor> desc = mOutputs.valueAt(i);
186            if ((mEngine->getPhoneState() != AUDIO_MODE_IN_CALL) || (desc != mPrimaryOutput)) {
187                audio_devices_t newDevice = getNewOutputDevice(desc, true /*fromCache*/);
188                // do not force device change on duplicated output because if device is 0, it will
189                // also force a device 0 for the two outputs it is duplicated to which may override
190                // a valid device selection on those outputs.
191                bool force = !desc->isDuplicated()
192                        && (!device_distinguishes_on_address(device)
193                                // always force when disconnecting (a non-duplicated device)
194                                || (state == AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE));
195                setOutputDevice(desc, newDevice, force, 0);
196            }
197        }
198
199        if (state == AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE) {
200            cleanUpForDevice(devDesc);
201        }
202
203        mpClientInterface->onAudioPortListUpdate();
204        return NO_ERROR;
205    }  // end if is output device
206
207    // handle input devices
208    if (audio_is_input_device(device)) {
209        SortedVector <audio_io_handle_t> inputs;
210
211        ssize_t index = mAvailableInputDevices.indexOf(devDesc);
212        switch (state)
213        {
214        // handle input device connection
215        case AUDIO_POLICY_DEVICE_STATE_AVAILABLE: {
216            if (index >= 0) {
217                ALOGW("setDeviceConnectionState() device already connected: %d", device);
218                return INVALID_OPERATION;
219            }
220            sp<HwModule> module = mHwModules.getModuleForDevice(device);
221            if (module == NULL) {
222                ALOGW("setDeviceConnectionState(): could not find HW module for device %08x",
223                      device);
224                return INVALID_OPERATION;
225            }
226            if (checkInputsForDevice(devDesc, state, inputs, devDesc->mAddress) != NO_ERROR) {
227                return INVALID_OPERATION;
228            }
229
230            index = mAvailableInputDevices.add(devDesc);
231            if (index >= 0) {
232                mAvailableInputDevices[index]->attach(module);
233            } else {
234                return NO_MEMORY;
235            }
236
237            // Set connect to HALs
238            AudioParameter param = AudioParameter(devDesc->mAddress);
239            param.addInt(String8(AUDIO_PARAMETER_DEVICE_CONNECT), device);
240            mpClientInterface->setParameters(AUDIO_IO_HANDLE_NONE, param.toString());
241
242            // Propagate device availability to Engine
243            mEngine->setDeviceConnectionState(devDesc, state);
244        } break;
245
246        // handle input device disconnection
247        case AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE: {
248            if (index < 0) {
249                ALOGW("setDeviceConnectionState() device not connected: %d", device);
250                return INVALID_OPERATION;
251            }
252
253            ALOGV("setDeviceConnectionState() disconnecting input device %x", device);
254
255            // Set Disconnect to HALs
256            AudioParameter param = AudioParameter(devDesc->mAddress);
257            param.addInt(String8(AUDIO_PARAMETER_DEVICE_DISCONNECT), device);
258            mpClientInterface->setParameters(AUDIO_IO_HANDLE_NONE, param.toString());
259
260            checkInputsForDevice(devDesc, state, inputs, devDesc->mAddress);
261            mAvailableInputDevices.remove(devDesc);
262
263            // Propagate device availability to Engine
264            mEngine->setDeviceConnectionState(devDesc, state);
265        } break;
266
267        default:
268            ALOGE("setDeviceConnectionState() invalid state: %x", state);
269            return BAD_VALUE;
270        }
271
272        closeAllInputs();
273
274        if (mEngine->getPhoneState() == AUDIO_MODE_IN_CALL && hasPrimaryOutput()) {
275            audio_devices_t newDevice = getNewOutputDevice(mPrimaryOutput, false /*fromCache*/);
276            updateCallRouting(newDevice);
277        }
278
279        if (state == AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE) {
280            cleanUpForDevice(devDesc);
281        }
282
283        mpClientInterface->onAudioPortListUpdate();
284        return NO_ERROR;
285    } // end if is input device
286
287    ALOGW("setDeviceConnectionState() invalid device: %x", device);
288    return BAD_VALUE;
289}
290
291audio_policy_dev_state_t AudioPolicyManager::getDeviceConnectionState(audio_devices_t device,
292                                                                      const char *device_address)
293{
294    sp<DeviceDescriptor> devDesc = mHwModules.getDeviceDescriptor(device, device_address, "");
295
296    DeviceVector *deviceVector;
297
298    if (audio_is_output_device(device)) {
299        deviceVector = &mAvailableOutputDevices;
300    } else if (audio_is_input_device(device)) {
301        deviceVector = &mAvailableInputDevices;
302    } else {
303        ALOGW("getDeviceConnectionState() invalid device type %08x", device);
304        return AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE;
305    }
306    return deviceVector->getDeviceConnectionState(devDesc);
307}
308
309void AudioPolicyManager::updateCallRouting(audio_devices_t rxDevice, int delayMs)
310{
311    bool createTxPatch = false;
312    struct audio_patch patch;
313    patch.num_sources = 1;
314    patch.num_sinks = 1;
315    status_t status;
316    audio_patch_handle_t afPatchHandle;
317    DeviceVector deviceList;
318
319    if(!hasPrimaryOutput()) {
320        return;
321    }
322    audio_devices_t txDevice = getDeviceAndMixForInputSource(AUDIO_SOURCE_VOICE_COMMUNICATION);
323    ALOGV("updateCallRouting device rxDevice %08x txDevice %08x", rxDevice, txDevice);
324
325    // release existing RX patch if any
326    if (mCallRxPatch != 0) {
327        mpClientInterface->releaseAudioPatch(mCallRxPatch->mAfPatchHandle, 0);
328        mCallRxPatch.clear();
329    }
330    // release TX patch if any
331    if (mCallTxPatch != 0) {
332        mpClientInterface->releaseAudioPatch(mCallTxPatch->mAfPatchHandle, 0);
333        mCallTxPatch.clear();
334    }
335
336    // If the RX device is on the primary HW module, then use legacy routing method for voice calls
337    // via setOutputDevice() on primary output.
338    // Otherwise, create two audio patches for TX and RX path.
339    if (availablePrimaryOutputDevices() & rxDevice) {
340        setOutputDevice(mPrimaryOutput, rxDevice, true, delayMs);
341        // If the TX device is also on the primary HW module, setOutputDevice() will take care
342        // of it due to legacy implementation. If not, create a patch.
343        if ((availablePrimaryInputDevices() & txDevice & ~AUDIO_DEVICE_BIT_IN)
344                == AUDIO_DEVICE_NONE) {
345            createTxPatch = true;
346        }
347    } else {
348        // create RX path audio patch
349        deviceList = mAvailableOutputDevices.getDevicesFromType(rxDevice);
350        ALOG_ASSERT(!deviceList.isEmpty(),
351                    "updateCallRouting() selected device not in output device list");
352        sp<DeviceDescriptor> rxSinkDeviceDesc = deviceList.itemAt(0);
353        deviceList = mAvailableInputDevices.getDevicesFromType(AUDIO_DEVICE_IN_TELEPHONY_RX);
354        ALOG_ASSERT(!deviceList.isEmpty(),
355                    "updateCallRouting() no telephony RX device");
356        sp<DeviceDescriptor> rxSourceDeviceDesc = deviceList.itemAt(0);
357
358        rxSourceDeviceDesc->toAudioPortConfig(&patch.sources[0]);
359        rxSinkDeviceDesc->toAudioPortConfig(&patch.sinks[0]);
360
361        // request to reuse existing output stream if one is already opened to reach the RX device
362        SortedVector<audio_io_handle_t> outputs =
363                                getOutputsForDevice(rxDevice, mOutputs);
364        audio_io_handle_t output = selectOutput(outputs,
365                                                AUDIO_OUTPUT_FLAG_NONE,
366                                                AUDIO_FORMAT_INVALID);
367        if (output != AUDIO_IO_HANDLE_NONE) {
368            sp<SwAudioOutputDescriptor> outputDesc = mOutputs.valueFor(output);
369            ALOG_ASSERT(!outputDesc->isDuplicated(),
370                        "updateCallRouting() RX device output is duplicated");
371            outputDesc->toAudioPortConfig(&patch.sources[1]);
372            patch.sources[1].ext.mix.usecase.stream = AUDIO_STREAM_PATCH;
373            patch.num_sources = 2;
374        }
375
376        afPatchHandle = AUDIO_PATCH_HANDLE_NONE;
377        status = mpClientInterface->createAudioPatch(&patch, &afPatchHandle, 0);
378        ALOGW_IF(status != NO_ERROR, "updateCallRouting() error %d creating RX audio patch",
379                                               status);
380        if (status == NO_ERROR) {
381            mCallRxPatch = new AudioPatch(&patch, mUidCached);
382            mCallRxPatch->mAfPatchHandle = afPatchHandle;
383            mCallRxPatch->mUid = mUidCached;
384        }
385        createTxPatch = true;
386    }
387    if (createTxPatch) {
388
389        struct audio_patch patch;
390        patch.num_sources = 1;
391        patch.num_sinks = 1;
392        deviceList = mAvailableInputDevices.getDevicesFromType(txDevice);
393        ALOG_ASSERT(!deviceList.isEmpty(),
394                    "updateCallRouting() selected device not in input device list");
395        sp<DeviceDescriptor> txSourceDeviceDesc = deviceList.itemAt(0);
396        txSourceDeviceDesc->toAudioPortConfig(&patch.sources[0]);
397        deviceList = mAvailableOutputDevices.getDevicesFromType(AUDIO_DEVICE_OUT_TELEPHONY_TX);
398        ALOG_ASSERT(!deviceList.isEmpty(),
399                    "updateCallRouting() no telephony TX device");
400        sp<DeviceDescriptor> txSinkDeviceDesc = deviceList.itemAt(0);
401        txSinkDeviceDesc->toAudioPortConfig(&patch.sinks[0]);
402
403        SortedVector<audio_io_handle_t> outputs =
404                                getOutputsForDevice(AUDIO_DEVICE_OUT_TELEPHONY_TX, mOutputs);
405        audio_io_handle_t output = selectOutput(outputs,
406                                                AUDIO_OUTPUT_FLAG_NONE,
407                                                AUDIO_FORMAT_INVALID);
408        // request to reuse existing output stream if one is already opened to reach the TX
409        // path output device
410        if (output != AUDIO_IO_HANDLE_NONE) {
411            sp<AudioOutputDescriptor> outputDesc = mOutputs.valueFor(output);
412            ALOG_ASSERT(!outputDesc->isDuplicated(),
413                        "updateCallRouting() RX device output is duplicated");
414            outputDesc->toAudioPortConfig(&patch.sources[1]);
415            patch.sources[1].ext.mix.usecase.stream = AUDIO_STREAM_PATCH;
416            patch.num_sources = 2;
417        }
418
419        // terminate active capture if on the same HW module as the call TX source device
420        // FIXME: would be better to refine to only inputs whose profile connects to the
421        // call TX device but this information is not in the audio patch and logic here must be
422        // symmetric to the one in startInput()
423        audio_io_handle_t activeInput = mInputs.getActiveInput();
424        if (activeInput != 0) {
425            sp<AudioInputDescriptor> activeDesc = mInputs.valueFor(activeInput);
426            if (activeDesc->getModuleHandle() == txSourceDeviceDesc->getModuleHandle()) {
427                //FIXME: consider all active sessions
428                AudioSessionCollection activeSessions = activeDesc->getActiveAudioSessions();
429                audio_session_t activeSession = activeSessions.keyAt(0);
430                stopInput(activeInput, activeSession);
431                releaseInput(activeInput, activeSession);
432            }
433        }
434
435        afPatchHandle = AUDIO_PATCH_HANDLE_NONE;
436        status = mpClientInterface->createAudioPatch(&patch, &afPatchHandle, 0);
437        ALOGW_IF(status != NO_ERROR, "setPhoneState() error %d creating TX audio patch",
438                                               status);
439        if (status == NO_ERROR) {
440            mCallTxPatch = new AudioPatch(&patch, mUidCached);
441            mCallTxPatch->mAfPatchHandle = afPatchHandle;
442            mCallTxPatch->mUid = mUidCached;
443        }
444    }
445}
446
447void AudioPolicyManager::setPhoneState(audio_mode_t state)
448{
449    ALOGV("setPhoneState() state %d", state);
450    // store previous phone state for management of sonification strategy below
451    int oldState = mEngine->getPhoneState();
452
453    if (mEngine->setPhoneState(state) != NO_ERROR) {
454        ALOGW("setPhoneState() invalid or same state %d", state);
455        return;
456    }
457    /// Opens: can these line be executed after the switch of volume curves???
458    // if leaving call state, handle special case of active streams
459    // pertaining to sonification strategy see handleIncallSonification()
460    if (isStateInCall(oldState)) {
461        ALOGV("setPhoneState() in call state management: new state is %d", state);
462        for (int stream = 0; stream < AUDIO_STREAM_CNT; stream++) {
463            if (stream == AUDIO_STREAM_PATCH) {
464                continue;
465            }
466            handleIncallSonification((audio_stream_type_t)stream, false, true);
467        }
468
469        // force reevaluating accessibility routing when call stops
470        mpClientInterface->invalidateStream(AUDIO_STREAM_ACCESSIBILITY);
471    }
472
473    /**
474     * Switching to or from incall state or switching between telephony and VoIP lead to force
475     * routing command.
476     */
477    bool force = ((is_state_in_call(oldState) != is_state_in_call(state))
478                  || (is_state_in_call(state) && (state != oldState)));
479
480    // check for device and output changes triggered by new phone state
481    checkA2dpSuspend();
482    checkOutputForAllStrategies();
483    updateDevicesAndOutputs();
484
485    int delayMs = 0;
486    if (isStateInCall(state)) {
487        nsecs_t sysTime = systemTime();
488        for (size_t i = 0; i < mOutputs.size(); i++) {
489            sp<SwAudioOutputDescriptor> desc = mOutputs.valueAt(i);
490            // mute media and sonification strategies and delay device switch by the largest
491            // latency of any output where either strategy is active.
492            // This avoid sending the ring tone or music tail into the earpiece or headset.
493            if ((isStrategyActive(desc, STRATEGY_MEDIA,
494                                  SONIFICATION_HEADSET_MUSIC_DELAY,
495                                  sysTime) ||
496                 isStrategyActive(desc, STRATEGY_SONIFICATION,
497                                  SONIFICATION_HEADSET_MUSIC_DELAY,
498                                  sysTime)) &&
499                    (delayMs < (int)desc->latency()*2)) {
500                delayMs = desc->latency()*2;
501            }
502            setStrategyMute(STRATEGY_MEDIA, true, desc);
503            setStrategyMute(STRATEGY_MEDIA, false, desc, MUTE_TIME_MS,
504                getDeviceForStrategy(STRATEGY_MEDIA, true /*fromCache*/));
505            setStrategyMute(STRATEGY_SONIFICATION, true, desc);
506            setStrategyMute(STRATEGY_SONIFICATION, false, desc, MUTE_TIME_MS,
507                getDeviceForStrategy(STRATEGY_SONIFICATION, true /*fromCache*/));
508        }
509    }
510
511    if (hasPrimaryOutput()) {
512        // Note that despite the fact that getNewOutputDevice() is called on the primary output,
513        // the device returned is not necessarily reachable via this output
514        audio_devices_t rxDevice = getNewOutputDevice(mPrimaryOutput, false /*fromCache*/);
515        // force routing command to audio hardware when ending call
516        // even if no device change is needed
517        if (isStateInCall(oldState) && rxDevice == AUDIO_DEVICE_NONE) {
518            rxDevice = mPrimaryOutput->device();
519        }
520
521        if (state == AUDIO_MODE_IN_CALL) {
522            updateCallRouting(rxDevice, delayMs);
523        } else if (oldState == AUDIO_MODE_IN_CALL) {
524            if (mCallRxPatch != 0) {
525                mpClientInterface->releaseAudioPatch(mCallRxPatch->mAfPatchHandle, 0);
526                mCallRxPatch.clear();
527            }
528            if (mCallTxPatch != 0) {
529                mpClientInterface->releaseAudioPatch(mCallTxPatch->mAfPatchHandle, 0);
530                mCallTxPatch.clear();
531            }
532            setOutputDevice(mPrimaryOutput, rxDevice, force, 0);
533        } else {
534            setOutputDevice(mPrimaryOutput, rxDevice, force, 0);
535        }
536    }
537    // if entering in call state, handle special case of active streams
538    // pertaining to sonification strategy see handleIncallSonification()
539    if (isStateInCall(state)) {
540        ALOGV("setPhoneState() in call state management: new state is %d", state);
541        for (int stream = 0; stream < AUDIO_STREAM_CNT; stream++) {
542            if (stream == AUDIO_STREAM_PATCH) {
543                continue;
544            }
545            handleIncallSonification((audio_stream_type_t)stream, true, true);
546        }
547
548        // force reevaluating accessibility routing when call starts
549        mpClientInterface->invalidateStream(AUDIO_STREAM_ACCESSIBILITY);
550    }
551
552    // Flag that ringtone volume must be limited to music volume until we exit MODE_RINGTONE
553    if (state == AUDIO_MODE_RINGTONE &&
554        isStreamActive(AUDIO_STREAM_MUSIC, SONIFICATION_HEADSET_MUSIC_DELAY)) {
555        mLimitRingtoneVolume = true;
556    } else {
557        mLimitRingtoneVolume = false;
558    }
559}
560
561audio_mode_t AudioPolicyManager::getPhoneState() {
562    return mEngine->getPhoneState();
563}
564
565void AudioPolicyManager::setForceUse(audio_policy_force_use_t usage,
566                                         audio_policy_forced_cfg_t config)
567{
568    ALOGV("setForceUse() usage %d, config %d, mPhoneState %d", usage, config, mEngine->getPhoneState());
569
570    if (mEngine->setForceUse(usage, config) != NO_ERROR) {
571        ALOGW("setForceUse() could not set force cfg %d for usage %d", config, usage);
572        return;
573    }
574    bool forceVolumeReeval = (usage == AUDIO_POLICY_FORCE_FOR_COMMUNICATION) ||
575            (usage == AUDIO_POLICY_FORCE_FOR_DOCK) ||
576            (usage == AUDIO_POLICY_FORCE_FOR_SYSTEM);
577
578    // check for device and output changes triggered by new force usage
579    checkA2dpSuspend();
580    checkOutputForAllStrategies();
581    updateDevicesAndOutputs();
582    if (mEngine->getPhoneState() == AUDIO_MODE_IN_CALL && hasPrimaryOutput()) {
583        audio_devices_t newDevice = getNewOutputDevice(mPrimaryOutput, true /*fromCache*/);
584        updateCallRouting(newDevice);
585    }
586    for (size_t i = 0; i < mOutputs.size(); i++) {
587        sp<SwAudioOutputDescriptor> outputDesc = mOutputs.valueAt(i);
588        audio_devices_t newDevice = getNewOutputDevice(outputDesc, true /*fromCache*/);
589        if ((mEngine->getPhoneState() != AUDIO_MODE_IN_CALL) || (outputDesc != mPrimaryOutput)) {
590            setOutputDevice(outputDesc, newDevice, (newDevice != AUDIO_DEVICE_NONE));
591        }
592        if (forceVolumeReeval && (newDevice != AUDIO_DEVICE_NONE)) {
593            applyStreamVolumes(outputDesc, newDevice, 0, true);
594        }
595    }
596
597    audio_io_handle_t activeInput = mInputs.getActiveInput();
598    if (activeInput != 0) {
599        sp<AudioInputDescriptor> activeDesc = mInputs.valueFor(activeInput);
600        audio_devices_t newDevice = getNewInputDevice(activeInput);
601        // Force new input selection if the new device can not be reached via current input
602        if (activeDesc->mProfile->getSupportedDevices().types() & (newDevice & ~AUDIO_DEVICE_BIT_IN)) {
603            setInputDevice(activeInput, newDevice);
604        } else {
605            closeInput(activeInput);
606        }
607    }
608}
609
610void AudioPolicyManager::setSystemProperty(const char* property, const char* value)
611{
612    ALOGV("setSystemProperty() property %s, value %s", property, value);
613}
614
615// Find a direct output profile compatible with the parameters passed, even if the input flags do
616// not explicitly request a direct output
617sp<IOProfile> AudioPolicyManager::getProfileForDirectOutput(
618                                                               audio_devices_t device,
619                                                               uint32_t samplingRate,
620                                                               audio_format_t format,
621                                                               audio_channel_mask_t channelMask,
622                                                               audio_output_flags_t flags)
623{
624    // only retain flags that will drive the direct output profile selection
625    // if explicitly requested
626    static const uint32_t kRelevantFlags =
627            (AUDIO_OUTPUT_FLAG_HW_AV_SYNC | AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD);
628    flags =
629        (audio_output_flags_t)((flags & kRelevantFlags) | AUDIO_OUTPUT_FLAG_DIRECT);
630
631    sp<IOProfile> profile;
632
633    for (size_t i = 0; i < mHwModules.size(); i++) {
634        if (mHwModules[i]->mHandle == 0) {
635            continue;
636        }
637        for (size_t j = 0; j < mHwModules[i]->mOutputProfiles.size(); j++) {
638            sp<IOProfile> curProfile = mHwModules[i]->mOutputProfiles[j];
639            if (!curProfile->isCompatibleProfile(device, String8(""),
640                    samplingRate, NULL /*updatedSamplingRate*/,
641                    format, NULL /*updatedFormat*/,
642                    channelMask, NULL /*updatedChannelMask*/,
643                    flags)) {
644                continue;
645            }
646            // reject profiles not corresponding to a device currently available
647            if ((mAvailableOutputDevices.types() & curProfile->getSupportedDevicesType()) == 0) {
648                continue;
649            }
650            // if several profiles are compatible, give priority to one with offload capability
651            if (profile != 0 && ((curProfile->getFlags() & AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD) == 0)) {
652                continue;
653            }
654            profile = curProfile;
655            if ((profile->getFlags() & AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD) != 0) {
656                break;
657            }
658        }
659    }
660    return profile;
661}
662
663audio_io_handle_t AudioPolicyManager::getOutput(audio_stream_type_t stream,
664                                                uint32_t samplingRate,
665                                                audio_format_t format,
666                                                audio_channel_mask_t channelMask,
667                                                audio_output_flags_t flags,
668                                                const audio_offload_info_t *offloadInfo)
669{
670    routing_strategy strategy = getStrategy(stream);
671    audio_devices_t device = getDeviceForStrategy(strategy, false /*fromCache*/);
672    ALOGV("getOutput() device %d, stream %d, samplingRate %d, format %x, channelMask %x, flags %x",
673          device, stream, samplingRate, format, channelMask, flags);
674
675    return getOutputForDevice(device, AUDIO_SESSION_ALLOCATE,
676                              stream, samplingRate,format, channelMask,
677                              flags, offloadInfo);
678}
679
680status_t AudioPolicyManager::getOutputForAttr(const audio_attributes_t *attr,
681                                              audio_io_handle_t *output,
682                                              audio_session_t session,
683                                              audio_stream_type_t *stream,
684                                              uid_t uid,
685                                              uint32_t samplingRate,
686                                              audio_format_t format,
687                                              audio_channel_mask_t channelMask,
688                                              audio_output_flags_t flags,
689                                              audio_port_handle_t selectedDeviceId,
690                                              const audio_offload_info_t *offloadInfo)
691{
692    audio_attributes_t attributes;
693    if (attr != NULL) {
694        if (!isValidAttributes(attr)) {
695            ALOGE("getOutputForAttr() invalid attributes: usage=%d content=%d flags=0x%x tags=[%s]",
696                  attr->usage, attr->content_type, attr->flags,
697                  attr->tags);
698            return BAD_VALUE;
699        }
700        attributes = *attr;
701    } else {
702        if (*stream < AUDIO_STREAM_MIN || *stream >= AUDIO_STREAM_PUBLIC_CNT) {
703            ALOGE("getOutputForAttr():  invalid stream type");
704            return BAD_VALUE;
705        }
706        stream_type_to_audio_attributes(*stream, &attributes);
707    }
708    sp<SwAudioOutputDescriptor> desc;
709    if (mPolicyMixes.getOutputForAttr(attributes, uid, desc) == NO_ERROR) {
710        ALOG_ASSERT(desc != 0, "Invalid desc returned by getOutputForAttr");
711        if (!audio_has_proportional_frames(format)) {
712            return BAD_VALUE;
713        }
714        *stream = streamTypefromAttributesInt(&attributes);
715        *output = desc->mIoHandle;
716        ALOGV("getOutputForAttr() returns output %d", *output);
717        return NO_ERROR;
718    }
719    if (attributes.usage == AUDIO_USAGE_VIRTUAL_SOURCE) {
720        ALOGW("getOutputForAttr() no policy mix found for usage AUDIO_USAGE_VIRTUAL_SOURCE");
721        return BAD_VALUE;
722    }
723
724    ALOGV("getOutputForAttr() usage=%d, content=%d, tag=%s flags=%08x"
725            " session %d selectedDeviceId %d",
726            attributes.usage, attributes.content_type, attributes.tags, attributes.flags,
727            session, selectedDeviceId);
728
729    *stream = streamTypefromAttributesInt(&attributes);
730
731    // Explicit routing?
732    sp<DeviceDescriptor> deviceDesc;
733    for (size_t i = 0; i < mAvailableOutputDevices.size(); i++) {
734        if (mAvailableOutputDevices[i]->getId() == selectedDeviceId) {
735            deviceDesc = mAvailableOutputDevices[i];
736            break;
737        }
738    }
739    mOutputRoutes.addRoute(session, *stream, SessionRoute::SOURCE_TYPE_NA, deviceDesc, uid);
740
741    routing_strategy strategy = (routing_strategy) getStrategyForAttr(&attributes);
742    audio_devices_t device = getDeviceForStrategy(strategy, false /*fromCache*/);
743
744    if ((attributes.flags & AUDIO_FLAG_HW_AV_SYNC) != 0) {
745        flags = (audio_output_flags_t)(flags | AUDIO_OUTPUT_FLAG_HW_AV_SYNC);
746    }
747
748    ALOGV("getOutputForAttr() device 0x%x, samplingRate %d, format %x, channelMask %x, flags %x",
749          device, samplingRate, format, channelMask, flags);
750
751    *output = getOutputForDevice(device, session, *stream,
752                                 samplingRate, format, channelMask,
753                                 flags, offloadInfo);
754    if (*output == AUDIO_IO_HANDLE_NONE) {
755        mOutputRoutes.removeRoute(session);
756        return INVALID_OPERATION;
757    }
758
759    return NO_ERROR;
760}
761
762audio_io_handle_t AudioPolicyManager::getOutputForDevice(
763        audio_devices_t device,
764        audio_session_t session __unused,
765        audio_stream_type_t stream,
766        uint32_t samplingRate,
767        audio_format_t format,
768        audio_channel_mask_t channelMask,
769        audio_output_flags_t flags,
770        const audio_offload_info_t *offloadInfo)
771{
772    audio_io_handle_t output = AUDIO_IO_HANDLE_NONE;
773    uint32_t latency = 0;
774    status_t status;
775
776#ifdef AUDIO_POLICY_TEST
777    if (mCurOutput != 0) {
778        ALOGV("getOutput() test output mCurOutput %d, samplingRate %d, format %d, channelMask %x, mDirectOutput %d",
779                mCurOutput, mTestSamplingRate, mTestFormat, mTestChannels, mDirectOutput);
780
781        if (mTestOutputs[mCurOutput] == 0) {
782            ALOGV("getOutput() opening test output");
783            sp<AudioOutputDescriptor> outputDesc = new SwAudioOutputDescriptor(NULL,
784                                                                               mpClientInterface);
785            outputDesc->mDevice = mTestDevice;
786            outputDesc->mLatency = mTestLatencyMs;
787            outputDesc->mFlags =
788                    (audio_output_flags_t)(mDirectOutput ? AUDIO_OUTPUT_FLAG_DIRECT : 0);
789            outputDesc->mRefCount[stream] = 0;
790            audio_config_t config = AUDIO_CONFIG_INITIALIZER;
791            config.sample_rate = mTestSamplingRate;
792            config.channel_mask = mTestChannels;
793            config.format = mTestFormat;
794            if (offloadInfo != NULL) {
795                config.offload_info = *offloadInfo;
796            }
797            status = mpClientInterface->openOutput(0,
798                                                  &mTestOutputs[mCurOutput],
799                                                  &config,
800                                                  &outputDesc->mDevice,
801                                                  String8(""),
802                                                  &outputDesc->mLatency,
803                                                  outputDesc->mFlags);
804            if (status == NO_ERROR) {
805                outputDesc->mSamplingRate = config.sample_rate;
806                outputDesc->mFormat = config.format;
807                outputDesc->mChannelMask = config.channel_mask;
808                AudioParameter outputCmd = AudioParameter();
809                outputCmd.addInt(String8("set_id"),mCurOutput);
810                mpClientInterface->setParameters(mTestOutputs[mCurOutput],outputCmd.toString());
811                addOutput(mTestOutputs[mCurOutput], outputDesc);
812            }
813        }
814        return mTestOutputs[mCurOutput];
815    }
816#endif //AUDIO_POLICY_TEST
817
818    // open a direct output if required by specified parameters
819    //force direct flag if offload flag is set: offloading implies a direct output stream
820    // and all common behaviors are driven by checking only the direct flag
821    // this should normally be set appropriately in the policy configuration file
822    if ((flags & AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD) != 0) {
823        flags = (audio_output_flags_t)(flags | AUDIO_OUTPUT_FLAG_DIRECT);
824    }
825    if ((flags & AUDIO_OUTPUT_FLAG_HW_AV_SYNC) != 0) {
826        flags = (audio_output_flags_t)(flags | AUDIO_OUTPUT_FLAG_DIRECT);
827    }
828    // only allow deep buffering for music stream type
829    if (stream != AUDIO_STREAM_MUSIC) {
830        flags = (audio_output_flags_t)(flags &~AUDIO_OUTPUT_FLAG_DEEP_BUFFER);
831    } else if (/* stream == AUDIO_STREAM_MUSIC && */
832            flags == AUDIO_OUTPUT_FLAG_NONE &&
833            property_get_bool("audio.deep_buffer.media", false /* default_value */)) {
834        // use DEEP_BUFFER as default output for music stream type
835        flags = (audio_output_flags_t)AUDIO_OUTPUT_FLAG_DEEP_BUFFER;
836    }
837    if (stream == AUDIO_STREAM_TTS) {
838        flags = AUDIO_OUTPUT_FLAG_TTS;
839    }
840
841    sp<IOProfile> profile;
842
843    // skip direct output selection if the request can obviously be attached to a mixed output
844    // and not explicitly requested
845    if (((flags & AUDIO_OUTPUT_FLAG_DIRECT) == 0) &&
846            audio_is_linear_pcm(format) && samplingRate <= MAX_MIXER_SAMPLING_RATE &&
847            audio_channel_count_from_out_mask(channelMask) <= 2) {
848        goto non_direct_output;
849    }
850
851    // Do not allow offloading if one non offloadable effect is enabled or MasterMono is enabled.
852    // This prevents creating an offloaded track and tearing it down immediately after start
853    // when audioflinger detects there is an active non offloadable effect.
854    // FIXME: We should check the audio session here but we do not have it in this context.
855    // This may prevent offloading in rare situations where effects are left active by apps
856    // in the background.
857
858    if (((flags & AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD) == 0) ||
859            !(mEffects.isNonOffloadableEffectEnabled() || mMasterMono)) {
860        profile = getProfileForDirectOutput(device,
861                                           samplingRate,
862                                           format,
863                                           channelMask,
864                                           (audio_output_flags_t)flags);
865    }
866
867    if (profile != 0) {
868        sp<SwAudioOutputDescriptor> outputDesc = NULL;
869
870        for (size_t i = 0; i < mOutputs.size(); i++) {
871            sp<SwAudioOutputDescriptor> desc = mOutputs.valueAt(i);
872            if (!desc->isDuplicated() && (profile == desc->mProfile)) {
873                outputDesc = desc;
874                // reuse direct output if currently open and configured with same parameters
875                if ((samplingRate == outputDesc->mSamplingRate) &&
876                        audio_formats_match(format, outputDesc->mFormat) &&
877                        (channelMask == outputDesc->mChannelMask)) {
878                    outputDesc->mDirectOpenCount++;
879                    ALOGV("getOutput() reusing direct output %d", mOutputs.keyAt(i));
880                    return mOutputs.keyAt(i);
881                }
882            }
883        }
884        // close direct output if currently open and configured with different parameters
885        if (outputDesc != NULL) {
886            closeOutput(outputDesc->mIoHandle);
887        }
888
889        // if the selected profile is offloaded and no offload info was specified,
890        // create a default one
891        audio_offload_info_t defaultOffloadInfo = AUDIO_INFO_INITIALIZER;
892        if ((profile->getFlags() & AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD) && !offloadInfo) {
893            flags = (audio_output_flags_t)(flags | AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD);
894            defaultOffloadInfo.sample_rate = samplingRate;
895            defaultOffloadInfo.channel_mask = channelMask;
896            defaultOffloadInfo.format = format;
897            defaultOffloadInfo.stream_type = stream;
898            defaultOffloadInfo.bit_rate = 0;
899            defaultOffloadInfo.duration_us = -1;
900            defaultOffloadInfo.has_video = true; // conservative
901            defaultOffloadInfo.is_streaming = true; // likely
902            offloadInfo = &defaultOffloadInfo;
903        }
904
905        outputDesc = new SwAudioOutputDescriptor(profile, mpClientInterface);
906        outputDesc->mDevice = device;
907        outputDesc->mLatency = 0;
908        outputDesc->mFlags = (audio_output_flags_t)(outputDesc->mFlags | flags);
909        audio_config_t config = AUDIO_CONFIG_INITIALIZER;
910        config.sample_rate = samplingRate;
911        config.channel_mask = channelMask;
912        config.format = format;
913        if (offloadInfo != NULL) {
914            config.offload_info = *offloadInfo;
915        }
916        status = mpClientInterface->openOutput(profile->getModuleHandle(),
917                                               &output,
918                                               &config,
919                                               &outputDesc->mDevice,
920                                               String8(""),
921                                               &outputDesc->mLatency,
922                                               outputDesc->mFlags);
923
924        // only accept an output with the requested parameters
925        if (status != NO_ERROR ||
926            (samplingRate != 0 && samplingRate != config.sample_rate) ||
927            (format != AUDIO_FORMAT_DEFAULT && !audio_formats_match(format, config.format)) ||
928            (channelMask != 0 && channelMask != config.channel_mask)) {
929            ALOGV("getOutput() failed opening direct output: output %d samplingRate %d %d,"
930                    "format %d %d, channelMask %04x %04x", output, samplingRate,
931                    outputDesc->mSamplingRate, format, outputDesc->mFormat, channelMask,
932                    outputDesc->mChannelMask);
933            if (output != AUDIO_IO_HANDLE_NONE) {
934                mpClientInterface->closeOutput(output);
935            }
936            // fall back to mixer output if possible when the direct output could not be open
937            if (audio_is_linear_pcm(format) && samplingRate <= MAX_MIXER_SAMPLING_RATE) {
938                goto non_direct_output;
939            }
940            return AUDIO_IO_HANDLE_NONE;
941        }
942        outputDesc->mSamplingRate = config.sample_rate;
943        outputDesc->mChannelMask = config.channel_mask;
944        outputDesc->mFormat = config.format;
945        outputDesc->mRefCount[stream] = 0;
946        outputDesc->mStopTime[stream] = 0;
947        outputDesc->mDirectOpenCount = 1;
948
949        audio_io_handle_t srcOutput = getOutputForEffect();
950        addOutput(output, outputDesc);
951        audio_io_handle_t dstOutput = getOutputForEffect();
952        if (dstOutput == output) {
953            mpClientInterface->moveEffects(AUDIO_SESSION_OUTPUT_MIX, srcOutput, dstOutput);
954        }
955        mPreviousOutputs = mOutputs;
956        ALOGV("getOutput() returns new direct output %d", output);
957        mpClientInterface->onAudioPortListUpdate();
958        return output;
959    }
960
961non_direct_output:
962    // ignoring channel mask due to downmix capability in mixer
963
964    // open a non direct output
965
966    // for non direct outputs, only PCM is supported
967    if (audio_is_linear_pcm(format)) {
968        // get which output is suitable for the specified stream. The actual
969        // routing change will happen when startOutput() will be called
970        SortedVector<audio_io_handle_t> outputs = getOutputsForDevice(device, mOutputs);
971
972        // at this stage we should ignore the DIRECT flag as no direct output could be found earlier
973        flags = (audio_output_flags_t)(flags & ~AUDIO_OUTPUT_FLAG_DIRECT);
974        output = selectOutput(outputs, flags, format);
975    }
976    ALOGW_IF((output == 0), "getOutput() could not find output for stream %d, samplingRate %d,"
977            "format %d, channels %x, flags %x", stream, samplingRate, format, channelMask, flags);
978
979    ALOGV("  getOutputForDevice() returns output %d", output);
980
981    return output;
982}
983
984audio_io_handle_t AudioPolicyManager::selectOutput(const SortedVector<audio_io_handle_t>& outputs,
985                                                       audio_output_flags_t flags,
986                                                       audio_format_t format)
987{
988    // select one output among several that provide a path to a particular device or set of
989    // devices (the list was previously build by getOutputsForDevice()).
990    // The priority is as follows:
991    // 1: the output with the highest number of requested policy flags
992    // 2: the output with the bit depth the closest to the requested one
993    // 3: the primary output
994    // 4: the first output in the list
995
996    if (outputs.size() == 0) {
997        return 0;
998    }
999    if (outputs.size() == 1) {
1000        return outputs[0];
1001    }
1002
1003    int maxCommonFlags = 0;
1004    audio_io_handle_t outputForFlags = 0;
1005    audio_io_handle_t outputForPrimary = 0;
1006    audio_io_handle_t outputForFormat = 0;
1007    audio_format_t bestFormat = AUDIO_FORMAT_INVALID;
1008    audio_format_t bestFormatForFlags = AUDIO_FORMAT_INVALID;
1009
1010    for (size_t i = 0; i < outputs.size(); i++) {
1011        sp<SwAudioOutputDescriptor> outputDesc = mOutputs.valueFor(outputs[i]);
1012        if (!outputDesc->isDuplicated()) {
1013            // if a valid format is specified, skip output if not compatible
1014            if (format != AUDIO_FORMAT_INVALID) {
1015                if (outputDesc->mFlags & AUDIO_OUTPUT_FLAG_DIRECT) {
1016                    if (!audio_formats_match(format, outputDesc->mFormat)) {
1017                        continue;
1018                    }
1019                } else if (!audio_is_linear_pcm(format)) {
1020                    continue;
1021                }
1022                if (AudioPort::isBetterFormatMatch(
1023                        outputDesc->mFormat, bestFormat, format)) {
1024                    outputForFormat = outputs[i];
1025                    bestFormat = outputDesc->mFormat;
1026                }
1027            }
1028
1029            int commonFlags = popcount(outputDesc->mProfile->getFlags() & flags);
1030            if (commonFlags >= maxCommonFlags) {
1031                if (commonFlags == maxCommonFlags) {
1032                    if (AudioPort::isBetterFormatMatch(
1033                            outputDesc->mFormat, bestFormatForFlags, format)) {
1034                        outputForFlags = outputs[i];
1035                        bestFormatForFlags = outputDesc->mFormat;
1036                    }
1037                } else {
1038                    outputForFlags = outputs[i];
1039                    maxCommonFlags = commonFlags;
1040                    bestFormatForFlags = outputDesc->mFormat;
1041                }
1042                ALOGV("selectOutput() commonFlags for output %d, %04x", outputs[i], commonFlags);
1043            }
1044            if (outputDesc->mProfile->getFlags() & AUDIO_OUTPUT_FLAG_PRIMARY) {
1045                outputForPrimary = outputs[i];
1046            }
1047        }
1048    }
1049
1050    if (outputForFlags != 0) {
1051        return outputForFlags;
1052    }
1053    if (outputForFormat != 0) {
1054        return outputForFormat;
1055    }
1056    if (outputForPrimary != 0) {
1057        return outputForPrimary;
1058    }
1059
1060    return outputs[0];
1061}
1062
1063status_t AudioPolicyManager::startOutput(audio_io_handle_t output,
1064                                             audio_stream_type_t stream,
1065                                             audio_session_t session)
1066{
1067    ALOGV("startOutput() output %d, stream %d, session %d",
1068          output, stream, session);
1069    ssize_t index = mOutputs.indexOfKey(output);
1070    if (index < 0) {
1071        ALOGW("startOutput() unknown output %d", output);
1072        return BAD_VALUE;
1073    }
1074
1075    sp<SwAudioOutputDescriptor> outputDesc = mOutputs.valueAt(index);
1076
1077    // Routing?
1078    mOutputRoutes.incRouteActivity(session);
1079
1080    audio_devices_t newDevice;
1081    if (outputDesc->mPolicyMix != NULL) {
1082        newDevice = AUDIO_DEVICE_OUT_REMOTE_SUBMIX;
1083    } else if (mOutputRoutes.hasRouteChanged(session)) {
1084        newDevice = getNewOutputDevice(outputDesc, false /*fromCache*/);
1085        checkStrategyRoute(getStrategy(stream), output);
1086    } else {
1087        newDevice = AUDIO_DEVICE_NONE;
1088    }
1089
1090    uint32_t delayMs = 0;
1091
1092    status_t status = startSource(outputDesc, stream, newDevice, &delayMs);
1093
1094    if (status != NO_ERROR) {
1095        mOutputRoutes.decRouteActivity(session);
1096        return status;
1097    }
1098    // Automatically enable the remote submix input when output is started on a re routing mix
1099    // of type MIX_TYPE_RECORDERS
1100    if (audio_is_remote_submix_device(newDevice) && outputDesc->mPolicyMix != NULL &&
1101            outputDesc->mPolicyMix->mMixType == MIX_TYPE_RECORDERS) {
1102            setDeviceConnectionStateInt(AUDIO_DEVICE_IN_REMOTE_SUBMIX,
1103                    AUDIO_POLICY_DEVICE_STATE_AVAILABLE,
1104                    outputDesc->mPolicyMix->mRegistrationId,
1105                    "remote-submix");
1106    }
1107
1108    if (delayMs != 0) {
1109        usleep(delayMs * 1000);
1110    }
1111
1112    return status;
1113}
1114
1115status_t AudioPolicyManager::startSource(sp<AudioOutputDescriptor> outputDesc,
1116                                             audio_stream_type_t stream,
1117                                             audio_devices_t device,
1118                                             uint32_t *delayMs)
1119{
1120    // cannot start playback of STREAM_TTS if any other output is being used
1121    uint32_t beaconMuteLatency = 0;
1122
1123    *delayMs = 0;
1124    if (stream == AUDIO_STREAM_TTS) {
1125        ALOGV("\t found BEACON stream");
1126        if (!mTtsOutputAvailable && mOutputs.isAnyOutputActive(AUDIO_STREAM_TTS /*streamToIgnore*/)) {
1127            return INVALID_OPERATION;
1128        } else {
1129            beaconMuteLatency = handleEventForBeacon(STARTING_BEACON);
1130        }
1131    } else {
1132        // some playback other than beacon starts
1133        beaconMuteLatency = handleEventForBeacon(STARTING_OUTPUT);
1134    }
1135
1136    // check active before incrementing usage count
1137    bool force = !outputDesc->isActive();
1138
1139    // increment usage count for this stream on the requested output:
1140    // NOTE that the usage count is the same for duplicated output and hardware output which is
1141    // necessary for a correct control of hardware output routing by startOutput() and stopOutput()
1142    outputDesc->changeRefCount(stream, 1);
1143
1144    if (outputDesc->mRefCount[stream] == 1 || device != AUDIO_DEVICE_NONE) {
1145        // starting an output being rerouted?
1146        if (device == AUDIO_DEVICE_NONE) {
1147            device = getNewOutputDevice(outputDesc, false /*fromCache*/);
1148        }
1149        routing_strategy strategy = getStrategy(stream);
1150        bool shouldWait = (strategy == STRATEGY_SONIFICATION) ||
1151                            (strategy == STRATEGY_SONIFICATION_RESPECTFUL) ||
1152                            (beaconMuteLatency > 0);
1153        uint32_t waitMs = beaconMuteLatency;
1154        for (size_t i = 0; i < mOutputs.size(); i++) {
1155            sp<AudioOutputDescriptor> desc = mOutputs.valueAt(i);
1156            if (desc != outputDesc) {
1157                // force a device change if any other output is managed by the same hw
1158                // module and has a current device selection that differs from selected device.
1159                // In this case, the audio HAL must receive the new device selection so that it can
1160                // change the device currently selected by the other active output.
1161                if (outputDesc->sharesHwModuleWith(desc) &&
1162                    desc->device() != device) {
1163                    force = true;
1164                }
1165                // wait for audio on other active outputs to be presented when starting
1166                // a notification so that audio focus effect can propagate, or that a mute/unmute
1167                // event occurred for beacon
1168                uint32_t latency = desc->latency();
1169                if (shouldWait && desc->isActive(latency * 2) && (waitMs < latency)) {
1170                    waitMs = latency;
1171                }
1172            }
1173        }
1174        uint32_t muteWaitMs = setOutputDevice(outputDesc, device, force);
1175
1176        // handle special case for sonification while in call
1177        if (isInCall()) {
1178            handleIncallSonification(stream, true, false);
1179        }
1180
1181        // apply volume rules for current stream and device if necessary
1182        checkAndSetVolume(stream,
1183                          mVolumeCurves->getVolumeIndex(stream, device),
1184                          outputDesc,
1185                          device);
1186
1187        // update the outputs if starting an output with a stream that can affect notification
1188        // routing
1189        handleNotificationRoutingForStream(stream);
1190
1191        // force reevaluating accessibility routing when ringtone or alarm starts
1192        if (strategy == STRATEGY_SONIFICATION) {
1193            mpClientInterface->invalidateStream(AUDIO_STREAM_ACCESSIBILITY);
1194        }
1195    }
1196    return NO_ERROR;
1197}
1198
1199
1200status_t AudioPolicyManager::stopOutput(audio_io_handle_t output,
1201                                            audio_stream_type_t stream,
1202                                            audio_session_t session)
1203{
1204    ALOGV("stopOutput() output %d, stream %d, session %d", output, stream, session);
1205    ssize_t index = mOutputs.indexOfKey(output);
1206    if (index < 0) {
1207        ALOGW("stopOutput() unknown output %d", output);
1208        return BAD_VALUE;
1209    }
1210
1211    sp<SwAudioOutputDescriptor> outputDesc = mOutputs.valueAt(index);
1212
1213    if (outputDesc->mRefCount[stream] == 1) {
1214        // Automatically disable the remote submix input when output is stopped on a
1215        // re routing mix of type MIX_TYPE_RECORDERS
1216        if (audio_is_remote_submix_device(outputDesc->mDevice) &&
1217                outputDesc->mPolicyMix != NULL &&
1218                outputDesc->mPolicyMix->mMixType == MIX_TYPE_RECORDERS) {
1219            setDeviceConnectionStateInt(AUDIO_DEVICE_IN_REMOTE_SUBMIX,
1220                    AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE,
1221                    outputDesc->mPolicyMix->mRegistrationId,
1222                    "remote-submix");
1223        }
1224    }
1225
1226    // Routing?
1227    bool forceDeviceUpdate = false;
1228    if (outputDesc->mRefCount[stream] > 0) {
1229        int activityCount = mOutputRoutes.decRouteActivity(session);
1230        forceDeviceUpdate = (mOutputRoutes.hasRoute(session) && (activityCount == 0));
1231
1232        if (forceDeviceUpdate) {
1233            checkStrategyRoute(getStrategy(stream), AUDIO_IO_HANDLE_NONE);
1234        }
1235    }
1236
1237    return stopSource(outputDesc, stream, forceDeviceUpdate);
1238}
1239
1240status_t AudioPolicyManager::stopSource(sp<AudioOutputDescriptor> outputDesc,
1241                                            audio_stream_type_t stream,
1242                                            bool forceDeviceUpdate)
1243{
1244    // always handle stream stop, check which stream type is stopping
1245    handleEventForBeacon(stream == AUDIO_STREAM_TTS ? STOPPING_BEACON : STOPPING_OUTPUT);
1246
1247    // handle special case for sonification while in call
1248    if (isInCall()) {
1249        handleIncallSonification(stream, false, false);
1250    }
1251
1252    if (outputDesc->mRefCount[stream] > 0) {
1253        // decrement usage count of this stream on the output
1254        outputDesc->changeRefCount(stream, -1);
1255
1256        // store time at which the stream was stopped - see isStreamActive()
1257        if (outputDesc->mRefCount[stream] == 0 || forceDeviceUpdate) {
1258            outputDesc->mStopTime[stream] = systemTime();
1259            audio_devices_t newDevice = getNewOutputDevice(outputDesc, false /*fromCache*/);
1260            // delay the device switch by twice the latency because stopOutput() is executed when
1261            // the track stop() command is received and at that time the audio track buffer can
1262            // still contain data that needs to be drained. The latency only covers the audio HAL
1263            // and kernel buffers. Also the latency does not always include additional delay in the
1264            // audio path (audio DSP, CODEC ...)
1265            setOutputDevice(outputDesc, newDevice, false, outputDesc->latency()*2);
1266
1267            // force restoring the device selection on other active outputs if it differs from the
1268            // one being selected for this output
1269            for (size_t i = 0; i < mOutputs.size(); i++) {
1270                audio_io_handle_t curOutput = mOutputs.keyAt(i);
1271                sp<AudioOutputDescriptor> desc = mOutputs.valueAt(i);
1272                if (desc != outputDesc &&
1273                        desc->isActive() &&
1274                        outputDesc->sharesHwModuleWith(desc) &&
1275                        (newDevice != desc->device())) {
1276                    setOutputDevice(desc,
1277                                    getNewOutputDevice(desc, false /*fromCache*/),
1278                                    true,
1279                                    outputDesc->latency()*2);
1280                }
1281            }
1282            // update the outputs if stopping one with a stream that can affect notification routing
1283            handleNotificationRoutingForStream(stream);
1284        }
1285        return NO_ERROR;
1286    } else {
1287        ALOGW("stopOutput() refcount is already 0");
1288        return INVALID_OPERATION;
1289    }
1290}
1291
1292void AudioPolicyManager::releaseOutput(audio_io_handle_t output,
1293                                       audio_stream_type_t stream __unused,
1294                                       audio_session_t session __unused)
1295{
1296    ALOGV("releaseOutput() %d", output);
1297    ssize_t index = mOutputs.indexOfKey(output);
1298    if (index < 0) {
1299        ALOGW("releaseOutput() releasing unknown output %d", output);
1300        return;
1301    }
1302
1303#ifdef AUDIO_POLICY_TEST
1304    int testIndex = testOutputIndex(output);
1305    if (testIndex != 0) {
1306        sp<AudioOutputDescriptor> outputDesc = mOutputs.valueAt(index);
1307        if (outputDesc->isActive()) {
1308            mpClientInterface->closeOutput(output);
1309            removeOutput(output);
1310            mTestOutputs[testIndex] = 0;
1311        }
1312        return;
1313    }
1314#endif //AUDIO_POLICY_TEST
1315
1316    // Routing
1317    mOutputRoutes.removeRoute(session);
1318
1319    sp<SwAudioOutputDescriptor> desc = mOutputs.valueAt(index);
1320    if (desc->mFlags & AUDIO_OUTPUT_FLAG_DIRECT) {
1321        if (desc->mDirectOpenCount <= 0) {
1322            ALOGW("releaseOutput() invalid open count %d for output %d",
1323                                                              desc->mDirectOpenCount, output);
1324            return;
1325        }
1326        if (--desc->mDirectOpenCount == 0) {
1327            closeOutput(output);
1328            // If effects where present on the output, audioflinger moved them to the primary
1329            // output by default: move them back to the appropriate output.
1330            audio_io_handle_t dstOutput = getOutputForEffect();
1331            if (hasPrimaryOutput() && dstOutput != mPrimaryOutput->mIoHandle) {
1332                mpClientInterface->moveEffects(AUDIO_SESSION_OUTPUT_MIX,
1333                                               mPrimaryOutput->mIoHandle, dstOutput);
1334            }
1335            mpClientInterface->onAudioPortListUpdate();
1336        }
1337    }
1338}
1339
1340
1341status_t AudioPolicyManager::getInputForAttr(const audio_attributes_t *attr,
1342                                             audio_io_handle_t *input,
1343                                             audio_session_t session,
1344                                             uid_t uid,
1345                                             uint32_t samplingRate,
1346                                             audio_format_t format,
1347                                             audio_channel_mask_t channelMask,
1348                                             audio_input_flags_t flags,
1349                                             audio_port_handle_t selectedDeviceId,
1350                                             input_type_t *inputType)
1351{
1352    ALOGV("getInputForAttr() source %d, samplingRate %d, format %d, channelMask %x,"
1353            "session %d, flags %#x",
1354          attr->source, samplingRate, format, channelMask, session, flags);
1355
1356    *input = AUDIO_IO_HANDLE_NONE;
1357    *inputType = API_INPUT_INVALID;
1358    audio_devices_t device;
1359    // handle legacy remote submix case where the address was not always specified
1360    String8 address = String8("");
1361    audio_source_t inputSource = attr->source;
1362    audio_source_t halInputSource;
1363    AudioMix *policyMix = NULL;
1364
1365    if (inputSource == AUDIO_SOURCE_DEFAULT) {
1366        inputSource = AUDIO_SOURCE_MIC;
1367    }
1368    halInputSource = inputSource;
1369
1370    // Explicit routing?
1371    sp<DeviceDescriptor> deviceDesc;
1372    for (size_t i = 0; i < mAvailableInputDevices.size(); i++) {
1373        if (mAvailableInputDevices[i]->getId() == selectedDeviceId) {
1374            deviceDesc = mAvailableInputDevices[i];
1375            break;
1376        }
1377    }
1378    mInputRoutes.addRoute(session, SessionRoute::STREAM_TYPE_NA, inputSource, deviceDesc, uid);
1379
1380    if (inputSource == AUDIO_SOURCE_REMOTE_SUBMIX &&
1381            strncmp(attr->tags, "addr=", strlen("addr=")) == 0) {
1382        status_t ret = mPolicyMixes.getInputMixForAttr(*attr, &policyMix);
1383        if (ret != NO_ERROR) {
1384            return ret;
1385        }
1386        *inputType = API_INPUT_MIX_EXT_POLICY_REROUTE;
1387        device = AUDIO_DEVICE_IN_REMOTE_SUBMIX;
1388        address = String8(attr->tags + strlen("addr="));
1389    } else {
1390        device = getDeviceAndMixForInputSource(inputSource, &policyMix);
1391        if (device == AUDIO_DEVICE_NONE) {
1392            ALOGW("getInputForAttr() could not find device for source %d", inputSource);
1393            return BAD_VALUE;
1394        }
1395        if (policyMix != NULL) {
1396            address = policyMix->mRegistrationId;
1397            if (policyMix->mMixType == MIX_TYPE_RECORDERS) {
1398                // there is an external policy, but this input is attached to a mix of recorders,
1399                // meaning it receives audio injected into the framework, so the recorder doesn't
1400                // know about it and is therefore considered "legacy"
1401                *inputType = API_INPUT_LEGACY;
1402            } else {
1403                // recording a mix of players defined by an external policy, we're rerouting for
1404                // an external policy
1405                *inputType = API_INPUT_MIX_EXT_POLICY_REROUTE;
1406            }
1407        } else if (audio_is_remote_submix_device(device)) {
1408            address = String8("0");
1409            *inputType = API_INPUT_MIX_CAPTURE;
1410        } else if (device == AUDIO_DEVICE_IN_TELEPHONY_RX) {
1411            *inputType = API_INPUT_TELEPHONY_RX;
1412        } else {
1413            *inputType = API_INPUT_LEGACY;
1414        }
1415
1416    }
1417
1418    *input = getInputForDevice(device, address, session, uid, inputSource,
1419                               samplingRate, format, channelMask, flags,
1420                               policyMix);
1421    if (*input == AUDIO_IO_HANDLE_NONE) {
1422        mInputRoutes.removeRoute(session);
1423        return INVALID_OPERATION;
1424    }
1425    ALOGV("getInputForAttr() returns input type = %d", *inputType);
1426    return NO_ERROR;
1427}
1428
1429
1430audio_io_handle_t AudioPolicyManager::getInputForDevice(audio_devices_t device,
1431                                                        String8 address,
1432                                                        audio_session_t session,
1433                                                        uid_t uid,
1434                                                        audio_source_t inputSource,
1435                                                        uint32_t samplingRate,
1436                                                        audio_format_t format,
1437                                                        audio_channel_mask_t channelMask,
1438                                                        audio_input_flags_t flags,
1439                                                        AudioMix *policyMix)
1440{
1441    audio_io_handle_t input = AUDIO_IO_HANDLE_NONE;
1442    audio_source_t halInputSource = inputSource;
1443    bool isSoundTrigger = false;
1444
1445    if (inputSource == AUDIO_SOURCE_HOTWORD) {
1446        ssize_t index = mSoundTriggerSessions.indexOfKey(session);
1447        if (index >= 0) {
1448            input = mSoundTriggerSessions.valueFor(session);
1449            isSoundTrigger = true;
1450            flags = (audio_input_flags_t)(flags | AUDIO_INPUT_FLAG_HW_HOTWORD);
1451            ALOGV("SoundTrigger capture on session %d input %d", session, input);
1452        } else {
1453            halInputSource = AUDIO_SOURCE_VOICE_RECOGNITION;
1454        }
1455    }
1456
1457    // find a compatible input profile (not necessarily identical in parameters)
1458    sp<IOProfile> profile;
1459    // samplingRate and flags may be updated by getInputProfile
1460    uint32_t profileSamplingRate = samplingRate;
1461    audio_format_t profileFormat = format;
1462    audio_channel_mask_t profileChannelMask = channelMask;
1463    audio_input_flags_t profileFlags = flags;
1464    for (;;) {
1465        profile = getInputProfile(device, address,
1466                                  profileSamplingRate, profileFormat, profileChannelMask,
1467                                  profileFlags);
1468        if (profile != 0) {
1469            break; // success
1470        } else if (profileFlags != AUDIO_INPUT_FLAG_NONE) {
1471            profileFlags = AUDIO_INPUT_FLAG_NONE; // retry
1472        } else { // fail
1473            ALOGW("getInputForDevice() could not find profile for device 0x%X,"
1474                  "samplingRate %u, format %#x, channelMask 0x%X, flags %#x",
1475                    device, samplingRate, format, channelMask, flags);
1476            return input;
1477        }
1478    }
1479
1480    if (profile->getModuleHandle() == 0) {
1481        ALOGE("getInputForAttr(): HW module %s not opened", profile->getModuleName());
1482        return input;
1483    }
1484
1485    sp<AudioSession> audioSession = new AudioSession(session,
1486                                                              inputSource,
1487                                                              format,
1488                                                              samplingRate,
1489                                                              channelMask,
1490                                                              flags,
1491                                                              uid,
1492                                                              isSoundTrigger,
1493                                                              policyMix, mpClientInterface);
1494
1495// TODO enable input reuse
1496#if 0
1497    // reuse an open input if possible
1498    for (size_t i = 0; i < mInputs.size(); i++) {
1499        sp<AudioInputDescriptor> desc = mInputs.valueAt(i);
1500        // reuse input if it shares the same profile and same sound trigger attribute
1501        if (profile == desc->mProfile &&
1502            isSoundTrigger == desc->isSoundTrigger()) {
1503
1504            sp<AudioSession> as = desc->getAudioSession(session);
1505            if (as != 0) {
1506                // do not allow unmatching properties on same session
1507                if (as->matches(audioSession)) {
1508                    as->changeOpenCount(1);
1509                } else {
1510                    ALOGW("getInputForDevice() record with different attributes"
1511                          " exists for session %d", session);
1512                    return input;
1513                }
1514            } else {
1515                desc->addAudioSession(session, audioSession);
1516            }
1517            ALOGV("getInputForDevice() reusing input %d", mInputs.keyAt(i));
1518            return mInputs.keyAt(i);
1519        }
1520    }
1521#endif
1522
1523    audio_config_t config = AUDIO_CONFIG_INITIALIZER;
1524    config.sample_rate = profileSamplingRate;
1525    config.channel_mask = profileChannelMask;
1526    config.format = profileFormat;
1527
1528    status_t status = mpClientInterface->openInput(profile->getModuleHandle(),
1529                                                   &input,
1530                                                   &config,
1531                                                   &device,
1532                                                   address,
1533                                                   halInputSource,
1534                                                   profileFlags);
1535
1536    // only accept input with the exact requested set of parameters
1537    if (status != NO_ERROR || input == AUDIO_IO_HANDLE_NONE ||
1538        (profileSamplingRate != config.sample_rate) ||
1539        !audio_formats_match(profileFormat, config.format) ||
1540        (profileChannelMask != config.channel_mask)) {
1541        ALOGW("getInputForAttr() failed opening input: samplingRate %d"
1542              ", format %d, channelMask %x",
1543                samplingRate, format, channelMask);
1544        if (input != AUDIO_IO_HANDLE_NONE) {
1545            mpClientInterface->closeInput(input);
1546        }
1547        return AUDIO_IO_HANDLE_NONE;
1548    }
1549
1550    sp<AudioInputDescriptor> inputDesc = new AudioInputDescriptor(profile);
1551    inputDesc->mSamplingRate = profileSamplingRate;
1552    inputDesc->mFormat = profileFormat;
1553    inputDesc->mChannelMask = profileChannelMask;
1554    inputDesc->mDevice = device;
1555    inputDesc->mPolicyMix = policyMix;
1556    inputDesc->addAudioSession(session, audioSession);
1557
1558    addInput(input, inputDesc);
1559    mpClientInterface->onAudioPortListUpdate();
1560
1561    return input;
1562}
1563
1564status_t AudioPolicyManager::startInput(audio_io_handle_t input,
1565                                        audio_session_t session)
1566{
1567    ALOGV("startInput() input %d", input);
1568    ssize_t index = mInputs.indexOfKey(input);
1569    if (index < 0) {
1570        ALOGW("startInput() unknown input %d", input);
1571        return BAD_VALUE;
1572    }
1573    sp<AudioInputDescriptor> inputDesc = mInputs.valueAt(index);
1574
1575    sp<AudioSession> audioSession = inputDesc->getAudioSession(session);
1576    if (audioSession == 0) {
1577        ALOGW("startInput() unknown session %d on input %d", session, input);
1578        return BAD_VALUE;
1579    }
1580
1581    // virtual input devices are compatible with other input devices
1582    if (!is_virtual_input_device(inputDesc->mDevice)) {
1583
1584        // for a non-virtual input device, check if there is another (non-virtual) active input
1585        audio_io_handle_t activeInput = mInputs.getActiveInput();
1586        if (activeInput != 0 && activeInput != input) {
1587
1588            // If the already active input uses AUDIO_SOURCE_HOTWORD then it is closed,
1589            // otherwise the active input continues and the new input cannot be started.
1590            sp<AudioInputDescriptor> activeDesc = mInputs.valueFor(activeInput);
1591            if ((activeDesc->inputSource() == AUDIO_SOURCE_HOTWORD) &&
1592                    !activeDesc->hasPreemptedSession(session)) {
1593                ALOGW("startInput(%d) preempting low-priority input %d", input, activeInput);
1594                //FIXME: consider all active sessions
1595                AudioSessionCollection activeSessions = activeDesc->getActiveAudioSessions();
1596                audio_session_t activeSession = activeSessions.keyAt(0);
1597                SortedVector<audio_session_t> sessions =
1598                                           activeDesc->getPreemptedSessions();
1599                sessions.add(activeSession);
1600                inputDesc->setPreemptedSessions(sessions);
1601                stopInput(activeInput, activeSession);
1602                releaseInput(activeInput, activeSession);
1603            } else {
1604                ALOGE("startInput(%d) failed: other input %d already started", input, activeInput);
1605                return INVALID_OPERATION;
1606            }
1607        }
1608
1609        // Do not allow capture if an active voice call is using a software patch and
1610        // the call TX source device is on the same HW module.
1611        // FIXME: would be better to refine to only inputs whose profile connects to the
1612        // call TX device but this information is not in the audio patch
1613        if (mCallTxPatch != 0 &&
1614            inputDesc->getModuleHandle() == mCallTxPatch->mPatch.sources[0].ext.device.hw_module) {
1615            return INVALID_OPERATION;
1616        }
1617    }
1618
1619    // Routing?
1620    mInputRoutes.incRouteActivity(session);
1621
1622    if (!inputDesc->isActive() || mInputRoutes.hasRouteChanged(session)) {
1623        // if input maps to a dynamic policy with an activity listener, notify of state change
1624        if ((inputDesc->mPolicyMix != NULL)
1625                && ((inputDesc->mPolicyMix->mCbFlags & AudioMix::kCbFlagNotifyActivity) != 0)) {
1626            mpClientInterface->onDynamicPolicyMixStateUpdate(inputDesc->mPolicyMix->mRegistrationId,
1627                    MIX_STATE_MIXING);
1628        }
1629
1630        if (mInputs.activeInputsCount() == 0) {
1631            SoundTrigger::setCaptureState(true);
1632        }
1633        setInputDevice(input, getNewInputDevice(input), true /* force */);
1634
1635        // automatically enable the remote submix output when input is started if not
1636        // used by a policy mix of type MIX_TYPE_RECORDERS
1637        // For remote submix (a virtual device), we open only one input per capture request.
1638        if (audio_is_remote_submix_device(inputDesc->mDevice)) {
1639            String8 address = String8("");
1640            if (inputDesc->mPolicyMix == NULL) {
1641                address = String8("0");
1642            } else if (inputDesc->mPolicyMix->mMixType == MIX_TYPE_PLAYERS) {
1643                address = inputDesc->mPolicyMix->mRegistrationId;
1644            }
1645            if (address != "") {
1646                setDeviceConnectionStateInt(AUDIO_DEVICE_OUT_REMOTE_SUBMIX,
1647                        AUDIO_POLICY_DEVICE_STATE_AVAILABLE,
1648                        address, "remote-submix");
1649            }
1650        }
1651    }
1652
1653    ALOGV("AudioPolicyManager::startInput() input source = %d", audioSession->inputSource());
1654
1655    audioSession->changeActiveCount(1);
1656    return NO_ERROR;
1657}
1658
1659status_t AudioPolicyManager::stopInput(audio_io_handle_t input,
1660                                       audio_session_t session)
1661{
1662    ALOGV("stopInput() input %d", input);
1663    ssize_t index = mInputs.indexOfKey(input);
1664    if (index < 0) {
1665        ALOGW("stopInput() unknown input %d", input);
1666        return BAD_VALUE;
1667    }
1668    sp<AudioInputDescriptor> inputDesc = mInputs.valueAt(index);
1669
1670    sp<AudioSession> audioSession = inputDesc->getAudioSession(session);
1671    if (index < 0) {
1672        ALOGW("stopInput() unknown session %d on input %d", session, input);
1673        return BAD_VALUE;
1674    }
1675
1676    if (audioSession->activeCount() == 0) {
1677        ALOGW("stopInput() input %d already stopped", input);
1678        return INVALID_OPERATION;
1679    }
1680
1681    audioSession->changeActiveCount(-1);
1682
1683    // Routing?
1684    mInputRoutes.decRouteActivity(session);
1685
1686    if (!inputDesc->isActive()) {
1687        // if input maps to a dynamic policy with an activity listener, notify of state change
1688        if ((inputDesc->mPolicyMix != NULL)
1689                && ((inputDesc->mPolicyMix->mCbFlags & AudioMix::kCbFlagNotifyActivity) != 0)) {
1690            mpClientInterface->onDynamicPolicyMixStateUpdate(inputDesc->mPolicyMix->mRegistrationId,
1691                    MIX_STATE_IDLE);
1692        }
1693
1694        // automatically disable the remote submix output when input is stopped if not
1695        // used by a policy mix of type MIX_TYPE_RECORDERS
1696        if (audio_is_remote_submix_device(inputDesc->mDevice)) {
1697            String8 address = String8("");
1698            if (inputDesc->mPolicyMix == NULL) {
1699                address = String8("0");
1700            } else if (inputDesc->mPolicyMix->mMixType == MIX_TYPE_PLAYERS) {
1701                address = inputDesc->mPolicyMix->mRegistrationId;
1702            }
1703            if (address != "") {
1704                setDeviceConnectionStateInt(AUDIO_DEVICE_OUT_REMOTE_SUBMIX,
1705                                         AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE,
1706                                         address, "remote-submix");
1707            }
1708        }
1709
1710        resetInputDevice(input);
1711
1712        if (mInputs.activeInputsCount() == 0) {
1713            SoundTrigger::setCaptureState(false);
1714        }
1715        inputDesc->clearPreemptedSessions();
1716    }
1717    return NO_ERROR;
1718}
1719
1720void AudioPolicyManager::releaseInput(audio_io_handle_t input,
1721                                      audio_session_t session)
1722{
1723
1724    ALOGV("releaseInput() %d", input);
1725    ssize_t index = mInputs.indexOfKey(input);
1726    if (index < 0) {
1727        ALOGW("releaseInput() releasing unknown input %d", input);
1728        return;
1729    }
1730
1731    // Routing
1732    mInputRoutes.removeRoute(session);
1733
1734    sp<AudioInputDescriptor> inputDesc = mInputs.valueAt(index);
1735    ALOG_ASSERT(inputDesc != 0);
1736
1737    sp<AudioSession> audioSession = inputDesc->getAudioSession(session);
1738    if (index < 0) {
1739        ALOGW("releaseInput() unknown session %d on input %d", session, input);
1740        return;
1741    }
1742
1743    if (audioSession->openCount() == 0) {
1744        ALOGW("releaseInput() invalid open count %d on session %d",
1745              audioSession->openCount(), session);
1746        return;
1747    }
1748
1749    if (audioSession->changeOpenCount(-1) == 0) {
1750        inputDesc->removeAudioSession(session);
1751    }
1752
1753    if (inputDesc->getOpenRefCount() > 0) {
1754        ALOGV("releaseInput() exit > 0");
1755        return;
1756    }
1757
1758    closeInput(input);
1759    mpClientInterface->onAudioPortListUpdate();
1760    ALOGV("releaseInput() exit");
1761}
1762
1763void AudioPolicyManager::closeAllInputs() {
1764    bool patchRemoved = false;
1765
1766    for(size_t input_index = 0; input_index < mInputs.size(); input_index++) {
1767        sp<AudioInputDescriptor> inputDesc = mInputs.valueAt(input_index);
1768        ssize_t patch_index = mAudioPatches.indexOfKey(inputDesc->getPatchHandle());
1769        if (patch_index >= 0) {
1770            sp<AudioPatch> patchDesc = mAudioPatches.valueAt(patch_index);
1771            status_t status = mpClientInterface->releaseAudioPatch(patchDesc->mAfPatchHandle, 0);
1772            mAudioPatches.removeItemsAt(patch_index);
1773            patchRemoved = true;
1774        }
1775        mpClientInterface->closeInput(mInputs.keyAt(input_index));
1776    }
1777    mInputs.clear();
1778    SoundTrigger::setCaptureState(false);
1779    nextAudioPortGeneration();
1780
1781    if (patchRemoved) {
1782        mpClientInterface->onAudioPatchListUpdate();
1783    }
1784}
1785
1786void AudioPolicyManager::initStreamVolume(audio_stream_type_t stream,
1787                                            int indexMin,
1788                                            int indexMax)
1789{
1790    ALOGV("initStreamVolume() stream %d, min %d, max %d", stream , indexMin, indexMax);
1791    mVolumeCurves->initStreamVolume(stream, indexMin, indexMax);
1792    if (stream == AUDIO_STREAM_MUSIC) {
1793        mVolumeCurves->initStreamVolume(AUDIO_STREAM_ACCESSIBILITY, indexMin, indexMax);
1794    }
1795}
1796
1797status_t AudioPolicyManager::setStreamVolumeIndex(audio_stream_type_t stream,
1798                                                  int index,
1799                                                  audio_devices_t device)
1800{
1801
1802    if ((index < mVolumeCurves->getVolumeIndexMin(stream)) ||
1803            (index > mVolumeCurves->getVolumeIndexMax(stream))) {
1804        return BAD_VALUE;
1805    }
1806    if (!audio_is_output_device(device)) {
1807        return BAD_VALUE;
1808    }
1809
1810    // Force max volume if stream cannot be muted
1811    if (!mVolumeCurves->canBeMuted(stream)) index = mVolumeCurves->getVolumeIndexMax(stream);
1812
1813    ALOGV("setStreamVolumeIndex() stream %d, device %04x, index %d",
1814          stream, device, index);
1815
1816    // if device is AUDIO_DEVICE_OUT_DEFAULT set default value and
1817    // clear all device specific values
1818    if (device == AUDIO_DEVICE_OUT_DEFAULT) {
1819        mVolumeCurves->clearCurrentVolumeIndex(stream);
1820    }
1821    mVolumeCurves->addCurrentVolumeIndex(stream, device, index);
1822
1823    // update volume on all outputs whose current device is also selected by the same
1824    // strategy as the device specified by the caller
1825    audio_devices_t selectedDevices = getDeviceForStrategy(getStrategy(stream), true /*fromCache*/);
1826    // it is possible that the requested device is not selected by the strategy (e.g an explicit
1827    // audio patch is active causing getDevicesForStream() to return this device. We must make
1828    // sure that the device passed is part of the devices considered when applying volume below.
1829    selectedDevices |= device;
1830
1831    //FIXME: AUDIO_STREAM_ACCESSIBILITY volume follows AUDIO_STREAM_MUSIC for now
1832    audio_devices_t accessibilityDevice = AUDIO_DEVICE_NONE;
1833    if (stream == AUDIO_STREAM_MUSIC) {
1834        mVolumeCurves->addCurrentVolumeIndex(AUDIO_STREAM_ACCESSIBILITY, device, index);
1835        accessibilityDevice = getDeviceForStrategy(STRATEGY_ACCESSIBILITY, true /*fromCache*/);
1836    }
1837
1838    status_t status = NO_ERROR;
1839    for (size_t i = 0; i < mOutputs.size(); i++) {
1840        sp<SwAudioOutputDescriptor> desc = mOutputs.valueAt(i);
1841        audio_devices_t curDevice = Volume::getDeviceForVolume(desc->device());
1842        if ((device == AUDIO_DEVICE_OUT_DEFAULT) || ((curDevice & selectedDevices) != 0)) {
1843            status_t volStatus = checkAndSetVolume(stream, index, desc, curDevice);
1844            if (volStatus != NO_ERROR) {
1845                status = volStatus;
1846            }
1847        }
1848        if ((accessibilityDevice != AUDIO_DEVICE_NONE) &&
1849                ((device == AUDIO_DEVICE_OUT_DEFAULT) || ((curDevice & accessibilityDevice) != 0)))
1850        {
1851            status_t volStatus = checkAndSetVolume(AUDIO_STREAM_ACCESSIBILITY,
1852                                                   index, desc, curDevice);
1853        }
1854    }
1855    return status;
1856}
1857
1858status_t AudioPolicyManager::getStreamVolumeIndex(audio_stream_type_t stream,
1859                                                      int *index,
1860                                                      audio_devices_t device)
1861{
1862    if (index == NULL) {
1863        return BAD_VALUE;
1864    }
1865    if (!audio_is_output_device(device)) {
1866        return BAD_VALUE;
1867    }
1868    // if device is AUDIO_DEVICE_OUT_DEFAULT, return volume for device corresponding to
1869    // the strategy the stream belongs to.
1870    if (device == AUDIO_DEVICE_OUT_DEFAULT) {
1871        device = getDeviceForStrategy(getStrategy(stream), true /*fromCache*/);
1872    }
1873    device = Volume::getDeviceForVolume(device);
1874
1875    *index =  mVolumeCurves->getVolumeIndex(stream, device);
1876    ALOGV("getStreamVolumeIndex() stream %d device %08x index %d", stream, device, *index);
1877    return NO_ERROR;
1878}
1879
1880audio_io_handle_t AudioPolicyManager::selectOutputForEffects(
1881                                            const SortedVector<audio_io_handle_t>& outputs)
1882{
1883    // select one output among several suitable for global effects.
1884    // The priority is as follows:
1885    // 1: An offloaded output. If the effect ends up not being offloadable,
1886    //    AudioFlinger will invalidate the track and the offloaded output
1887    //    will be closed causing the effect to be moved to a PCM output.
1888    // 2: A deep buffer output
1889    // 3: the first output in the list
1890
1891    if (outputs.size() == 0) {
1892        return 0;
1893    }
1894
1895    audio_io_handle_t outputOffloaded = 0;
1896    audio_io_handle_t outputDeepBuffer = 0;
1897
1898    for (size_t i = 0; i < outputs.size(); i++) {
1899        sp<SwAudioOutputDescriptor> desc = mOutputs.valueFor(outputs[i]);
1900        ALOGV("selectOutputForEffects outputs[%zu] flags %x", i, desc->mFlags);
1901        if ((desc->mFlags & AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD) != 0) {
1902            outputOffloaded = outputs[i];
1903        }
1904        if ((desc->mFlags & AUDIO_OUTPUT_FLAG_DEEP_BUFFER) != 0) {
1905            outputDeepBuffer = outputs[i];
1906        }
1907    }
1908
1909    ALOGV("selectOutputForEffects outputOffloaded %d outputDeepBuffer %d",
1910          outputOffloaded, outputDeepBuffer);
1911    if (outputOffloaded != 0) {
1912        return outputOffloaded;
1913    }
1914    if (outputDeepBuffer != 0) {
1915        return outputDeepBuffer;
1916    }
1917
1918    return outputs[0];
1919}
1920
1921audio_io_handle_t AudioPolicyManager::getOutputForEffect(const effect_descriptor_t *desc)
1922{
1923    // apply simple rule where global effects are attached to the same output as MUSIC streams
1924
1925    routing_strategy strategy = getStrategy(AUDIO_STREAM_MUSIC);
1926    audio_devices_t device = getDeviceForStrategy(strategy, false /*fromCache*/);
1927    SortedVector<audio_io_handle_t> dstOutputs = getOutputsForDevice(device, mOutputs);
1928
1929    audio_io_handle_t output = selectOutputForEffects(dstOutputs);
1930    ALOGV("getOutputForEffect() got output %d for fx %s flags %x",
1931          output, (desc == NULL) ? "unspecified" : desc->name,  (desc == NULL) ? 0 : desc->flags);
1932
1933    return output;
1934}
1935
1936status_t AudioPolicyManager::registerEffect(const effect_descriptor_t *desc,
1937                                audio_io_handle_t io,
1938                                uint32_t strategy,
1939                                int session,
1940                                int id)
1941{
1942    ssize_t index = mOutputs.indexOfKey(io);
1943    if (index < 0) {
1944        index = mInputs.indexOfKey(io);
1945        if (index < 0) {
1946            ALOGW("registerEffect() unknown io %d", io);
1947            return INVALID_OPERATION;
1948        }
1949    }
1950    return mEffects.registerEffect(desc, io, strategy, session, id);
1951}
1952
1953bool AudioPolicyManager::isStreamActive(audio_stream_type_t stream, uint32_t inPastMs) const
1954{
1955    return mOutputs.isStreamActive(stream, inPastMs);
1956}
1957
1958bool AudioPolicyManager::isStreamActiveRemotely(audio_stream_type_t stream, uint32_t inPastMs) const
1959{
1960    return mOutputs.isStreamActiveRemotely(stream, inPastMs);
1961}
1962
1963bool AudioPolicyManager::isSourceActive(audio_source_t source) const
1964{
1965    for (size_t i = 0; i < mInputs.size(); i++) {
1966        const sp<AudioInputDescriptor>  inputDescriptor = mInputs.valueAt(i);
1967        if (inputDescriptor->isSourceActive(source)) {
1968            return true;
1969        }
1970    }
1971    return false;
1972}
1973
1974// Register a list of custom mixes with their attributes and format.
1975// When a mix is registered, corresponding input and output profiles are
1976// added to the remote submix hw module. The profile contains only the
1977// parameters (sampling rate, format...) specified by the mix.
1978// The corresponding input remote submix device is also connected.
1979//
1980// When a remote submix device is connected, the address is checked to select the
1981// appropriate profile and the corresponding input or output stream is opened.
1982//
1983// When capture starts, getInputForAttr() will:
1984//  - 1 look for a mix matching the address passed in attribtutes tags if any
1985//  - 2 if none found, getDeviceForInputSource() will:
1986//     - 2.1 look for a mix matching the attributes source
1987//     - 2.2 if none found, default to device selection by policy rules
1988// At this time, the corresponding output remote submix device is also connected
1989// and active playback use cases can be transferred to this mix if needed when reconnecting
1990// after AudioTracks are invalidated
1991//
1992// When playback starts, getOutputForAttr() will:
1993//  - 1 look for a mix matching the address passed in attribtutes tags if any
1994//  - 2 if none found, look for a mix matching the attributes usage
1995//  - 3 if none found, default to device and output selection by policy rules.
1996
1997status_t AudioPolicyManager::registerPolicyMixes(Vector<AudioMix> mixes)
1998{
1999    sp<HwModule> module;
2000    for (size_t i = 0; i < mHwModules.size(); i++) {
2001        if (strcmp(AUDIO_HARDWARE_MODULE_ID_REMOTE_SUBMIX, mHwModules[i]->mName) == 0 &&
2002                mHwModules[i]->mHandle != 0) {
2003            module = mHwModules[i];
2004            break;
2005        }
2006    }
2007
2008    if (module == 0) {
2009        return INVALID_OPERATION;
2010    }
2011
2012    ALOGV("registerPolicyMixes() num mixes %zu", mixes.size());
2013
2014    for (size_t i = 0; i < mixes.size(); i++) {
2015        String8 address = mixes[i].mRegistrationId;
2016
2017        if (mPolicyMixes.registerMix(address, mixes[i]) != NO_ERROR) {
2018            continue;
2019        }
2020        audio_config_t outputConfig = mixes[i].mFormat;
2021        audio_config_t inputConfig = mixes[i].mFormat;
2022        // NOTE: audio flinger mixer does not support mono output: configure remote submix HAL in
2023        // stereo and let audio flinger do the channel conversion if needed.
2024        outputConfig.channel_mask = AUDIO_CHANNEL_OUT_STEREO;
2025        inputConfig.channel_mask = AUDIO_CHANNEL_IN_STEREO;
2026        module->addOutputProfile(address, &outputConfig,
2027                                 AUDIO_DEVICE_OUT_REMOTE_SUBMIX, address);
2028        module->addInputProfile(address, &inputConfig,
2029                                 AUDIO_DEVICE_IN_REMOTE_SUBMIX, address);
2030
2031        if (mixes[i].mMixType == MIX_TYPE_PLAYERS) {
2032            setDeviceConnectionStateInt(AUDIO_DEVICE_IN_REMOTE_SUBMIX,
2033                                     AUDIO_POLICY_DEVICE_STATE_AVAILABLE,
2034                                     address.string(), "remote-submix");
2035        } else {
2036            setDeviceConnectionStateInt(AUDIO_DEVICE_OUT_REMOTE_SUBMIX,
2037                                     AUDIO_POLICY_DEVICE_STATE_AVAILABLE,
2038                                     address.string(), "remote-submix");
2039        }
2040    }
2041    return NO_ERROR;
2042}
2043
2044status_t AudioPolicyManager::unregisterPolicyMixes(Vector<AudioMix> mixes)
2045{
2046    sp<HwModule> module;
2047    for (size_t i = 0; i < mHwModules.size(); i++) {
2048        if (strcmp(AUDIO_HARDWARE_MODULE_ID_REMOTE_SUBMIX, mHwModules[i]->mName) == 0 &&
2049                mHwModules[i]->mHandle != 0) {
2050            module = mHwModules[i];
2051            break;
2052        }
2053    }
2054
2055    if (module == 0) {
2056        return INVALID_OPERATION;
2057    }
2058
2059    ALOGV("unregisterPolicyMixes() num mixes %zu", mixes.size());
2060
2061    for (size_t i = 0; i < mixes.size(); i++) {
2062        String8 address = mixes[i].mRegistrationId;
2063
2064        if (mPolicyMixes.unregisterMix(address) != NO_ERROR) {
2065            continue;
2066        }
2067
2068        if (getDeviceConnectionState(AUDIO_DEVICE_IN_REMOTE_SUBMIX, address.string()) ==
2069                                             AUDIO_POLICY_DEVICE_STATE_AVAILABLE)
2070        {
2071            setDeviceConnectionStateInt(AUDIO_DEVICE_IN_REMOTE_SUBMIX,
2072                                     AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE,
2073                                     address.string(), "remote-submix");
2074        }
2075
2076        if (getDeviceConnectionState(AUDIO_DEVICE_OUT_REMOTE_SUBMIX, address.string()) ==
2077                                             AUDIO_POLICY_DEVICE_STATE_AVAILABLE)
2078        {
2079            setDeviceConnectionStateInt(AUDIO_DEVICE_OUT_REMOTE_SUBMIX,
2080                                     AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE,
2081                                     address.string(), "remote-submix");
2082        }
2083        module->removeOutputProfile(address);
2084        module->removeInputProfile(address);
2085    }
2086    return NO_ERROR;
2087}
2088
2089
2090status_t AudioPolicyManager::dump(int fd)
2091{
2092    const size_t SIZE = 256;
2093    char buffer[SIZE];
2094    String8 result;
2095
2096    snprintf(buffer, SIZE, "\nAudioPolicyManager Dump: %p\n", this);
2097    result.append(buffer);
2098
2099    snprintf(buffer, SIZE, " Primary Output: %d\n",
2100             hasPrimaryOutput() ? mPrimaryOutput->mIoHandle : AUDIO_IO_HANDLE_NONE);
2101    result.append(buffer);
2102    snprintf(buffer, SIZE, " Phone state: %d\n", mEngine->getPhoneState());
2103    result.append(buffer);
2104    snprintf(buffer, SIZE, " Force use for communications %d\n",
2105             mEngine->getForceUse(AUDIO_POLICY_FORCE_FOR_COMMUNICATION));
2106    result.append(buffer);
2107    snprintf(buffer, SIZE, " Force use for media %d\n", mEngine->getForceUse(AUDIO_POLICY_FORCE_FOR_MEDIA));
2108    result.append(buffer);
2109    snprintf(buffer, SIZE, " Force use for record %d\n", mEngine->getForceUse(AUDIO_POLICY_FORCE_FOR_RECORD));
2110    result.append(buffer);
2111    snprintf(buffer, SIZE, " Force use for dock %d\n", mEngine->getForceUse(AUDIO_POLICY_FORCE_FOR_DOCK));
2112    result.append(buffer);
2113    snprintf(buffer, SIZE, " Force use for system %d\n", mEngine->getForceUse(AUDIO_POLICY_FORCE_FOR_SYSTEM));
2114    result.append(buffer);
2115    snprintf(buffer, SIZE, " Force use for hdmi system audio %d\n",
2116            mEngine->getForceUse(AUDIO_POLICY_FORCE_FOR_HDMI_SYSTEM_AUDIO));
2117    result.append(buffer);
2118    snprintf(buffer, SIZE, " TTS output %s\n", mTtsOutputAvailable ? "available" : "not available");
2119    result.append(buffer);
2120    snprintf(buffer, SIZE, " Master mono: %s\n", mMasterMono ? "on" : "off");
2121    result.append(buffer);
2122
2123    write(fd, result.string(), result.size());
2124
2125    mAvailableOutputDevices.dump(fd, String8("Available output"));
2126    mAvailableInputDevices.dump(fd, String8("Available input"));
2127    mHwModules.dump(fd);
2128    mOutputs.dump(fd);
2129    mInputs.dump(fd);
2130    mVolumeCurves->dump(fd);
2131    mEffects.dump(fd);
2132    mAudioPatches.dump(fd);
2133
2134    return NO_ERROR;
2135}
2136
2137// This function checks for the parameters which can be offloaded.
2138// This can be enhanced depending on the capability of the DSP and policy
2139// of the system.
2140bool AudioPolicyManager::isOffloadSupported(const audio_offload_info_t& offloadInfo)
2141{
2142    ALOGV("isOffloadSupported: SR=%u, CM=0x%x, Format=0x%x, StreamType=%d,"
2143     " BitRate=%u, duration=%" PRId64 " us, has_video=%d",
2144     offloadInfo.sample_rate, offloadInfo.channel_mask,
2145     offloadInfo.format,
2146     offloadInfo.stream_type, offloadInfo.bit_rate, offloadInfo.duration_us,
2147     offloadInfo.has_video);
2148
2149    if (mMasterMono) {
2150        return false; // no offloading if mono is set.
2151    }
2152
2153    // Check if offload has been disabled
2154    char propValue[PROPERTY_VALUE_MAX];
2155    if (property_get("audio.offload.disable", propValue, "0")) {
2156        if (atoi(propValue) != 0) {
2157            ALOGV("offload disabled by audio.offload.disable=%s", propValue );
2158            return false;
2159        }
2160    }
2161
2162    // Check if stream type is music, then only allow offload as of now.
2163    if (offloadInfo.stream_type != AUDIO_STREAM_MUSIC)
2164    {
2165        ALOGV("isOffloadSupported: stream_type != MUSIC, returning false");
2166        return false;
2167    }
2168
2169    // Check if streaming is off, then only allow offload as of now.
2170    // This is a temporary work around until the root cause is fixed in offload
2171    // playback path.
2172    if (offloadInfo.is_streaming)
2173    {
2174        ALOGV("isOffloadSupported: is_streaming == true, returning false");
2175        return false;
2176    }
2177
2178    //TODO: enable audio offloading with video when ready
2179    const bool allowOffloadWithVideo =
2180            property_get_bool("audio.offload.video", false /* default_value */);
2181    if (offloadInfo.has_video && !allowOffloadWithVideo) {
2182        ALOGV("isOffloadSupported: has_video == true, returning false");
2183        return false;
2184    }
2185
2186    //If duration is less than minimum value defined in property, return false
2187    if (property_get("audio.offload.min.duration.secs", propValue, NULL)) {
2188        if (offloadInfo.duration_us < (atoi(propValue) * 1000000 )) {
2189            ALOGV("Offload denied by duration < audio.offload.min.duration.secs(=%s)", propValue);
2190            return false;
2191        }
2192    } else if (offloadInfo.duration_us < OFFLOAD_DEFAULT_MIN_DURATION_SECS * 1000000) {
2193        ALOGV("Offload denied by duration < default min(=%u)", OFFLOAD_DEFAULT_MIN_DURATION_SECS);
2194        return false;
2195    }
2196
2197    // Do not allow offloading if one non offloadable effect is enabled. This prevents from
2198    // creating an offloaded track and tearing it down immediately after start when audioflinger
2199    // detects there is an active non offloadable effect.
2200    // FIXME: We should check the audio session here but we do not have it in this context.
2201    // This may prevent offloading in rare situations where effects are left active by apps
2202    // in the background.
2203    if (mEffects.isNonOffloadableEffectEnabled()) {
2204        return false;
2205    }
2206
2207    // See if there is a profile to support this.
2208    // AUDIO_DEVICE_NONE
2209    sp<IOProfile> profile = getProfileForDirectOutput(AUDIO_DEVICE_NONE /*ignore device */,
2210                                            offloadInfo.sample_rate,
2211                                            offloadInfo.format,
2212                                            offloadInfo.channel_mask,
2213                                            AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD);
2214    ALOGV("isOffloadSupported() profile %sfound", profile != 0 ? "" : "NOT ");
2215    return (profile != 0);
2216}
2217
2218status_t AudioPolicyManager::listAudioPorts(audio_port_role_t role,
2219                                            audio_port_type_t type,
2220                                            unsigned int *num_ports,
2221                                            struct audio_port *ports,
2222                                            unsigned int *generation)
2223{
2224    if (num_ports == NULL || (*num_ports != 0 && ports == NULL) ||
2225            generation == NULL) {
2226        return BAD_VALUE;
2227    }
2228    ALOGV("listAudioPorts() role %d type %d num_ports %d ports %p", role, type, *num_ports, ports);
2229    if (ports == NULL) {
2230        *num_ports = 0;
2231    }
2232
2233    size_t portsWritten = 0;
2234    size_t portsMax = *num_ports;
2235    *num_ports = 0;
2236    if (type == AUDIO_PORT_TYPE_NONE || type == AUDIO_PORT_TYPE_DEVICE) {
2237        if (role == AUDIO_PORT_ROLE_SINK || role == AUDIO_PORT_ROLE_NONE) {
2238            for (size_t i = 0;
2239                    i  < mAvailableOutputDevices.size() && portsWritten < portsMax; i++) {
2240                mAvailableOutputDevices[i]->toAudioPort(&ports[portsWritten++]);
2241            }
2242            *num_ports += mAvailableOutputDevices.size();
2243        }
2244        if (role == AUDIO_PORT_ROLE_SOURCE || role == AUDIO_PORT_ROLE_NONE) {
2245            for (size_t i = 0;
2246                    i  < mAvailableInputDevices.size() && portsWritten < portsMax; i++) {
2247                mAvailableInputDevices[i]->toAudioPort(&ports[portsWritten++]);
2248            }
2249            *num_ports += mAvailableInputDevices.size();
2250        }
2251    }
2252    if (type == AUDIO_PORT_TYPE_NONE || type == AUDIO_PORT_TYPE_MIX) {
2253        if (role == AUDIO_PORT_ROLE_SINK || role == AUDIO_PORT_ROLE_NONE) {
2254            for (size_t i = 0; i < mInputs.size() && portsWritten < portsMax; i++) {
2255                mInputs[i]->toAudioPort(&ports[portsWritten++]);
2256            }
2257            *num_ports += mInputs.size();
2258        }
2259        if (role == AUDIO_PORT_ROLE_SOURCE || role == AUDIO_PORT_ROLE_NONE) {
2260            size_t numOutputs = 0;
2261            for (size_t i = 0; i < mOutputs.size(); i++) {
2262                if (!mOutputs[i]->isDuplicated()) {
2263                    numOutputs++;
2264                    if (portsWritten < portsMax) {
2265                        mOutputs[i]->toAudioPort(&ports[portsWritten++]);
2266                    }
2267                }
2268            }
2269            *num_ports += numOutputs;
2270        }
2271    }
2272    *generation = curAudioPortGeneration();
2273    ALOGV("listAudioPorts() got %zu ports needed %d", portsWritten, *num_ports);
2274    return NO_ERROR;
2275}
2276
2277status_t AudioPolicyManager::getAudioPort(struct audio_port *port __unused)
2278{
2279    return NO_ERROR;
2280}
2281
2282status_t AudioPolicyManager::createAudioPatch(const struct audio_patch *patch,
2283                                               audio_patch_handle_t *handle,
2284                                               uid_t uid)
2285{
2286    ALOGV("createAudioPatch()");
2287
2288    if (handle == NULL || patch == NULL) {
2289        return BAD_VALUE;
2290    }
2291    ALOGV("createAudioPatch() num sources %d num sinks %d", patch->num_sources, patch->num_sinks);
2292
2293    if (patch->num_sources == 0 || patch->num_sources > AUDIO_PATCH_PORTS_MAX ||
2294            patch->num_sinks == 0 || patch->num_sinks > AUDIO_PATCH_PORTS_MAX) {
2295        return BAD_VALUE;
2296    }
2297    // only one source per audio patch supported for now
2298    if (patch->num_sources > 1) {
2299        return INVALID_OPERATION;
2300    }
2301
2302    if (patch->sources[0].role != AUDIO_PORT_ROLE_SOURCE) {
2303        return INVALID_OPERATION;
2304    }
2305    for (size_t i = 0; i < patch->num_sinks; i++) {
2306        if (patch->sinks[i].role != AUDIO_PORT_ROLE_SINK) {
2307            return INVALID_OPERATION;
2308        }
2309    }
2310
2311    sp<AudioPatch> patchDesc;
2312    ssize_t index = mAudioPatches.indexOfKey(*handle);
2313
2314    ALOGV("createAudioPatch source id %d role %d type %d", patch->sources[0].id,
2315                                                           patch->sources[0].role,
2316                                                           patch->sources[0].type);
2317#if LOG_NDEBUG == 0
2318    for (size_t i = 0; i < patch->num_sinks; i++) {
2319        ALOGV("createAudioPatch sink %zu: id %d role %d type %d", i, patch->sinks[i].id,
2320                                                             patch->sinks[i].role,
2321                                                             patch->sinks[i].type);
2322    }
2323#endif
2324
2325    if (index >= 0) {
2326        patchDesc = mAudioPatches.valueAt(index);
2327        ALOGV("createAudioPatch() mUidCached %d patchDesc->mUid %d uid %d",
2328                                                                  mUidCached, patchDesc->mUid, uid);
2329        if (patchDesc->mUid != mUidCached && uid != patchDesc->mUid) {
2330            return INVALID_OPERATION;
2331        }
2332    } else {
2333        *handle = 0;
2334    }
2335
2336    if (patch->sources[0].type == AUDIO_PORT_TYPE_MIX) {
2337        sp<SwAudioOutputDescriptor> outputDesc = mOutputs.getOutputFromId(patch->sources[0].id);
2338        if (outputDesc == NULL) {
2339            ALOGV("createAudioPatch() output not found for id %d", patch->sources[0].id);
2340            return BAD_VALUE;
2341        }
2342        ALOG_ASSERT(!outputDesc->isDuplicated(),"duplicated output %d in source in ports",
2343                                                outputDesc->mIoHandle);
2344        if (patchDesc != 0) {
2345            if (patchDesc->mPatch.sources[0].id != patch->sources[0].id) {
2346                ALOGV("createAudioPatch() source id differs for patch current id %d new id %d",
2347                                          patchDesc->mPatch.sources[0].id, patch->sources[0].id);
2348                return BAD_VALUE;
2349            }
2350        }
2351        DeviceVector devices;
2352        for (size_t i = 0; i < patch->num_sinks; i++) {
2353            // Only support mix to devices connection
2354            // TODO add support for mix to mix connection
2355            if (patch->sinks[i].type != AUDIO_PORT_TYPE_DEVICE) {
2356                ALOGV("createAudioPatch() source mix but sink is not a device");
2357                return INVALID_OPERATION;
2358            }
2359            sp<DeviceDescriptor> devDesc =
2360                    mAvailableOutputDevices.getDeviceFromId(patch->sinks[i].id);
2361            if (devDesc == 0) {
2362                ALOGV("createAudioPatch() out device not found for id %d", patch->sinks[i].id);
2363                return BAD_VALUE;
2364            }
2365
2366            if (!outputDesc->mProfile->isCompatibleProfile(devDesc->type(),
2367                                                           devDesc->mAddress,
2368                                                           patch->sources[0].sample_rate,
2369                                                           NULL,  // updatedSamplingRate
2370                                                           patch->sources[0].format,
2371                                                           NULL,  // updatedFormat
2372                                                           patch->sources[0].channel_mask,
2373                                                           NULL,  // updatedChannelMask
2374                                                           AUDIO_OUTPUT_FLAG_NONE /*FIXME*/)) {
2375                ALOGV("createAudioPatch() profile not supported for device %08x",
2376                        devDesc->type());
2377                return INVALID_OPERATION;
2378            }
2379            devices.add(devDesc);
2380        }
2381        if (devices.size() == 0) {
2382            return INVALID_OPERATION;
2383        }
2384
2385        // TODO: reconfigure output format and channels here
2386        ALOGV("createAudioPatch() setting device %08x on output %d",
2387              devices.types(), outputDesc->mIoHandle);
2388        setOutputDevice(outputDesc, devices.types(), true, 0, handle);
2389        index = mAudioPatches.indexOfKey(*handle);
2390        if (index >= 0) {
2391            if (patchDesc != 0 && patchDesc != mAudioPatches.valueAt(index)) {
2392                ALOGW("createAudioPatch() setOutputDevice() did not reuse the patch provided");
2393            }
2394            patchDesc = mAudioPatches.valueAt(index);
2395            patchDesc->mUid = uid;
2396            ALOGV("createAudioPatch() success");
2397        } else {
2398            ALOGW("createAudioPatch() setOutputDevice() failed to create a patch");
2399            return INVALID_OPERATION;
2400        }
2401    } else if (patch->sources[0].type == AUDIO_PORT_TYPE_DEVICE) {
2402        if (patch->sinks[0].type == AUDIO_PORT_TYPE_MIX) {
2403            // input device to input mix connection
2404            // only one sink supported when connecting an input device to a mix
2405            if (patch->num_sinks > 1) {
2406                return INVALID_OPERATION;
2407            }
2408            sp<AudioInputDescriptor> inputDesc = mInputs.getInputFromId(patch->sinks[0].id);
2409            if (inputDesc == NULL) {
2410                return BAD_VALUE;
2411            }
2412            if (patchDesc != 0) {
2413                if (patchDesc->mPatch.sinks[0].id != patch->sinks[0].id) {
2414                    return BAD_VALUE;
2415                }
2416            }
2417            sp<DeviceDescriptor> devDesc =
2418                    mAvailableInputDevices.getDeviceFromId(patch->sources[0].id);
2419            if (devDesc == 0) {
2420                return BAD_VALUE;
2421            }
2422
2423            if (!inputDesc->mProfile->isCompatibleProfile(devDesc->type(),
2424                                                          devDesc->mAddress,
2425                                                          patch->sinks[0].sample_rate,
2426                                                          NULL, /*updatedSampleRate*/
2427                                                          patch->sinks[0].format,
2428                                                          NULL, /*updatedFormat*/
2429                                                          patch->sinks[0].channel_mask,
2430                                                          NULL, /*updatedChannelMask*/
2431                                                          // FIXME for the parameter type,
2432                                                          // and the NONE
2433                                                          (audio_output_flags_t)
2434                                                            AUDIO_INPUT_FLAG_NONE)) {
2435                return INVALID_OPERATION;
2436            }
2437            // TODO: reconfigure output format and channels here
2438            ALOGV("createAudioPatch() setting device %08x on output %d",
2439                                                  devDesc->type(), inputDesc->mIoHandle);
2440            setInputDevice(inputDesc->mIoHandle, devDesc->type(), true, handle);
2441            index = mAudioPatches.indexOfKey(*handle);
2442            if (index >= 0) {
2443                if (patchDesc != 0 && patchDesc != mAudioPatches.valueAt(index)) {
2444                    ALOGW("createAudioPatch() setInputDevice() did not reuse the patch provided");
2445                }
2446                patchDesc = mAudioPatches.valueAt(index);
2447                patchDesc->mUid = uid;
2448                ALOGV("createAudioPatch() success");
2449            } else {
2450                ALOGW("createAudioPatch() setInputDevice() failed to create a patch");
2451                return INVALID_OPERATION;
2452            }
2453        } else if (patch->sinks[0].type == AUDIO_PORT_TYPE_DEVICE) {
2454            // device to device connection
2455            if (patchDesc != 0) {
2456                if (patchDesc->mPatch.sources[0].id != patch->sources[0].id) {
2457                    return BAD_VALUE;
2458                }
2459            }
2460            sp<DeviceDescriptor> srcDeviceDesc =
2461                    mAvailableInputDevices.getDeviceFromId(patch->sources[0].id);
2462            if (srcDeviceDesc == 0) {
2463                return BAD_VALUE;
2464            }
2465
2466            //update source and sink with our own data as the data passed in the patch may
2467            // be incomplete.
2468            struct audio_patch newPatch = *patch;
2469            srcDeviceDesc->toAudioPortConfig(&newPatch.sources[0], &patch->sources[0]);
2470
2471            for (size_t i = 0; i < patch->num_sinks; i++) {
2472                if (patch->sinks[i].type != AUDIO_PORT_TYPE_DEVICE) {
2473                    ALOGV("createAudioPatch() source device but one sink is not a device");
2474                    return INVALID_OPERATION;
2475                }
2476
2477                sp<DeviceDescriptor> sinkDeviceDesc =
2478                        mAvailableOutputDevices.getDeviceFromId(patch->sinks[i].id);
2479                if (sinkDeviceDesc == 0) {
2480                    return BAD_VALUE;
2481                }
2482                sinkDeviceDesc->toAudioPortConfig(&newPatch.sinks[i], &patch->sinks[i]);
2483
2484                // create a software bridge in PatchPanel if:
2485                // - source and sink devices are on differnt HW modules OR
2486                // - audio HAL version is < 3.0
2487                if ((srcDeviceDesc->getModuleHandle() != sinkDeviceDesc->getModuleHandle()) ||
2488                        (srcDeviceDesc->mModule->getHalVersion() < AUDIO_DEVICE_API_VERSION_3_0)) {
2489                    // support only one sink device for now to simplify output selection logic
2490                    if (patch->num_sinks > 1) {
2491                        return INVALID_OPERATION;
2492                    }
2493                    SortedVector<audio_io_handle_t> outputs =
2494                                            getOutputsForDevice(sinkDeviceDesc->type(), mOutputs);
2495                    // if the sink device is reachable via an opened output stream, request to go via
2496                    // this output stream by adding a second source to the patch description
2497                    audio_io_handle_t output = selectOutput(outputs,
2498                                                            AUDIO_OUTPUT_FLAG_NONE,
2499                                                            AUDIO_FORMAT_INVALID);
2500                    if (output != AUDIO_IO_HANDLE_NONE) {
2501                        sp<AudioOutputDescriptor> outputDesc = mOutputs.valueFor(output);
2502                        if (outputDesc->isDuplicated()) {
2503                            return INVALID_OPERATION;
2504                        }
2505                        outputDesc->toAudioPortConfig(&newPatch.sources[1], &patch->sources[0]);
2506                        newPatch.sources[1].ext.mix.usecase.stream = AUDIO_STREAM_PATCH;
2507                        newPatch.num_sources = 2;
2508                    }
2509                }
2510            }
2511            // TODO: check from routing capabilities in config file and other conflicting patches
2512
2513            audio_patch_handle_t afPatchHandle = AUDIO_PATCH_HANDLE_NONE;
2514            if (index >= 0) {
2515                afPatchHandle = patchDesc->mAfPatchHandle;
2516            }
2517
2518            status_t status = mpClientInterface->createAudioPatch(&newPatch,
2519                                                                  &afPatchHandle,
2520                                                                  0);
2521            ALOGV("createAudioPatch() patch panel returned %d patchHandle %d",
2522                                                                  status, afPatchHandle);
2523            if (status == NO_ERROR) {
2524                if (index < 0) {
2525                    patchDesc = new AudioPatch(&newPatch, uid);
2526                    addAudioPatch(patchDesc->mHandle, patchDesc);
2527                } else {
2528                    patchDesc->mPatch = newPatch;
2529                }
2530                patchDesc->mAfPatchHandle = afPatchHandle;
2531                *handle = patchDesc->mHandle;
2532                nextAudioPortGeneration();
2533                mpClientInterface->onAudioPatchListUpdate();
2534            } else {
2535                ALOGW("createAudioPatch() patch panel could not connect device patch, error %d",
2536                status);
2537                return INVALID_OPERATION;
2538            }
2539        } else {
2540            return BAD_VALUE;
2541        }
2542    } else {
2543        return BAD_VALUE;
2544    }
2545    return NO_ERROR;
2546}
2547
2548status_t AudioPolicyManager::releaseAudioPatch(audio_patch_handle_t handle,
2549                                                  uid_t uid)
2550{
2551    ALOGV("releaseAudioPatch() patch %d", handle);
2552
2553    ssize_t index = mAudioPatches.indexOfKey(handle);
2554
2555    if (index < 0) {
2556        return BAD_VALUE;
2557    }
2558    sp<AudioPatch> patchDesc = mAudioPatches.valueAt(index);
2559    ALOGV("releaseAudioPatch() mUidCached %d patchDesc->mUid %d uid %d",
2560          mUidCached, patchDesc->mUid, uid);
2561    if (patchDesc->mUid != mUidCached && uid != patchDesc->mUid) {
2562        return INVALID_OPERATION;
2563    }
2564
2565    struct audio_patch *patch = &patchDesc->mPatch;
2566    patchDesc->mUid = mUidCached;
2567    if (patch->sources[0].type == AUDIO_PORT_TYPE_MIX) {
2568        sp<SwAudioOutputDescriptor> outputDesc = mOutputs.getOutputFromId(patch->sources[0].id);
2569        if (outputDesc == NULL) {
2570            ALOGV("releaseAudioPatch() output not found for id %d", patch->sources[0].id);
2571            return BAD_VALUE;
2572        }
2573
2574        setOutputDevice(outputDesc,
2575                        getNewOutputDevice(outputDesc, true /*fromCache*/),
2576                       true,
2577                       0,
2578                       NULL);
2579    } else if (patch->sources[0].type == AUDIO_PORT_TYPE_DEVICE) {
2580        if (patch->sinks[0].type == AUDIO_PORT_TYPE_MIX) {
2581            sp<AudioInputDescriptor> inputDesc = mInputs.getInputFromId(patch->sinks[0].id);
2582            if (inputDesc == NULL) {
2583                ALOGV("releaseAudioPatch() input not found for id %d", patch->sinks[0].id);
2584                return BAD_VALUE;
2585            }
2586            setInputDevice(inputDesc->mIoHandle,
2587                           getNewInputDevice(inputDesc->mIoHandle),
2588                           true,
2589                           NULL);
2590        } else if (patch->sinks[0].type == AUDIO_PORT_TYPE_DEVICE) {
2591            audio_patch_handle_t afPatchHandle = patchDesc->mAfPatchHandle;
2592            status_t status = mpClientInterface->releaseAudioPatch(patchDesc->mAfPatchHandle, 0);
2593            ALOGV("releaseAudioPatch() patch panel returned %d patchHandle %d",
2594                                                              status, patchDesc->mAfPatchHandle);
2595            removeAudioPatch(patchDesc->mHandle);
2596            nextAudioPortGeneration();
2597            mpClientInterface->onAudioPatchListUpdate();
2598        } else {
2599            return BAD_VALUE;
2600        }
2601    } else {
2602        return BAD_VALUE;
2603    }
2604    return NO_ERROR;
2605}
2606
2607status_t AudioPolicyManager::listAudioPatches(unsigned int *num_patches,
2608                                              struct audio_patch *patches,
2609                                              unsigned int *generation)
2610{
2611    if (generation == NULL) {
2612        return BAD_VALUE;
2613    }
2614    *generation = curAudioPortGeneration();
2615    return mAudioPatches.listAudioPatches(num_patches, patches);
2616}
2617
2618status_t AudioPolicyManager::setAudioPortConfig(const struct audio_port_config *config)
2619{
2620    ALOGV("setAudioPortConfig()");
2621
2622    if (config == NULL) {
2623        return BAD_VALUE;
2624    }
2625    ALOGV("setAudioPortConfig() on port handle %d", config->id);
2626    // Only support gain configuration for now
2627    if (config->config_mask != AUDIO_PORT_CONFIG_GAIN) {
2628        return INVALID_OPERATION;
2629    }
2630
2631    sp<AudioPortConfig> audioPortConfig;
2632    if (config->type == AUDIO_PORT_TYPE_MIX) {
2633        if (config->role == AUDIO_PORT_ROLE_SOURCE) {
2634            sp<SwAudioOutputDescriptor> outputDesc = mOutputs.getOutputFromId(config->id);
2635            if (outputDesc == NULL) {
2636                return BAD_VALUE;
2637            }
2638            ALOG_ASSERT(!outputDesc->isDuplicated(),
2639                        "setAudioPortConfig() called on duplicated output %d",
2640                        outputDesc->mIoHandle);
2641            audioPortConfig = outputDesc;
2642        } else if (config->role == AUDIO_PORT_ROLE_SINK) {
2643            sp<AudioInputDescriptor> inputDesc = mInputs.getInputFromId(config->id);
2644            if (inputDesc == NULL) {
2645                return BAD_VALUE;
2646            }
2647            audioPortConfig = inputDesc;
2648        } else {
2649            return BAD_VALUE;
2650        }
2651    } else if (config->type == AUDIO_PORT_TYPE_DEVICE) {
2652        sp<DeviceDescriptor> deviceDesc;
2653        if (config->role == AUDIO_PORT_ROLE_SOURCE) {
2654            deviceDesc = mAvailableInputDevices.getDeviceFromId(config->id);
2655        } else if (config->role == AUDIO_PORT_ROLE_SINK) {
2656            deviceDesc = mAvailableOutputDevices.getDeviceFromId(config->id);
2657        } else {
2658            return BAD_VALUE;
2659        }
2660        if (deviceDesc == NULL) {
2661            return BAD_VALUE;
2662        }
2663        audioPortConfig = deviceDesc;
2664    } else {
2665        return BAD_VALUE;
2666    }
2667
2668    struct audio_port_config backupConfig;
2669    status_t status = audioPortConfig->applyAudioPortConfig(config, &backupConfig);
2670    if (status == NO_ERROR) {
2671        struct audio_port_config newConfig;
2672        audioPortConfig->toAudioPortConfig(&newConfig, config);
2673        status = mpClientInterface->setAudioPortConfig(&newConfig, 0);
2674    }
2675    if (status != NO_ERROR) {
2676        audioPortConfig->applyAudioPortConfig(&backupConfig);
2677    }
2678
2679    return status;
2680}
2681
2682void AudioPolicyManager::releaseResourcesForUid(uid_t uid)
2683{
2684    clearAudioSources(uid);
2685    clearAudioPatches(uid);
2686    clearSessionRoutes(uid);
2687}
2688
2689void AudioPolicyManager::clearAudioPatches(uid_t uid)
2690{
2691    for (ssize_t i = (ssize_t)mAudioPatches.size() - 1; i >= 0; i--)  {
2692        sp<AudioPatch> patchDesc = mAudioPatches.valueAt(i);
2693        if (patchDesc->mUid == uid) {
2694            releaseAudioPatch(mAudioPatches.keyAt(i), uid);
2695        }
2696    }
2697}
2698
2699void AudioPolicyManager::checkStrategyRoute(routing_strategy strategy,
2700                                            audio_io_handle_t ouptutToSkip)
2701{
2702    audio_devices_t device = getDeviceForStrategy(strategy, false /*fromCache*/);
2703    SortedVector<audio_io_handle_t> outputs = getOutputsForDevice(device, mOutputs);
2704    for (size_t j = 0; j < mOutputs.size(); j++) {
2705        if (mOutputs.keyAt(j) == ouptutToSkip) {
2706            continue;
2707        }
2708        sp<SwAudioOutputDescriptor> outputDesc = mOutputs.valueAt(j);
2709        if (!isStrategyActive(outputDesc, (routing_strategy)strategy)) {
2710            continue;
2711        }
2712        // If the default device for this strategy is on another output mix,
2713        // invalidate all tracks in this strategy to force re connection.
2714        // Otherwise select new device on the output mix.
2715        if (outputs.indexOf(mOutputs.keyAt(j)) < 0) {
2716            for (int stream = 0; stream < AUDIO_STREAM_CNT; stream++) {
2717                if (stream == AUDIO_STREAM_PATCH) {
2718                    continue;
2719                }
2720                if (getStrategy((audio_stream_type_t)stream) == strategy) {
2721                    mpClientInterface->invalidateStream((audio_stream_type_t)stream);
2722                }
2723            }
2724        } else {
2725            audio_devices_t newDevice = getNewOutputDevice(outputDesc, false /*fromCache*/);
2726            setOutputDevice(outputDesc, newDevice, false);
2727        }
2728    }
2729}
2730
2731void AudioPolicyManager::clearSessionRoutes(uid_t uid)
2732{
2733    // remove output routes associated with this uid
2734    SortedVector<routing_strategy> affectedStrategies;
2735    for (ssize_t i = (ssize_t)mOutputRoutes.size() - 1; i >= 0; i--)  {
2736        sp<SessionRoute> route = mOutputRoutes.valueAt(i);
2737        if (route->mUid == uid) {
2738            mOutputRoutes.removeItemsAt(i);
2739            if (route->mDeviceDescriptor != 0) {
2740                affectedStrategies.add(getStrategy(route->mStreamType));
2741            }
2742        }
2743    }
2744    // reroute outputs if necessary
2745    for (size_t i = 0; i < affectedStrategies.size(); i++) {
2746        checkStrategyRoute(affectedStrategies[i], AUDIO_IO_HANDLE_NONE);
2747    }
2748
2749    // remove input routes associated with this uid
2750    SortedVector<audio_source_t> affectedSources;
2751    for (ssize_t i = (ssize_t)mInputRoutes.size() - 1; i >= 0; i--)  {
2752        sp<SessionRoute> route = mInputRoutes.valueAt(i);
2753        if (route->mUid == uid) {
2754            mInputRoutes.removeItemsAt(i);
2755            if (route->mDeviceDescriptor != 0) {
2756                affectedSources.add(route->mSource);
2757            }
2758        }
2759    }
2760    // reroute inputs if necessary
2761    SortedVector<audio_io_handle_t> inputsToClose;
2762    for (size_t i = 0; i < mInputs.size(); i++) {
2763        sp<AudioInputDescriptor> inputDesc = mInputs.valueAt(i);
2764        if (affectedSources.indexOf(inputDesc->inputSource()) >= 0) {
2765            inputsToClose.add(inputDesc->mIoHandle);
2766        }
2767    }
2768    for (size_t i = 0; i < inputsToClose.size(); i++) {
2769        closeInput(inputsToClose[i]);
2770    }
2771}
2772
2773void AudioPolicyManager::clearAudioSources(uid_t uid)
2774{
2775    for (ssize_t i = (ssize_t)mAudioSources.size() - 1; i >= 0; i--)  {
2776        sp<AudioSourceDescriptor> sourceDesc = mAudioSources.valueAt(i);
2777        if (sourceDesc->mUid == uid) {
2778            stopAudioSource(mAudioSources.keyAt(i));
2779        }
2780    }
2781}
2782
2783status_t AudioPolicyManager::acquireSoundTriggerSession(audio_session_t *session,
2784                                       audio_io_handle_t *ioHandle,
2785                                       audio_devices_t *device)
2786{
2787    *session = (audio_session_t)mpClientInterface->newAudioUniqueId();
2788    *ioHandle = (audio_io_handle_t)mpClientInterface->newAudioUniqueId();
2789    *device = getDeviceAndMixForInputSource(AUDIO_SOURCE_HOTWORD);
2790
2791    return mSoundTriggerSessions.acquireSession(*session, *ioHandle);
2792}
2793
2794status_t AudioPolicyManager::startAudioSource(const struct audio_port_config *source,
2795                                  const audio_attributes_t *attributes,
2796                                  audio_io_handle_t *handle,
2797                                  uid_t uid)
2798{
2799    ALOGV("%s source %p attributes %p handle %p", __FUNCTION__, source, attributes, handle);
2800    if (source == NULL || attributes == NULL || handle == NULL) {
2801        return BAD_VALUE;
2802    }
2803
2804    *handle = AUDIO_IO_HANDLE_NONE;
2805
2806    if (source->role != AUDIO_PORT_ROLE_SOURCE ||
2807            source->type != AUDIO_PORT_TYPE_DEVICE) {
2808        ALOGV("%s INVALID_OPERATION source->role %d source->type %d", __FUNCTION__, source->role, source->type);
2809        return INVALID_OPERATION;
2810    }
2811
2812    sp<DeviceDescriptor> srcDeviceDesc =
2813            mAvailableInputDevices.getDevice(source->ext.device.type,
2814                                              String8(source->ext.device.address));
2815    if (srcDeviceDesc == 0) {
2816        ALOGV("%s source->ext.device.type %08x not found", __FUNCTION__, source->ext.device.type);
2817        return BAD_VALUE;
2818    }
2819    sp<AudioSourceDescriptor> sourceDesc =
2820            new AudioSourceDescriptor(srcDeviceDesc, attributes, uid);
2821
2822    struct audio_patch dummyPatch;
2823    sp<AudioPatch> patchDesc = new AudioPatch(&dummyPatch, uid);
2824    sourceDesc->mPatchDesc = patchDesc;
2825
2826    status_t status = connectAudioSource(sourceDesc);
2827    if (status == NO_ERROR) {
2828        mAudioSources.add(sourceDesc->getHandle(), sourceDesc);
2829        *handle = sourceDesc->getHandle();
2830    }
2831    return status;
2832}
2833
2834status_t AudioPolicyManager::connectAudioSource(const sp<AudioSourceDescriptor>& sourceDesc)
2835{
2836    ALOGV("%s handle %d", __FUNCTION__, sourceDesc->getHandle());
2837
2838    // make sure we only have one patch per source.
2839    disconnectAudioSource(sourceDesc);
2840
2841    routing_strategy strategy = (routing_strategy) getStrategyForAttr(&sourceDesc->mAttributes);
2842    audio_stream_type_t stream = audio_attributes_to_stream_type(&sourceDesc->mAttributes);
2843    sp<DeviceDescriptor> srcDeviceDesc = sourceDesc->mDevice;
2844
2845    audio_devices_t sinkDevice = getDeviceForStrategy(strategy, true);
2846    sp<DeviceDescriptor> sinkDeviceDesc =
2847            mAvailableOutputDevices.getDevice(sinkDevice, String8(""));
2848
2849    audio_patch_handle_t afPatchHandle = AUDIO_PATCH_HANDLE_NONE;
2850    struct audio_patch *patch = &sourceDesc->mPatchDesc->mPatch;
2851
2852    if (srcDeviceDesc->getAudioPort()->mModule->getHandle() ==
2853            sinkDeviceDesc->getAudioPort()->mModule->getHandle() &&
2854            srcDeviceDesc->getAudioPort()->mModule->getHalVersion() >= AUDIO_DEVICE_API_VERSION_3_0 &&
2855            srcDeviceDesc->getAudioPort()->mGains.size() > 0) {
2856        ALOGV("%s AUDIO_DEVICE_API_VERSION_3_0", __FUNCTION__);
2857        //   create patch between src device and output device
2858        //   create Hwoutput and add to mHwOutputs
2859    } else {
2860        SortedVector<audio_io_handle_t> outputs = getOutputsForDevice(sinkDevice, mOutputs);
2861        audio_io_handle_t output =
2862                selectOutput(outputs, AUDIO_OUTPUT_FLAG_NONE, AUDIO_FORMAT_INVALID);
2863        if (output == AUDIO_IO_HANDLE_NONE) {
2864            ALOGV("%s no output for device %08x", __FUNCTION__, sinkDevice);
2865            return INVALID_OPERATION;
2866        }
2867        sp<SwAudioOutputDescriptor> outputDesc = mOutputs.valueFor(output);
2868        if (outputDesc->isDuplicated()) {
2869            ALOGV("%s output for device %08x is duplicated", __FUNCTION__, sinkDevice);
2870            return INVALID_OPERATION;
2871        }
2872        // create a special patch with no sink and two sources:
2873        // - the second source indicates to PatchPanel through which output mix this patch should
2874        // be connected as well as the stream type for volume control
2875        // - the sink is defined by whatever output device is currently selected for the output
2876        // though which this patch is routed.
2877        patch->num_sinks = 0;
2878        patch->num_sources = 2;
2879        srcDeviceDesc->toAudioPortConfig(&patch->sources[0], NULL);
2880        outputDesc->toAudioPortConfig(&patch->sources[1], NULL);
2881        patch->sources[1].ext.mix.usecase.stream = stream;
2882        status_t status = mpClientInterface->createAudioPatch(patch,
2883                                                              &afPatchHandle,
2884                                                              0);
2885        ALOGV("%s patch panel returned %d patchHandle %d", __FUNCTION__,
2886                                                              status, afPatchHandle);
2887        if (status != NO_ERROR) {
2888            ALOGW("%s patch panel could not connect device patch, error %d",
2889                  __FUNCTION__, status);
2890            return INVALID_OPERATION;
2891        }
2892        uint32_t delayMs = 0;
2893        status = startSource(outputDesc, stream, sinkDevice, &delayMs);
2894
2895        if (status != NO_ERROR) {
2896            mpClientInterface->releaseAudioPatch(sourceDesc->mPatchDesc->mAfPatchHandle, 0);
2897            return status;
2898        }
2899        sourceDesc->mSwOutput = outputDesc;
2900        if (delayMs != 0) {
2901            usleep(delayMs * 1000);
2902        }
2903    }
2904
2905    sourceDesc->mPatchDesc->mAfPatchHandle = afPatchHandle;
2906    addAudioPatch(sourceDesc->mPatchDesc->mHandle, sourceDesc->mPatchDesc);
2907
2908    return NO_ERROR;
2909}
2910
2911status_t AudioPolicyManager::stopAudioSource(audio_io_handle_t handle __unused)
2912{
2913    sp<AudioSourceDescriptor> sourceDesc = mAudioSources.valueFor(handle);
2914    ALOGV("%s handle %d", __FUNCTION__, handle);
2915    if (sourceDesc == 0) {
2916        ALOGW("%s unknown source for handle %d", __FUNCTION__, handle);
2917        return BAD_VALUE;
2918    }
2919    status_t status = disconnectAudioSource(sourceDesc);
2920
2921    mAudioSources.removeItem(handle);
2922    return status;
2923}
2924
2925status_t AudioPolicyManager::setMasterMono(bool mono)
2926{
2927    if (mMasterMono == mono) {
2928        return NO_ERROR;
2929    }
2930    mMasterMono = mono;
2931    // if enabling mono we close all offloaded devices, which will invalidate the
2932    // corresponding AudioTrack. The AudioTrack client/MediaPlayer is responsible
2933    // for recreating the new AudioTrack as non-offloaded PCM.
2934    //
2935    // If disabling mono, we leave all tracks as is: we don't know which clients
2936    // and tracks are able to be recreated as offloaded. The next "song" should
2937    // play back offloaded.
2938    if (mMasterMono) {
2939        Vector<audio_io_handle_t> offloaded;
2940        for (size_t i = 0; i < mOutputs.size(); ++i) {
2941            sp<SwAudioOutputDescriptor> desc = mOutputs.valueAt(i);
2942            if (desc->mFlags & AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD) {
2943                offloaded.push(desc->mIoHandle);
2944            }
2945        }
2946        for (size_t i = 0; i < offloaded.size(); ++i) {
2947            closeOutput(offloaded[i]);
2948        }
2949    }
2950    // update master mono for all remaining outputs
2951    for (size_t i = 0; i < mOutputs.size(); ++i) {
2952        updateMono(mOutputs.keyAt(i));
2953    }
2954    return NO_ERROR;
2955}
2956
2957status_t AudioPolicyManager::getMasterMono(bool *mono)
2958{
2959    *mono = mMasterMono;
2960    return NO_ERROR;
2961}
2962
2963status_t AudioPolicyManager::disconnectAudioSource(const sp<AudioSourceDescriptor>& sourceDesc)
2964{
2965    ALOGV("%s handle %d", __FUNCTION__, sourceDesc->getHandle());
2966
2967    sp<AudioPatch> patchDesc = mAudioPatches.valueFor(sourceDesc->mPatchDesc->mHandle);
2968    if (patchDesc == 0) {
2969        ALOGW("%s source has no patch with handle %d", __FUNCTION__,
2970              sourceDesc->mPatchDesc->mHandle);
2971        return BAD_VALUE;
2972    }
2973    removeAudioPatch(sourceDesc->mPatchDesc->mHandle);
2974
2975    audio_stream_type_t stream = audio_attributes_to_stream_type(&sourceDesc->mAttributes);
2976    sp<SwAudioOutputDescriptor> swOutputDesc = sourceDesc->mSwOutput.promote();
2977    if (swOutputDesc != 0) {
2978        stopSource(swOutputDesc, stream, false);
2979        mpClientInterface->releaseAudioPatch(patchDesc->mAfPatchHandle, 0);
2980    } else {
2981        sp<HwAudioOutputDescriptor> hwOutputDesc = sourceDesc->mHwOutput.promote();
2982        if (hwOutputDesc != 0) {
2983          //   release patch between src device and output device
2984          //   close Hwoutput and remove from mHwOutputs
2985        } else {
2986            ALOGW("%s source has neither SW nor HW output", __FUNCTION__);
2987        }
2988    }
2989    return NO_ERROR;
2990}
2991
2992sp<AudioSourceDescriptor> AudioPolicyManager::getSourceForStrategyOnOutput(
2993        audio_io_handle_t output, routing_strategy strategy)
2994{
2995    sp<AudioSourceDescriptor> source;
2996    for (size_t i = 0; i < mAudioSources.size(); i++)  {
2997        sp<AudioSourceDescriptor> sourceDesc = mAudioSources.valueAt(i);
2998        routing_strategy sourceStrategy =
2999                (routing_strategy) getStrategyForAttr(&sourceDesc->mAttributes);
3000        sp<SwAudioOutputDescriptor> outputDesc = sourceDesc->mSwOutput.promote();
3001        if (sourceStrategy == strategy && outputDesc != 0 && outputDesc->mIoHandle == output) {
3002            source = sourceDesc;
3003            break;
3004        }
3005    }
3006    return source;
3007}
3008
3009// ----------------------------------------------------------------------------
3010// AudioPolicyManager
3011// ----------------------------------------------------------------------------
3012uint32_t AudioPolicyManager::nextAudioPortGeneration()
3013{
3014    return android_atomic_inc(&mAudioPortGeneration);
3015}
3016
3017AudioPolicyManager::AudioPolicyManager(AudioPolicyClientInterface *clientInterface)
3018    :
3019#ifdef AUDIO_POLICY_TEST
3020    Thread(false),
3021#endif //AUDIO_POLICY_TEST
3022    mLimitRingtoneVolume(false), mLastVoiceVolume(-1.0f),
3023    mA2dpSuspended(false),
3024    mAudioPortGeneration(1),
3025    mBeaconMuteRefCount(0),
3026    mBeaconPlayingRefCount(0),
3027    mBeaconMuted(false),
3028    mTtsOutputAvailable(false),
3029    mMasterMono(false)
3030{
3031    mUidCached = getuid();
3032    mpClientInterface = clientInterface;
3033
3034    // TODO: remove when legacy conf file is removed. true on devices that use DRC on the
3035    // DEVICE_CATEGORY_SPEAKER path to boost soft sounds, used to adjust volume curves accordingly.
3036    // Note: remove also speaker_drc_enabled from global configuration of XML config file.
3037    bool speakerDrcEnabled = false;
3038
3039#ifdef USE_XML_AUDIO_POLICY_CONF
3040    mVolumeCurves = new VolumeCurvesCollection();
3041    AudioPolicyConfig config(mHwModules, mAvailableOutputDevices, mAvailableInputDevices,
3042                             mDefaultOutputDevice, speakerDrcEnabled,
3043                             static_cast<VolumeCurvesCollection *>(mVolumeCurves));
3044    PolicySerializer serializer;
3045    if (serializer.deserialize(AUDIO_POLICY_XML_CONFIG_FILE, config) != NO_ERROR) {
3046#else
3047    mVolumeCurves = new StreamDescriptorCollection();
3048    AudioPolicyConfig config(mHwModules, mAvailableOutputDevices, mAvailableInputDevices,
3049                             mDefaultOutputDevice, speakerDrcEnabled);
3050    if ((ConfigParsingUtils::loadConfig(AUDIO_POLICY_VENDOR_CONFIG_FILE, config) != NO_ERROR) &&
3051            (ConfigParsingUtils::loadConfig(AUDIO_POLICY_CONFIG_FILE, config) != NO_ERROR)) {
3052#endif
3053        ALOGE("could not load audio policy configuration file, setting defaults");
3054        config.setDefault();
3055    }
3056    // must be done after reading the policy (since conditionned by Speaker Drc Enabling)
3057    mVolumeCurves->initializeVolumeCurves(speakerDrcEnabled);
3058
3059    // Once policy config has been parsed, retrieve an instance of the engine and initialize it.
3060    audio_policy::EngineInstance *engineInstance = audio_policy::EngineInstance::getInstance();
3061    if (!engineInstance) {
3062        ALOGE("%s:  Could not get an instance of policy engine", __FUNCTION__);
3063        return;
3064    }
3065    // Retrieve the Policy Manager Interface
3066    mEngine = engineInstance->queryInterface<AudioPolicyManagerInterface>();
3067    if (mEngine == NULL) {
3068        ALOGE("%s: Failed to get Policy Engine Interface", __FUNCTION__);
3069        return;
3070    }
3071    mEngine->setObserver(this);
3072    status_t status = mEngine->initCheck();
3073    ALOG_ASSERT(status == NO_ERROR, "Policy engine not initialized(err=%d)", status);
3074
3075    // mAvailableOutputDevices and mAvailableInputDevices now contain all attached devices
3076    // open all output streams needed to access attached devices
3077    audio_devices_t outputDeviceTypes = mAvailableOutputDevices.types();
3078    audio_devices_t inputDeviceTypes = mAvailableInputDevices.types() & ~AUDIO_DEVICE_BIT_IN;
3079    for (size_t i = 0; i < mHwModules.size(); i++) {
3080        mHwModules[i]->mHandle = mpClientInterface->loadHwModule(mHwModules[i]->getName());
3081        if (mHwModules[i]->mHandle == 0) {
3082            ALOGW("could not open HW module %s", mHwModules[i]->getName());
3083            continue;
3084        }
3085        // open all output streams needed to access attached devices
3086        // except for direct output streams that are only opened when they are actually
3087        // required by an app.
3088        // This also validates mAvailableOutputDevices list
3089        for (size_t j = 0; j < mHwModules[i]->mOutputProfiles.size(); j++)
3090        {
3091            const sp<IOProfile> outProfile = mHwModules[i]->mOutputProfiles[j];
3092
3093            if (!outProfile->hasSupportedDevices()) {
3094                ALOGW("Output profile contains no device on module %s", mHwModules[i]->getName());
3095                continue;
3096            }
3097            if ((outProfile->getFlags() & AUDIO_OUTPUT_FLAG_TTS) != 0) {
3098                mTtsOutputAvailable = true;
3099            }
3100
3101            if ((outProfile->getFlags() & AUDIO_OUTPUT_FLAG_DIRECT) != 0) {
3102                continue;
3103            }
3104            audio_devices_t profileType = outProfile->getSupportedDevicesType();
3105            if ((profileType & mDefaultOutputDevice->type()) != AUDIO_DEVICE_NONE) {
3106                profileType = mDefaultOutputDevice->type();
3107            } else {
3108                // chose first device present in profile's SupportedDevices also part of
3109                // outputDeviceTypes
3110                profileType = outProfile->getSupportedDeviceForType(outputDeviceTypes);
3111            }
3112            if ((profileType & outputDeviceTypes) == 0) {
3113                continue;
3114            }
3115            sp<SwAudioOutputDescriptor> outputDesc = new SwAudioOutputDescriptor(outProfile,
3116                                                                                 mpClientInterface);
3117
3118            outputDesc->mDevice = profileType;
3119            audio_config_t config = AUDIO_CONFIG_INITIALIZER;
3120            config.sample_rate = outputDesc->mSamplingRate;
3121            config.channel_mask = outputDesc->mChannelMask;
3122            config.format = outputDesc->mFormat;
3123            audio_io_handle_t output = AUDIO_IO_HANDLE_NONE;
3124            status_t status = mpClientInterface->openOutput(outProfile->getModuleHandle(),
3125                                                            &output,
3126                                                            &config,
3127                                                            &outputDesc->mDevice,
3128                                                            String8(""),
3129                                                            &outputDesc->mLatency,
3130                                                            outputDesc->mFlags);
3131
3132            if (status != NO_ERROR) {
3133                ALOGW("Cannot open output stream for device %08x on hw module %s",
3134                      outputDesc->mDevice,
3135                      mHwModules[i]->getName());
3136            } else {
3137                outputDesc->mSamplingRate = config.sample_rate;
3138                outputDesc->mChannelMask = config.channel_mask;
3139                outputDesc->mFormat = config.format;
3140
3141                const DeviceVector &supportedDevices = outProfile->getSupportedDevices();
3142                for (size_t k = 0; k  < supportedDevices.size(); k++) {
3143                    ssize_t index = mAvailableOutputDevices.indexOf(supportedDevices[k]);
3144                    // give a valid ID to an attached device once confirmed it is reachable
3145                    if (index >= 0 && !mAvailableOutputDevices[index]->isAttached()) {
3146                        mAvailableOutputDevices[index]->attach(mHwModules[i]);
3147                    }
3148                }
3149                if (mPrimaryOutput == 0 &&
3150                        outProfile->getFlags() & AUDIO_OUTPUT_FLAG_PRIMARY) {
3151                    mPrimaryOutput = outputDesc;
3152                }
3153                addOutput(output, outputDesc);
3154                setOutputDevice(outputDesc,
3155                                outputDesc->mDevice,
3156                                true);
3157            }
3158        }
3159        // open input streams needed to access attached devices to validate
3160        // mAvailableInputDevices list
3161        for (size_t j = 0; j < mHwModules[i]->mInputProfiles.size(); j++)
3162        {
3163            const sp<IOProfile> inProfile = mHwModules[i]->mInputProfiles[j];
3164
3165            if (!inProfile->hasSupportedDevices()) {
3166                ALOGW("Input profile contains no device on module %s", mHwModules[i]->getName());
3167                continue;
3168            }
3169            // chose first device present in profile's SupportedDevices also part of
3170            // inputDeviceTypes
3171            audio_devices_t profileType = inProfile->getSupportedDeviceForType(inputDeviceTypes);
3172
3173            if ((profileType & inputDeviceTypes) == 0) {
3174                continue;
3175            }
3176            sp<AudioInputDescriptor> inputDesc =
3177                    new AudioInputDescriptor(inProfile);
3178
3179            inputDesc->mDevice = profileType;
3180
3181            // find the address
3182            DeviceVector inputDevices = mAvailableInputDevices.getDevicesFromType(profileType);
3183            //   the inputs vector must be of size 1, but we don't want to crash here
3184            String8 address = inputDevices.size() > 0 ? inputDevices.itemAt(0)->mAddress
3185                    : String8("");
3186            ALOGV("  for input device 0x%x using address %s", profileType, address.string());
3187            ALOGE_IF(inputDevices.size() == 0, "Input device list is empty!");
3188
3189            audio_config_t config = AUDIO_CONFIG_INITIALIZER;
3190            config.sample_rate = inputDesc->mSamplingRate;
3191            config.channel_mask = inputDesc->mChannelMask;
3192            config.format = inputDesc->mFormat;
3193            audio_io_handle_t input = AUDIO_IO_HANDLE_NONE;
3194            status_t status = mpClientInterface->openInput(inProfile->getModuleHandle(),
3195                                                           &input,
3196                                                           &config,
3197                                                           &inputDesc->mDevice,
3198                                                           address,
3199                                                           AUDIO_SOURCE_MIC,
3200                                                           AUDIO_INPUT_FLAG_NONE);
3201
3202            if (status == NO_ERROR) {
3203                const DeviceVector &supportedDevices = inProfile->getSupportedDevices();
3204                for (size_t k = 0; k  < supportedDevices.size(); k++) {
3205                    ssize_t index =  mAvailableInputDevices.indexOf(supportedDevices[k]);
3206                    // give a valid ID to an attached device once confirmed it is reachable
3207                    if (index >= 0) {
3208                        sp<DeviceDescriptor> devDesc = mAvailableInputDevices[index];
3209                        if (!devDesc->isAttached()) {
3210                            devDesc->attach(mHwModules[i]);
3211                            devDesc->importAudioPort(inProfile);
3212                        }
3213                    }
3214                }
3215                mpClientInterface->closeInput(input);
3216            } else {
3217                ALOGW("Cannot open input stream for device %08x on hw module %s",
3218                      inputDesc->mDevice,
3219                      mHwModules[i]->getName());
3220            }
3221        }
3222    }
3223    // make sure all attached devices have been allocated a unique ID
3224    for (size_t i = 0; i  < mAvailableOutputDevices.size();) {
3225        if (!mAvailableOutputDevices[i]->isAttached()) {
3226            ALOGW("Output device %08x unreachable", mAvailableOutputDevices[i]->type());
3227            mAvailableOutputDevices.remove(mAvailableOutputDevices[i]);
3228            continue;
3229        }
3230        // The device is now validated and can be appended to the available devices of the engine
3231        mEngine->setDeviceConnectionState(mAvailableOutputDevices[i],
3232                                          AUDIO_POLICY_DEVICE_STATE_AVAILABLE);
3233        i++;
3234    }
3235    for (size_t i = 0; i  < mAvailableInputDevices.size();) {
3236        if (!mAvailableInputDevices[i]->isAttached()) {
3237            ALOGW("Input device %08x unreachable", mAvailableInputDevices[i]->type());
3238            mAvailableInputDevices.remove(mAvailableInputDevices[i]);
3239            continue;
3240        }
3241        // The device is now validated and can be appended to the available devices of the engine
3242        mEngine->setDeviceConnectionState(mAvailableInputDevices[i],
3243                                          AUDIO_POLICY_DEVICE_STATE_AVAILABLE);
3244        i++;
3245    }
3246    // make sure default device is reachable
3247    if (mDefaultOutputDevice == 0 || mAvailableOutputDevices.indexOf(mDefaultOutputDevice) < 0) {
3248        ALOGE("Default device %08x is unreachable", mDefaultOutputDevice->type());
3249    }
3250
3251    ALOGE_IF((mPrimaryOutput == 0), "Failed to open primary output");
3252
3253    updateDevicesAndOutputs();
3254
3255#ifdef AUDIO_POLICY_TEST
3256    if (mPrimaryOutput != 0) {
3257        AudioParameter outputCmd = AudioParameter();
3258        outputCmd.addInt(String8("set_id"), 0);
3259        mpClientInterface->setParameters(mPrimaryOutput->mIoHandle, outputCmd.toString());
3260
3261        mTestDevice = AUDIO_DEVICE_OUT_SPEAKER;
3262        mTestSamplingRate = 44100;
3263        mTestFormat = AUDIO_FORMAT_PCM_16_BIT;
3264        mTestChannels =  AUDIO_CHANNEL_OUT_STEREO;
3265        mTestLatencyMs = 0;
3266        mCurOutput = 0;
3267        mDirectOutput = false;
3268        for (int i = 0; i < NUM_TEST_OUTPUTS; i++) {
3269            mTestOutputs[i] = 0;
3270        }
3271
3272        const size_t SIZE = 256;
3273        char buffer[SIZE];
3274        snprintf(buffer, SIZE, "AudioPolicyManagerTest");
3275        run(buffer, ANDROID_PRIORITY_AUDIO);
3276    }
3277#endif //AUDIO_POLICY_TEST
3278}
3279
3280AudioPolicyManager::~AudioPolicyManager()
3281{
3282#ifdef AUDIO_POLICY_TEST
3283    exit();
3284#endif //AUDIO_POLICY_TEST
3285   for (size_t i = 0; i < mOutputs.size(); i++) {
3286        mpClientInterface->closeOutput(mOutputs.keyAt(i));
3287   }
3288   for (size_t i = 0; i < mInputs.size(); i++) {
3289        mpClientInterface->closeInput(mInputs.keyAt(i));
3290   }
3291   mAvailableOutputDevices.clear();
3292   mAvailableInputDevices.clear();
3293   mOutputs.clear();
3294   mInputs.clear();
3295   mHwModules.clear();
3296}
3297
3298status_t AudioPolicyManager::initCheck()
3299{
3300    return hasPrimaryOutput() ? NO_ERROR : NO_INIT;
3301}
3302
3303#ifdef AUDIO_POLICY_TEST
3304bool AudioPolicyManager::threadLoop()
3305{
3306    ALOGV("entering threadLoop()");
3307    while (!exitPending())
3308    {
3309        String8 command;
3310        int valueInt;
3311        String8 value;
3312
3313        Mutex::Autolock _l(mLock);
3314        mWaitWorkCV.waitRelative(mLock, milliseconds(50));
3315
3316        command = mpClientInterface->getParameters(0, String8("test_cmd_policy"));
3317        AudioParameter param = AudioParameter(command);
3318
3319        if (param.getInt(String8("test_cmd_policy"), valueInt) == NO_ERROR &&
3320            valueInt != 0) {
3321            ALOGV("Test command %s received", command.string());
3322            String8 target;
3323            if (param.get(String8("target"), target) != NO_ERROR) {
3324                target = "Manager";
3325            }
3326            if (param.getInt(String8("test_cmd_policy_output"), valueInt) == NO_ERROR) {
3327                param.remove(String8("test_cmd_policy_output"));
3328                mCurOutput = valueInt;
3329            }
3330            if (param.get(String8("test_cmd_policy_direct"), value) == NO_ERROR) {
3331                param.remove(String8("test_cmd_policy_direct"));
3332                if (value == "false") {
3333                    mDirectOutput = false;
3334                } else if (value == "true") {
3335                    mDirectOutput = true;
3336                }
3337            }
3338            if (param.getInt(String8("test_cmd_policy_input"), valueInt) == NO_ERROR) {
3339                param.remove(String8("test_cmd_policy_input"));
3340                mTestInput = valueInt;
3341            }
3342
3343            if (param.get(String8("test_cmd_policy_format"), value) == NO_ERROR) {
3344                param.remove(String8("test_cmd_policy_format"));
3345                int format = AUDIO_FORMAT_INVALID;
3346                if (value == "PCM 16 bits") {
3347                    format = AUDIO_FORMAT_PCM_16_BIT;
3348                } else if (value == "PCM 8 bits") {
3349                    format = AUDIO_FORMAT_PCM_8_BIT;
3350                } else if (value == "Compressed MP3") {
3351                    format = AUDIO_FORMAT_MP3;
3352                }
3353                if (format != AUDIO_FORMAT_INVALID) {
3354                    if (target == "Manager") {
3355                        mTestFormat = format;
3356                    } else if (mTestOutputs[mCurOutput] != 0) {
3357                        AudioParameter outputParam = AudioParameter();
3358                        outputParam.addInt(String8("format"), format);
3359                        mpClientInterface->setParameters(mTestOutputs[mCurOutput], outputParam.toString());
3360                    }
3361                }
3362            }
3363            if (param.get(String8("test_cmd_policy_channels"), value) == NO_ERROR) {
3364                param.remove(String8("test_cmd_policy_channels"));
3365                int channels = 0;
3366
3367                if (value == "Channels Stereo") {
3368                    channels =  AUDIO_CHANNEL_OUT_STEREO;
3369                } else if (value == "Channels Mono") {
3370                    channels =  AUDIO_CHANNEL_OUT_MONO;
3371                }
3372                if (channels != 0) {
3373                    if (target == "Manager") {
3374                        mTestChannels = channels;
3375                    } else if (mTestOutputs[mCurOutput] != 0) {
3376                        AudioParameter outputParam = AudioParameter();
3377                        outputParam.addInt(String8("channels"), channels);
3378                        mpClientInterface->setParameters(mTestOutputs[mCurOutput], outputParam.toString());
3379                    }
3380                }
3381            }
3382            if (param.getInt(String8("test_cmd_policy_sampleRate"), valueInt) == NO_ERROR) {
3383                param.remove(String8("test_cmd_policy_sampleRate"));
3384                if (valueInt >= 0 && valueInt <= 96000) {
3385                    int samplingRate = valueInt;
3386                    if (target == "Manager") {
3387                        mTestSamplingRate = samplingRate;
3388                    } else if (mTestOutputs[mCurOutput] != 0) {
3389                        AudioParameter outputParam = AudioParameter();
3390                        outputParam.addInt(String8("sampling_rate"), samplingRate);
3391                        mpClientInterface->setParameters(mTestOutputs[mCurOutput], outputParam.toString());
3392                    }
3393                }
3394            }
3395
3396            if (param.get(String8("test_cmd_policy_reopen"), value) == NO_ERROR) {
3397                param.remove(String8("test_cmd_policy_reopen"));
3398
3399                mpClientInterface->closeOutput(mpClientInterface->closeOutput(mPrimaryOutput););
3400
3401                audio_module_handle_t moduleHandle = mPrimaryOutput->getModuleHandle();
3402
3403                removeOutput(mPrimaryOutput->mIoHandle);
3404                sp<SwAudioOutputDescriptor> outputDesc = new AudioOutputDescriptor(NULL,
3405                                                                               mpClientInterface);
3406                outputDesc->mDevice = AUDIO_DEVICE_OUT_SPEAKER;
3407                audio_config_t config = AUDIO_CONFIG_INITIALIZER;
3408                config.sample_rate = outputDesc->mSamplingRate;
3409                config.channel_mask = outputDesc->mChannelMask;
3410                config.format = outputDesc->mFormat;
3411                audio_io_handle_t handle;
3412                status_t status = mpClientInterface->openOutput(moduleHandle,
3413                                                                &handle,
3414                                                                &config,
3415                                                                &outputDesc->mDevice,
3416                                                                String8(""),
3417                                                                &outputDesc->mLatency,
3418                                                                outputDesc->mFlags);
3419                if (status != NO_ERROR) {
3420                    ALOGE("Failed to reopen hardware output stream, "
3421                        "samplingRate: %d, format %d, channels %d",
3422                        outputDesc->mSamplingRate, outputDesc->mFormat, outputDesc->mChannelMask);
3423                } else {
3424                    outputDesc->mSamplingRate = config.sample_rate;
3425                    outputDesc->mChannelMask = config.channel_mask;
3426                    outputDesc->mFormat = config.format;
3427                    mPrimaryOutput = outputDesc;
3428                    AudioParameter outputCmd = AudioParameter();
3429                    outputCmd.addInt(String8("set_id"), 0);
3430                    mpClientInterface->setParameters(handle, outputCmd.toString());
3431                    addOutput(handle, outputDesc);
3432                }
3433            }
3434
3435
3436            mpClientInterface->setParameters(0, String8("test_cmd_policy="));
3437        }
3438    }
3439    return false;
3440}
3441
3442void AudioPolicyManager::exit()
3443{
3444    {
3445        AutoMutex _l(mLock);
3446        requestExit();
3447        mWaitWorkCV.signal();
3448    }
3449    requestExitAndWait();
3450}
3451
3452int AudioPolicyManager::testOutputIndex(audio_io_handle_t output)
3453{
3454    for (int i = 0; i < NUM_TEST_OUTPUTS; i++) {
3455        if (output == mTestOutputs[i]) return i;
3456    }
3457    return 0;
3458}
3459#endif //AUDIO_POLICY_TEST
3460
3461// ---
3462
3463void AudioPolicyManager::addOutput(audio_io_handle_t output, sp<SwAudioOutputDescriptor> outputDesc)
3464{
3465    outputDesc->setIoHandle(output);
3466    mOutputs.add(output, outputDesc);
3467    updateMono(output); // update mono status when adding to output list
3468    nextAudioPortGeneration();
3469}
3470
3471void AudioPolicyManager::removeOutput(audio_io_handle_t output)
3472{
3473    mOutputs.removeItem(output);
3474}
3475
3476void AudioPolicyManager::addInput(audio_io_handle_t input, sp<AudioInputDescriptor> inputDesc)
3477{
3478    inputDesc->setIoHandle(input);
3479    mInputs.add(input, inputDesc);
3480    nextAudioPortGeneration();
3481}
3482
3483void AudioPolicyManager::findIoHandlesByAddress(sp<SwAudioOutputDescriptor> desc /*in*/,
3484        const audio_devices_t device /*in*/,
3485        const String8 address /*in*/,
3486        SortedVector<audio_io_handle_t>& outputs /*out*/) {
3487    sp<DeviceDescriptor> devDesc =
3488        desc->mProfile->getSupportedDeviceByAddress(device, address);
3489    if (devDesc != 0) {
3490        ALOGV("findIoHandlesByAddress(): adding opened output %d on same address %s",
3491              desc->mIoHandle, address.string());
3492        outputs.add(desc->mIoHandle);
3493    }
3494}
3495
3496status_t AudioPolicyManager::checkOutputsForDevice(const sp<DeviceDescriptor> devDesc,
3497                                                   audio_policy_dev_state_t state,
3498                                                   SortedVector<audio_io_handle_t>& outputs,
3499                                                   const String8 address)
3500{
3501    audio_devices_t device = devDesc->type();
3502    sp<SwAudioOutputDescriptor> desc;
3503
3504    if (audio_device_is_digital(device)) {
3505        // erase all current sample rates, formats and channel masks
3506        devDesc->clearAudioProfiles();
3507    }
3508
3509    if (state == AUDIO_POLICY_DEVICE_STATE_AVAILABLE) {
3510        // first list already open outputs that can be routed to this device
3511        for (size_t i = 0; i < mOutputs.size(); i++) {
3512            desc = mOutputs.valueAt(i);
3513            if (!desc->isDuplicated() && (desc->supportedDevices() & device)) {
3514                if (!device_distinguishes_on_address(device)) {
3515                    ALOGV("checkOutputsForDevice(): adding opened output %d", mOutputs.keyAt(i));
3516                    outputs.add(mOutputs.keyAt(i));
3517                } else {
3518                    ALOGV("  checking address match due to device 0x%x", device);
3519                    findIoHandlesByAddress(desc, device, address, outputs);
3520                }
3521            }
3522        }
3523        // then look for output profiles that can be routed to this device
3524        SortedVector< sp<IOProfile> > profiles;
3525        for (size_t i = 0; i < mHwModules.size(); i++)
3526        {
3527            if (mHwModules[i]->mHandle == 0) {
3528                continue;
3529            }
3530            for (size_t j = 0; j < mHwModules[i]->mOutputProfiles.size(); j++)
3531            {
3532                sp<IOProfile> profile = mHwModules[i]->mOutputProfiles[j];
3533                if (profile->supportDevice(device)) {
3534                    if (!device_distinguishes_on_address(device) ||
3535                            profile->supportDeviceAddress(address)) {
3536                        profiles.add(profile);
3537                        ALOGV("checkOutputsForDevice(): adding profile %zu from module %zu", j, i);
3538                    }
3539                }
3540            }
3541        }
3542
3543        ALOGV("  found %zu profiles, %zu outputs", profiles.size(), outputs.size());
3544
3545        if (profiles.isEmpty() && outputs.isEmpty()) {
3546            ALOGW("checkOutputsForDevice(): No output available for device %04x", device);
3547            return BAD_VALUE;
3548        }
3549
3550        // open outputs for matching profiles if needed. Direct outputs are also opened to
3551        // query for dynamic parameters and will be closed later by setDeviceConnectionState()
3552        for (ssize_t profile_index = 0; profile_index < (ssize_t)profiles.size(); profile_index++) {
3553            sp<IOProfile> profile = profiles[profile_index];
3554
3555            // nothing to do if one output is already opened for this profile
3556            size_t j;
3557            for (j = 0; j < outputs.size(); j++) {
3558                desc = mOutputs.valueFor(outputs.itemAt(j));
3559                if (!desc->isDuplicated() && desc->mProfile == profile) {
3560                    // matching profile: save the sample rates, format and channel masks supported
3561                    // by the profile in our device descriptor
3562                    if (audio_device_is_digital(device)) {
3563                        devDesc->importAudioPort(profile);
3564                    }
3565                    break;
3566                }
3567            }
3568            if (j != outputs.size()) {
3569                continue;
3570            }
3571
3572            ALOGV("opening output for device %08x with params %s profile %p",
3573                                                      device, address.string(), profile.get());
3574            desc = new SwAudioOutputDescriptor(profile, mpClientInterface);
3575            desc->mDevice = device;
3576            audio_config_t config = AUDIO_CONFIG_INITIALIZER;
3577            config.sample_rate = desc->mSamplingRate;
3578            config.channel_mask = desc->mChannelMask;
3579            config.format = desc->mFormat;
3580            config.offload_info.sample_rate = desc->mSamplingRate;
3581            config.offload_info.channel_mask = desc->mChannelMask;
3582            config.offload_info.format = desc->mFormat;
3583            audio_io_handle_t output = AUDIO_IO_HANDLE_NONE;
3584            status_t status = mpClientInterface->openOutput(profile->getModuleHandle(),
3585                                                            &output,
3586                                                            &config,
3587                                                            &desc->mDevice,
3588                                                            address,
3589                                                            &desc->mLatency,
3590                                                            desc->mFlags);
3591            if (status == NO_ERROR) {
3592                desc->mSamplingRate = config.sample_rate;
3593                desc->mChannelMask = config.channel_mask;
3594                desc->mFormat = config.format;
3595
3596                // Here is where the out_set_parameters() for card & device gets called
3597                if (!address.isEmpty()) {
3598                    char *param = audio_device_address_to_parameter(device, address);
3599                    mpClientInterface->setParameters(output, String8(param));
3600                    free(param);
3601                }
3602                updateAudioProfiles(output, profile->getAudioProfiles());
3603                if (!profile->hasValidAudioProfile()) {
3604                    ALOGW("checkOutputsForDevice() missing param");
3605                    mpClientInterface->closeOutput(output);
3606                    output = AUDIO_IO_HANDLE_NONE;
3607                } else if (profile->hasDynamicAudioProfile()) {
3608                    mpClientInterface->closeOutput(output);
3609                    profile->pickAudioProfile(config.sample_rate, config.channel_mask, config.format);
3610                    config.offload_info.sample_rate = config.sample_rate;
3611                    config.offload_info.channel_mask = config.channel_mask;
3612                    config.offload_info.format = config.format;
3613                    status = mpClientInterface->openOutput(profile->getModuleHandle(),
3614                                                           &output,
3615                                                           &config,
3616                                                           &desc->mDevice,
3617                                                           address,
3618                                                           &desc->mLatency,
3619                                                           desc->mFlags);
3620                    if (status == NO_ERROR) {
3621                        desc->mSamplingRate = config.sample_rate;
3622                        desc->mChannelMask = config.channel_mask;
3623                        desc->mFormat = config.format;
3624                    } else {
3625                        output = AUDIO_IO_HANDLE_NONE;
3626                    }
3627                }
3628
3629                if (output != AUDIO_IO_HANDLE_NONE) {
3630                    addOutput(output, desc);
3631                    if (device_distinguishes_on_address(device) && address != "0") {
3632                        sp<AudioPolicyMix> policyMix;
3633                        if (mPolicyMixes.getAudioPolicyMix(address, policyMix) != NO_ERROR) {
3634                            ALOGE("checkOutputsForDevice() cannot find policy for address %s",
3635                                  address.string());
3636                        }
3637                        policyMix->setOutput(desc);
3638                        desc->mPolicyMix = policyMix->getMix();
3639
3640                    } else if (((desc->mFlags & AUDIO_OUTPUT_FLAG_DIRECT) == 0) &&
3641                                    hasPrimaryOutput()) {
3642                        // no duplicated output for direct outputs and
3643                        // outputs used by dynamic policy mixes
3644                        audio_io_handle_t duplicatedOutput = AUDIO_IO_HANDLE_NONE;
3645
3646                        // set initial stream volume for device
3647                        applyStreamVolumes(desc, device, 0, true);
3648
3649                        //TODO: configure audio effect output stage here
3650
3651                        // open a duplicating output thread for the new output and the primary output
3652                        duplicatedOutput =
3653                                mpClientInterface->openDuplicateOutput(output,
3654                                                                       mPrimaryOutput->mIoHandle);
3655                        if (duplicatedOutput != AUDIO_IO_HANDLE_NONE) {
3656                            // add duplicated output descriptor
3657                            sp<SwAudioOutputDescriptor> dupOutputDesc =
3658                                    new SwAudioOutputDescriptor(NULL, mpClientInterface);
3659                            dupOutputDesc->mOutput1 = mPrimaryOutput;
3660                            dupOutputDesc->mOutput2 = desc;
3661                            dupOutputDesc->mSamplingRate = desc->mSamplingRate;
3662                            dupOutputDesc->mFormat = desc->mFormat;
3663                            dupOutputDesc->mChannelMask = desc->mChannelMask;
3664                            dupOutputDesc->mLatency = desc->mLatency;
3665                            addOutput(duplicatedOutput, dupOutputDesc);
3666                            applyStreamVolumes(dupOutputDesc, device, 0, true);
3667                        } else {
3668                            ALOGW("checkOutputsForDevice() could not open dup output for %d and %d",
3669                                    mPrimaryOutput->mIoHandle, output);
3670                            mpClientInterface->closeOutput(output);
3671                            removeOutput(output);
3672                            nextAudioPortGeneration();
3673                            output = AUDIO_IO_HANDLE_NONE;
3674                        }
3675                    }
3676                }
3677            } else {
3678                output = AUDIO_IO_HANDLE_NONE;
3679            }
3680            if (output == AUDIO_IO_HANDLE_NONE) {
3681                ALOGW("checkOutputsForDevice() could not open output for device %x", device);
3682                profiles.removeAt(profile_index);
3683                profile_index--;
3684            } else {
3685                outputs.add(output);
3686                // Load digital format info only for digital devices
3687                if (audio_device_is_digital(device)) {
3688                    devDesc->importAudioPort(profile);
3689                }
3690
3691                if (device_distinguishes_on_address(device)) {
3692                    ALOGV("checkOutputsForDevice(): setOutputDevice(dev=0x%x, addr=%s)",
3693                            device, address.string());
3694                    setOutputDevice(desc, device, true/*force*/, 0/*delay*/,
3695                            NULL/*patch handle*/, address.string());
3696                }
3697                ALOGV("checkOutputsForDevice(): adding output %d", output);
3698            }
3699        }
3700
3701        if (profiles.isEmpty()) {
3702            ALOGW("checkOutputsForDevice(): No output available for device %04x", device);
3703            return BAD_VALUE;
3704        }
3705    } else { // Disconnect
3706        // check if one opened output is not needed any more after disconnecting one device
3707        for (size_t i = 0; i < mOutputs.size(); i++) {
3708            desc = mOutputs.valueAt(i);
3709            if (!desc->isDuplicated()) {
3710                // exact match on device
3711                if (device_distinguishes_on_address(device) &&
3712                        (desc->supportedDevices() == device)) {
3713                    findIoHandlesByAddress(desc, device, address, outputs);
3714                } else if (!(desc->supportedDevices() & mAvailableOutputDevices.types())) {
3715                    ALOGV("checkOutputsForDevice(): disconnecting adding output %d",
3716                            mOutputs.keyAt(i));
3717                    outputs.add(mOutputs.keyAt(i));
3718                }
3719            }
3720        }
3721        // Clear any profiles associated with the disconnected device.
3722        for (size_t i = 0; i < mHwModules.size(); i++)
3723        {
3724            if (mHwModules[i]->mHandle == 0) {
3725                continue;
3726            }
3727            for (size_t j = 0; j < mHwModules[i]->mOutputProfiles.size(); j++)
3728            {
3729                sp<IOProfile> profile = mHwModules[i]->mOutputProfiles[j];
3730                if (profile->supportDevice(device)) {
3731                    ALOGV("checkOutputsForDevice(): "
3732                            "clearing direct output profile %zu on module %zu", j, i);
3733                    profile->clearAudioProfiles();
3734                }
3735            }
3736        }
3737    }
3738    return NO_ERROR;
3739}
3740
3741status_t AudioPolicyManager::checkInputsForDevice(const sp<DeviceDescriptor> devDesc,
3742                                                  audio_policy_dev_state_t state,
3743                                                  SortedVector<audio_io_handle_t>& inputs,
3744                                                  const String8 address)
3745{
3746    audio_devices_t device = devDesc->type();
3747    sp<AudioInputDescriptor> desc;
3748
3749    if (audio_device_is_digital(device)) {
3750        // erase all current sample rates, formats and channel masks
3751        devDesc->clearAudioProfiles();
3752    }
3753
3754    if (state == AUDIO_POLICY_DEVICE_STATE_AVAILABLE) {
3755        // first list already open inputs that can be routed to this device
3756        for (size_t input_index = 0; input_index < mInputs.size(); input_index++) {
3757            desc = mInputs.valueAt(input_index);
3758            if (desc->mProfile->supportDevice(device)) {
3759                ALOGV("checkInputsForDevice(): adding opened input %d", mInputs.keyAt(input_index));
3760               inputs.add(mInputs.keyAt(input_index));
3761            }
3762        }
3763
3764        // then look for input profiles that can be routed to this device
3765        SortedVector< sp<IOProfile> > profiles;
3766        for (size_t module_idx = 0; module_idx < mHwModules.size(); module_idx++)
3767        {
3768            if (mHwModules[module_idx]->mHandle == 0) {
3769                continue;
3770            }
3771            for (size_t profile_index = 0;
3772                 profile_index < mHwModules[module_idx]->mInputProfiles.size();
3773                 profile_index++)
3774            {
3775                sp<IOProfile> profile = mHwModules[module_idx]->mInputProfiles[profile_index];
3776
3777                if (profile->supportDevice(device)) {
3778                    if (!device_distinguishes_on_address(device) ||
3779                            profile->supportDeviceAddress(address)) {
3780                        profiles.add(profile);
3781                        ALOGV("checkInputsForDevice(): adding profile %zu from module %zu",
3782                              profile_index, module_idx);
3783                    }
3784                }
3785            }
3786        }
3787
3788        if (profiles.isEmpty() && inputs.isEmpty()) {
3789            ALOGW("checkInputsForDevice(): No input available for device 0x%X", device);
3790            return BAD_VALUE;
3791        }
3792
3793        // open inputs for matching profiles if needed. Direct inputs are also opened to
3794        // query for dynamic parameters and will be closed later by setDeviceConnectionState()
3795        for (ssize_t profile_index = 0; profile_index < (ssize_t)profiles.size(); profile_index++) {
3796
3797            sp<IOProfile> profile = profiles[profile_index];
3798            // nothing to do if one input is already opened for this profile
3799            size_t input_index;
3800            for (input_index = 0; input_index < mInputs.size(); input_index++) {
3801                desc = mInputs.valueAt(input_index);
3802                if (desc->mProfile == profile) {
3803                    if (audio_device_is_digital(device)) {
3804                        devDesc->importAudioPort(profile);
3805                    }
3806                    break;
3807                }
3808            }
3809            if (input_index != mInputs.size()) {
3810                continue;
3811            }
3812
3813            ALOGV("opening input for device 0x%X with params %s", device, address.string());
3814            desc = new AudioInputDescriptor(profile);
3815            desc->mDevice = device;
3816            audio_config_t config = AUDIO_CONFIG_INITIALIZER;
3817            config.sample_rate = desc->mSamplingRate;
3818            config.channel_mask = desc->mChannelMask;
3819            config.format = desc->mFormat;
3820            audio_io_handle_t input = AUDIO_IO_HANDLE_NONE;
3821            status_t status = mpClientInterface->openInput(profile->getModuleHandle(),
3822                                                           &input,
3823                                                           &config,
3824                                                           &desc->mDevice,
3825                                                           address,
3826                                                           AUDIO_SOURCE_MIC,
3827                                                           AUDIO_INPUT_FLAG_NONE /*FIXME*/);
3828
3829            if (status == NO_ERROR) {
3830                desc->mSamplingRate = config.sample_rate;
3831                desc->mChannelMask = config.channel_mask;
3832                desc->mFormat = config.format;
3833
3834                if (!address.isEmpty()) {
3835                    char *param = audio_device_address_to_parameter(device, address);
3836                    mpClientInterface->setParameters(input, String8(param));
3837                    free(param);
3838                }
3839                updateAudioProfiles(input, profile->getAudioProfiles());
3840                if (!profile->hasValidAudioProfile()) {
3841                    ALOGW("checkInputsForDevice() direct input missing param");
3842                    mpClientInterface->closeInput(input);
3843                    input = AUDIO_IO_HANDLE_NONE;
3844                }
3845
3846                if (input != 0) {
3847                    addInput(input, desc);
3848                }
3849            } // endif input != 0
3850
3851            if (input == AUDIO_IO_HANDLE_NONE) {
3852                ALOGW("checkInputsForDevice() could not open input for device 0x%X", device);
3853                profiles.removeAt(profile_index);
3854                profile_index--;
3855            } else {
3856                inputs.add(input);
3857                if (audio_device_is_digital(device)) {
3858                    devDesc->importAudioPort(profile);
3859                }
3860                ALOGV("checkInputsForDevice(): adding input %d", input);
3861            }
3862        } // end scan profiles
3863
3864        if (profiles.isEmpty()) {
3865            ALOGW("checkInputsForDevice(): No input available for device 0x%X", device);
3866            return BAD_VALUE;
3867        }
3868    } else {
3869        // Disconnect
3870        // check if one opened input is not needed any more after disconnecting one device
3871        for (size_t input_index = 0; input_index < mInputs.size(); input_index++) {
3872            desc = mInputs.valueAt(input_index);
3873            if (!(desc->mProfile->supportDevice(mAvailableInputDevices.types()))) {
3874                ALOGV("checkInputsForDevice(): disconnecting adding input %d",
3875                      mInputs.keyAt(input_index));
3876                inputs.add(mInputs.keyAt(input_index));
3877            }
3878        }
3879        // Clear any profiles associated with the disconnected device.
3880        for (size_t module_index = 0; module_index < mHwModules.size(); module_index++) {
3881            if (mHwModules[module_index]->mHandle == 0) {
3882                continue;
3883            }
3884            for (size_t profile_index = 0;
3885                 profile_index < mHwModules[module_index]->mInputProfiles.size();
3886                 profile_index++) {
3887                sp<IOProfile> profile = mHwModules[module_index]->mInputProfiles[profile_index];
3888                if (profile->supportDevice(device)) {
3889                    ALOGV("checkInputsForDevice(): clearing direct input profile %zu on module %zu",
3890                          profile_index, module_index);
3891                    profile->clearAudioProfiles();
3892                }
3893            }
3894        }
3895    } // end disconnect
3896
3897    return NO_ERROR;
3898}
3899
3900
3901void AudioPolicyManager::closeOutput(audio_io_handle_t output)
3902{
3903    ALOGV("closeOutput(%d)", output);
3904
3905    sp<SwAudioOutputDescriptor> outputDesc = mOutputs.valueFor(output);
3906    if (outputDesc == NULL) {
3907        ALOGW("closeOutput() unknown output %d", output);
3908        return;
3909    }
3910    mPolicyMixes.closeOutput(outputDesc);
3911
3912    // look for duplicated outputs connected to the output being removed.
3913    for (size_t i = 0; i < mOutputs.size(); i++) {
3914        sp<SwAudioOutputDescriptor> dupOutputDesc = mOutputs.valueAt(i);
3915        if (dupOutputDesc->isDuplicated() &&
3916                (dupOutputDesc->mOutput1 == outputDesc ||
3917                dupOutputDesc->mOutput2 == outputDesc)) {
3918            sp<AudioOutputDescriptor> outputDesc2;
3919            if (dupOutputDesc->mOutput1 == outputDesc) {
3920                outputDesc2 = dupOutputDesc->mOutput2;
3921            } else {
3922                outputDesc2 = dupOutputDesc->mOutput1;
3923            }
3924            // As all active tracks on duplicated output will be deleted,
3925            // and as they were also referenced on the other output, the reference
3926            // count for their stream type must be adjusted accordingly on
3927            // the other output.
3928            for (int j = 0; j < AUDIO_STREAM_CNT; j++) {
3929                int refCount = dupOutputDesc->mRefCount[j];
3930                outputDesc2->changeRefCount((audio_stream_type_t)j,-refCount);
3931            }
3932            audio_io_handle_t duplicatedOutput = mOutputs.keyAt(i);
3933            ALOGV("closeOutput() closing also duplicated output %d", duplicatedOutput);
3934
3935            mpClientInterface->closeOutput(duplicatedOutput);
3936            removeOutput(duplicatedOutput);
3937        }
3938    }
3939
3940    nextAudioPortGeneration();
3941
3942    ssize_t index = mAudioPatches.indexOfKey(outputDesc->getPatchHandle());
3943    if (index >= 0) {
3944        sp<AudioPatch> patchDesc = mAudioPatches.valueAt(index);
3945        status_t status = mpClientInterface->releaseAudioPatch(patchDesc->mAfPatchHandle, 0);
3946        mAudioPatches.removeItemsAt(index);
3947        mpClientInterface->onAudioPatchListUpdate();
3948    }
3949
3950    AudioParameter param;
3951    param.add(String8("closing"), String8("true"));
3952    mpClientInterface->setParameters(output, param.toString());
3953
3954    mpClientInterface->closeOutput(output);
3955    removeOutput(output);
3956    mPreviousOutputs = mOutputs;
3957}
3958
3959void AudioPolicyManager::closeInput(audio_io_handle_t input)
3960{
3961    ALOGV("closeInput(%d)", input);
3962
3963    sp<AudioInputDescriptor> inputDesc = mInputs.valueFor(input);
3964    if (inputDesc == NULL) {
3965        ALOGW("closeInput() unknown input %d", input);
3966        return;
3967    }
3968
3969    nextAudioPortGeneration();
3970
3971    ssize_t index = mAudioPatches.indexOfKey(inputDesc->getPatchHandle());
3972    if (index >= 0) {
3973        sp<AudioPatch> patchDesc = mAudioPatches.valueAt(index);
3974        status_t status = mpClientInterface->releaseAudioPatch(patchDesc->mAfPatchHandle, 0);
3975        mAudioPatches.removeItemsAt(index);
3976        mpClientInterface->onAudioPatchListUpdate();
3977    }
3978
3979    mpClientInterface->closeInput(input);
3980    mInputs.removeItem(input);
3981}
3982
3983SortedVector<audio_io_handle_t> AudioPolicyManager::getOutputsForDevice(
3984                                                                audio_devices_t device,
3985                                                                SwAudioOutputCollection openOutputs)
3986{
3987    SortedVector<audio_io_handle_t> outputs;
3988
3989    ALOGVV("getOutputsForDevice() device %04x", device);
3990    for (size_t i = 0; i < openOutputs.size(); i++) {
3991        ALOGVV("output %d isDuplicated=%d device=%04x",
3992                i, openOutputs.valueAt(i)->isDuplicated(),
3993                openOutputs.valueAt(i)->supportedDevices());
3994        if ((device & openOutputs.valueAt(i)->supportedDevices()) == device) {
3995            ALOGVV("getOutputsForDevice() found output %d", openOutputs.keyAt(i));
3996            outputs.add(openOutputs.keyAt(i));
3997        }
3998    }
3999    return outputs;
4000}
4001
4002bool AudioPolicyManager::vectorsEqual(SortedVector<audio_io_handle_t>& outputs1,
4003                                      SortedVector<audio_io_handle_t>& outputs2)
4004{
4005    if (outputs1.size() != outputs2.size()) {
4006        return false;
4007    }
4008    for (size_t i = 0; i < outputs1.size(); i++) {
4009        if (outputs1[i] != outputs2[i]) {
4010            return false;
4011        }
4012    }
4013    return true;
4014}
4015
4016void AudioPolicyManager::checkOutputForStrategy(routing_strategy strategy)
4017{
4018    audio_devices_t oldDevice = getDeviceForStrategy(strategy, true /*fromCache*/);
4019    audio_devices_t newDevice = getDeviceForStrategy(strategy, false /*fromCache*/);
4020    SortedVector<audio_io_handle_t> srcOutputs = getOutputsForDevice(oldDevice, mPreviousOutputs);
4021    SortedVector<audio_io_handle_t> dstOutputs = getOutputsForDevice(newDevice, mOutputs);
4022
4023    // also take into account external policy-related changes: add all outputs which are
4024    // associated with policies in the "before" and "after" output vectors
4025    ALOGVV("checkOutputForStrategy(): policy related outputs");
4026    for (size_t i = 0 ; i < mPreviousOutputs.size() ; i++) {
4027        const sp<SwAudioOutputDescriptor> desc = mPreviousOutputs.valueAt(i);
4028        if (desc != 0 && desc->mPolicyMix != NULL) {
4029            srcOutputs.add(desc->mIoHandle);
4030            ALOGVV(" previous outputs: adding %d", desc->mIoHandle);
4031        }
4032    }
4033    for (size_t i = 0 ; i < mOutputs.size() ; i++) {
4034        const sp<SwAudioOutputDescriptor> desc = mOutputs.valueAt(i);
4035        if (desc != 0 && desc->mPolicyMix != NULL) {
4036            dstOutputs.add(desc->mIoHandle);
4037            ALOGVV(" new outputs: adding %d", desc->mIoHandle);
4038        }
4039    }
4040
4041    if (!vectorsEqual(srcOutputs,dstOutputs)) {
4042        ALOGV("checkOutputForStrategy() strategy %d, moving from output %d to output %d",
4043              strategy, srcOutputs[0], dstOutputs[0]);
4044        // mute strategy while moving tracks from one output to another
4045        for (size_t i = 0; i < srcOutputs.size(); i++) {
4046            sp<SwAudioOutputDescriptor> desc = mOutputs.valueFor(srcOutputs[i]);
4047            if (isStrategyActive(desc, strategy)) {
4048                setStrategyMute(strategy, true, desc);
4049                setStrategyMute(strategy, false, desc, MUTE_TIME_MS, newDevice);
4050            }
4051            sp<AudioSourceDescriptor> source =
4052                    getSourceForStrategyOnOutput(srcOutputs[i], strategy);
4053            if (source != 0){
4054                connectAudioSource(source);
4055            }
4056        }
4057
4058        // Move effects associated to this strategy from previous output to new output
4059        if (strategy == STRATEGY_MEDIA) {
4060            audio_io_handle_t fxOutput = selectOutputForEffects(dstOutputs);
4061            SortedVector<audio_io_handle_t> moved;
4062            for (size_t i = 0; i < mEffects.size(); i++) {
4063                sp<EffectDescriptor> effectDesc = mEffects.valueAt(i);
4064                if (effectDesc->mSession == AUDIO_SESSION_OUTPUT_MIX &&
4065                        effectDesc->mIo != fxOutput) {
4066                    if (moved.indexOf(effectDesc->mIo) < 0) {
4067                        ALOGV("checkOutputForStrategy() moving effect %d to output %d",
4068                              mEffects.keyAt(i), fxOutput);
4069                        mpClientInterface->moveEffects(AUDIO_SESSION_OUTPUT_MIX, effectDesc->mIo,
4070                                                       fxOutput);
4071                        moved.add(effectDesc->mIo);
4072                    }
4073                    effectDesc->mIo = fxOutput;
4074                }
4075            }
4076        }
4077        // Move tracks associated to this strategy from previous output to new output
4078        for (int i = 0; i < AUDIO_STREAM_CNT; i++) {
4079            if (i == AUDIO_STREAM_PATCH) {
4080                continue;
4081            }
4082            if (getStrategy((audio_stream_type_t)i) == strategy) {
4083                mpClientInterface->invalidateStream((audio_stream_type_t)i);
4084            }
4085        }
4086    }
4087}
4088
4089void AudioPolicyManager::checkOutputForAllStrategies()
4090{
4091    if (mEngine->getForceUse(AUDIO_POLICY_FORCE_FOR_SYSTEM) == AUDIO_POLICY_FORCE_SYSTEM_ENFORCED)
4092        checkOutputForStrategy(STRATEGY_ENFORCED_AUDIBLE);
4093    checkOutputForStrategy(STRATEGY_PHONE);
4094    if (mEngine->getForceUse(AUDIO_POLICY_FORCE_FOR_SYSTEM) != AUDIO_POLICY_FORCE_SYSTEM_ENFORCED)
4095        checkOutputForStrategy(STRATEGY_ENFORCED_AUDIBLE);
4096    checkOutputForStrategy(STRATEGY_SONIFICATION);
4097    checkOutputForStrategy(STRATEGY_SONIFICATION_RESPECTFUL);
4098    checkOutputForStrategy(STRATEGY_ACCESSIBILITY);
4099    checkOutputForStrategy(STRATEGY_MEDIA);
4100    checkOutputForStrategy(STRATEGY_DTMF);
4101    checkOutputForStrategy(STRATEGY_REROUTING);
4102}
4103
4104void AudioPolicyManager::checkA2dpSuspend()
4105{
4106    audio_io_handle_t a2dpOutput = mOutputs.getA2dpOutput();
4107    if (a2dpOutput == 0) {
4108        mA2dpSuspended = false;
4109        return;
4110    }
4111
4112    bool isScoConnected =
4113            ((mAvailableInputDevices.types() & AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET &
4114                    ~AUDIO_DEVICE_BIT_IN) != 0) ||
4115            ((mAvailableOutputDevices.types() & AUDIO_DEVICE_OUT_ALL_SCO) != 0);
4116    // suspend A2DP output if:
4117    //      (NOT already suspended) &&
4118    //      ((SCO device is connected &&
4119    //       (forced usage for communication || for record is SCO))) ||
4120    //      (phone state is ringing || in call)
4121    //
4122    // restore A2DP output if:
4123    //      (Already suspended) &&
4124    //      ((SCO device is NOT connected ||
4125    //       (forced usage NOT for communication && NOT for record is SCO))) &&
4126    //      (phone state is NOT ringing && NOT in call)
4127    //
4128    if (mA2dpSuspended) {
4129        if ((!isScoConnected ||
4130             ((mEngine->getForceUse(AUDIO_POLICY_FORCE_FOR_COMMUNICATION) != AUDIO_POLICY_FORCE_BT_SCO) &&
4131              (mEngine->getForceUse(AUDIO_POLICY_FORCE_FOR_RECORD) != AUDIO_POLICY_FORCE_BT_SCO))) &&
4132             ((mEngine->getPhoneState() != AUDIO_MODE_IN_CALL) &&
4133              (mEngine->getPhoneState() != AUDIO_MODE_RINGTONE))) {
4134
4135            mpClientInterface->restoreOutput(a2dpOutput);
4136            mA2dpSuspended = false;
4137        }
4138    } else {
4139        if ((isScoConnected &&
4140             ((mEngine->getForceUse(AUDIO_POLICY_FORCE_FOR_COMMUNICATION) == AUDIO_POLICY_FORCE_BT_SCO) ||
4141              (mEngine->getForceUse(AUDIO_POLICY_FORCE_FOR_RECORD) == AUDIO_POLICY_FORCE_BT_SCO))) ||
4142             ((mEngine->getPhoneState() == AUDIO_MODE_IN_CALL) ||
4143              (mEngine->getPhoneState() == AUDIO_MODE_RINGTONE))) {
4144
4145            mpClientInterface->suspendOutput(a2dpOutput);
4146            mA2dpSuspended = true;
4147        }
4148    }
4149}
4150
4151audio_devices_t AudioPolicyManager::getNewOutputDevice(const sp<AudioOutputDescriptor>& outputDesc,
4152                                                       bool fromCache)
4153{
4154    audio_devices_t device = AUDIO_DEVICE_NONE;
4155
4156    ssize_t index = mAudioPatches.indexOfKey(outputDesc->getPatchHandle());
4157    if (index >= 0) {
4158        sp<AudioPatch> patchDesc = mAudioPatches.valueAt(index);
4159        if (patchDesc->mUid != mUidCached) {
4160            ALOGV("getNewOutputDevice() device %08x forced by patch %d",
4161                  outputDesc->device(), outputDesc->getPatchHandle());
4162            return outputDesc->device();
4163        }
4164    }
4165
4166    // check the following by order of priority to request a routing change if necessary:
4167    // 1: the strategy enforced audible is active and enforced on the output:
4168    //      use device for strategy enforced audible
4169    // 2: we are in call or the strategy phone is active on the output:
4170    //      use device for strategy phone
4171    // 3: the strategy for enforced audible is active but not enforced on the output:
4172    //      use the device for strategy enforced audible
4173    // 4: the strategy accessibility is active on the output:
4174    //      use device for strategy accessibility
4175    // 5: the strategy sonification is active on the output:
4176    //      use device for strategy sonification
4177    // 6: the strategy "respectful" sonification is active on the output:
4178    //      use device for strategy "respectful" sonification
4179    // 7: the strategy media is active on the output:
4180    //      use device for strategy media
4181    // 8: the strategy DTMF is active on the output:
4182    //      use device for strategy DTMF
4183    // 9: the strategy for beacon, a.k.a. "transmitted through speaker" is active on the output:
4184    //      use device for strategy t-t-s
4185    if (isStrategyActive(outputDesc, STRATEGY_ENFORCED_AUDIBLE) &&
4186        mEngine->getForceUse(AUDIO_POLICY_FORCE_FOR_SYSTEM) == AUDIO_POLICY_FORCE_SYSTEM_ENFORCED) {
4187        device = getDeviceForStrategy(STRATEGY_ENFORCED_AUDIBLE, fromCache);
4188    } else if (isInCall() ||
4189                    isStrategyActive(outputDesc, STRATEGY_PHONE)) {
4190        device = getDeviceForStrategy(STRATEGY_PHONE, fromCache);
4191    } else if (isStrategyActive(outputDesc, STRATEGY_ENFORCED_AUDIBLE)) {
4192        device = getDeviceForStrategy(STRATEGY_ENFORCED_AUDIBLE, fromCache);
4193    } else if (isStrategyActive(outputDesc, STRATEGY_ACCESSIBILITY)) {
4194        device = getDeviceForStrategy(STRATEGY_ACCESSIBILITY, fromCache);
4195    } else if (isStrategyActive(outputDesc, STRATEGY_SONIFICATION)) {
4196        device = getDeviceForStrategy(STRATEGY_SONIFICATION, fromCache);
4197    } else if (isStrategyActive(outputDesc, STRATEGY_SONIFICATION_RESPECTFUL)) {
4198        device = getDeviceForStrategy(STRATEGY_SONIFICATION_RESPECTFUL, fromCache);
4199    } else if (isStrategyActive(outputDesc, STRATEGY_MEDIA)) {
4200        device = getDeviceForStrategy(STRATEGY_MEDIA, fromCache);
4201    } else if (isStrategyActive(outputDesc, STRATEGY_DTMF)) {
4202        device = getDeviceForStrategy(STRATEGY_DTMF, fromCache);
4203    } else if (isStrategyActive(outputDesc, STRATEGY_TRANSMITTED_THROUGH_SPEAKER)) {
4204        device = getDeviceForStrategy(STRATEGY_TRANSMITTED_THROUGH_SPEAKER, fromCache);
4205    } else if (isStrategyActive(outputDesc, STRATEGY_REROUTING)) {
4206        device = getDeviceForStrategy(STRATEGY_REROUTING, fromCache);
4207    }
4208
4209    ALOGV("getNewOutputDevice() selected device %x", device);
4210    return device;
4211}
4212
4213audio_devices_t AudioPolicyManager::getNewInputDevice(audio_io_handle_t input)
4214{
4215    sp<AudioInputDescriptor> inputDesc = mInputs.valueFor(input);
4216
4217    ssize_t index = mAudioPatches.indexOfKey(inputDesc->getPatchHandle());
4218    if (index >= 0) {
4219        sp<AudioPatch> patchDesc = mAudioPatches.valueAt(index);
4220        if (patchDesc->mUid != mUidCached) {
4221            ALOGV("getNewInputDevice() device %08x forced by patch %d",
4222                  inputDesc->mDevice, inputDesc->getPatchHandle());
4223            return inputDesc->mDevice;
4224        }
4225    }
4226
4227    audio_devices_t device = getDeviceAndMixForInputSource(inputDesc->inputSource());
4228
4229    return device;
4230}
4231
4232uint32_t AudioPolicyManager::getStrategyForStream(audio_stream_type_t stream) {
4233    return (uint32_t)getStrategy(stream);
4234}
4235
4236audio_devices_t AudioPolicyManager::getDevicesForStream(audio_stream_type_t stream) {
4237    // By checking the range of stream before calling getStrategy, we avoid
4238    // getStrategy's behavior for invalid streams.  getStrategy would do a ALOGE
4239    // and then return STRATEGY_MEDIA, but we want to return the empty set.
4240    if (stream < (audio_stream_type_t) 0 || stream >= AUDIO_STREAM_PUBLIC_CNT) {
4241        return AUDIO_DEVICE_NONE;
4242    }
4243    audio_devices_t devices;
4244    routing_strategy strategy = getStrategy(stream);
4245    devices = getDeviceForStrategy(strategy, true /*fromCache*/);
4246    SortedVector<audio_io_handle_t> outputs = getOutputsForDevice(devices, mOutputs);
4247    for (size_t i = 0; i < outputs.size(); i++) {
4248        sp<AudioOutputDescriptor> outputDesc = mOutputs.valueFor(outputs[i]);
4249        if (isStrategyActive(outputDesc, strategy)) {
4250            devices = outputDesc->device();
4251            break;
4252        }
4253    }
4254
4255    /*Filter SPEAKER_SAFE out of results, as AudioService doesn't know about it
4256      and doesn't really need to.*/
4257    if (devices & AUDIO_DEVICE_OUT_SPEAKER_SAFE) {
4258        devices |= AUDIO_DEVICE_OUT_SPEAKER;
4259        devices &= ~AUDIO_DEVICE_OUT_SPEAKER_SAFE;
4260    }
4261    return devices;
4262}
4263
4264routing_strategy AudioPolicyManager::getStrategy(audio_stream_type_t stream) const
4265{
4266    ALOG_ASSERT(stream != AUDIO_STREAM_PATCH,"getStrategy() called for AUDIO_STREAM_PATCH");
4267    return mEngine->getStrategyForStream(stream);
4268}
4269
4270uint32_t AudioPolicyManager::getStrategyForAttr(const audio_attributes_t *attr) {
4271    // flags to strategy mapping
4272    if ((attr->flags & AUDIO_FLAG_BEACON) == AUDIO_FLAG_BEACON) {
4273        return (uint32_t) STRATEGY_TRANSMITTED_THROUGH_SPEAKER;
4274    }
4275    if ((attr->flags & AUDIO_FLAG_AUDIBILITY_ENFORCED) == AUDIO_FLAG_AUDIBILITY_ENFORCED) {
4276        return (uint32_t) STRATEGY_ENFORCED_AUDIBLE;
4277    }
4278    // usage to strategy mapping
4279    return static_cast<uint32_t>(mEngine->getStrategyForUsage(attr->usage));
4280}
4281
4282void AudioPolicyManager::handleNotificationRoutingForStream(audio_stream_type_t stream) {
4283    switch(stream) {
4284    case AUDIO_STREAM_MUSIC:
4285        checkOutputForStrategy(STRATEGY_SONIFICATION_RESPECTFUL);
4286        updateDevicesAndOutputs();
4287        break;
4288    default:
4289        break;
4290    }
4291}
4292
4293uint32_t AudioPolicyManager::handleEventForBeacon(int event) {
4294
4295    // skip beacon mute management if a dedicated TTS output is available
4296    if (mTtsOutputAvailable) {
4297        return 0;
4298    }
4299
4300    switch(event) {
4301    case STARTING_OUTPUT:
4302        mBeaconMuteRefCount++;
4303        break;
4304    case STOPPING_OUTPUT:
4305        if (mBeaconMuteRefCount > 0) {
4306            mBeaconMuteRefCount--;
4307        }
4308        break;
4309    case STARTING_BEACON:
4310        mBeaconPlayingRefCount++;
4311        break;
4312    case STOPPING_BEACON:
4313        if (mBeaconPlayingRefCount > 0) {
4314            mBeaconPlayingRefCount--;
4315        }
4316        break;
4317    }
4318
4319    if (mBeaconMuteRefCount > 0) {
4320        // any playback causes beacon to be muted
4321        return setBeaconMute(true);
4322    } else {
4323        // no other playback: unmute when beacon starts playing, mute when it stops
4324        return setBeaconMute(mBeaconPlayingRefCount == 0);
4325    }
4326}
4327
4328uint32_t AudioPolicyManager::setBeaconMute(bool mute) {
4329    ALOGV("setBeaconMute(%d) mBeaconMuteRefCount=%d mBeaconPlayingRefCount=%d",
4330            mute, mBeaconMuteRefCount, mBeaconPlayingRefCount);
4331    // keep track of muted state to avoid repeating mute/unmute operations
4332    if (mBeaconMuted != mute) {
4333        // mute/unmute AUDIO_STREAM_TTS on all outputs
4334        ALOGV("\t muting %d", mute);
4335        uint32_t maxLatency = 0;
4336        for (size_t i = 0; i < mOutputs.size(); i++) {
4337            sp<SwAudioOutputDescriptor> desc = mOutputs.valueAt(i);
4338            setStreamMute(AUDIO_STREAM_TTS, mute/*on*/,
4339                    desc,
4340                    0 /*delay*/, AUDIO_DEVICE_NONE);
4341            const uint32_t latency = desc->latency() * 2;
4342            if (latency > maxLatency) {
4343                maxLatency = latency;
4344            }
4345        }
4346        mBeaconMuted = mute;
4347        return maxLatency;
4348    }
4349    return 0;
4350}
4351
4352audio_devices_t AudioPolicyManager::getDeviceForStrategy(routing_strategy strategy,
4353                                                         bool fromCache)
4354{
4355    // Routing
4356    // see if we have an explicit route
4357    // scan the whole RouteMap, for each entry, convert the stream type to a strategy
4358    // (getStrategy(stream)).
4359    // if the strategy from the stream type in the RouteMap is the same as the argument above,
4360    // and activity count is non-zero
4361    // the device = the device from the descriptor in the RouteMap, and exit.
4362    for (size_t routeIndex = 0; routeIndex < mOutputRoutes.size(); routeIndex++) {
4363        sp<SessionRoute> route = mOutputRoutes.valueAt(routeIndex);
4364        routing_strategy strat = getStrategy(route->mStreamType);
4365        // Special case for accessibility strategy which must follow any strategy it is
4366        // currently remapped to
4367        bool strategyMatch = (strat == strategy) ||
4368                             ((strategy == STRATEGY_ACCESSIBILITY) &&
4369                              ((mEngine->getStrategyForUsage(
4370                                      AUDIO_USAGE_ASSISTANCE_ACCESSIBILITY) == strat) ||
4371                               (strat == STRATEGY_MEDIA)));
4372        if (strategyMatch && route->isActive()) {
4373            return route->mDeviceDescriptor->type();
4374        }
4375    }
4376
4377    if (fromCache) {
4378        ALOGVV("getDeviceForStrategy() from cache strategy %d, device %x",
4379              strategy, mDeviceForStrategy[strategy]);
4380        return mDeviceForStrategy[strategy];
4381    }
4382    return mEngine->getDeviceForStrategy(strategy);
4383}
4384
4385void AudioPolicyManager::updateDevicesAndOutputs()
4386{
4387    for (int i = 0; i < NUM_STRATEGIES; i++) {
4388        mDeviceForStrategy[i] = getDeviceForStrategy((routing_strategy)i, false /*fromCache*/);
4389    }
4390    mPreviousOutputs = mOutputs;
4391}
4392
4393uint32_t AudioPolicyManager::checkDeviceMuteStrategies(sp<AudioOutputDescriptor> outputDesc,
4394                                                       audio_devices_t prevDevice,
4395                                                       uint32_t delayMs)
4396{
4397    // mute/unmute strategies using an incompatible device combination
4398    // if muting, wait for the audio in pcm buffer to be drained before proceeding
4399    // if unmuting, unmute only after the specified delay
4400    if (outputDesc->isDuplicated()) {
4401        return 0;
4402    }
4403
4404    uint32_t muteWaitMs = 0;
4405    audio_devices_t device = outputDesc->device();
4406    bool shouldMute = outputDesc->isActive() && (popcount(device) >= 2);
4407
4408    for (size_t i = 0; i < NUM_STRATEGIES; i++) {
4409        audio_devices_t curDevice = getDeviceForStrategy((routing_strategy)i, false /*fromCache*/);
4410        curDevice = curDevice & outputDesc->supportedDevices();
4411        bool mute = shouldMute && (curDevice & device) && (curDevice != device);
4412        bool doMute = false;
4413
4414        if (mute && !outputDesc->mStrategyMutedByDevice[i]) {
4415            doMute = true;
4416            outputDesc->mStrategyMutedByDevice[i] = true;
4417        } else if (!mute && outputDesc->mStrategyMutedByDevice[i]){
4418            doMute = true;
4419            outputDesc->mStrategyMutedByDevice[i] = false;
4420        }
4421        if (doMute) {
4422            for (size_t j = 0; j < mOutputs.size(); j++) {
4423                sp<AudioOutputDescriptor> desc = mOutputs.valueAt(j);
4424                // skip output if it does not share any device with current output
4425                if ((desc->supportedDevices() & outputDesc->supportedDevices())
4426                        == AUDIO_DEVICE_NONE) {
4427                    continue;
4428                }
4429                ALOGVV("checkDeviceMuteStrategies() %s strategy %d (curDevice %04x)",
4430                      mute ? "muting" : "unmuting", i, curDevice);
4431                setStrategyMute((routing_strategy)i, mute, desc, mute ? 0 : delayMs);
4432                if (isStrategyActive(desc, (routing_strategy)i)) {
4433                    if (mute) {
4434                        // FIXME: should not need to double latency if volume could be applied
4435                        // immediately by the audioflinger mixer. We must account for the delay
4436                        // between now and the next time the audioflinger thread for this output
4437                        // will process a buffer (which corresponds to one buffer size,
4438                        // usually 1/2 or 1/4 of the latency).
4439                        if (muteWaitMs < desc->latency() * 2) {
4440                            muteWaitMs = desc->latency() * 2;
4441                        }
4442                    }
4443                }
4444            }
4445        }
4446    }
4447
4448    // temporary mute output if device selection changes to avoid volume bursts due to
4449    // different per device volumes
4450    if (outputDesc->isActive() && (device != prevDevice)) {
4451        if (muteWaitMs < outputDesc->latency() * 2) {
4452            muteWaitMs = outputDesc->latency() * 2;
4453        }
4454        for (size_t i = 0; i < NUM_STRATEGIES; i++) {
4455            if (isStrategyActive(outputDesc, (routing_strategy)i)) {
4456                setStrategyMute((routing_strategy)i, true, outputDesc);
4457                // do tempMute unmute after twice the mute wait time
4458                setStrategyMute((routing_strategy)i, false, outputDesc,
4459                                muteWaitMs *2, device);
4460            }
4461        }
4462    }
4463
4464    // wait for the PCM output buffers to empty before proceeding with the rest of the command
4465    if (muteWaitMs > delayMs) {
4466        muteWaitMs -= delayMs;
4467        usleep(muteWaitMs * 1000);
4468        return muteWaitMs;
4469    }
4470    return 0;
4471}
4472
4473uint32_t AudioPolicyManager::setOutputDevice(const sp<AudioOutputDescriptor>& outputDesc,
4474                                             audio_devices_t device,
4475                                             bool force,
4476                                             int delayMs,
4477                                             audio_patch_handle_t *patchHandle,
4478                                             const char* address)
4479{
4480    ALOGV("setOutputDevice() device %04x delayMs %d", device, delayMs);
4481    AudioParameter param;
4482    uint32_t muteWaitMs;
4483
4484    if (outputDesc->isDuplicated()) {
4485        muteWaitMs = setOutputDevice(outputDesc->subOutput1(), device, force, delayMs);
4486        muteWaitMs += setOutputDevice(outputDesc->subOutput2(), device, force, delayMs);
4487        return muteWaitMs;
4488    }
4489    // no need to proceed if new device is not AUDIO_DEVICE_NONE and not supported by current
4490    // output profile
4491    if ((device != AUDIO_DEVICE_NONE) &&
4492            ((device & outputDesc->supportedDevices()) == 0)) {
4493        return 0;
4494    }
4495
4496    // filter devices according to output selected
4497    device = (audio_devices_t)(device & outputDesc->supportedDevices());
4498
4499    audio_devices_t prevDevice = outputDesc->mDevice;
4500
4501    ALOGV("setOutputDevice() prevDevice 0x%04x", prevDevice);
4502
4503    if (device != AUDIO_DEVICE_NONE) {
4504        outputDesc->mDevice = device;
4505    }
4506    muteWaitMs = checkDeviceMuteStrategies(outputDesc, prevDevice, delayMs);
4507
4508    // Do not change the routing if:
4509    //      the requested device is AUDIO_DEVICE_NONE
4510    //      OR the requested device is the same as current device
4511    //  AND force is not specified
4512    //  AND the output is connected by a valid audio patch.
4513    // Doing this check here allows the caller to call setOutputDevice() without conditions
4514    if ((device == AUDIO_DEVICE_NONE || device == prevDevice) &&
4515        !force &&
4516        outputDesc->getPatchHandle() != 0) {
4517        ALOGV("setOutputDevice() setting same device 0x%04x or null device", device);
4518        return muteWaitMs;
4519    }
4520
4521    ALOGV("setOutputDevice() changing device");
4522
4523    // do the routing
4524    if (device == AUDIO_DEVICE_NONE) {
4525        resetOutputDevice(outputDesc, delayMs, NULL);
4526    } else {
4527        DeviceVector deviceList = (address == NULL) ?
4528                mAvailableOutputDevices.getDevicesFromType(device)
4529                : mAvailableOutputDevices.getDevicesFromTypeAddr(device, String8(address));
4530        if (!deviceList.isEmpty()) {
4531            struct audio_patch patch;
4532            outputDesc->toAudioPortConfig(&patch.sources[0]);
4533            patch.num_sources = 1;
4534            patch.num_sinks = 0;
4535            for (size_t i = 0; i < deviceList.size() && i < AUDIO_PATCH_PORTS_MAX; i++) {
4536                deviceList.itemAt(i)->toAudioPortConfig(&patch.sinks[i]);
4537                patch.num_sinks++;
4538            }
4539            ssize_t index;
4540            if (patchHandle && *patchHandle != AUDIO_PATCH_HANDLE_NONE) {
4541                index = mAudioPatches.indexOfKey(*patchHandle);
4542            } else {
4543                index = mAudioPatches.indexOfKey(outputDesc->getPatchHandle());
4544            }
4545            sp< AudioPatch> patchDesc;
4546            audio_patch_handle_t afPatchHandle = AUDIO_PATCH_HANDLE_NONE;
4547            if (index >= 0) {
4548                patchDesc = mAudioPatches.valueAt(index);
4549                afPatchHandle = patchDesc->mAfPatchHandle;
4550            }
4551
4552            status_t status = mpClientInterface->createAudioPatch(&patch,
4553                                                                   &afPatchHandle,
4554                                                                   delayMs);
4555            ALOGV("setOutputDevice() createAudioPatch returned %d patchHandle %d"
4556                    "num_sources %d num_sinks %d",
4557                                       status, afPatchHandle, patch.num_sources, patch.num_sinks);
4558            if (status == NO_ERROR) {
4559                if (index < 0) {
4560                    patchDesc = new AudioPatch(&patch, mUidCached);
4561                    addAudioPatch(patchDesc->mHandle, patchDesc);
4562                } else {
4563                    patchDesc->mPatch = patch;
4564                }
4565                patchDesc->mAfPatchHandle = afPatchHandle;
4566                if (patchHandle) {
4567                    *patchHandle = patchDesc->mHandle;
4568                }
4569                outputDesc->setPatchHandle(patchDesc->mHandle);
4570                nextAudioPortGeneration();
4571                mpClientInterface->onAudioPatchListUpdate();
4572            }
4573        }
4574
4575        // inform all input as well
4576        for (size_t i = 0; i < mInputs.size(); i++) {
4577            const sp<AudioInputDescriptor>  inputDescriptor = mInputs.valueAt(i);
4578            if (!is_virtual_input_device(inputDescriptor->mDevice)) {
4579                AudioParameter inputCmd = AudioParameter();
4580                ALOGV("%s: inform input %d of device:%d", __func__,
4581                      inputDescriptor->mIoHandle, device);
4582                inputCmd.addInt(String8(AudioParameter::keyRouting),device);
4583                mpClientInterface->setParameters(inputDescriptor->mIoHandle,
4584                                                 inputCmd.toString(),
4585                                                 delayMs);
4586            }
4587        }
4588    }
4589
4590    // update stream volumes according to new device
4591    applyStreamVolumes(outputDesc, device, delayMs);
4592
4593    return muteWaitMs;
4594}
4595
4596status_t AudioPolicyManager::resetOutputDevice(const sp<AudioOutputDescriptor>& outputDesc,
4597                                               int delayMs,
4598                                               audio_patch_handle_t *patchHandle)
4599{
4600    ssize_t index;
4601    if (patchHandle) {
4602        index = mAudioPatches.indexOfKey(*patchHandle);
4603    } else {
4604        index = mAudioPatches.indexOfKey(outputDesc->getPatchHandle());
4605    }
4606    if (index < 0) {
4607        return INVALID_OPERATION;
4608    }
4609    sp< AudioPatch> patchDesc = mAudioPatches.valueAt(index);
4610    status_t status = mpClientInterface->releaseAudioPatch(patchDesc->mAfPatchHandle, delayMs);
4611    ALOGV("resetOutputDevice() releaseAudioPatch returned %d", status);
4612    outputDesc->setPatchHandle(0);
4613    removeAudioPatch(patchDesc->mHandle);
4614    nextAudioPortGeneration();
4615    mpClientInterface->onAudioPatchListUpdate();
4616    return status;
4617}
4618
4619status_t AudioPolicyManager::setInputDevice(audio_io_handle_t input,
4620                                            audio_devices_t device,
4621                                            bool force,
4622                                            audio_patch_handle_t *patchHandle)
4623{
4624    status_t status = NO_ERROR;
4625
4626    sp<AudioInputDescriptor> inputDesc = mInputs.valueFor(input);
4627    if ((device != AUDIO_DEVICE_NONE) && ((device != inputDesc->mDevice) || force)) {
4628        inputDesc->mDevice = device;
4629
4630        DeviceVector deviceList = mAvailableInputDevices.getDevicesFromType(device);
4631        if (!deviceList.isEmpty()) {
4632            struct audio_patch patch;
4633            inputDesc->toAudioPortConfig(&patch.sinks[0]);
4634            // AUDIO_SOURCE_HOTWORD is for internal use only:
4635            // handled as AUDIO_SOURCE_VOICE_RECOGNITION by the audio HAL
4636            if (patch.sinks[0].ext.mix.usecase.source == AUDIO_SOURCE_HOTWORD &&
4637                    !inputDesc->isSoundTrigger()) {
4638                patch.sinks[0].ext.mix.usecase.source = AUDIO_SOURCE_VOICE_RECOGNITION;
4639            }
4640            patch.num_sinks = 1;
4641            //only one input device for now
4642            deviceList.itemAt(0)->toAudioPortConfig(&patch.sources[0]);
4643            patch.num_sources = 1;
4644            ssize_t index;
4645            if (patchHandle && *patchHandle != AUDIO_PATCH_HANDLE_NONE) {
4646                index = mAudioPatches.indexOfKey(*patchHandle);
4647            } else {
4648                index = mAudioPatches.indexOfKey(inputDesc->getPatchHandle());
4649            }
4650            sp< AudioPatch> patchDesc;
4651            audio_patch_handle_t afPatchHandle = AUDIO_PATCH_HANDLE_NONE;
4652            if (index >= 0) {
4653                patchDesc = mAudioPatches.valueAt(index);
4654                afPatchHandle = patchDesc->mAfPatchHandle;
4655            }
4656
4657            status_t status = mpClientInterface->createAudioPatch(&patch,
4658                                                                  &afPatchHandle,
4659                                                                  0);
4660            ALOGV("setInputDevice() createAudioPatch returned %d patchHandle %d",
4661                                                                          status, afPatchHandle);
4662            if (status == NO_ERROR) {
4663                if (index < 0) {
4664                    patchDesc = new AudioPatch(&patch, mUidCached);
4665                    addAudioPatch(patchDesc->mHandle, patchDesc);
4666                } else {
4667                    patchDesc->mPatch = patch;
4668                }
4669                patchDesc->mAfPatchHandle = afPatchHandle;
4670                if (patchHandle) {
4671                    *patchHandle = patchDesc->mHandle;
4672                }
4673                inputDesc->setPatchHandle(patchDesc->mHandle);
4674                nextAudioPortGeneration();
4675                mpClientInterface->onAudioPatchListUpdate();
4676            }
4677        }
4678    }
4679    return status;
4680}
4681
4682status_t AudioPolicyManager::resetInputDevice(audio_io_handle_t input,
4683                                              audio_patch_handle_t *patchHandle)
4684{
4685    sp<AudioInputDescriptor> inputDesc = mInputs.valueFor(input);
4686    ssize_t index;
4687    if (patchHandle) {
4688        index = mAudioPatches.indexOfKey(*patchHandle);
4689    } else {
4690        index = mAudioPatches.indexOfKey(inputDesc->getPatchHandle());
4691    }
4692    if (index < 0) {
4693        return INVALID_OPERATION;
4694    }
4695    sp< AudioPatch> patchDesc = mAudioPatches.valueAt(index);
4696    status_t status = mpClientInterface->releaseAudioPatch(patchDesc->mAfPatchHandle, 0);
4697    ALOGV("resetInputDevice() releaseAudioPatch returned %d", status);
4698    inputDesc->setPatchHandle(0);
4699    removeAudioPatch(patchDesc->mHandle);
4700    nextAudioPortGeneration();
4701    mpClientInterface->onAudioPatchListUpdate();
4702    return status;
4703}
4704
4705sp<IOProfile> AudioPolicyManager::getInputProfile(audio_devices_t device,
4706                                                  String8 address,
4707                                                  uint32_t& samplingRate,
4708                                                  audio_format_t& format,
4709                                                  audio_channel_mask_t& channelMask,
4710                                                  audio_input_flags_t flags)
4711{
4712    // Choose an input profile based on the requested capture parameters: select the first available
4713    // profile supporting all requested parameters.
4714    //
4715    // TODO: perhaps isCompatibleProfile should return a "matching" score so we can return
4716    // the best matching profile, not the first one.
4717
4718    for (size_t i = 0; i < mHwModules.size(); i++)
4719    {
4720        if (mHwModules[i]->mHandle == 0) {
4721            continue;
4722        }
4723        for (size_t j = 0; j < mHwModules[i]->mInputProfiles.size(); j++)
4724        {
4725            sp<IOProfile> profile = mHwModules[i]->mInputProfiles[j];
4726            // profile->log();
4727            if (profile->isCompatibleProfile(device, address, samplingRate,
4728                                             &samplingRate /*updatedSamplingRate*/,
4729                                             format,
4730                                             &format /*updatedFormat*/,
4731                                             channelMask,
4732                                             &channelMask /*updatedChannelMask*/,
4733                                             (audio_output_flags_t) flags)) {
4734
4735                return profile;
4736            }
4737        }
4738    }
4739    return NULL;
4740}
4741
4742
4743audio_devices_t AudioPolicyManager::getDeviceAndMixForInputSource(audio_source_t inputSource,
4744                                                                  AudioMix **policyMix)
4745{
4746    audio_devices_t availableDeviceTypes = mAvailableInputDevices.types() & ~AUDIO_DEVICE_BIT_IN;
4747    audio_devices_t selectedDeviceFromMix =
4748           mPolicyMixes.getDeviceAndMixForInputSource(inputSource, availableDeviceTypes, policyMix);
4749
4750    if (selectedDeviceFromMix != AUDIO_DEVICE_NONE) {
4751        return selectedDeviceFromMix;
4752    }
4753    return getDeviceForInputSource(inputSource);
4754}
4755
4756audio_devices_t AudioPolicyManager::getDeviceForInputSource(audio_source_t inputSource)
4757{
4758    for (size_t routeIndex = 0; routeIndex < mInputRoutes.size(); routeIndex++) {
4759         sp<SessionRoute> route = mInputRoutes.valueAt(routeIndex);
4760         if (inputSource == route->mSource && route->isActive()) {
4761             return route->mDeviceDescriptor->type();
4762         }
4763     }
4764
4765     return mEngine->getDeviceForInputSource(inputSource);
4766}
4767
4768float AudioPolicyManager::computeVolume(audio_stream_type_t stream,
4769                                        int index,
4770                                        audio_devices_t device)
4771{
4772    float volumeDb = mVolumeCurves->volIndexToDb(stream, Volume::getDeviceCategory(device), index);
4773    // if a headset is connected, apply the following rules to ring tones and notifications
4774    // to avoid sound level bursts in user's ears:
4775    // - always attenuate ring tones and notifications volume by 6dB
4776    // - if music is playing, always limit the volume to current music volume,
4777    // with a minimum threshold at -36dB so that notification is always perceived.
4778    const routing_strategy stream_strategy = getStrategy(stream);
4779    if ((device & (AUDIO_DEVICE_OUT_BLUETOOTH_A2DP |
4780            AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES |
4781            AUDIO_DEVICE_OUT_WIRED_HEADSET |
4782            AUDIO_DEVICE_OUT_WIRED_HEADPHONE)) &&
4783        ((stream_strategy == STRATEGY_SONIFICATION)
4784                || (stream_strategy == STRATEGY_SONIFICATION_RESPECTFUL)
4785                || (stream == AUDIO_STREAM_SYSTEM)
4786                || ((stream_strategy == STRATEGY_ENFORCED_AUDIBLE) &&
4787                    (mEngine->getForceUse(AUDIO_POLICY_FORCE_FOR_SYSTEM) == AUDIO_POLICY_FORCE_NONE))) &&
4788            mVolumeCurves->canBeMuted(stream)) {
4789        volumeDb += SONIFICATION_HEADSET_VOLUME_FACTOR_DB;
4790        // when the phone is ringing we must consider that music could have been paused just before
4791        // by the music application and behave as if music was active if the last music track was
4792        // just stopped
4793        if (isStreamActive(AUDIO_STREAM_MUSIC, SONIFICATION_HEADSET_MUSIC_DELAY) ||
4794                mLimitRingtoneVolume) {
4795            audio_devices_t musicDevice = getDeviceForStrategy(STRATEGY_MEDIA, true /*fromCache*/);
4796            float musicVolDB = computeVolume(AUDIO_STREAM_MUSIC,
4797                                             mVolumeCurves->getVolumeIndex(AUDIO_STREAM_MUSIC,
4798                                                                              musicDevice),
4799                                             musicDevice);
4800            float minVolDB = (musicVolDB > SONIFICATION_HEADSET_VOLUME_MIN_DB) ?
4801                    musicVolDB : SONIFICATION_HEADSET_VOLUME_MIN_DB;
4802            if (volumeDb > minVolDB) {
4803                volumeDb = minVolDB;
4804                ALOGV("computeVolume limiting volume to %f musicVol %f", minVolDB, musicVolDB);
4805            }
4806        }
4807    }
4808
4809    return volumeDb;
4810}
4811
4812status_t AudioPolicyManager::checkAndSetVolume(audio_stream_type_t stream,
4813                                                   int index,
4814                                                   const sp<AudioOutputDescriptor>& outputDesc,
4815                                                   audio_devices_t device,
4816                                                   int delayMs,
4817                                                   bool force)
4818{
4819    // do not change actual stream volume if the stream is muted
4820    if (outputDesc->mMuteCount[stream] != 0) {
4821        ALOGVV("checkAndSetVolume() stream %d muted count %d",
4822              stream, outputDesc->mMuteCount[stream]);
4823        return NO_ERROR;
4824    }
4825    audio_policy_forced_cfg_t forceUseForComm =
4826            mEngine->getForceUse(AUDIO_POLICY_FORCE_FOR_COMMUNICATION);
4827    // do not change in call volume if bluetooth is connected and vice versa
4828    if ((stream == AUDIO_STREAM_VOICE_CALL && forceUseForComm == AUDIO_POLICY_FORCE_BT_SCO) ||
4829        (stream == AUDIO_STREAM_BLUETOOTH_SCO && forceUseForComm != AUDIO_POLICY_FORCE_BT_SCO)) {
4830        ALOGV("checkAndSetVolume() cannot set stream %d volume with force use = %d for comm",
4831             stream, forceUseForComm);
4832        return INVALID_OPERATION;
4833    }
4834
4835    if (device == AUDIO_DEVICE_NONE) {
4836        device = outputDesc->device();
4837    }
4838
4839    float volumeDb = computeVolume(stream, index, device);
4840    if (outputDesc->isFixedVolume(device)) {
4841        volumeDb = 0.0f;
4842    }
4843
4844    outputDesc->setVolume(volumeDb, stream, device, delayMs, force);
4845
4846    if (stream == AUDIO_STREAM_VOICE_CALL ||
4847        stream == AUDIO_STREAM_BLUETOOTH_SCO) {
4848        float voiceVolume;
4849        // Force voice volume to max for bluetooth SCO as volume is managed by the headset
4850        if (stream == AUDIO_STREAM_VOICE_CALL) {
4851            voiceVolume = (float)index/(float)mVolumeCurves->getVolumeIndexMax(stream);
4852        } else {
4853            voiceVolume = 1.0;
4854        }
4855
4856        if (voiceVolume != mLastVoiceVolume && outputDesc == mPrimaryOutput) {
4857            mpClientInterface->setVoiceVolume(voiceVolume, delayMs);
4858            mLastVoiceVolume = voiceVolume;
4859        }
4860    }
4861
4862    return NO_ERROR;
4863}
4864
4865void AudioPolicyManager::applyStreamVolumes(const sp<AudioOutputDescriptor>& outputDesc,
4866                                                audio_devices_t device,
4867                                                int delayMs,
4868                                                bool force)
4869{
4870    ALOGVV("applyStreamVolumes() for device %08x", device);
4871
4872    for (int stream = 0; stream < AUDIO_STREAM_CNT; stream++) {
4873        if (stream == AUDIO_STREAM_PATCH) {
4874            continue;
4875        }
4876        checkAndSetVolume((audio_stream_type_t)stream,
4877                          mVolumeCurves->getVolumeIndex((audio_stream_type_t)stream, device),
4878                          outputDesc,
4879                          device,
4880                          delayMs,
4881                          force);
4882    }
4883}
4884
4885void AudioPolicyManager::setStrategyMute(routing_strategy strategy,
4886                                             bool on,
4887                                             const sp<AudioOutputDescriptor>& outputDesc,
4888                                             int delayMs,
4889                                             audio_devices_t device)
4890{
4891    ALOGVV("setStrategyMute() strategy %d, mute %d, output ID %d",
4892           strategy, on, outputDesc->getId());
4893    for (int stream = 0; stream < AUDIO_STREAM_CNT; stream++) {
4894        if (stream == AUDIO_STREAM_PATCH) {
4895            continue;
4896        }
4897        if (getStrategy((audio_stream_type_t)stream) == strategy) {
4898            setStreamMute((audio_stream_type_t)stream, on, outputDesc, delayMs, device);
4899        }
4900    }
4901}
4902
4903void AudioPolicyManager::setStreamMute(audio_stream_type_t stream,
4904                                           bool on,
4905                                           const sp<AudioOutputDescriptor>& outputDesc,
4906                                           int delayMs,
4907                                           audio_devices_t device)
4908{
4909    if (device == AUDIO_DEVICE_NONE) {
4910        device = outputDesc->device();
4911    }
4912
4913    ALOGVV("setStreamMute() stream %d, mute %d, mMuteCount %d device %04x",
4914          stream, on, outputDesc->mMuteCount[stream], device);
4915
4916    if (on) {
4917        if (outputDesc->mMuteCount[stream] == 0) {
4918            if (mVolumeCurves->canBeMuted(stream) &&
4919                    ((stream != AUDIO_STREAM_ENFORCED_AUDIBLE) ||
4920                     (mEngine->getForceUse(AUDIO_POLICY_FORCE_FOR_SYSTEM) == AUDIO_POLICY_FORCE_NONE))) {
4921                checkAndSetVolume(stream, 0, outputDesc, device, delayMs);
4922            }
4923        }
4924        // increment mMuteCount after calling checkAndSetVolume() so that volume change is not ignored
4925        outputDesc->mMuteCount[stream]++;
4926    } else {
4927        if (outputDesc->mMuteCount[stream] == 0) {
4928            ALOGV("setStreamMute() unmuting non muted stream!");
4929            return;
4930        }
4931        if (--outputDesc->mMuteCount[stream] == 0) {
4932            checkAndSetVolume(stream,
4933                              mVolumeCurves->getVolumeIndex(stream, device),
4934                              outputDesc,
4935                              device,
4936                              delayMs);
4937        }
4938    }
4939}
4940
4941void AudioPolicyManager::handleIncallSonification(audio_stream_type_t stream,
4942                                                      bool starting, bool stateChange)
4943{
4944    if(!hasPrimaryOutput()) {
4945        return;
4946    }
4947
4948    // if the stream pertains to sonification strategy and we are in call we must
4949    // mute the stream if it is low visibility. If it is high visibility, we must play a tone
4950    // in the device used for phone strategy and play the tone if the selected device does not
4951    // interfere with the device used for phone strategy
4952    // if stateChange is true, we are called from setPhoneState() and we must mute or unmute as
4953    // many times as there are active tracks on the output
4954    const routing_strategy stream_strategy = getStrategy(stream);
4955    if ((stream_strategy == STRATEGY_SONIFICATION) ||
4956            ((stream_strategy == STRATEGY_SONIFICATION_RESPECTFUL))) {
4957        sp<SwAudioOutputDescriptor> outputDesc = mPrimaryOutput;
4958        ALOGV("handleIncallSonification() stream %d starting %d device %x stateChange %d",
4959                stream, starting, outputDesc->mDevice, stateChange);
4960        if (outputDesc->mRefCount[stream]) {
4961            int muteCount = 1;
4962            if (stateChange) {
4963                muteCount = outputDesc->mRefCount[stream];
4964            }
4965            if (audio_is_low_visibility(stream)) {
4966                ALOGV("handleIncallSonification() low visibility, muteCount %d", muteCount);
4967                for (int i = 0; i < muteCount; i++) {
4968                    setStreamMute(stream, starting, mPrimaryOutput);
4969                }
4970            } else {
4971                ALOGV("handleIncallSonification() high visibility");
4972                if (outputDesc->device() &
4973                        getDeviceForStrategy(STRATEGY_PHONE, true /*fromCache*/)) {
4974                    ALOGV("handleIncallSonification() high visibility muted, muteCount %d", muteCount);
4975                    for (int i = 0; i < muteCount; i++) {
4976                        setStreamMute(stream, starting, mPrimaryOutput);
4977                    }
4978                }
4979                if (starting) {
4980                    mpClientInterface->startTone(AUDIO_POLICY_TONE_IN_CALL_NOTIFICATION,
4981                                                 AUDIO_STREAM_VOICE_CALL);
4982                } else {
4983                    mpClientInterface->stopTone();
4984                }
4985            }
4986        }
4987    }
4988}
4989
4990audio_stream_type_t AudioPolicyManager::streamTypefromAttributesInt(const audio_attributes_t *attr)
4991{
4992    // flags to stream type mapping
4993    if ((attr->flags & AUDIO_FLAG_AUDIBILITY_ENFORCED) == AUDIO_FLAG_AUDIBILITY_ENFORCED) {
4994        return AUDIO_STREAM_ENFORCED_AUDIBLE;
4995    }
4996    if ((attr->flags & AUDIO_FLAG_SCO) == AUDIO_FLAG_SCO) {
4997        return AUDIO_STREAM_BLUETOOTH_SCO;
4998    }
4999    if ((attr->flags & AUDIO_FLAG_BEACON) == AUDIO_FLAG_BEACON) {
5000        return AUDIO_STREAM_TTS;
5001    }
5002
5003    // usage to stream type mapping
5004    switch (attr->usage) {
5005    case AUDIO_USAGE_MEDIA:
5006    case AUDIO_USAGE_GAME:
5007    case AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE:
5008        return AUDIO_STREAM_MUSIC;
5009    case AUDIO_USAGE_ASSISTANCE_ACCESSIBILITY:
5010        if (isStreamActive(AUDIO_STREAM_ALARM)) {
5011            return AUDIO_STREAM_ALARM;
5012        }
5013        if (isStreamActive(AUDIO_STREAM_RING)) {
5014            return AUDIO_STREAM_RING;
5015        }
5016        if (isInCall()) {
5017            return AUDIO_STREAM_VOICE_CALL;
5018        }
5019        return AUDIO_STREAM_ACCESSIBILITY;
5020    case AUDIO_USAGE_ASSISTANCE_SONIFICATION:
5021        return AUDIO_STREAM_SYSTEM;
5022    case AUDIO_USAGE_VOICE_COMMUNICATION:
5023        return AUDIO_STREAM_VOICE_CALL;
5024
5025    case AUDIO_USAGE_VOICE_COMMUNICATION_SIGNALLING:
5026        return AUDIO_STREAM_DTMF;
5027
5028    case AUDIO_USAGE_ALARM:
5029        return AUDIO_STREAM_ALARM;
5030    case AUDIO_USAGE_NOTIFICATION_TELEPHONY_RINGTONE:
5031        return AUDIO_STREAM_RING;
5032
5033    case AUDIO_USAGE_NOTIFICATION:
5034    case AUDIO_USAGE_NOTIFICATION_COMMUNICATION_REQUEST:
5035    case AUDIO_USAGE_NOTIFICATION_COMMUNICATION_INSTANT:
5036    case AUDIO_USAGE_NOTIFICATION_COMMUNICATION_DELAYED:
5037    case AUDIO_USAGE_NOTIFICATION_EVENT:
5038        return AUDIO_STREAM_NOTIFICATION;
5039
5040    case AUDIO_USAGE_UNKNOWN:
5041    default:
5042        return AUDIO_STREAM_MUSIC;
5043    }
5044}
5045
5046bool AudioPolicyManager::isValidAttributes(const audio_attributes_t *paa)
5047{
5048    // has flags that map to a strategy?
5049    if ((paa->flags & (AUDIO_FLAG_AUDIBILITY_ENFORCED | AUDIO_FLAG_SCO | AUDIO_FLAG_BEACON)) != 0) {
5050        return true;
5051    }
5052
5053    // has known usage?
5054    switch (paa->usage) {
5055    case AUDIO_USAGE_UNKNOWN:
5056    case AUDIO_USAGE_MEDIA:
5057    case AUDIO_USAGE_VOICE_COMMUNICATION:
5058    case AUDIO_USAGE_VOICE_COMMUNICATION_SIGNALLING:
5059    case AUDIO_USAGE_ALARM:
5060    case AUDIO_USAGE_NOTIFICATION:
5061    case AUDIO_USAGE_NOTIFICATION_TELEPHONY_RINGTONE:
5062    case AUDIO_USAGE_NOTIFICATION_COMMUNICATION_REQUEST:
5063    case AUDIO_USAGE_NOTIFICATION_COMMUNICATION_INSTANT:
5064    case AUDIO_USAGE_NOTIFICATION_COMMUNICATION_DELAYED:
5065    case AUDIO_USAGE_NOTIFICATION_EVENT:
5066    case AUDIO_USAGE_ASSISTANCE_ACCESSIBILITY:
5067    case AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE:
5068    case AUDIO_USAGE_ASSISTANCE_SONIFICATION:
5069    case AUDIO_USAGE_GAME:
5070    case AUDIO_USAGE_VIRTUAL_SOURCE:
5071        break;
5072    default:
5073        return false;
5074    }
5075    return true;
5076}
5077
5078bool AudioPolicyManager::isStrategyActive(const sp<AudioOutputDescriptor> outputDesc,
5079                                          routing_strategy strategy, uint32_t inPastMs,
5080                                          nsecs_t sysTime) const
5081{
5082    if ((sysTime == 0) && (inPastMs != 0)) {
5083        sysTime = systemTime();
5084    }
5085    for (int i = 0; i < (int)AUDIO_STREAM_CNT; i++) {
5086        if (i == AUDIO_STREAM_PATCH) {
5087            continue;
5088        }
5089        if (((getStrategy((audio_stream_type_t)i) == strategy) ||
5090                (NUM_STRATEGIES == strategy)) &&
5091                outputDesc->isStreamActive((audio_stream_type_t)i, inPastMs, sysTime)) {
5092            return true;
5093        }
5094    }
5095    return false;
5096}
5097
5098audio_policy_forced_cfg_t AudioPolicyManager::getForceUse(audio_policy_force_use_t usage)
5099{
5100    return mEngine->getForceUse(usage);
5101}
5102
5103bool AudioPolicyManager::isInCall()
5104{
5105    return isStateInCall(mEngine->getPhoneState());
5106}
5107
5108bool AudioPolicyManager::isStateInCall(int state)
5109{
5110    return is_state_in_call(state);
5111}
5112
5113void AudioPolicyManager::cleanUpForDevice(const sp<DeviceDescriptor>& deviceDesc)
5114{
5115    for (ssize_t i = (ssize_t)mAudioSources.size() - 1; i >= 0; i--)  {
5116        sp<AudioSourceDescriptor> sourceDesc = mAudioSources.valueAt(i);
5117        if (sourceDesc->mDevice->equals(deviceDesc)) {
5118            ALOGV("%s releasing audio source %d", __FUNCTION__, sourceDesc->getHandle());
5119            stopAudioSource(sourceDesc->getHandle());
5120        }
5121    }
5122
5123    for (ssize_t i = (ssize_t)mAudioPatches.size() - 1; i >= 0; i--)  {
5124        sp<AudioPatch> patchDesc = mAudioPatches.valueAt(i);
5125        bool release = false;
5126        for (size_t j = 0; j < patchDesc->mPatch.num_sources && !release; j++)  {
5127            const struct audio_port_config *source = &patchDesc->mPatch.sources[j];
5128            if (source->type == AUDIO_PORT_TYPE_DEVICE &&
5129                    source->ext.device.type == deviceDesc->type()) {
5130                release = true;
5131            }
5132        }
5133        for (size_t j = 0; j < patchDesc->mPatch.num_sinks && !release; j++)  {
5134            const struct audio_port_config *sink = &patchDesc->mPatch.sinks[j];
5135            if (sink->type == AUDIO_PORT_TYPE_DEVICE &&
5136                    sink->ext.device.type == deviceDesc->type()) {
5137                release = true;
5138            }
5139        }
5140        if (release) {
5141            ALOGV("%s releasing patch %u", __FUNCTION__, patchDesc->mHandle);
5142            releaseAudioPatch(patchDesc->mHandle, patchDesc->mUid);
5143        }
5144    }
5145}
5146
5147void AudioPolicyManager::updateAudioProfiles(audio_io_handle_t ioHandle,
5148                                             AudioProfileVector &profiles)
5149{
5150    String8 reply;
5151    char *value;
5152    // Format MUST be checked first to update the list of AudioProfile
5153    if (profiles.hasDynamicFormat()) {
5154        reply = mpClientInterface->getParameters(ioHandle,
5155                                                 String8(AUDIO_PARAMETER_STREAM_SUP_FORMATS));
5156        ALOGV("%s: supported formats %s", __FUNCTION__, reply.string());
5157        AudioParameter repliedParameters(reply);
5158        if (repliedParameters.get(
5159                String8(AUDIO_PARAMETER_STREAM_SUP_FORMATS), reply) != NO_ERROR) {
5160            ALOGE("%s: failed to retrieve format, bailing out", __FUNCTION__);
5161            return;
5162        }
5163        profiles.setFormats(formatsFromString(reply.string()));
5164    }
5165    const FormatVector &supportedFormats = profiles.getSupportedFormats();
5166
5167    for (size_t formatIndex = 0; formatIndex < supportedFormats.size(); formatIndex++) {
5168        audio_format_t format = supportedFormats[formatIndex];
5169        ChannelsVector channelMasks;
5170        SampleRateVector samplingRates;
5171        AudioParameter requestedParameters;
5172        requestedParameters.addInt(String8(AUDIO_PARAMETER_STREAM_FORMAT), format);
5173
5174        if (profiles.hasDynamicRateFor(format)) {
5175            reply = mpClientInterface->getParameters(ioHandle,
5176                                                     requestedParameters.toString() + ";" +
5177                                                     AUDIO_PARAMETER_STREAM_SUP_SAMPLING_RATES);
5178            ALOGV("%s: supported sampling rates %s", __FUNCTION__, reply.string());
5179            AudioParameter repliedParameters(reply);
5180            if (repliedParameters.get(
5181                    String8(AUDIO_PARAMETER_STREAM_SUP_SAMPLING_RATES), reply) == NO_ERROR) {
5182                samplingRates = samplingRatesFromString(reply.string());
5183            }
5184        }
5185        if (profiles.hasDynamicChannelsFor(format)) {
5186            reply = mpClientInterface->getParameters(ioHandle,
5187                                                     requestedParameters.toString() + ";" +
5188                                                     AUDIO_PARAMETER_STREAM_SUP_CHANNELS);
5189            ALOGV("%s: supported channel masks %s", __FUNCTION__, reply.string());
5190            AudioParameter repliedParameters(reply);
5191            if (repliedParameters.get(
5192                    String8(AUDIO_PARAMETER_STREAM_SUP_CHANNELS), reply) == NO_ERROR) {
5193                channelMasks = channelMasksFromString(reply.string());
5194            }
5195        }
5196        profiles.addProfileFromHal(new AudioProfile(format, channelMasks, samplingRates));
5197    }
5198}
5199
5200}; // namespace android
5201