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