summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkeunyoung <keunyoung@google.com>2014-12-30 13:00:52 -0800
committerkeunyoung <keunyoung@google.com>2015-01-05 13:27:42 -0800
commit3190e67d5c80c1e39e3be91784110af1180cd182 (patch)
treedf0ffbb41220270e726bc95e1148bae7a370473a
parent0d19abb440c7e62e944efbeadf02299990f9a589 (diff)
downloadframeworks_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.cpp32
-rw-r--r--services/audiopolicy/AudioPolicyManager.h1
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();