From ed5b4342935b8d624ff965187ce9bfe7facf53ef Mon Sep 17 00:00:00 2001 From: Eric Laurent Date: Sun, 9 Jul 2017 16:51:08 -0700 Subject: [PATCH] audio policy: fix audio device properties loading Only load removable digital device properties from streams with dynamic profiles. This avoids aggregating properties from other stream profiles when the device can also be reached via those profiles. Bug: 38423100 Test: connect various USB devices and check properties are loaded properly. Change-Id: Ie5eed397d3a475848a3d423d18ffae9d55917ac4 --- .../common/managerdefinitions/include/AudioPort.h | 2 +- .../managerdefinitions/include/DeviceDescriptor.h | 2 +- .../common/managerdefinitions/src/AudioPort.cpp | 2 +- .../common/managerdefinitions/src/DeviceDescriptor.cpp | 5 ++++- .../audiopolicy/managerdefault/AudioPolicyManager.cpp | 10 +++++++--- 5 files changed, 14 insertions(+), 7 deletions(-) diff --git a/services/audiopolicy/common/managerdefinitions/include/AudioPort.h b/services/audiopolicy/common/managerdefinitions/include/AudioPort.h index ded22859b7..4f79ed292a 100644 --- a/services/audiopolicy/common/managerdefinitions/include/AudioPort.h +++ b/services/audiopolicy/common/managerdefinitions/include/AudioPort.h @@ -71,7 +71,7 @@ public: virtual void toAudioPort(struct audio_port *port) const; - virtual void importAudioPort(const sp& port); + virtual void importAudioPort(const sp& port, bool force = false); void addAudioProfile(const sp &profile) { mProfiles.add(profile); } diff --git a/services/audiopolicy/common/managerdefinitions/include/DeviceDescriptor.h b/services/audiopolicy/common/managerdefinitions/include/DeviceDescriptor.h index 9a52d225f7..1a644d782c 100644 --- a/services/audiopolicy/common/managerdefinitions/include/DeviceDescriptor.h +++ b/services/audiopolicy/common/managerdefinitions/include/DeviceDescriptor.h @@ -48,7 +48,7 @@ public: // AudioPort virtual void attach(const sp& module); virtual void toAudioPort(struct audio_port *port) const; - virtual void importAudioPort(const sp& port); + virtual void importAudioPort(const sp& port, bool force = false); audio_port_handle_t getId() const; status_t dump(int fd, int spaces, int index, bool verbose = true) const; diff --git a/services/audiopolicy/common/managerdefinitions/src/AudioPort.cpp b/services/audiopolicy/common/managerdefinitions/src/AudioPort.cpp index 6ed2cb7fad..fcf9070394 100644 --- a/services/audiopolicy/common/managerdefinitions/src/AudioPort.cpp +++ b/services/audiopolicy/common/managerdefinitions/src/AudioPort.cpp @@ -128,7 +128,7 @@ void AudioPort::toAudioPort(struct audio_port *port) const port->num_gains = i; } -void AudioPort::importAudioPort(const sp& port) +void AudioPort::importAudioPort(const sp& port, bool force __unused) { size_t indexToImport; for (indexToImport = 0; indexToImport < port->mProfiles.size(); indexToImport++) { diff --git a/services/audiopolicy/common/managerdefinitions/src/DeviceDescriptor.cpp b/services/audiopolicy/common/managerdefinitions/src/DeviceDescriptor.cpp index f0e48b6255..a2c1165c5e 100644 --- a/services/audiopolicy/common/managerdefinitions/src/DeviceDescriptor.cpp +++ b/services/audiopolicy/common/managerdefinitions/src/DeviceDescriptor.cpp @@ -263,7 +263,10 @@ void DeviceDescriptor::toAudioPort(struct audio_port *port) const strncpy(port->ext.device.address, mAddress.string(), AUDIO_DEVICE_MAX_ADDRESS_LEN); } -void DeviceDescriptor::importAudioPort(const sp& port) { +void DeviceDescriptor::importAudioPort(const sp& port, bool force) { + if (!force && !port->hasDynamicAudioProfile()) { + return; + } AudioPort::importAudioPort(port); port->pickAudioProfile(mSamplingRate, mChannelMask, mFormat); } diff --git a/services/audiopolicy/managerdefault/AudioPolicyManager.cpp b/services/audiopolicy/managerdefault/AudioPolicyManager.cpp index e8e531ad4c..d9859eaadf 100644 --- a/services/audiopolicy/managerdefault/AudioPolicyManager.cpp +++ b/services/audiopolicy/managerdefault/AudioPolicyManager.cpp @@ -3647,7 +3647,7 @@ AudioPolicyManager::AudioPolicyManager(AudioPolicyClientInterface *clientInterfa sp devDesc = mAvailableInputDevices[index]; if (!devDesc->isAttached()) { devDesc->attach(mHwModules[i]); - devDesc->importAudioPort(inProfile); + devDesc->importAudioPort(inProfile, true); } } } @@ -4010,8 +4010,8 @@ status_t AudioPolicyManager::checkOutputsForDevice(const sp& d continue; } - ALOGV("opening output for device %08x with params %s profile %p", - device, address.string(), profile.get()); + ALOGV("opening output for device %08x with params %s profile %p name %s", + device, address.string(), profile.get(), profile->getName().string()); desc = new SwAudioOutputDescriptor(profile, mpClientInterface); desc->mDevice = device; audio_config_t config = AUDIO_CONFIG_INITIALIZER; @@ -4260,6 +4260,10 @@ status_t AudioPolicyManager::checkInputsForDevice(const sp& de config.channel_mask = desc->mChannelMask; config.format = desc->mFormat; audio_io_handle_t input = AUDIO_IO_HANDLE_NONE; + + ALOGV("opening inputput for device %08x with params %s profile %p name %s", + desc->mDevice, address.string(), profile.get(), profile->getName().string()); + status_t status = mpClientInterface->openInput(profile->getModuleHandle(), &input, &config,