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

Commit 05c7bc9e authored by Eric Laurent's avatar Eric Laurent Committed by Gerrit Code Review
Browse files

Merge "Revert^2 "Support device role for capture preset.""

parents 66ce6895 6e46824a
Loading
Loading
Loading
Loading
+53 −0
Original line number Diff line number Diff line
@@ -1635,6 +1635,59 @@ status_t AudioSystem::getDevicesForRoleAndStrategy(product_strategy_t strategy,
    return aps->getDevicesForRoleAndStrategy(strategy, role, devices);
}

status_t AudioSystem::setDevicesRoleForCapturePreset(audio_source_t audioSource,
                                                     device_role_t role,
                                                     const AudioDeviceTypeAddrVector &devices)
{
    const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
    if (aps == 0) {
        return PERMISSION_DENIED;
    }
    return aps->setDevicesRoleForCapturePreset(audioSource, role, devices);
}

status_t AudioSystem::addDevicesRoleForCapturePreset(audio_source_t audioSource,
                                                     device_role_t role,
                                                     const AudioDeviceTypeAddrVector &devices)
{
    const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
    if (aps == 0) {
        return PERMISSION_DENIED;
    }
    return aps->addDevicesRoleForCapturePreset(audioSource, role, devices);
}

status_t AudioSystem::removeDevicesRoleForCapturePreset(
        audio_source_t audioSource, device_role_t role, const AudioDeviceTypeAddrVector& devices)
{
    const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
    if (aps == 0) {
        return PERMISSION_DENIED;
    }
    return aps->removeDevicesRoleForCapturePreset(audioSource, role, devices);
}

status_t AudioSystem::clearDevicesRoleForCapturePreset(audio_source_t audioSource,
                                                       device_role_t role)
{
    const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
    if (aps == 0) {
        return PERMISSION_DENIED;
    }
    return aps->clearDevicesRoleForCapturePreset(audioSource, role);
}

status_t AudioSystem::getDevicesForRoleAndCapturePreset(audio_source_t audioSource,
                                                        device_role_t role,
                                                        AudioDeviceTypeAddrVector &devices)
{
    const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
    if (aps == 0) {
        return PERMISSION_DENIED;
    }
    return aps->getDevicesForRoleAndCapturePreset(audioSource, role, devices);
}

class CaptureStateListenerImpl : public media::BnCaptureStateListener,
                                 public IBinder::DeathRecipient {
public:
+165 −1
Original line number Diff line number Diff line
@@ -119,6 +119,11 @@ enum {
    AUDIO_MODULES_UPDATED,  // oneway
    SET_CURRENT_IME_UID,
    REGISTER_SOUNDTRIGGER_CAPTURE_STATE_LISTENER,
    SET_DEVICES_ROLE_FOR_CAPTURE_PRESET,
    ADD_DEVICES_ROLE_FOR_CAPTURE_PRESET,
    REMOVE_DEVICES_ROLE_FOR_CAPTURE_PRESET,
    CLEAR_DEVICES_ROLE_FOR_CAPTURE_PRESET,
    GET_DEVICES_FOR_ROLE_AND_CAPTURE_PRESET,
};

#define MAX_ITEMS_PER_LIST 1024
@@ -1408,6 +1413,95 @@ public:
        return static_cast<status_t>(reply.readInt32());
    }

    virtual status_t setDevicesRoleForCapturePreset(audio_source_t audioSource,
            device_role_t role, const AudioDeviceTypeAddrVector &devices) {
        Parcel data, reply;
        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
        data.writeUint32(static_cast<uint32_t>(audioSource));
        data.writeUint32(static_cast<uint32_t>(role));
        status_t status = data.writeParcelableVector(devices);
        if (status != NO_ERROR) {
            return status;
        }
        status = remote()->transact(SET_DEVICES_ROLE_FOR_CAPTURE_PRESET, data, &reply);
        if (status != NO_ERROR) {
            return status;
        }
        return static_cast<status_t>(reply.readInt32());
    }

    virtual status_t addDevicesRoleForCapturePreset(audio_source_t audioSource,
            device_role_t role, const AudioDeviceTypeAddrVector &devices)
    {
        Parcel data, reply;
        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
        data.writeUint32(static_cast<uint32_t>(audioSource));
        data.writeUint32(static_cast<uint32_t>(role));
        status_t status = data.writeParcelableVector(devices);
        if (status != NO_ERROR) {
            return status;
        }
        status = remote()->transact(ADD_DEVICES_ROLE_FOR_CAPTURE_PRESET, data, &reply);
        if (status != NO_ERROR) {
           return status;
        }
        return static_cast<status_t>(reply.readInt32());
    }

    virtual status_t removeDevicesRoleForCapturePreset(
            audio_source_t audioSource, device_role_t role,
            const AudioDeviceTypeAddrVector& devices)
    {
        Parcel data, reply;
        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
        data.writeUint32(static_cast<uint32_t>(audioSource));
        data.writeUint32(static_cast<uint32_t>(role));
        status_t status = data.writeParcelableVector(devices);
        if (status != NO_ERROR) {
            return status;
        }
        status = remote()->transact(REMOVE_DEVICES_ROLE_FOR_CAPTURE_PRESET,
                data, &reply);
        if (status != NO_ERROR) {
           return status;
        }
        return static_cast<status_t>(reply.readInt32());
    }

    virtual status_t clearDevicesRoleForCapturePreset(
            audio_source_t audioSource, device_role_t role)
    {
        Parcel data, reply;
        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
        data.writeUint32(static_cast<uint32_t>(audioSource));
        data.writeUint32(static_cast<uint32_t>(role));
        status_t status = remote()->transact(CLEAR_DEVICES_ROLE_FOR_CAPTURE_PRESET,
                data, &reply);
        if (status != NO_ERROR) {
           return status;
        }
        return static_cast<status_t>(reply.readInt32());
    }

    virtual status_t getDevicesForRoleAndCapturePreset(audio_source_t audioSource,
            device_role_t role, AudioDeviceTypeAddrVector &devices)
    {
        Parcel data, reply;
        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
        data.writeUint32(static_cast<uint32_t>(audioSource));
        data.writeUint32(static_cast<uint32_t>(role));
        status_t status = remote()->transact(GET_DEVICES_FOR_ROLE_AND_CAPTURE_PRESET,
                data, &reply);
        if (status != NO_ERROR) {
            return status;
        }
        status = reply.readParcelableVector(&devices);
        if (status != NO_ERROR) {
            return status;
        }
        return static_cast<status_t>(reply.readInt32());
    }

    virtual status_t getDevicesForAttributes(const AudioAttributes &aa,
            AudioDeviceTypeAddrVector *devices) const
    {
@@ -1544,7 +1638,12 @@ status_t BnAudioPolicyService::onTransact(
        case SET_ALLOWED_CAPTURE_POLICY:
        case AUDIO_MODULES_UPDATED:
        case SET_CURRENT_IME_UID:
        case REGISTER_SOUNDTRIGGER_CAPTURE_STATE_LISTENER: {
        case REGISTER_SOUNDTRIGGER_CAPTURE_STATE_LISTENER:
        case SET_DEVICES_ROLE_FOR_CAPTURE_PRESET:
        case ADD_DEVICES_ROLE_FOR_CAPTURE_PRESET:
        case REMOVE_DEVICES_ROLE_FOR_CAPTURE_PRESET:
        case CLEAR_DEVICES_ROLE_FOR_CAPTURE_PRESET:
        case GET_DEVICES_FOR_ROLE_AND_CAPTURE_PRESET: {
            if (!isServiceUid(IPCThreadState::self()->getCallingUid())) {
                ALOGW("%s: transaction %d received from PID %d unauthorized UID %d",
                      __func__, code, IPCThreadState::self()->getCallingPid(),
@@ -2729,6 +2828,71 @@ status_t BnAudioPolicyService::onTransact(
            return NO_ERROR;
        } break;

        case SET_DEVICES_ROLE_FOR_CAPTURE_PRESET: {
            CHECK_INTERFACE(IAudioPolicyService, data, reply);
            audio_source_t audioSource = (audio_source_t) data.readUint32();
            device_role_t role = (device_role_t) data.readUint32();
            AudioDeviceTypeAddrVector devices;
            status_t status = data.readParcelableVector(&devices);
            if (status != NO_ERROR) {
                return status;
            }
            status = setDevicesRoleForCapturePreset(audioSource, role, devices);
            reply->writeInt32(status);
            return NO_ERROR;
        }

        case ADD_DEVICES_ROLE_FOR_CAPTURE_PRESET: {
            CHECK_INTERFACE(IAudioPolicyService, data, reply);
            audio_source_t audioSource = (audio_source_t) data.readUint32();
            device_role_t role = (device_role_t) data.readUint32();
            AudioDeviceTypeAddrVector devices;
            status_t status = data.readParcelableVector(&devices);
            if (status != NO_ERROR) {
                return status;
            }
            status = addDevicesRoleForCapturePreset(audioSource, role, devices);
            reply->writeInt32(status);
            return NO_ERROR;
        }

        case REMOVE_DEVICES_ROLE_FOR_CAPTURE_PRESET: {
            CHECK_INTERFACE(IAudioPolicyService, data, reply);
            audio_source_t audioSource = (audio_source_t) data.readUint32();
            device_role_t role = (device_role_t) data.readUint32();
            AudioDeviceTypeAddrVector devices;
            status_t status = data.readParcelableVector(&devices);
            if (status != NO_ERROR) {
                return status;
            }
            status = removeDevicesRoleForCapturePreset(audioSource, role, devices);
            reply->writeInt32(status);
            return NO_ERROR;
        }

        case CLEAR_DEVICES_ROLE_FOR_CAPTURE_PRESET: {
            CHECK_INTERFACE(IAudioPolicyService, data, reply);
            audio_source_t audioSource = (audio_source_t) data.readUint32();
            device_role_t role = (device_role_t) data.readUint32();
            status_t status = clearDevicesRoleForCapturePreset(audioSource, role);
            reply->writeInt32(status);
            return NO_ERROR;
        }

        case GET_DEVICES_FOR_ROLE_AND_CAPTURE_PRESET: {
            CHECK_INTERFACE(IAudioPolicyService, data, reply);
            audio_source_t audioSource = (audio_source_t) data.readUint32();
            device_role_t role = (device_role_t) data.readUint32();
            AudioDeviceTypeAddrVector devices;
            status_t status = getDevicesForRoleAndCapturePreset(audioSource, role, devices);
            status_t marshall_status = reply->writeParcelableVector(devices);
            if (marshall_status != NO_ERROR) {
                return marshall_status;
            }
            reply->writeInt32(status);
            return NO_ERROR;
        }

        default:
            return BBinder::onTransact(code, data, reply, flags);
    }
+16 −0
Original line number Diff line number Diff line
@@ -433,6 +433,22 @@ public:
    static status_t getDevicesForRoleAndStrategy(product_strategy_t strategy,
            device_role_t role, AudioDeviceTypeAddrVector &devices);

    static status_t setDevicesRoleForCapturePreset(audio_source_t audioSource,
            device_role_t role, const AudioDeviceTypeAddrVector &devices);

    static status_t addDevicesRoleForCapturePreset(audio_source_t audioSource,
            device_role_t role, const AudioDeviceTypeAddrVector &devices);

    static status_t removeDevicesRoleForCapturePreset(
            audio_source_t audioSource, device_role_t role,
            const AudioDeviceTypeAddrVector& devices);

    static status_t clearDevicesRoleForCapturePreset(
            audio_source_t audioSource, device_role_t role);

    static status_t getDevicesForRoleAndCapturePreset(audio_source_t audioSource,
            device_role_t role, AudioDeviceTypeAddrVector &devices);

    static status_t getDeviceForStrategy(product_strategy_t strategy,
            AudioDeviceTypeAddr &device);

+19 −0
Original line number Diff line number Diff line
@@ -252,6 +252,25 @@ public:
                                                  device_role_t role,
                                                  AudioDeviceTypeAddrVector &devices) = 0;

    virtual status_t setDevicesRoleForCapturePreset(audio_source_t audioSource,
                                                    device_role_t role,
                                                    const AudioDeviceTypeAddrVector &devices) = 0;

    virtual status_t addDevicesRoleForCapturePreset(audio_source_t audioSource,
                                                    device_role_t role,
                                                    const AudioDeviceTypeAddrVector &devices) = 0;

    virtual status_t removeDevicesRoleForCapturePreset(
            audio_source_t audioSource, device_role_t role,
            const AudioDeviceTypeAddrVector& devices) = 0;

    virtual status_t clearDevicesRoleForCapturePreset(audio_source_t audioSource,
                                                      device_role_t role) = 0;

    virtual status_t getDevicesForRoleAndCapturePreset(audio_source_t audioSource,
                                                       device_role_t role,
                                                       AudioDeviceTypeAddrVector &devices) = 0;

    // The return code here is only intended to represent transport errors. The
    // actual server implementation should always return NO_ERROR.
    virtual status_t registerSoundTriggerCaptureStateListener(
+23 −0
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@
#include <arpa/inet.h>
#include <iostream>
#include <regex>
#include <set>
#include <sstream>

namespace android {
@@ -80,6 +81,14 @@ bool AudioDeviceTypeAddr::operator<(const AudioDeviceTypeAddr& other) const {
    return false;
}

bool AudioDeviceTypeAddr::operator==(const AudioDeviceTypeAddr &rhs) const {
    return equals(rhs);
}

bool AudioDeviceTypeAddr::operator!=(const AudioDeviceTypeAddr &rhs) const {
    return !operator==(rhs);
}

void AudioDeviceTypeAddr::reset() {
    mType = AUDIO_DEVICE_NONE;
    setAddress("");
@@ -120,6 +129,20 @@ DeviceTypeSet getAudioDeviceTypes(const AudioDeviceTypeAddrVector& deviceTypeAdd
    return deviceTypes;
}

AudioDeviceTypeAddrVector excludeDeviceTypeAddrsFrom(
        const AudioDeviceTypeAddrVector& devices,
        const AudioDeviceTypeAddrVector& devicesToExclude) {
    std::set<AudioDeviceTypeAddr> devicesToExcludeSet(
            devicesToExclude.begin(), devicesToExclude.end());
    AudioDeviceTypeAddrVector remainedDevices;
    for (const auto& device : devices) {
        if (devicesToExcludeSet.count(device) == 0) {
            remainedDevices.push_back(device);
        }
    }
    return remainedDevices;
}

std::string dumpAudioDeviceTypeAddrVector(const AudioDeviceTypeAddrVector& deviceTypeAddrs,
                                          bool includeSensitiveInfo) {
    std::stringstream stream;
Loading