diff options
author | keunyoung <keunyoung@google.com> | 2014-12-30 13:00:52 -0800 |
---|---|---|
committer | keunyoung <keunyoung@google.com> | 2015-01-05 13:27:42 -0800 |
commit | 3190e67d5c80c1e39e3be91784110af1180cd182 (patch) | |
tree | df0ffbb41220270e726bc95e1148bae7a370473a | |
parent | 0d19abb440c7e62e944efbeadf02299990f9a589 (diff) | |
download | frameworks_av-3190e67d5c80c1e39e3be91784110af1180cd182.zip frameworks_av-3190e67d5c80c1e39e3be91784110af1180cd182.tar.gz frameworks_av-3190e67d5c80c1e39e3be91784110af1180cd182.tar.bz2 |
close remote submix's output when device is not available.
- change output close logic to find the device from IOProfile rather than
AudioPatch as AudioPatch handle can be cleared before disconnect.
- Otherwise, remote submix can be stuck as output is never closed and does not
work any more as subsequent open fails as output is already taken.
bug: 18733215
Change-Id: Iddb481c91e81070e6be18996a4c8837dabd7ebdb
-rw-r--r-- | services/audiopolicy/AudioPolicyManager.cpp | 32 | ||||
-rw-r--r-- | services/audiopolicy/AudioPolicyManager.h | 1 |
2 files changed, 10 insertions, 23 deletions
diff --git a/services/audiopolicy/AudioPolicyManager.cpp b/services/audiopolicy/AudioPolicyManager.cpp index 34c677c..8d1b3bb 100644 --- a/services/audiopolicy/AudioPolicyManager.cpp +++ b/services/audiopolicy/AudioPolicyManager.cpp @@ -3442,29 +3442,15 @@ void AudioPolicyManager::addInput(audio_io_handle_t input, sp<AudioInputDescript } void AudioPolicyManager::findIoHandlesByAddress(sp<AudioOutputDescriptor> desc /*in*/, + const audio_devices_t device /*in*/, const String8 address /*in*/, SortedVector<audio_io_handle_t>& outputs /*out*/) { - // look for a match on the given address on the addresses of the outputs: - // find the address by finding the patch that maps to this output - ssize_t patchIdx = mAudioPatches.indexOfKey(desc->mPatchHandle); - //ALOGV(" inspecting output %d (patch %d) for supported device=0x%x", - // outputIdx, patchIdx, desc->mProfile->mSupportedDevices.types()); - if (patchIdx >= 0) { - const sp<AudioPatch> patchDesc = mAudioPatches.valueAt(patchIdx); - const int numSinks = patchDesc->mPatch.num_sinks; - for (ssize_t j=0; j < numSinks; j++) { - if (patchDesc->mPatch.sinks[j].type == AUDIO_PORT_TYPE_DEVICE) { - const char* patchAddr = - patchDesc->mPatch.sinks[j].ext.device.address; - if (strncmp(patchAddr, - address.string(), AUDIO_DEVICE_MAX_ADDRESS_LEN) == 0) { - ALOGV("findIoHandlesByAddress(): adding opened output %d on same address %s", - desc->mIoHandle, patchDesc->mPatch.sinks[j].ext.device.address); - outputs.add(desc->mIoHandle); - break; - } - } - } + sp<DeviceDescriptor> devDesc = + desc->mProfile->mSupportedDevices.getDevice(device, address); + if (devDesc != 0) { + ALOGV("findIoHandlesByAddress(): adding opened output %d on same address %s", + desc->mIoHandle, address.string()); + outputs.add(desc->mIoHandle); } } @@ -3488,7 +3474,7 @@ status_t AudioPolicyManager::checkOutputsForDevice(const sp<DeviceDescriptor> de outputs.add(mOutputs.keyAt(i)); } else { ALOGV(" checking address match due to device 0x%x", device); - findIoHandlesByAddress(desc, address, outputs); + findIoHandlesByAddress(desc, device, address, outputs); } } } @@ -3716,7 +3702,7 @@ status_t AudioPolicyManager::checkOutputsForDevice(const sp<DeviceDescriptor> de // exact match on device if (deviceDistinguishesOnAddress(device) && (desc->mProfile->mSupportedDevices.types() == device)) { - findIoHandlesByAddress(desc, address, outputs); + findIoHandlesByAddress(desc, device, address, outputs); } else if (!(desc->mProfile->mSupportedDevices.types() & mAvailableOutputDevices.types())) { ALOGV("checkOutputsForDevice(): disconnecting adding output %d", diff --git a/services/audiopolicy/AudioPolicyManager.h b/services/audiopolicy/AudioPolicyManager.h index 2059f58..633888f 100644 --- a/services/audiopolicy/AudioPolicyManager.h +++ b/services/audiopolicy/AudioPolicyManager.h @@ -889,6 +889,7 @@ private: // see deviceDistinguishesOnAddress(audio_devices_t) for whether the device type is one // where addresses are used to distinguish between one connected device and another. void findIoHandlesByAddress(sp<AudioOutputDescriptor> desc /*in*/, + const audio_devices_t device /*in*/, const String8 address /*in*/, SortedVector<audio_io_handle_t>& outputs /*out*/); uint32_t nextUniqueId(); |