Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ed5b4342 authored by Eric Laurent's avatar Eric Laurent
Browse files

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
parent 69545369
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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); }

+1 −1
Original line number Diff line number Diff line
@@ -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;
+1 −1
Original line number Diff line number Diff line
@@ -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++) {
+4 −1
Original line number Diff line number Diff line
@@ -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);
}
+7 −3
Original line number Diff line number Diff line
@@ -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,