Fix issues 2333450 and 2333559:
[0xdroid:hardware_msm7k.git] / libaudio / AudioPolicyManager.cpp
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 "AudioPolicyManager"
18 //#define LOG_NDEBUG 0
19 #include <utils/Log.h>
20 #include "AudioPolicyManager.h"
21 #include <media/mediarecorder.h>
22
23 namespace android {
24
25
26 // ----------------------------------------------------------------------------
27 // AudioPolicyInterface implementation
28 // ----------------------------------------------------------------------------
29
30
31 status_t AudioPolicyManager::setDeviceConnectionState(AudioSystem::audio_devices device,
32                                                   AudioSystem::device_connection_state state,
33                                                   const char *device_address)
34 {
35
36     LOGV("setDeviceConnectionState() device: %x, state %d, address %s", device, state, device_address);
37
38     // connect/disconnect only 1 device at a time
39     if (AudioSystem::popCount(device) != 1) return BAD_VALUE;
40
41     if (strlen(device_address) >= MAX_DEVICE_ADDRESS_LEN) {
42         LOGE("setDeviceConnectionState() invalid address: %s", device_address);
43         return BAD_VALUE;
44     }
45
46     // handle output devices
47     if (AudioSystem::isOutputDevice(device)) {
48
49 #ifndef WITH_A2DP
50         if (AudioSystem::isA2dpDevice(device)) {
51             LOGE("setDeviceConnectionState() invalid device: %x", device);
52             return BAD_VALUE;
53         }
54 #endif
55
56         switch (state)
57         {
58         // handle output device connection
59         case AudioSystem::DEVICE_STATE_AVAILABLE:
60             if (mAvailableOutputDevices & device) {
61                 LOGW("setDeviceConnectionState() device already connected: %x", device);
62                 return INVALID_OPERATION;
63             }
64             LOGW_IF((getOutputForDevice((uint32_t)device) != 0), "setDeviceConnectionState(): output using unconnected device %x", device);
65
66             LOGV("setDeviceConnectionState() connecting device %x", device);
67
68             // register new device as available
69             mAvailableOutputDevices |= device;
70
71 #ifdef WITH_A2DP
72             // handle A2DP device connection
73             if (AudioSystem::isA2dpDevice(device)) {
74                 // when an A2DP device is connected, open an A2DP and a duplicated output
75                 LOGV("opening A2DP output for device %s", device_address);
76                 AudioOutputDescriptor *outputDesc = new AudioOutputDescriptor();
77                 outputDesc->mDevice = device;
78                 mA2dpOutput = mpClientInterface->openOutput(&outputDesc->mDevice,
79                                                         &outputDesc->mSamplingRate,
80                                                         &outputDesc->mFormat,
81                                                         &outputDesc->mChannels,
82                                                         &outputDesc->mLatency,
83                                                         outputDesc->mFlags);
84                 if (mA2dpOutput) {
85                     // add A2DP output descriptor
86                     mOutputs.add(mA2dpOutput, outputDesc);
87                     // set initial stream volume for A2DP device
88                     applyStreamVolumes(mA2dpOutput, device);
89                     mDuplicatedOutput = mpClientInterface->openDuplicateOutput(mA2dpOutput, mHardwareOutput);
90                     if (mDuplicatedOutput != 0) {
91                         // If both A2DP and duplicated outputs are open, send device address to A2DP hardware
92                         // interface
93                         AudioParameter param;
94                         param.add(String8("a2dp_sink_address"), String8(device_address));
95                         mpClientInterface->setParameters(mA2dpOutput, param.toString());
96                         mA2dpDeviceAddress = String8(device_address, MAX_DEVICE_ADDRESS_LEN);
97
98                         // add duplicated output descriptor
99                         AudioOutputDescriptor *dupOutputDesc = new AudioOutputDescriptor();
100                         dupOutputDesc->mOutput1 = mOutputs.valueFor(mHardwareOutput);
101                         dupOutputDesc->mOutput2 = mOutputs.valueFor(mA2dpOutput);
102                         dupOutputDesc->mSamplingRate = outputDesc->mSamplingRate;
103                         dupOutputDesc->mFormat = outputDesc->mFormat;
104                         dupOutputDesc->mChannels = outputDesc->mChannels;
105                         dupOutputDesc->mLatency = outputDesc->mLatency;
106                         mOutputs.add(mDuplicatedOutput, dupOutputDesc);
107                         applyStreamVolumes(mDuplicatedOutput, device);
108                     } else {
109                         LOGW("getOutput() could not open duplicated output for %d and %d",
110                                 mHardwareOutput, mA2dpOutput);
111                         mAvailableOutputDevices &= ~device;
112                         delete outputDesc;
113                         return NO_INIT;
114                     }
115                 } else {
116                     LOGW("setDeviceConnectionState() could not open A2DP output for device %x", device);
117                     mAvailableOutputDevices &= ~device;
118                     delete outputDesc;
119                     return NO_INIT;
120                 }
121                 AudioOutputDescriptor *hwOutputDesc = mOutputs.valueFor(mHardwareOutput);
122
123                 if (mA2dpDeviceAddress == mScoDeviceAddress) {
124                     // It is normal to suspend twice if we are both in call,
125                     // and have the hardware audio output routed to BT SCO
126                     if (mPhoneState != AudioSystem::MODE_NORMAL) {
127                         mpClientInterface->suspendOutput(mA2dpOutput);
128                     }
129                     if (AudioSystem::isBluetoothScoDevice((AudioSystem::audio_devices)hwOutputDesc->device())) {
130                         mpClientInterface->suspendOutput(mA2dpOutput);
131                     }
132                 }
133
134                 // move streams pertaining to STRATEGY_MEDIA to the newly opened A2DP output
135                 if (getDeviceForStrategy(STRATEGY_MEDIA) & device) {
136                     for (int i = 0; i < (int)AudioSystem::NUM_STREAM_TYPES; i++) {
137                         if (getStrategy((AudioSystem::stream_type)i) == STRATEGY_MEDIA) {
138                             mpClientInterface->setStreamOutput((AudioSystem::stream_type)i, mA2dpOutput);
139                             outputDesc->mRefCount[i] = hwOutputDesc->mRefCount[i];
140                             hwOutputDesc->mRefCount[i] = 0;
141                         }
142                     }
143
144                 }
145                 // move streams pertaining to STRATEGY_DTMF to the newly opened A2DP output
146                 if (getDeviceForStrategy(STRATEGY_DTMF) & device) {
147                     for (int i = 0; i < (int)AudioSystem::NUM_STREAM_TYPES; i++) {
148                         if (getStrategy((AudioSystem::stream_type)i) == STRATEGY_DTMF) {
149                             mpClientInterface->setStreamOutput((AudioSystem::stream_type)i, mA2dpOutput);
150                             outputDesc->mRefCount[i] = hwOutputDesc->mRefCount[i];
151                             hwOutputDesc->mRefCount[i] = 0;
152                         }
153                     }
154
155                 }
156                 // move streams pertaining to STRATEGY_SONIFICATION to the newly opened duplicated output
157                 if (getDeviceForStrategy(STRATEGY_SONIFICATION) & device) {
158                     for (int i = 0; i < (int)AudioSystem::NUM_STREAM_TYPES; i++) {
159                         if (getStrategy((AudioSystem::stream_type)i) == STRATEGY_SONIFICATION) {
160                             mpClientInterface->setStreamOutput((AudioSystem::stream_type)i, mDuplicatedOutput);
161                             outputDesc->mRefCount[i] =
162                                 hwOutputDesc->mRefCount[i];
163                             mOutputs.valueFor(mDuplicatedOutput)->mRefCount[i] =
164                                 hwOutputDesc->mRefCount[i];
165                         }
166                     }
167                 }
168             } else
169 #endif
170             // handle wired and SCO device connection (accessed via hardware output)
171             {
172
173                 uint32_t newDevice = 0;
174                 if (AudioSystem::isBluetoothScoDevice(device)) {
175                     LOGV("setDeviceConnectionState() BT SCO  device, address %s", device_address);
176                     // keep track of SCO device address
177                     mScoDeviceAddress = String8(device_address, MAX_DEVICE_ADDRESS_LEN);
178                     // if in call and connecting SCO device, check if we must reroute hardware output
179                     if (mPhoneState == AudioSystem::MODE_IN_CALL &&
180                         getDeviceForStrategy(STRATEGY_PHONE) == device) {
181                         newDevice = device;
182                     } else if (mOutputs.valueFor(mHardwareOutput)->isUsedByStrategy(STRATEGY_DTMF) &&
183                                getDeviceForStrategy(STRATEGY_DTMF) == device) {
184                         newDevice = device;
185                     }
186                     if ((mA2dpDeviceAddress == mScoDeviceAddress) &&
187                         (mPhoneState != AudioSystem::MODE_NORMAL)) {
188                         mpClientInterface->suspendOutput(mA2dpOutput);
189                     }
190                 } else if (device == AudioSystem::DEVICE_OUT_WIRED_HEADSET ||
191                            device == AudioSystem::DEVICE_OUT_WIRED_HEADPHONE) {
192                     LOGV("setDeviceConnectionState() wired headset device");
193                     // if connecting a wired headset, we check the following by order of priority
194                     // to request a routing change if necessary:
195                     // 1: we are in call or the strategy phone is active on the hardware output:
196                     //      use device for strategy phone
197                     // 2: the strategy sonification is active on the hardware output:
198                     //      use device for strategy sonification
199                     // 3: the strategy media is active on the hardware output:
200                     //      use device for strategy media
201                     // 4: the strategy DTMF is active on the hardware output:
202                     //      use device for strategy DTMF
203                     if (getDeviceForStrategy(STRATEGY_PHONE) == device &&
204                         (mPhoneState == AudioSystem::MODE_IN_CALL ||
205                         mOutputs.valueFor(mHardwareOutput)->isUsedByStrategy(STRATEGY_PHONE))) {
206                         newDevice = device;
207                     } else if ((getDeviceForStrategy(STRATEGY_SONIFICATION) & device) &&
208                                mOutputs.valueFor(mHardwareOutput)->isUsedByStrategy(STRATEGY_SONIFICATION)){
209                         newDevice = getDeviceForStrategy(STRATEGY_SONIFICATION);
210                     } else if ((getDeviceForStrategy(STRATEGY_MEDIA) == device) &&
211                                mOutputs.valueFor(mHardwareOutput)->isUsedByStrategy(STRATEGY_MEDIA)){
212                         newDevice = device;
213                     } else if (getDeviceForStrategy(STRATEGY_DTMF) == device &&
214                             mOutputs.valueFor(mHardwareOutput)->isUsedByStrategy(STRATEGY_DTMF)) {
215                          newDevice = device;
216                     }
217                 }
218                 // request routing change if necessary
219                 setOutputDevice(mHardwareOutput, newDevice);
220             }
221             break;
222         // handle output device disconnection
223         case AudioSystem::DEVICE_STATE_UNAVAILABLE: {
224             if (!(mAvailableOutputDevices & device)) {
225                 LOGW("setDeviceConnectionState() device not connected: %x", device);
226                 return INVALID_OPERATION;
227             }
228
229             uint32_t newDevice = 0;
230             // get usage of disconnected device by all strategies
231             bool wasUsedForMedia = (getDeviceForStrategy(STRATEGY_MEDIA) & device) != 0;
232             bool wasUsedForSonification = (getDeviceForStrategy(STRATEGY_SONIFICATION) & device) != 0;
233             bool wasUsedforPhone = (getDeviceForStrategy(STRATEGY_PHONE) & device) != 0;
234             bool wasUsedforDtmf = (getDeviceForStrategy(STRATEGY_DTMF) & device) != 0;
235             LOGV("setDeviceConnectionState() disconnecting device %x used by media %d, sonification %d, phone %d",
236                     device, wasUsedForMedia, wasUsedForSonification, wasUsedforPhone);
237             // remove device from available output devices
238             mAvailableOutputDevices &= ~device;
239
240 #ifdef WITH_A2DP
241             // handle A2DP device disconnection
242             if (AudioSystem::isA2dpDevice(device)) {
243                 if (mA2dpOutput == 0 || mDuplicatedOutput == 0) {
244                     LOGW("setDeviceConnectionState() disconnecting A2DP and no A2DP output!");
245                     mAvailableOutputDevices |= device;
246                     return INVALID_OPERATION;
247                 }
248
249                 if (mA2dpDeviceAddress != device_address) {
250                     LOGW("setDeviceConnectionState() disconnecting unknow A2DP sink address %s", device_address);
251                     mAvailableOutputDevices |= device;
252                     return INVALID_OPERATION;
253                 }
254
255                 AudioOutputDescriptor *hwOutputDesc = mOutputs.valueFor(mHardwareOutput);
256                 AudioOutputDescriptor *a2dpOutputDesc = mOutputs.valueFor(mA2dpOutput);
257
258                 // mute media during 2 seconds to avoid outputing sound on hardware output while music stream
259                 // is switched from A2DP output and before music is paused by music application
260                 setStrategyMute(STRATEGY_MEDIA, true, mHardwareOutput);
261                 setStrategyMute(STRATEGY_MEDIA, false, mHardwareOutput, 2000);
262
263                 // If the A2DP device was used by DTMF strategy, move all streams pertaining to DTMF strategy to
264                 // hardware output
265                 if (wasUsedforDtmf) {
266                     for (int i = 0; i < (int)AudioSystem::NUM_STREAM_TYPES; i++) {
267                         if (getStrategy((AudioSystem::stream_type)i) == STRATEGY_DTMF) {
268                             mpClientInterface->setStreamOutput((AudioSystem::stream_type)i, mHardwareOutput);
269                             hwOutputDesc->changeRefCount((AudioSystem::stream_type)i,
270                                     a2dpOutputDesc->mRefCount[i]);
271                         }
272                     }
273                     if (a2dpOutputDesc->isUsedByStrategy(STRATEGY_DTMF)) {
274                         newDevice = getDeviceForStrategy(STRATEGY_DTMF);
275                     }
276                 }
277
278                 // If the A2DP device was used by media strategy, move all streams pertaining to media strategy to
279                 // hardware output
280                 if (wasUsedForMedia) {
281                     for (int i = 0; i < (int)AudioSystem::NUM_STREAM_TYPES; i++) {
282                         if (getStrategy((AudioSystem::stream_type)i) == STRATEGY_MEDIA) {
283                             mpClientInterface->setStreamOutput((AudioSystem::stream_type)i, mHardwareOutput);
284                             hwOutputDesc->changeRefCount((AudioSystem::stream_type)i,
285                                     a2dpOutputDesc->mRefCount[i]);
286                         }
287                     }
288                     if (a2dpOutputDesc->isUsedByStrategy(STRATEGY_MEDIA)) {
289                         newDevice = getDeviceForStrategy(STRATEGY_MEDIA);
290                     }
291                 }
292
293                 // If the A2DP device was used by sonification strategy, move all streams pertaining to
294                 // sonification strategy to hardware output.
295                 // Note that newDevice is overwritten here giving sonification strategy a higher priority than
296                 // media strategy.
297                 if (wasUsedForSonification) {
298                     for (int i = 0; i < (int)AudioSystem::NUM_STREAM_TYPES; i++) {
299                         if (getStrategy((AudioSystem::stream_type)i) == STRATEGY_SONIFICATION) {
300                             mpClientInterface->setStreamOutput((AudioSystem::stream_type)i, mHardwareOutput);
301                         }
302                     }
303                     if (a2dpOutputDesc->isUsedByStrategy(STRATEGY_SONIFICATION)) {
304                         newDevice = getDeviceForStrategy(STRATEGY_SONIFICATION);
305                     }
306                 }
307
308                 // close A2DP and duplicated outputs
309                 AudioParameter param;
310                 param.add(String8("closing"), String8("true"));
311                 mpClientInterface->setParameters(mA2dpOutput, param.toString());
312
313                 LOGW("setDeviceConnectionState() closing A2DP and duplicated output!");
314                 mpClientInterface->closeOutput(mDuplicatedOutput);
315                 delete mOutputs.valueFor(mDuplicatedOutput);
316                 mOutputs.removeItem(mDuplicatedOutput);
317                 mDuplicatedOutput = 0;
318                 mpClientInterface->closeOutput(mA2dpOutput);
319                 delete mOutputs.valueFor(mA2dpOutput);
320                 mOutputs.removeItem(mA2dpOutput);
321                 mA2dpOutput = 0;
322             } else
323 #endif
324             {
325                 if (AudioSystem::isBluetoothScoDevice(device)) {
326                     // handle SCO device disconnection
327                     if (wasUsedforPhone &&
328                         mPhoneState == AudioSystem::MODE_IN_CALL) {
329                         // if in call, find new suitable device for phone strategy
330                         newDevice = getDeviceForStrategy(STRATEGY_PHONE);
331                     } else if (wasUsedforDtmf &&
332                                mOutputs.valueFor(mHardwareOutput)->isUsedByStrategy(STRATEGY_DTMF)) {
333                         newDevice = getDeviceForStrategy(STRATEGY_DTMF);
334                     }
335                     if ((mA2dpDeviceAddress == mScoDeviceAddress) &&
336                         (mPhoneState != AudioSystem::MODE_NORMAL)) {
337                         mpClientInterface->restoreOutput(mA2dpOutput);
338                     }
339                 } else if (device == AudioSystem::DEVICE_OUT_WIRED_HEADSET ||
340                            device == AudioSystem::DEVICE_OUT_WIRED_HEADPHONE) {
341                     // if disconnecting a wired headset, we check the following by order of priority
342                     // to request a routing change if necessary:
343                     // 1: we are in call or the strategy phone is active on the hardware output:
344                     //      use device for strategy phone
345                     // 2: the strategy sonification is active on the hardware output:
346                     //      use device for strategy sonification
347                     // 3: the strategy media is active on the hardware output:
348                     //      use device for strategy media
349                     // 4: the strategy DTMF is active on the hardware output:
350                     //      use device for strategy DTMF
351                     if (wasUsedforPhone &&
352                         (mPhoneState == AudioSystem::MODE_IN_CALL ||
353                          mOutputs.valueFor(mHardwareOutput)->isUsedByStrategy(STRATEGY_PHONE))) {
354                         newDevice = getDeviceForStrategy(STRATEGY_PHONE);
355                     } else if (wasUsedForSonification &&
356                                mOutputs.valueFor(mHardwareOutput)->isUsedByStrategy(STRATEGY_SONIFICATION)){
357                         newDevice = getDeviceForStrategy(STRATEGY_SONIFICATION);
358                     } else if (wasUsedForMedia &&
359                                mOutputs.valueFor(mHardwareOutput)->isUsedByStrategy(STRATEGY_MEDIA)){
360                         newDevice = getDeviceForStrategy(STRATEGY_MEDIA);
361                     } else if (wasUsedforDtmf &&
362                                mOutputs.valueFor(mHardwareOutput)->isUsedByStrategy(STRATEGY_DTMF)){
363                         newDevice = getDeviceForStrategy(STRATEGY_DTMF);
364                     }
365                 }
366             }
367             // request routing change if necessary
368             setOutputDevice(mHardwareOutput, newDevice);
369
370             // clear A2DP and SCO device address if necessary
371 #ifdef WITH_A2DP
372             if (AudioSystem::isA2dpDevice(device)) {
373                 mA2dpDeviceAddress = "";
374             }
375 #endif
376             if (AudioSystem::isBluetoothScoDevice(device)) {
377                 mScoDeviceAddress = "";
378             }
379             } break;
380
381         default:
382             LOGE("setDeviceConnectionState() invalid state: %x", state);
383             return BAD_VALUE;
384         }
385
386         if (device == AudioSystem::DEVICE_OUT_WIRED_HEADSET) {
387             device = AudioSystem::DEVICE_IN_WIRED_HEADSET;
388         } else if (device == AudioSystem::DEVICE_OUT_BLUETOOTH_SCO ||
389                    device == AudioSystem::DEVICE_OUT_BLUETOOTH_SCO_HEADSET ||
390                    device == AudioSystem::DEVICE_OUT_BLUETOOTH_SCO_CARKIT) {
391             device = AudioSystem::DEVICE_IN_BLUETOOTH_SCO_HEADSET;
392         } else {
393             return NO_ERROR;
394         }
395     }
396     // handle input devices
397     if (AudioSystem::isInputDevice(device)) {
398
399         switch (state)
400         {
401         // handle input device connection
402         case AudioSystem::DEVICE_STATE_AVAILABLE: {
403             if (mAvailableInputDevices & device) {
404                 LOGW("setDeviceConnectionState() device already connected: %d", device);
405                 return INVALID_OPERATION;
406             }
407             mAvailableInputDevices |= device;
408             }
409             break;
410
411         // handle input device disconnection
412         case AudioSystem::DEVICE_STATE_UNAVAILABLE: {
413             if (!(mAvailableInputDevices & device)) {
414                 LOGW("setDeviceConnectionState() device not connected: %d", device);
415                 return INVALID_OPERATION;
416             }
417             mAvailableInputDevices &= ~device;
418             } break;
419
420         default:
421             LOGE("setDeviceConnectionState() invalid state: %x", state);
422             return BAD_VALUE;
423         }
424
425         audio_io_handle_t activeInput = getActiveInput();
426         if (activeInput != 0) {
427             AudioInputDescriptor *inputDesc = mInputs.valueFor(activeInput);
428             uint32_t newDevice = getDeviceForInputSource(inputDesc->mInputSource);
429             if (newDevice != inputDesc->mDevice) {
430                 LOGV("setDeviceConnectionState() changing device from %x to %x for input %d",
431                         inputDesc->mDevice, newDevice, activeInput);
432                 inputDesc->mDevice = newDevice;
433                 AudioParameter param = AudioParameter();
434                 param.addInt(String8(AudioParameter::keyRouting), (int)newDevice);
435                 mpClientInterface->setParameters(activeInput, param.toString());
436             }
437         }
438
439         return NO_ERROR;
440     }
441
442     LOGW("setDeviceConnectionState() invalid device: %x", device);
443     return BAD_VALUE;
444 }
445
446 AudioSystem::device_connection_state AudioPolicyManager::getDeviceConnectionState(AudioSystem::audio_devices device,
447                                                   const char *device_address)
448 {
449     AudioSystem::device_connection_state state = AudioSystem::DEVICE_STATE_UNAVAILABLE;
450     String8 address = String8(device_address);
451     if (AudioSystem::isOutputDevice(device)) {
452         if (device & mAvailableOutputDevices) {
453 #ifdef WITH_A2DP
454             if (AudioSystem::isA2dpDevice(device) &&
455                 address != "" && mA2dpDeviceAddress != address) {
456                 return state;
457             }
458 #endif
459             if (AudioSystem::isBluetoothScoDevice(device) &&
460                 address != "" && mScoDeviceAddress != address) {
461                 return state;
462             }
463             state = AudioSystem::DEVICE_STATE_AVAILABLE;
464         }
465     } else if (AudioSystem::isInputDevice(device)) {
466         if (device & mAvailableInputDevices) {
467             state = AudioSystem::DEVICE_STATE_AVAILABLE;
468         }
469     }
470
471     return state;
472 }
473
474 void AudioPolicyManager::setPhoneState(int state)
475 {
476     LOGV("setPhoneState() state %d", state);
477     uint32_t newDevice = 0;
478     if (state < 0 || state >= AudioSystem::NUM_MODES) {
479         LOGW("setPhoneState() invalid state %d", state);
480         return;
481     }
482
483     if (state == mPhoneState ) {
484         LOGW("setPhoneState() setting same state %d", state);
485         return;
486     }
487
488     // if leaving call state, handle special case of active streams
489     // pertaining to sonification strategy see handleIncallSonification()
490     if (mPhoneState == AudioSystem::MODE_IN_CALL) {
491         LOGV("setPhoneState() in call state management: new state is %d", state);
492         for (int stream = 0; stream < AudioSystem::NUM_STREAM_TYPES; stream++) {
493             handleIncallSonification(stream, false, true);
494         }
495     }
496
497     // store previous phone state for management of sonification strategy below
498     int oldState = mPhoneState;
499     uint32_t oldDtmfDevice = getDeviceForStrategy(STRATEGY_DTMF);
500     uint32_t oldSonificationDevice = getDeviceForStrategy(STRATEGY_SONIFICATION) & ~AudioSystem::DEVICE_OUT_SPEAKER;
501     mPhoneState = state;
502     bool force = false;
503     AudioOutputDescriptor *hwOutputDesc = mOutputs.valueFor(mHardwareOutput);
504     // check if a routing change is required for hardware output in the following
505     // order of priority:
506     // 1: a stream pertaining to sonification strategy is active
507     // 2: new state is incall
508     // 3: a stream pertaining to media strategy is active
509     // 4: a stream pertaining to DTMF strategy is active
510     if (hwOutputDesc->isUsedByStrategy(STRATEGY_SONIFICATION)) {
511         newDevice = getDeviceForStrategy(STRATEGY_SONIFICATION);
512     } else if (mPhoneState == AudioSystem::MODE_IN_CALL) {
513         newDevice = getDeviceForStrategy(STRATEGY_PHONE);
514         // force routing command to audio hardware when starting call
515         // even if no device change is needed
516         force = true;
517     } else if (hwOutputDesc->isUsedByStrategy(STRATEGY_MEDIA)) {
518         newDevice = getDeviceForStrategy(STRATEGY_MEDIA);
519     } else if (hwOutputDesc->isUsedByStrategy(STRATEGY_DTMF)) {
520         newDevice = getDeviceForStrategy(STRATEGY_DTMF);
521     }
522
523
524     if (mA2dpOutput != 0) {
525         // If entering or exiting in call state, switch DTMF streams to/from A2DP output
526         // if necessary
527         uint32_t newDtmfDevice = getDeviceForStrategy(STRATEGY_DTMF);
528         uint32_t newSonificationDevice = getDeviceForStrategy(STRATEGY_SONIFICATION) & ~AudioSystem::DEVICE_OUT_SPEAKER;
529         if (state == AudioSystem::MODE_IN_CALL) {  // entering in call mode
530             // move DTMF streams from A2DP output to hardware output if necessary
531             if (AudioSystem::isA2dpDevice((AudioSystem::audio_devices)oldDtmfDevice) &&
532                 !AudioSystem::isA2dpDevice((AudioSystem::audio_devices)newDtmfDevice)) {
533                 for (int i = 0; i < (int)AudioSystem::NUM_STREAM_TYPES; i++) {
534                     if (getStrategy((AudioSystem::stream_type)i) == STRATEGY_DTMF) {
535                         mpClientInterface->setStreamOutput((AudioSystem::stream_type)i, mHardwareOutput);
536                         int refCount = mOutputs.valueFor(mA2dpOutput)->mRefCount[i];
537                         hwOutputDesc->changeRefCount((AudioSystem::stream_type)i,
538                                 refCount);
539                         mOutputs.valueFor(mA2dpOutput)->changeRefCount((AudioSystem::stream_type)i,-refCount);
540                     }
541                 }
542                 if (newDevice == 0 && mOutputs.valueFor(mA2dpOutput)->isUsedByStrategy(STRATEGY_DTMF)) {
543                     newDevice = newDtmfDevice;
544                 }
545             }
546             // move SONIFICATION streams from duplicated output to hardware output if necessary
547             if (AudioSystem::isA2dpDevice((AudioSystem::audio_devices)oldSonificationDevice) &&
548                 !AudioSystem::isA2dpDevice((AudioSystem::audio_devices)newSonificationDevice)) {
549                 for (int i = 0; i < (int)AudioSystem::NUM_STREAM_TYPES; i++) {
550                     if (getStrategy((AudioSystem::stream_type)i) == STRATEGY_SONIFICATION) {
551                         mpClientInterface->setStreamOutput((AudioSystem::stream_type)i, mHardwareOutput);
552                         int refCount = mOutputs.valueFor(mDuplicatedOutput)->mRefCount[i];
553                         hwOutputDesc->changeRefCount((AudioSystem::stream_type)i,
554                                 refCount);
555                         mOutputs.valueFor(mDuplicatedOutput)->changeRefCount((AudioSystem::stream_type)i,-refCount);
556                     }
557                 }
558             }
559         } else {  // exiting in call mode
560             // move DTMF streams from hardware output to A2DP output if necessary
561             if (!AudioSystem::isA2dpDevice((AudioSystem::audio_devices)oldDtmfDevice) &&
562                 AudioSystem::isA2dpDevice((AudioSystem::audio_devices)newDtmfDevice)) {
563                 for (int i = 0; i < (int)AudioSystem::NUM_STREAM_TYPES; i++) {
564                     if (getStrategy((AudioSystem::stream_type)i) == STRATEGY_DTMF) {
565                         mpClientInterface->setStreamOutput((AudioSystem::stream_type)i, mA2dpOutput);
566                         int refCount = hwOutputDesc->mRefCount[i];
567                         mOutputs.valueFor(mA2dpOutput)->changeRefCount((AudioSystem::stream_type)i, refCount);
568                         hwOutputDesc->changeRefCount((AudioSystem::stream_type)i, -refCount);
569                     }
570                 }
571             }
572             // move SONIFICATION streams from hardware output to A2DP output if necessary
573             if (!AudioSystem::isA2dpDevice((AudioSystem::audio_devices)oldSonificationDevice) &&
574                 AudioSystem::isA2dpDevice((AudioSystem::audio_devices)newSonificationDevice)) {
575                 for (int i = 0; i < (int)AudioSystem::NUM_STREAM_TYPES; i++) {
576                     if (getStrategy((AudioSystem::stream_type)i) == STRATEGY_SONIFICATION) {
577                         mpClientInterface->setStreamOutput((AudioSystem::stream_type)i, mDuplicatedOutput);
578                         int refCount = hwOutputDesc->mRefCount[i];
579                         mOutputs.valueFor(mDuplicatedOutput)->changeRefCount((AudioSystem::stream_type)i, refCount);
580                         hwOutputDesc->changeRefCount((AudioSystem::stream_type)i, -refCount);
581                     }
582                 }
583             }
584         }
585         // suspend A2DP output if SCO device address is the same as A2DP device address.
586         // no need to check that a SCO device is actually connected as mScoDeviceAddress == ""
587         // if none is connected and the test below will fail.
588         if (mA2dpDeviceAddress == mScoDeviceAddress) {
589             if (oldState == AudioSystem::MODE_NORMAL) {
590                 mpClientInterface->suspendOutput(mA2dpOutput);
591             } else if (state == AudioSystem::MODE_NORMAL) {
592                 mpClientInterface->restoreOutput(mA2dpOutput);
593             }
594         }
595     }
596
597     // force routing command to audio hardware when ending call
598     // even if no device change is needed
599     if (oldState == AudioSystem::MODE_IN_CALL) {
600         if (newDevice == 0) {
601             newDevice = hwOutputDesc->device();
602         }
603         force = true;
604     }
605     // change routing is necessary
606     setOutputDevice(mHardwareOutput, newDevice, force);
607
608     // if entering in call state, handle special case of active streams
609     // pertaining to sonification strategy see handleIncallSonification()
610     if (state == AudioSystem::MODE_IN_CALL) {
611         LOGV("setPhoneState() in call state management: new state is %d", state);
612         for (int stream = 0; stream < AudioSystem::NUM_STREAM_TYPES; stream++) {
613             handleIncallSonification(stream, true, true);
614         }
615     }
616
617     // Flag that ringtone volume must be limited to music volume until we exit MODE_RINGTONE
618     if (state == AudioSystem::MODE_RINGTONE &&
619         (hwOutputDesc->isUsedByStream(AudioSystem::MUSIC) ||
620         (systemTime() - mMusicStopTime) < seconds(SONIFICATION_HEADSET_MUSIC_DELAY))) {
621         mLimitRingtoneVolume = true;
622     } else {
623         mLimitRingtoneVolume = false;
624     }
625 }
626
627 void AudioPolicyManager::setRingerMode(uint32_t mode, uint32_t mask)
628 {
629     LOGV("setRingerMode() mode %x, mask %x", mode, mask);
630
631     mRingerMode = mode;
632 }
633
634 void AudioPolicyManager::setForceUse(AudioSystem::force_use usage, AudioSystem::forced_config config)
635 {
636     LOGV("setForceUse() usage %d, config %d, mPhoneState %d", usage, config, mPhoneState);
637
638     switch(usage) {
639     case AudioSystem::FOR_COMMUNICATION:
640         if (config != AudioSystem::FORCE_SPEAKER && config != AudioSystem::FORCE_BT_SCO &&
641             config != AudioSystem::FORCE_NONE) {
642             LOGW("setForceUse() invalid config %d for FOR_COMMUNICATION", config);
643             return;
644         }
645         mForceUse[usage] = config;
646         // update hardware output routing immediately if in call, or if there is an active
647         // VOICE_CALL stream, as would be the case with an application that uses this stream
648         // for it to behave like in a telephony app (e.g. voicemail app that plays audio files
649         // streamed or downloaded to the device)
650         if ((mPhoneState == AudioSystem::MODE_IN_CALL) ||
651                 (mOutputs.valueFor(mHardwareOutput)->isUsedByStream(AudioSystem::VOICE_CALL))) {
652             uint32_t device = getDeviceForStrategy(STRATEGY_PHONE);
653             setOutputDevice(mHardwareOutput, device);
654         }
655         break;
656     case AudioSystem::FOR_MEDIA:
657         if (config != AudioSystem::FORCE_HEADPHONES && config != AudioSystem::FORCE_BT_A2DP &&
658             config != AudioSystem::FORCE_WIRED_ACCESSORY && config != AudioSystem::FORCE_NONE) {
659             LOGW("setForceUse() invalid config %d for FOR_MEDIA", config);
660             return;
661         }
662         mForceUse[usage] = config;
663         break;
664     case AudioSystem::FOR_RECORD:
665         if (config != AudioSystem::FORCE_BT_SCO && config != AudioSystem::FORCE_WIRED_ACCESSORY &&
666             config != AudioSystem::FORCE_NONE) {
667             LOGW("setForceUse() invalid config %d for FOR_RECORD", config);
668             return;
669         }
670         mForceUse[usage] = config;
671         break;
672     case AudioSystem::FOR_DOCK:
673         if (config != AudioSystem::FORCE_NONE && config != AudioSystem::FORCE_BT_CAR_DOCK &&
674             config != AudioSystem::FORCE_BT_DESK_DOCK && config != AudioSystem::FORCE_WIRED_ACCESSORY) {
675             LOGW("setForceUse() invalid config %d for FOR_DOCK", config);
676         }
677         mForceUse[usage] = config;
678         break;
679     default:
680         LOGW("setForceUse() invalid usage %d", usage);
681         break;
682     }
683 }
684
685 AudioSystem::forced_config AudioPolicyManager::getForceUse(AudioSystem::force_use usage)
686 {
687     return mForceUse[usage];
688 }
689
690 void AudioPolicyManager::setSystemProperty(const char* property, const char* value)
691 {
692     LOGV("setSystemProperty() property %s, value %s", property, value);
693     if (strcmp(property, "ro.camera.sound.forced") == 0) {
694         if (atoi(value)) {
695             LOGV("ENFORCED_AUDIBLE cannot be muted");
696             mStreams[AudioSystem::ENFORCED_AUDIBLE].mCanBeMuted = false;
697         } else {
698             LOGV("ENFORCED_AUDIBLE can be muted");
699             mStreams[AudioSystem::ENFORCED_AUDIBLE].mCanBeMuted = true;
700         }
701     }
702 }
703
704 audio_io_handle_t AudioPolicyManager::getOutput(AudioSystem::stream_type stream,
705                                     uint32_t samplingRate,
706                                     uint32_t format,
707                                     uint32_t channels,
708                                     AudioSystem::output_flags flags)
709 {
710     audio_io_handle_t output = 0;
711     uint32_t latency = 0;
712     routing_strategy strategy = getStrategy((AudioSystem::stream_type)stream);
713     uint32_t device = getDeviceForStrategy(strategy);
714     LOGV("getOutput() stream %d, samplingRate %d, format %d, channels %x, flags %x", stream, samplingRate, format, channels, flags);
715
716
717     // open a direct output if:
718     // 1 a direct output is explicitely requested
719     // 2 the audio format is compressed
720     if ((flags & AudioSystem::OUTPUT_FLAG_DIRECT) ||
721          (format !=0 && !AudioSystem::isLinearPCM(format))) {
722
723         LOGV("getOutput() opening direct output device %x", device);
724         AudioOutputDescriptor *outputDesc = new AudioOutputDescriptor();
725         outputDesc->mDevice = device;
726         outputDesc->mSamplingRate = samplingRate;
727         outputDesc->mFormat = format;
728         outputDesc->mChannels = channels;
729         outputDesc->mLatency = 0;
730         outputDesc->mFlags = (AudioSystem::output_flags)(flags | AudioSystem::OUTPUT_FLAG_DIRECT);
731         outputDesc->mRefCount[stream] = 1;
732         output = mpClientInterface->openOutput(&outputDesc->mDevice,
733                                         &outputDesc->mSamplingRate,
734                                         &outputDesc->mFormat,
735                                         &outputDesc->mChannels,
736                                         &outputDesc->mLatency,
737                                         outputDesc->mFlags);
738
739         // only accept an output with the requeted parameters
740         if ((samplingRate != 0 && samplingRate != outputDesc->mSamplingRate) ||
741             (format != 0 && format != outputDesc->mFormat) ||
742             (channels != 0 && channels != outputDesc->mChannels)) {
743             LOGV("getOutput() failed opening direct output: samplingRate %d, format %d, channels %d",
744                     samplingRate, format, channels);
745             mpClientInterface->closeOutput(output);
746             delete outputDesc;
747             return 0;
748         }
749         mOutputs.add(output, outputDesc);
750         return output;
751     }
752
753     if (channels != 0 && channels != AudioSystem::CHANNEL_OUT_MONO &&
754         channels != AudioSystem::CHANNEL_OUT_STEREO) {
755         return 0;
756     }
757     // open a non direct output
758
759     // get which output is suitable for the specified stream. The actual routing change will happen
760     // when startOutput() will be called
761     uint32_t device2 = device & ~AudioSystem::DEVICE_OUT_SPEAKER;
762     if (AudioSystem::popCount((AudioSystem::audio_devices)device) == 2) {
763 #ifdef WITH_A2DP
764         if (AudioSystem::isA2dpDevice((AudioSystem::audio_devices)device2)) {
765             // if playing on 2 devices among which one is A2DP, use duplicated output
766             LOGV("getOutput() using duplicated output");
767             LOGW_IF((mA2dpOutput == 0), "getOutput() A2DP device in multiple %x selected but A2DP output not opened", device);
768             output = mDuplicatedOutput;
769         } else
770 #endif
771         {
772             // if playing on 2 devices among which none is A2DP, use hardware output
773             output = mHardwareOutput;
774         }
775         LOGV("getOutput() using output %d for 2 devices %x", output, device);
776     } else {
777 #ifdef WITH_A2DP
778         if (AudioSystem::isA2dpDevice((AudioSystem::audio_devices)device2)) {
779             // if playing on A2DP device, use a2dp output
780             LOGW_IF((mA2dpOutput == 0), "getOutput() A2DP device %x selected but A2DP output not opened", device);
781             output = mA2dpOutput;
782         } else
783 #endif
784         {
785             // if playing on not A2DP device, use hardware output
786             output = mHardwareOutput;
787         }
788     }
789
790
791     LOGW_IF((output ==0), "getOutput() could not find output for stream %d, samplingRate %d, format %d, channels %x, flags %x",
792                 stream, samplingRate, format, channels, flags);
793
794     return output;
795 }
796
797 status_t AudioPolicyManager::startOutput(audio_io_handle_t output, AudioSystem::stream_type stream)
798 {
799     LOGV("startOutput() output %d, stream %d", output, stream);
800     ssize_t index = mOutputs.indexOfKey(output);
801     if (index < 0) {
802         LOGW("startOutput() unknow output %d", output);
803         return BAD_VALUE;
804     }
805
806     AudioOutputDescriptor *outputDesc = mOutputs.valueAt(index);
807     routing_strategy strategy = getStrategy((AudioSystem::stream_type)stream);
808     uint32_t device = getDeviceForStrategy(strategy);
809
810     if (!outputDesc->isUsedByStrategy(strategy)) {
811         // if the stream started is the first active stream in its strategy, check if routing change
812         // must be done on hardware output
813         uint32_t newDevice = 0;
814         if (AudioSystem::popCount((AudioSystem::audio_devices)device) == 2) {
815 #ifdef WITH_A2DP
816             uint32_t device2 = device & ~AudioSystem::DEVICE_OUT_SPEAKER;
817             if (AudioSystem::isA2dpDevice((AudioSystem::audio_devices)device2)) {
818                 // if one device is A2DP, selected the second device for hardware output
819                 device &= ~device2;
820             } else
821 #endif
822             {
823                 // we only support speaker + headset and speaker + headphone combinations on hardware output.
824                 // other combinations will leave device = 0 and no routing will happen.
825                 if (device != (AudioSystem::DEVICE_OUT_SPEAKER | AudioSystem::DEVICE_OUT_WIRED_HEADSET) &&
826                     device != (AudioSystem::DEVICE_OUT_SPEAKER | AudioSystem::DEVICE_OUT_WIRED_HEADPHONE)) {
827                     device = AudioSystem::DEVICE_OUT_SPEAKER;
828                 }
829             }
830         }
831
832         // By order of priority
833         // 1 apply routing for phone strategy in any case
834         // 2 apply routing for notification strategy if no stream pertaining to
835         //   phone strategies is playing
836         // 3 apply routing for media strategy is not incall and neither phone nor sonification
837         //   strategies is active.
838         // 4 apply routing for DTMF strategy if no stream pertaining to
839         //   neither phone, sonification nor media strategy is playing
840         if (strategy == STRATEGY_PHONE) {
841             newDevice = device;
842         } else if (!mOutputs.valueFor(mHardwareOutput)->isUsedByStrategy(STRATEGY_PHONE)) {
843             if (strategy == STRATEGY_SONIFICATION) {
844                 newDevice = device;
845             } else if (!mOutputs.valueFor(mHardwareOutput)->isUsedByStrategy(STRATEGY_SONIFICATION)) {
846                 if (strategy == STRATEGY_MEDIA) {
847                     newDevice = device;
848                 } else if (!mOutputs.valueFor(mHardwareOutput)->isUsedByStrategy(STRATEGY_MEDIA)) {
849                     // strategy == STRATEGY_DTMF
850                     newDevice = device;
851                 }
852             }
853         }
854
855         // TODO: maybe mute stream is selected device was refused
856         setOutputDevice(mHardwareOutput, newDevice);
857     }
858
859     // incremenent usage count for this stream on the requested output:
860     // NOTE that the usage count is the same for duplicated output and hardware output which is
861     // necassary for a correct control of hardware output routing by startOutput() and stopOutput()
862     outputDesc->changeRefCount(stream, 1);
863
864     // handle special case for sonification while in call
865     if (mPhoneState == AudioSystem::MODE_IN_CALL) {
866         handleIncallSonification(stream, true, false);
867     }
868
869     // apply volume rules for current stream and device if necessary
870     checkAndSetVolume(stream, mStreams[stream].mIndexCur, output, outputDesc->device());
871
872     return NO_ERROR;
873 }
874
875 status_t AudioPolicyManager::stopOutput(audio_io_handle_t output, AudioSystem::stream_type stream)
876 {
877     LOGV("stopOutput() output %d, stream %d", output, stream);
878     ssize_t index = mOutputs.indexOfKey(output);
879     if (index < 0) {
880         LOGW("stopOutput() unknow output %d", output);
881         return BAD_VALUE;
882     }
883
884     AudioOutputDescriptor *outputDesc = mOutputs.valueAt(index);
885     routing_strategy strategy = getStrategy((AudioSystem::stream_type)stream);
886
887     // handle special case for sonification while in call
888     if (mPhoneState == AudioSystem::MODE_IN_CALL) {
889         handleIncallSonification(stream, false, false);
890     }
891
892     if (outputDesc->isUsedByStrategy(strategy)) {
893         // decrement usage count of this stream on the output
894         outputDesc->changeRefCount(stream, -1);
895         if (!outputDesc->isUsedByStrategy(strategy)) {
896             // if the stream is the last of its strategy to use this output, change routing
897             // in the following order or priority:
898             // PHONE > SONIFICATION > MEDIA > DTMF
899             uint32_t newDevice = 0;
900             if (outputDesc->isUsedByStrategy(STRATEGY_PHONE)) {
901                 newDevice = getDeviceForStrategy(STRATEGY_PHONE);
902             } else if (outputDesc->isUsedByStrategy(STRATEGY_SONIFICATION)) {
903                 newDevice = getDeviceForStrategy(STRATEGY_SONIFICATION);
904             } else if (mPhoneState == AudioSystem::MODE_IN_CALL) {
905                 newDevice = getDeviceForStrategy(STRATEGY_PHONE);
906             } else if (outputDesc->isUsedByStrategy(STRATEGY_MEDIA)) {
907                 newDevice = getDeviceForStrategy(STRATEGY_MEDIA);
908             } else if (outputDesc->isUsedByStrategy(STRATEGY_DTMF)) {
909                 newDevice = getDeviceForStrategy(STRATEGY_DTMF);
910             }
911
912             // apply routing change if necessary.
913             // insert a delay of 2 times the audio hardware latency to ensure PCM
914             // buffers in audio flinger and audio hardware are emptied before the
915             // routing change is executed.
916             setOutputDevice(mHardwareOutput, newDevice, false, mOutputs.valueFor(mHardwareOutput)->mLatency*2);
917         }
918         // store time at which the last music track was stopped - see computeVolume()
919         if (stream == AudioSystem::MUSIC) {
920             mMusicStopTime = systemTime();
921         }
922         return NO_ERROR;
923     } else {
924         LOGW("stopOutput() refcount is already 0 for output %d", output);
925         return INVALID_OPERATION;
926     }
927 }
928
929 void AudioPolicyManager::releaseOutput(audio_io_handle_t output)
930 {
931     LOGV("releaseOutput() %d", output);
932     ssize_t index = mOutputs.indexOfKey(output);
933     if (index < 0) {
934         LOGW("releaseOutput() releasing unknown output %d", output);
935         return;
936     }
937     if (mOutputs.valueAt(index)->mFlags & AudioSystem::OUTPUT_FLAG_DIRECT) {
938         mpClientInterface->closeOutput(output);
939         delete mOutputs.valueAt(index);
940         mOutputs.removeItem(output);
941     }
942 }
943
944 audio_io_handle_t AudioPolicyManager::getInput(int inputSource,
945                                     uint32_t samplingRate,
946                                     uint32_t format,
947                                     uint32_t channels,
948                                     AudioSystem::audio_in_acoustics acoustics)
949 {
950     audio_io_handle_t input = 0;
951     uint32_t device = getDeviceForInputSource(inputSource);
952
953     LOGV("getInput() inputSource %d, samplingRate %d, format %d, channels %x, acoustics %x", inputSource, samplingRate, format, channels, acoustics);
954
955     if (device == 0) {
956         return 0;
957     }
958
959     // adapt channel selection to input source
960     switch(inputSource) {
961     case AUDIO_SOURCE_VOICE_UPLINK:
962         channels = AudioSystem::CHANNEL_IN_VOICE_UPLINK;
963         break;
964     case AUDIO_SOURCE_VOICE_DOWNLINK:
965         channels = AudioSystem::CHANNEL_IN_VOICE_DNLINK;
966         break;
967     case AUDIO_SOURCE_VOICE_CALL:
968         channels = (AudioSystem::CHANNEL_IN_VOICE_UPLINK | AudioSystem::CHANNEL_IN_VOICE_DNLINK);
969         break;
970     default:
971         break;
972     }
973
974     AudioInputDescriptor *inputDesc = new AudioInputDescriptor();
975
976     inputDesc->mInputSource = inputSource;
977     inputDesc->mDevice = device;
978     inputDesc->mSamplingRate = samplingRate;
979     inputDesc->mFormat = format;
980     inputDesc->mChannels = channels;
981     inputDesc->mAcoustics = acoustics;
982     inputDesc->mRefCount = 0;
983     input = mpClientInterface->openInput(&inputDesc->mDevice,
984                                     &inputDesc->mSamplingRate,
985                                     &inputDesc->mFormat,
986                                     &inputDesc->mChannels,
987                                     inputDesc->mAcoustics);
988
989     // only accept input with the exact requested set of parameters
990     if ((samplingRate != inputDesc->mSamplingRate) ||
991         (format != inputDesc->mFormat) ||
992         (channels != inputDesc->mChannels)) {
993         LOGV("getOutput() failed opening input: samplingRate %d, format %d, channels %d",
994                 samplingRate, format, channels);
995         mpClientInterface->closeInput(input);
996         delete inputDesc;
997         return 0;
998     }
999     mInputs.add(input, inputDesc);
1000     return input;
1001 }
1002
1003 status_t AudioPolicyManager::startInput(audio_io_handle_t input)
1004 {
1005     LOGV("startInput() input %d", input);
1006     ssize_t index = mInputs.indexOfKey(input);
1007     if (index < 0) {
1008         LOGW("startInput() unknow input %d", input);
1009         return BAD_VALUE;
1010     }
1011     AudioInputDescriptor *inputDesc = mInputs.valueAt(index);
1012
1013     // refuse 2 active AudioRecord clients at the same time
1014     if (getActiveInput() != 0) {
1015         LOGW("startInput() input %d failed: other input already started", input);
1016         return INVALID_OPERATION;
1017     }
1018
1019     AudioParameter param = AudioParameter();
1020     param.addInt(String8(AudioParameter::keyRouting), (int)inputDesc->mDevice);
1021     mpClientInterface->setParameters(input, param.toString());
1022
1023     inputDesc->mRefCount = 1;
1024     return NO_ERROR;
1025 }
1026
1027 status_t AudioPolicyManager::stopInput(audio_io_handle_t input)
1028 {
1029     LOGV("stopInput() input %d", input);
1030     ssize_t index = mInputs.indexOfKey(input);
1031     if (index < 0) {
1032         LOGW("stopInput() unknow input %d", input);
1033         return BAD_VALUE;
1034     }
1035     AudioInputDescriptor *inputDesc = mInputs.valueAt(index);
1036
1037     if (inputDesc->mRefCount == 0) {
1038         LOGW("stopInput() input %d already stopped", input);
1039         return INVALID_OPERATION;
1040     } else {
1041         AudioParameter param = AudioParameter();
1042         param.addInt(String8(AudioParameter::keyRouting), 0);
1043         mpClientInterface->setParameters(input, param.toString());
1044         inputDesc->mRefCount = 0;
1045         return NO_ERROR;
1046     }
1047 }
1048
1049 void AudioPolicyManager::releaseInput(audio_io_handle_t input)
1050 {
1051     LOGV("releaseInput() %d", input);
1052     ssize_t index = mInputs.indexOfKey(input);
1053     if (index < 0) {
1054         LOGW("releaseInput() releasing unknown input %d", input);
1055         return;
1056     }
1057     mpClientInterface->closeInput(input);
1058     delete mInputs.valueAt(index);
1059     mInputs.removeItem(input);
1060     LOGV("releaseInput() exit");
1061 }
1062
1063
1064
1065 void AudioPolicyManager::initStreamVolume(AudioSystem::stream_type stream,
1066                                             int indexMin,
1067                                             int indexMax)
1068 {
1069     LOGV("initStreamVolume() stream %d, min %d, max %d", stream , indexMin, indexMax);
1070     if (indexMin < 0 || indexMin >= indexMax) {
1071         LOGW("initStreamVolume() invalid index limits for stream %d, min %d, max %d", stream , indexMin, indexMax);
1072         return;
1073     }
1074     mStreams[stream].mIndexMin = indexMin;
1075     mStreams[stream].mIndexMax = indexMax;
1076 }
1077
1078 status_t AudioPolicyManager::setStreamVolumeIndex(AudioSystem::stream_type stream, int index)
1079 {
1080
1081     if ((index < mStreams[stream].mIndexMin) || (index > mStreams[stream].mIndexMax)) {
1082         return BAD_VALUE;
1083     }
1084
1085     // Force max volume if stream cannot be muted
1086     if (!mStreams[stream].mCanBeMuted) index = mStreams[stream].mIndexMax;
1087
1088     LOGV("setStreamVolumeIndex() stream %d, index %d", stream, index);
1089     mStreams[stream].mIndexCur = index;
1090
1091     // compute and apply stream volume on all outputs according to connected device
1092     status_t status = NO_ERROR;
1093     for (size_t i = 0; i < mOutputs.size(); i++) {
1094         status_t volStatus = checkAndSetVolume(stream, index, mOutputs.keyAt(i), mOutputs.valueAt(i)->device());
1095         if (volStatus != NO_ERROR) {
1096             status = volStatus;
1097         }
1098     }
1099     return status;
1100 }
1101
1102 status_t AudioPolicyManager::getStreamVolumeIndex(AudioSystem::stream_type stream, int *index)
1103 {
1104     if (index == 0) {
1105         return BAD_VALUE;
1106     }
1107     LOGV("getStreamVolumeIndex() stream %d", stream);
1108     *index =  mStreams[stream].mIndexCur;
1109     return NO_ERROR;
1110 }
1111
1112 status_t AudioPolicyManager::dump(int fd)
1113 {
1114     const size_t SIZE = 256;
1115     char buffer[SIZE];
1116     String8 result;
1117
1118     snprintf(buffer, SIZE, "\nAudioPolicyManager Dump: %p\n", this);
1119     result.append(buffer);
1120     snprintf(buffer, SIZE, " Hardware Output: %d\n", mHardwareOutput);
1121     result.append(buffer);
1122     snprintf(buffer, SIZE, " A2DP Output: %d\n", mA2dpOutput);
1123     result.append(buffer);
1124     snprintf(buffer, SIZE, " Duplicated Output: %d\n", mDuplicatedOutput);
1125     result.append(buffer);
1126     snprintf(buffer, SIZE, " Output devices: %08x\n", mAvailableOutputDevices);
1127     result.append(buffer);
1128     snprintf(buffer, SIZE, " Input devices: %08x\n", mAvailableInputDevices);
1129     result.append(buffer);
1130     snprintf(buffer, SIZE, " A2DP device address: %s\n", mA2dpDeviceAddress.string());
1131     result.append(buffer);
1132     snprintf(buffer, SIZE, " SCO device address: %s\n", mScoDeviceAddress.string());
1133     result.append(buffer);
1134     snprintf(buffer, SIZE, " Phone state: %d\n", mPhoneState);
1135     result.append(buffer);
1136     snprintf(buffer, SIZE, " Ringer mode: %d\n", mRingerMode);
1137     result.append(buffer);
1138     snprintf(buffer, SIZE, " Force use for communications %d\n", mForceUse[AudioSystem::FOR_COMMUNICATION]);
1139     result.append(buffer);
1140     snprintf(buffer, SIZE, " Force use for media %d\n", mForceUse[AudioSystem::FOR_MEDIA]);
1141     result.append(buffer);
1142     snprintf(buffer, SIZE, " Force use for record %d\n", mForceUse[AudioSystem::FOR_RECORD]);
1143     result.append(buffer);
1144     snprintf(buffer, SIZE, " Force use for dock %d\n", mForceUse[AudioSystem::FOR_DOCK]);
1145     result.append(buffer);
1146     write(fd, result.string(), result.size());
1147
1148     snprintf(buffer, SIZE, "\nOutputs dump:\n");
1149     write(fd, buffer, strlen(buffer));
1150     for (size_t i = 0; i < mOutputs.size(); i++) {
1151         snprintf(buffer, SIZE, "- Output %d dump:\n", mOutputs.keyAt(i));
1152         write(fd, buffer, strlen(buffer));
1153         mOutputs.valueAt(i)->dump(fd);
1154     }
1155
1156     snprintf(buffer, SIZE, "\nInputs dump:\n");
1157     write(fd, buffer, strlen(buffer));
1158     for (size_t i = 0; i < mInputs.size(); i++) {
1159         snprintf(buffer, SIZE, "- Input %d dump:\n", mInputs.keyAt(i));
1160         write(fd, buffer, strlen(buffer));
1161         mInputs.valueAt(i)->dump(fd);
1162     }
1163
1164     snprintf(buffer, SIZE, "\nStreams dump:\n");
1165     write(fd, buffer, strlen(buffer));
1166     snprintf(buffer, SIZE, " Stream  Index Min  Index Max  Index Cur  Mute Count  Can be muted\n");
1167     write(fd, buffer, strlen(buffer));
1168     for (size_t i = 0; i < AudioSystem::NUM_STREAM_TYPES; i++) {
1169         snprintf(buffer, SIZE, " %02d", i);
1170         mStreams[i].dump(buffer + 3, SIZE);
1171         write(fd, buffer, strlen(buffer));
1172     }
1173
1174     return NO_ERROR;
1175 }
1176
1177 // ----------------------------------------------------------------------------
1178 // AudioPolicyManager
1179 // ----------------------------------------------------------------------------
1180
1181 // ---  class factory
1182
1183
1184 extern "C" AudioPolicyInterface* createAudioPolicyManager(AudioPolicyClientInterface *clientInterface)
1185 {
1186     return new AudioPolicyManager(clientInterface);
1187 }
1188
1189 extern "C" void destroyAudioPolicyManager(AudioPolicyInterface *interface)
1190 {
1191     delete interface;
1192 }
1193
1194 AudioPolicyManager::AudioPolicyManager(AudioPolicyClientInterface *clientInterface)
1195 : mPhoneState(AudioSystem::MODE_NORMAL), mRingerMode(0), mMusicStopTime(0), mLimitRingtoneVolume(false)
1196 {
1197     mpClientInterface = clientInterface;
1198
1199     for (int i = 0; i < AudioSystem::NUM_FORCE_USE; i++) {
1200         mForceUse[i] = AudioSystem::FORCE_NONE;
1201     }
1202
1203     // devices available by default are speaker, ear piece and microphone
1204     mAvailableOutputDevices = AudioSystem::DEVICE_OUT_EARPIECE |
1205                         AudioSystem::DEVICE_OUT_SPEAKER;
1206     mAvailableInputDevices = AudioSystem::DEVICE_IN_BUILTIN_MIC;
1207
1208     mA2dpDeviceAddress = String8("");
1209     mScoDeviceAddress = String8("");
1210
1211     // open hardware output
1212     AudioOutputDescriptor *outputDesc = new AudioOutputDescriptor();
1213     outputDesc->mDevice = (uint32_t)AudioSystem::DEVICE_OUT_SPEAKER;
1214     mHardwareOutput = mpClientInterface->openOutput(&outputDesc->mDevice,
1215                                     &outputDesc->mSamplingRate,
1216                                     &outputDesc->mFormat,
1217                                     &outputDesc->mChannels,
1218                                     &outputDesc->mLatency,
1219                                     outputDesc->mFlags);
1220
1221     if (mHardwareOutput == 0) {
1222         LOGE("Failed to initialize hardware output stream, samplingRate: %d, format %d, channels %d",
1223                 outputDesc->mSamplingRate, outputDesc->mFormat, outputDesc->mChannels);
1224     } else {
1225         mOutputs.add(mHardwareOutput, outputDesc);
1226         setOutputDevice(mHardwareOutput, (uint32_t)AudioSystem::DEVICE_OUT_SPEAKER, true);
1227     }
1228
1229     mA2dpOutput = 0;
1230     mDuplicatedOutput = 0;
1231 }
1232
1233 AudioPolicyManager::~AudioPolicyManager()
1234 {
1235    for (size_t i = 0; i < mOutputs.size(); i++) {
1236         mpClientInterface->closeOutput(mOutputs.keyAt(i));
1237         delete mOutputs.valueAt(i);
1238    }
1239    mOutputs.clear();
1240    for (size_t i = 0; i < mInputs.size(); i++) {
1241         mpClientInterface->closeInput(mInputs.keyAt(i));
1242         delete mInputs.valueAt(i);
1243    }
1244    mInputs.clear();
1245 }
1246
1247 // ---
1248
1249 audio_io_handle_t AudioPolicyManager::getOutputForDevice(uint32_t device)
1250 {
1251     audio_io_handle_t output = 0;
1252     uint32_t lDevice;
1253
1254     for (size_t i = 0; i < mOutputs.size(); i++) {
1255         lDevice = mOutputs.valueAt(i)->device();
1256         LOGV("getOutputForDevice() output %d devices %x", mOutputs.keyAt(i), lDevice);
1257
1258         // We are only considering outputs connected to a mixer here => exclude direct outputs
1259         if ((lDevice == device) &&
1260            !(mOutputs.valueAt(i)->mFlags & AudioSystem::OUTPUT_FLAG_DIRECT)) {
1261             output = mOutputs.keyAt(i);
1262             LOGV("getOutputForDevice() found output %d for device %x", output, device);
1263             break;
1264         }
1265     }
1266     return output;
1267 }
1268
1269 AudioPolicyManager::routing_strategy AudioPolicyManager::getStrategy(AudioSystem::stream_type stream)
1270 {
1271     // stream to strategy mapping
1272     switch (stream) {
1273     case AudioSystem::VOICE_CALL:
1274     case AudioSystem::BLUETOOTH_SCO:
1275         return STRATEGY_PHONE;
1276     case AudioSystem::RING:
1277     case AudioSystem::NOTIFICATION:
1278     case AudioSystem::ALARM:
1279     case AudioSystem::ENFORCED_AUDIBLE:
1280         return STRATEGY_SONIFICATION;
1281     case AudioSystem::DTMF:
1282         return STRATEGY_DTMF;
1283     default:
1284         LOGE("unknown stream type");
1285     case AudioSystem::SYSTEM:
1286         // NOTE: SYSTEM stream uses MEDIA strategy because muting music and switching outputs
1287         // while key clicks are played produces a poor result
1288     case AudioSystem::TTS:
1289     case AudioSystem::MUSIC:
1290         return STRATEGY_MEDIA;
1291     }
1292 }
1293
1294 uint32_t AudioPolicyManager::getDeviceForStrategy(routing_strategy strategy)
1295 {
1296     uint32_t device = 0;
1297
1298     switch (strategy) {
1299     case STRATEGY_DTMF:
1300         if (mPhoneState != AudioSystem::MODE_IN_CALL) {
1301             // when off call, DTMF strategy follows the same rules as MEDIA strategy
1302             device = getDeviceForStrategy(STRATEGY_MEDIA);
1303             break;
1304         }
1305         // when in call, DTMF and PHONE strategies follow the same rules
1306         // FALL THROUGH
1307
1308     case STRATEGY_PHONE:
1309         // for phone strategy, we first consider the forced use and then the available devices by order
1310         // of priority
1311         switch (mForceUse[AudioSystem::FOR_COMMUNICATION]) {
1312         case AudioSystem::FORCE_BT_SCO:
1313             if (mPhoneState != AudioSystem::MODE_IN_CALL || strategy != STRATEGY_DTMF) {
1314                 device = mAvailableOutputDevices & AudioSystem::DEVICE_OUT_BLUETOOTH_SCO_CARKIT;
1315                 if (device) break;
1316             }
1317             device = mAvailableOutputDevices & AudioSystem::DEVICE_OUT_BLUETOOTH_SCO_HEADSET;
1318             if (device) break;
1319             device = mAvailableOutputDevices & AudioSystem::DEVICE_OUT_BLUETOOTH_SCO;
1320             if (device) break;
1321             // if SCO device is requested but no SCO device is available, fall back to default case
1322             // FALL THROUGH
1323
1324         default:    // FORCE_NONE
1325             device = mAvailableOutputDevices & AudioSystem::DEVICE_OUT_WIRED_HEADPHONE;
1326             if (device) break;
1327             device = mAvailableOutputDevices & AudioSystem::DEVICE_OUT_WIRED_HEADSET;
1328             if (device) break;
1329             device = mAvailableOutputDevices & AudioSystem::DEVICE_OUT_EARPIECE;
1330             if (device == 0) {
1331                 LOGE("getDeviceForStrategy() earpiece device not found");
1332             }
1333             break;
1334
1335         case AudioSystem::FORCE_SPEAKER:
1336             if (mPhoneState != AudioSystem::MODE_IN_CALL || strategy != STRATEGY_DTMF) {
1337                 device = mAvailableOutputDevices & AudioSystem::DEVICE_OUT_BLUETOOTH_SCO_CARKIT;
1338                 if (device) break;
1339             }
1340             device = mAvailableOutputDevices & AudioSystem::DEVICE_OUT_SPEAKER;
1341             if (device == 0) {
1342                 LOGE("getDeviceForStrategy() speaker device not found");
1343             }
1344             break;
1345         }
1346     break;
1347
1348     case STRATEGY_SONIFICATION:
1349
1350         // If incall, just select the STRATEGY_PHONE device: The rest of the behavior is handled by
1351         // handleIncallSonification().
1352         if (mPhoneState == AudioSystem::MODE_IN_CALL) {
1353             device = getDeviceForStrategy(STRATEGY_PHONE);
1354             break;
1355         }
1356         device = mAvailableOutputDevices & AudioSystem::DEVICE_OUT_SPEAKER;
1357         if (device == 0) {
1358             LOGE("getDeviceForStrategy() speaker device not found");
1359         }
1360         // The second device used for sonification is the same as the device used by media strategy
1361         // FALL THROUGH
1362
1363     case STRATEGY_MEDIA: {
1364         uint32_t device2 = mAvailableOutputDevices & AudioSystem::DEVICE_OUT_AUX_DIGITAL;
1365         if (device2 == 0) {
1366             device2 = mAvailableOutputDevices & AudioSystem::DEVICE_OUT_BLUETOOTH_A2DP;
1367             if (device2 == 0) {
1368                 device2 = mAvailableOutputDevices & AudioSystem::DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES;
1369                 if (device2 == 0) {
1370                     device2 = mAvailableOutputDevices & AudioSystem::DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER;
1371                     if (device2 == 0) {
1372                         device2 = mAvailableOutputDevices & AudioSystem::DEVICE_OUT_WIRED_HEADPHONE;
1373                         if (device2 == 0) {
1374                             device2 = mAvailableOutputDevices & AudioSystem::DEVICE_OUT_WIRED_HEADSET;
1375                             if (device2 == 0) {
1376                                 device = mAvailableOutputDevices & AudioSystem::DEVICE_OUT_SPEAKER;
1377                                 if (device == 0) {
1378                                     LOGE("getDeviceForStrategy() speaker device not found");
1379                                 }
1380                             }
1381                         }
1382                     }
1383                 }
1384             }
1385         }
1386         // device is DEVICE_OUT_SPEAKER if we come from case STRATEGY_SONIFICATION, 0 otherwise
1387         device |= device2;
1388         // Do not play media stream if in call and the requested device would change the hardware
1389         // output routing
1390         if (mPhoneState == AudioSystem::MODE_IN_CALL &&
1391             !AudioSystem::isA2dpDevice((AudioSystem::audio_devices)device) &&
1392             device != getDeviceForStrategy(STRATEGY_PHONE)) {
1393             device = 0;
1394             LOGV("getDeviceForStrategy() incompatible media and phone devices");
1395         }
1396         } break;
1397
1398     default:
1399         LOGW("getDeviceForStrategy() unknown strategy: %d", strategy);
1400         break;
1401     }
1402
1403     LOGV("getDeviceForStrategy() strategy %d, device %x", strategy, device);
1404     return device;
1405 }
1406
1407 void AudioPolicyManager::setOutputDevice(audio_io_handle_t output, uint32_t device, bool force, int delayMs)
1408 {
1409     LOGV("setOutputDevice() output %d device %x delayMs %d", output, device, delayMs);
1410     if (mOutputs.indexOfKey(output) < 0) {
1411         LOGW("setOutputDevice() unknown output %d", output);
1412         return;
1413     }
1414 #ifdef WITH_A2DP
1415     if (output == mHardwareOutput) {
1416         // clear A2DP devices from device bit field here so that the caller does not have to
1417         // do it in case of multiple device selections
1418         uint32_t device2 = device & ~AudioSystem::DEVICE_OUT_SPEAKER;
1419         if (AudioSystem::isA2dpDevice((AudioSystem::audio_devices)device2)) {
1420             LOGV("setOutputDevice() removing A2DP device");
1421             device &= ~device2;
1422         }
1423     } else if (output == mA2dpOutput) {
1424         // clear hardware devices from device bit field here so that the caller does not have to
1425         // do it in case of multiple device selections (the second device is always DEVICE_OUT_SPEAKER)
1426         // in this case
1427         device &= ~AudioSystem::DEVICE_OUT_SPEAKER;
1428     }
1429 #endif
1430
1431     // doing this check here allows the caller to call setOutputDevice() without conditions
1432     if (device == 0) return;
1433
1434     uint32_t oldDevice = (uint32_t)mOutputs.valueFor(output)->device();
1435     // Do not change the routing if the requested device is the same as current device. Doing this check
1436     // here allows the caller to call setOutputDevice() without conditions
1437     if (device == oldDevice && !force) {
1438         LOGV("setOutputDevice() setting same device %x for output %d", device, output);
1439         return;
1440     }
1441
1442     mOutputs.valueFor(output)->mDevice = device;
1443     // mute media streams if both speaker and headset are selected
1444     if (device == (AudioSystem::DEVICE_OUT_SPEAKER | AudioSystem::DEVICE_OUT_WIRED_HEADSET) ||
1445         device == (AudioSystem::DEVICE_OUT_SPEAKER | AudioSystem::DEVICE_OUT_WIRED_HEADPHONE)) {
1446         setStrategyMute(STRATEGY_MEDIA, true, output);
1447         // wait for the PCM output buffers to empty before proceeding with the rest of the command
1448         usleep(mOutputs.valueFor(output)->mLatency*2*1000);
1449     }
1450     // suspend A2D output if SCO device is selected
1451     if (AudioSystem::isBluetoothScoDevice((AudioSystem::audio_devices)device)) {
1452          if (mA2dpOutput && mScoDeviceAddress == mA2dpDeviceAddress) {
1453              mpClientInterface->suspendOutput(mA2dpOutput);
1454          }
1455     }
1456     // do the routing
1457     AudioParameter param = AudioParameter();
1458     param.addInt(String8(AudioParameter::keyRouting), (int)device);
1459     mpClientInterface->setParameters(mHardwareOutput, param.toString(), delayMs);
1460     // update stream volumes according to new device
1461     applyStreamVolumes(output, device, delayMs);
1462
1463     // if disconnecting SCO device, restore A2DP output
1464     if (AudioSystem::isBluetoothScoDevice((AudioSystem::audio_devices)oldDevice)) {
1465          if (mA2dpOutput && mScoDeviceAddress == mA2dpDeviceAddress) {
1466              LOGV("restore A2DP output");
1467              mpClientInterface->restoreOutput(mA2dpOutput);
1468          }
1469     }
1470     // if changing from a combined headset + speaker route, unmute media streams
1471     if (oldDevice == (AudioSystem::DEVICE_OUT_SPEAKER | AudioSystem::DEVICE_OUT_WIRED_HEADSET) ||
1472         oldDevice == (AudioSystem::DEVICE_OUT_SPEAKER | AudioSystem::DEVICE_OUT_WIRED_HEADPHONE)) {
1473         setStrategyMute(STRATEGY_MEDIA, false, output, delayMs);
1474     }
1475 }
1476
1477 uint32_t AudioPolicyManager::getDeviceForInputSource(int inputSource)
1478 {
1479     uint32_t device;
1480
1481     switch(inputSource) {
1482     case AUDIO_SOURCE_DEFAULT:
1483     case AUDIO_SOURCE_MIC:
1484     case AUDIO_SOURCE_VOICE_RECOGNITION:
1485         if (mForceUse[AudioSystem::FOR_RECORD] == AudioSystem::FORCE_BT_SCO &&
1486             mAvailableInputDevices & AudioSystem::DEVICE_IN_BLUETOOTH_SCO_HEADSET) {
1487             device = AudioSystem::DEVICE_IN_BLUETOOTH_SCO_HEADSET;
1488         } else if (mAvailableInputDevices & AudioSystem::DEVICE_IN_WIRED_HEADSET) {
1489             device = AudioSystem::DEVICE_IN_WIRED_HEADSET;
1490         } else {
1491             device = AudioSystem::DEVICE_IN_BUILTIN_MIC;
1492         }
1493         break;
1494     case AUDIO_SOURCE_CAMCORDER:
1495         device = AudioSystem::DEVICE_IN_BUILTIN_MIC;
1496         break;
1497     case AUDIO_SOURCE_VOICE_UPLINK:
1498     case AUDIO_SOURCE_VOICE_DOWNLINK:
1499     case AUDIO_SOURCE_VOICE_CALL:
1500         device = AudioSystem::DEVICE_IN_VOICE_CALL;
1501         break;
1502     default:
1503         LOGW("getInput() invalid input source %d", inputSource);
1504         device = 0;
1505         break;
1506     }
1507     return device;
1508 }
1509
1510 audio_io_handle_t AudioPolicyManager::getActiveInput()
1511 {
1512     for (size_t i = 0; i < mInputs.size(); i++) {
1513         if (mInputs.valueAt(i)->mRefCount > 0) {
1514             return mInputs.keyAt(i);
1515         }
1516     }
1517     return 0;
1518 }
1519
1520 float AudioPolicyManager::computeVolume(int stream, int index, audio_io_handle_t output, uint32_t device)
1521 {
1522     float volume = 1.0;
1523     AudioOutputDescriptor *outputDesc = mOutputs.valueFor(output);
1524     StreamDescriptor &streamDesc = mStreams[stream];
1525
1526     if (device == 0) {
1527         device = outputDesc->device();
1528     }
1529
1530     int volInt = (100 * (index - streamDesc.mIndexMin)) / (streamDesc.mIndexMax - streamDesc.mIndexMin);
1531     volume = AudioSystem::linearToLog(volInt);
1532
1533     // if a heaset is connected, apply the following rules to ring tones and notifications
1534     // to avoid sound level bursts in user's ears:
1535     // - always attenuate ring tones and notifications volume by 6dB
1536     // - if music is playing, always limit the volume to current music volume,
1537     // with a minimum threshold at -36dB so that notification is always perceived.
1538     if ((device &
1539         (AudioSystem::DEVICE_OUT_BLUETOOTH_A2DP |
1540         AudioSystem::DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES |
1541         AudioSystem::DEVICE_OUT_WIRED_HEADSET |
1542         AudioSystem::DEVICE_OUT_WIRED_HEADPHONE)) &&
1543         (getStrategy((AudioSystem::stream_type)stream) == STRATEGY_SONIFICATION)) {
1544         volume *= SONIFICATION_HEADSET_VOLUME_FACTOR;
1545         // when the phone is ringing we must consider that music could have been paused just before
1546         // by the music application and behave as if music was active if the last music track was
1547         // just stopped
1548         if (outputDesc->isUsedByStream(AudioSystem::MUSIC) || mLimitRingtoneVolume) {
1549             float musicVol = computeVolume(AudioSystem::MUSIC, mStreams[AudioSystem::MUSIC].mIndexCur, output, device);
1550             float minVol = (musicVol > SONIFICATION_HEADSET_VOLUME_MIN) ? musicVol : SONIFICATION_HEADSET_VOLUME_MIN;
1551             if (volume > minVol) {
1552                 volume = minVol;
1553                 LOGV("computeVolume limiting volume to %f musicVol %f", minVol, musicVol);
1554             }
1555         }
1556     }
1557
1558     return volume;
1559 }
1560
1561 status_t AudioPolicyManager::checkAndSetVolume(int stream, int index, audio_io_handle_t output, uint32_t device, int delayMs, bool force)
1562 {
1563
1564     // do not change actual stream volume if the stream is muted
1565     if (mStreams[stream].mMuteCount != 0) {
1566         LOGV("checkAndSetVolume() stream %d muted count %d", stream, mStreams[stream].mMuteCount);
1567         return NO_ERROR;
1568     }
1569
1570     // do not change in call volume if bluetooth is connected and vice versa
1571     if ((stream == AudioSystem::VOICE_CALL && mForceUse[AudioSystem::FOR_COMMUNICATION] == AudioSystem::FORCE_BT_SCO) ||
1572         (stream == AudioSystem::BLUETOOTH_SCO && mForceUse[AudioSystem::FOR_COMMUNICATION] != AudioSystem::FORCE_BT_SCO)) {
1573         LOGV("checkAndSetVolume() cannot set stream %d volume with force use = %d for comm",
1574              stream, mForceUse[AudioSystem::FOR_COMMUNICATION]);
1575         return INVALID_OPERATION;
1576     }
1577
1578     float volume = computeVolume(stream, index, output, device);
1579     // do not set volume if the float value did not change
1580     if (volume != mOutputs.valueFor(output)->mCurVolume[stream] || force) {
1581         mOutputs.valueFor(output)->mCurVolume[stream] = volume;
1582         LOGV("setStreamVolume() for output %d stream %d, volume %f, delay %d", output, stream, volume, delayMs);
1583         if (stream == AudioSystem::VOICE_CALL ||
1584             stream == AudioSystem::DTMF ||
1585             stream == AudioSystem::BLUETOOTH_SCO) {
1586             float voiceVolume = -1.0;
1587             // offset value to reflect actual hardware volume that never reaches 0
1588             // 1% corresponds roughly to first step in VOICE_CALL stream volume setting (see AudioService.java)
1589             volume = 0.01 + 0.99 * volume;
1590             if (stream == AudioSystem::VOICE_CALL) {
1591                 voiceVolume = (float)index/(float)mStreams[stream].mIndexMax;
1592             } else if (stream == AudioSystem::BLUETOOTH_SCO) {
1593                 voiceVolume = 1.0;
1594             }
1595             if (voiceVolume >= 0 && output == mHardwareOutput) {
1596                 mpClientInterface->setVoiceVolume(voiceVolume, delayMs);
1597             }
1598         }
1599         mpClientInterface->setStreamVolume((AudioSystem::stream_type)stream, volume, output, delayMs);
1600     }
1601
1602     return NO_ERROR;
1603 }
1604
1605 void AudioPolicyManager::applyStreamVolumes(audio_io_handle_t output, uint32_t device, int delayMs)
1606 {
1607     LOGV("applyStreamVolumes() for output %d and device %x", output, device);
1608
1609     for (int stream = 0; stream < AudioSystem::NUM_STREAM_TYPES; stream++) {
1610         checkAndSetVolume(stream, mStreams[stream].mIndexCur, output, device, delayMs);
1611     }
1612 }
1613
1614 void AudioPolicyManager::setStrategyMute(routing_strategy strategy, bool on, audio_io_handle_t output, int delayMs)
1615 {
1616     LOGV("setStrategyMute() strategy %d, mute %d, output %d", strategy, on, output);
1617     for (int stream = 0; stream < AudioSystem::NUM_STREAM_TYPES; stream++) {
1618         if (getStrategy((AudioSystem::stream_type)stream) == strategy) {
1619             setStreamMute(stream, on, output, delayMs);
1620         }
1621     }
1622 }
1623
1624 void AudioPolicyManager::setStreamMute(int stream, bool on, audio_io_handle_t output, int delayMs)
1625 {
1626     StreamDescriptor &streamDesc = mStreams[stream];
1627     uint32_t device = mOutputs.valueFor(output)->mDevice;
1628
1629     LOGV("setStreamMute() stream %d, mute %d, output %d, mMuteCount %d", stream, on, output, streamDesc.mMuteCount);
1630
1631     if (on) {
1632         if (streamDesc.mMuteCount == 0) {
1633             if (streamDesc.mCanBeMuted) {
1634                 checkAndSetVolume(stream, 0, output, device, delayMs);
1635             }
1636         }
1637         // increment mMuteCount after calling checkAndSetVolume() so that volume change is not ignored
1638         streamDesc.mMuteCount++;
1639     } else {
1640         if (streamDesc.mMuteCount == 0) {
1641             LOGW("setStreamMute() unmuting non muted stream!");
1642             return;
1643         }
1644         if (--streamDesc.mMuteCount == 0) {
1645             checkAndSetVolume(stream, streamDesc.mIndexCur, output, device, delayMs);
1646         }
1647     }
1648 }
1649
1650 void AudioPolicyManager::handleIncallSonification(int stream, bool starting, bool stateChange)
1651 {
1652     // if the stream pertains to sonification strategy and we are in call we must
1653     // mute the stream if it is low visibility. If it is high visibility, we must play a tone
1654     // in the device used for phone strategy and play the tone if the selected device does not
1655     // interfere with the device used for phone strategy
1656     // if stateChange is true, we are called from setPhoneState() and we must mute or unmute as
1657     // many times as there are active tracks on the output
1658
1659     if (getStrategy((AudioSystem::stream_type)stream) == STRATEGY_SONIFICATION) {
1660         AudioOutputDescriptor *outputDesc = mOutputs.valueFor(mHardwareOutput);
1661         LOGV("handleIncallSonification() stream %d starting %d device %x stateChange %d",
1662                 stream, starting, outputDesc->mDevice, stateChange);
1663         if (outputDesc->isUsedByStream((AudioSystem::stream_type)stream)) {
1664             int muteCount = 1;
1665             if (stateChange) {
1666                 muteCount = outputDesc->mRefCount[stream];
1667             }
1668             if (AudioSystem::isLowVisibility((AudioSystem::stream_type)stream)) {
1669                 LOGV("handleIncallSonification() low visibility, muteCount %d", muteCount);
1670                 for (int i = 0; i < muteCount; i++) {
1671                     setStreamMute(stream, starting, mHardwareOutput);
1672                 }
1673             } else {
1674                 LOGV("handleIncallSonification() high visibility ");
1675                 if (outputDesc->mDevice & getDeviceForStrategy(STRATEGY_PHONE)) {
1676                     LOGV("handleIncallSonification() high visibility muted, muteCount %d", muteCount);
1677                     for (int i = 0; i < muteCount; i++) {
1678                         setStreamMute(stream, starting, mHardwareOutput);
1679                     }
1680                 }
1681                 if (starting) {
1682                     mpClientInterface->startTone(ToneGenerator::TONE_SUP_CALL_WAITING, AudioSystem::VOICE_CALL);
1683                 } else {
1684                     mpClientInterface->stopTone();
1685                 }
1686             }
1687         }
1688     }
1689 }
1690
1691
1692 // --- AudioOutputDescriptor class implementation
1693
1694 AudioPolicyManager::AudioOutputDescriptor::AudioOutputDescriptor()
1695     : mSamplingRate(0), mFormat(0), mChannels(0), mLatency(0),
1696     mFlags((AudioSystem::output_flags)0), mDevice(0), mOutput1(0), mOutput2(0)
1697 {
1698     // clear usage count for all stream types
1699     for (int i = 0; i < AudioSystem::NUM_STREAM_TYPES; i++) {
1700         mRefCount[i] = 0;
1701         mCurVolume[i] = -1.0;
1702     }
1703 }
1704
1705 uint32_t AudioPolicyManager::AudioOutputDescriptor::device()
1706 {
1707     uint32_t device = 0;
1708     if (isDuplicated()) {
1709         device = mOutput1->mDevice | mOutput2->mDevice;
1710     } else {
1711         device = mDevice;
1712     }
1713     return device;
1714 }
1715
1716 void AudioPolicyManager::AudioOutputDescriptor::changeRefCount(AudioSystem::stream_type stream, int delta)
1717 {
1718     // forward usage count change to attached outputs
1719     if (isDuplicated()) {
1720         mOutput1->changeRefCount(stream, delta);
1721         mOutput2->changeRefCount(stream, delta);
1722     }
1723     if ((delta + (int)mRefCount[stream]) < 0) {
1724         LOGW("changeRefCount() invalid delta %d for stream %d, refCount %d", delta, stream, mRefCount[stream]);
1725         mRefCount[stream] = 0;
1726         return;
1727     }
1728     mRefCount[stream] += delta;
1729     LOGV("changeRefCount() stream %d, count %d", stream, mRefCount[stream]);
1730 }
1731
1732 bool AudioPolicyManager::AudioOutputDescriptor::isUsedByStrategy(routing_strategy strategy)
1733 {
1734     for (int i = 0; i < (int)AudioSystem::NUM_STREAM_TYPES; i++) {
1735         if (AudioPolicyManager::getStrategy((AudioSystem::stream_type)i) == strategy &&
1736             isUsedByStream((AudioSystem::stream_type)i)) {
1737             return true;
1738         }
1739     }
1740     return false;
1741 }
1742
1743 status_t AudioPolicyManager::AudioOutputDescriptor::dump(int fd)
1744 {
1745     const size_t SIZE = 256;
1746     char buffer[SIZE];
1747     String8 result;
1748
1749     snprintf(buffer, SIZE, " Sampling rate: %d\n", mSamplingRate);
1750     result.append(buffer);
1751     snprintf(buffer, SIZE, " Format: %d\n", mFormat);
1752     result.append(buffer);
1753     snprintf(buffer, SIZE, " Channels: %08x\n", mChannels);
1754     result.append(buffer);
1755     snprintf(buffer, SIZE, " Latency: %d\n", mLatency);
1756     result.append(buffer);
1757     snprintf(buffer, SIZE, " Flags %08x\n", mFlags);
1758     result.append(buffer);
1759     snprintf(buffer, SIZE, " Devices %08x\n", mDevice);
1760     result.append(buffer);
1761     snprintf(buffer, SIZE, " Stream volume refCount\n");
1762     result.append(buffer);
1763     for (int i = 0; i < AudioSystem::NUM_STREAM_TYPES; i++) {
1764         snprintf(buffer, SIZE, " %02d     %.03f  %d\n", i, mCurVolume[i], mRefCount[i]);
1765         result.append(buffer);
1766     }
1767     write(fd, result.string(), result.size());
1768
1769     return NO_ERROR;
1770 }
1771
1772 // --- AudioInputDescriptor class implementation
1773
1774 AudioPolicyManager::AudioInputDescriptor::AudioInputDescriptor()
1775     : mSamplingRate(0), mFormat(0), mChannels(0),
1776      mAcoustics((AudioSystem::audio_in_acoustics)0), mDevice(0), mRefCount(0)
1777 {
1778 }
1779
1780 status_t AudioPolicyManager::AudioInputDescriptor::dump(int fd)
1781 {
1782     const size_t SIZE = 256;
1783     char buffer[SIZE];
1784     String8 result;
1785
1786     snprintf(buffer, SIZE, " Sampling rate: %d\n", mSamplingRate);
1787     result.append(buffer);
1788     snprintf(buffer, SIZE, " Format: %d\n", mFormat);
1789     result.append(buffer);
1790     snprintf(buffer, SIZE, " Channels: %08x\n", mChannels);
1791     result.append(buffer);
1792     snprintf(buffer, SIZE, " Acoustics %08x\n", mAcoustics);
1793     result.append(buffer);
1794     snprintf(buffer, SIZE, " Devices %08x\n", mDevice);
1795     result.append(buffer);
1796     snprintf(buffer, SIZE, " Ref Count %d\n", mRefCount);
1797     result.append(buffer);
1798     write(fd, result.string(), result.size());
1799
1800     return NO_ERROR;
1801 }
1802
1803 // --- StreamDescriptor class implementation
1804
1805 void AudioPolicyManager::StreamDescriptor::dump(char* buffer, size_t size)
1806 {
1807     snprintf(buffer, size, "      %02d         %02d         %02d         %02d          %d\n",
1808             mIndexMin,
1809             mIndexMax,
1810             mIndexCur,
1811             mMuteCount,
1812             mCanBeMuted);
1813 }
1814
1815
1816 }; // namespace android