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
gugelfrei
Eric Laurent 7 years ago
parent 69545369ee
commit ed5b434293

@ -71,7 +71,7 @@ public:
virtual void toAudioPort(struct audio_port *port) const;
virtual void importAudioPort(const sp<AudioPort>& port);
virtual void importAudioPort(const sp<AudioPort>& port, bool force = false);
void addAudioProfile(const sp<AudioProfile> &profile) { mProfiles.add(profile); }

@ -48,7 +48,7 @@ public:
// AudioPort
virtual void attach(const sp<HwModule>& module);
virtual void toAudioPort(struct audio_port *port) const;
virtual void importAudioPort(const sp<AudioPort>& port);
virtual void importAudioPort(const sp<AudioPort>& port, bool force = false);
audio_port_handle_t getId() const;
status_t dump(int fd, int spaces, int index, bool verbose = true) const;

@ -128,7 +128,7 @@ void AudioPort::toAudioPort(struct audio_port *port) const
port->num_gains = i;
}
void AudioPort::importAudioPort(const sp<AudioPort>& port)
void AudioPort::importAudioPort(const sp<AudioPort>& port, bool force __unused)
{
size_t indexToImport;
for (indexToImport = 0; indexToImport < port->mProfiles.size(); indexToImport++) {

@ -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<AudioPort>& port) {
void DeviceDescriptor::importAudioPort(const sp<AudioPort>& port, bool force) {
if (!force && !port->hasDynamicAudioProfile()) {
return;
}
AudioPort::importAudioPort(port);
port->pickAudioProfile(mSamplingRate, mChannelMask, mFormat);
}

@ -3647,7 +3647,7 @@ AudioPolicyManager::AudioPolicyManager(AudioPolicyClientInterface *clientInterfa
sp<DeviceDescriptor> 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<DeviceDescriptor>& 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<DeviceDescriptor>& 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,

Loading…
Cancel
Save