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

Commit 0f4b3c54 authored by Eric Laurent's avatar Eric Laurent
Browse files

audio policy: refactor audio record APIs

Refactor audio policy service APIs controlling audio record (startInput, stopInput, releaseInput)
To allow finer grain control per AudioRecord client and prepare for new concurrent capture
policy

Test: AudioRecord CTS test. manual test of capture use cases:
camcorder, OK Google VoIP

Change-Id: I4992fd5a115853c47be5dac5465989eb53f1287c
parent c6116926
Loading
Loading
Loading
Loading
+8 −13
Original line number Diff line number Diff line
@@ -904,6 +904,7 @@ status_t AudioSystem::getInputForAttr(const audio_attributes_t *attr,
                                audio_session_t session,
                                pid_t pid,
                                uid_t uid,
                                const String16& opPackageName,
                                const audio_config_base_t *config,
                                audio_input_flags_t flags,
                                audio_port_handle_t *selectedDeviceId,
@@ -912,35 +913,29 @@ status_t AudioSystem::getInputForAttr(const audio_attributes_t *attr,
    const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
    if (aps == 0) return NO_INIT;
    return aps->getInputForAttr(
            attr, input, session, pid, uid,
            attr, input, session, pid, uid, opPackageName,
            config, flags, selectedDeviceId, portId);
}

status_t AudioSystem::startInput(audio_io_handle_t input,
                                 audio_session_t session,
                                 audio_devices_t device,
                                 uid_t uid,
                                 bool *silenced)
status_t AudioSystem::startInput(audio_port_handle_t portId, bool *silenced)
{
    const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
    if (aps == 0) return PERMISSION_DENIED;
    return aps->startInput(input, session, device, uid, silenced);
    return aps->startInput(portId, silenced);
}

status_t AudioSystem::stopInput(audio_io_handle_t input,
                                audio_session_t session)
status_t AudioSystem::stopInput(audio_port_handle_t portId)
{
    const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
    if (aps == 0) return PERMISSION_DENIED;
    return aps->stopInput(input, session);
    return aps->stopInput(portId);
}

void AudioSystem::releaseInput(audio_io_handle_t input,
                               audio_session_t session)
void AudioSystem::releaseInput(audio_port_handle_t portId)
{
    const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
    if (aps == 0) return;
    aps->releaseInput(input, session);
    aps->releaseInput(portId);
}

status_t AudioSystem::initStreamVolume(audio_stream_type_t stream,
+16 −28
Original line number Diff line number Diff line
@@ -285,6 +285,7 @@ public:
                                     audio_session_t session,
                                     pid_t pid,
                                     uid_t uid,
                                     const String16& opPackageName,
                                     const audio_config_base_t *config,
                                     audio_input_flags_t flags,
                                     audio_port_handle_t *selectedDeviceId,
@@ -313,6 +314,7 @@ public:
        data.writeInt32(session);
        data.writeInt32(pid);
        data.writeInt32(uid);
        data.writeString16(opPackageName);
        data.write(config, sizeof(audio_config_base_t));
        data.writeInt32(flags);
        data.writeInt32(*selectedDeviceId);
@@ -331,18 +333,12 @@ public:
        return NO_ERROR;
    }

    virtual status_t startInput(audio_io_handle_t input,
                                audio_session_t session,
                                audio_devices_t device,
                                uid_t uid,
    virtual status_t startInput(audio_port_handle_t portId,
                                bool *silenced)
    {
        Parcel data, reply;
        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
        data.writeInt32(input);
        data.writeInt32(session);
        data.writeInt32(device);
        data.writeInt32(uid);
        data.writeInt32(portId);
        data.writeInt32(*silenced ? 1 : 0);
        remote()->transact(START_INPUT, data, &reply);
        status_t status = static_cast <status_t> (reply.readInt32());
@@ -350,24 +346,20 @@ public:
        return status;
    }

    virtual status_t stopInput(audio_io_handle_t input,
                               audio_session_t session)
    virtual status_t stopInput(audio_port_handle_t portId)
    {
        Parcel data, reply;
        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
        data.writeInt32(input);
        data.writeInt32(session);
        data.writeInt32(portId);
        remote()->transact(STOP_INPUT, data, &reply);
        return static_cast <status_t> (reply.readInt32());
    }

    virtual void releaseInput(audio_io_handle_t input,
                              audio_session_t session)
    virtual void releaseInput(audio_port_handle_t portId)
    {
        Parcel data, reply;
        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
        data.writeInt32(input);
        data.writeInt32(session);
        data.writeInt32(portId);
        remote()->transact(RELEASE_INPUT, data, &reply);
    }

@@ -1034,6 +1026,7 @@ status_t BnAudioPolicyService::onTransact(
            audio_session_t session = (audio_session_t)data.readInt32();
            pid_t pid = (pid_t)data.readInt32();
            uid_t uid = (uid_t)data.readInt32();
            const String16 opPackageName = data.readString16();
            audio_config_base_t config;
            memset(&config, 0, sizeof(audio_config_base_t));
            data.read(&config, sizeof(audio_config_base_t));
@@ -1041,7 +1034,7 @@ status_t BnAudioPolicyService::onTransact(
            audio_port_handle_t selectedDeviceId = (audio_port_handle_t) data.readInt32();
            audio_port_handle_t portId = (audio_port_handle_t)data.readInt32();
            status_t status = getInputForAttr(&attr, &input, session, pid, uid,
                                              &config,
                                              opPackageName, &config,
                                              flags, &selectedDeviceId, &portId);
            reply->writeInt32(status);
            if (status == NO_ERROR) {
@@ -1054,12 +1047,9 @@ status_t BnAudioPolicyService::onTransact(

        case START_INPUT: {
            CHECK_INTERFACE(IAudioPolicyService, data, reply);
            audio_io_handle_t input = static_cast <audio_io_handle_t>(data.readInt32());
            audio_session_t session = static_cast <audio_session_t>(data.readInt32());
            audio_devices_t device = static_cast <audio_devices_t>(data.readInt32());
            uid_t uid = static_cast <uid_t>(data.readInt32());
            audio_port_handle_t portId = static_cast <audio_port_handle_t>(data.readInt32());
            bool silenced = data.readInt32() == 1;
            status_t status = startInput(input, session, device, uid, &silenced);
            status_t status = startInput(portId, &silenced);
            reply->writeInt32(static_cast <uint32_t>(status));
            reply->writeInt32(silenced ? 1 : 0);
            return NO_ERROR;
@@ -1067,17 +1057,15 @@ status_t BnAudioPolicyService::onTransact(

        case STOP_INPUT: {
            CHECK_INTERFACE(IAudioPolicyService, data, reply);
            audio_io_handle_t input = static_cast <audio_io_handle_t>(data.readInt32());
            audio_session_t session = static_cast <audio_session_t>(data.readInt32());
            reply->writeInt32(static_cast <uint32_t>(stopInput(input, session)));
            audio_port_handle_t portId = static_cast <audio_port_handle_t>(data.readInt32());
            reply->writeInt32(static_cast <uint32_t>(stopInput(portId)));
            return NO_ERROR;
        } break;

        case RELEASE_INPUT: {
            CHECK_INTERFACE(IAudioPolicyService, data, reply);
            audio_io_handle_t input = static_cast <audio_io_handle_t>(data.readInt32());
            audio_session_t session = static_cast <audio_session_t>(data.readInt32());
            releaseInput(input, session);
            audio_port_handle_t portId = static_cast <audio_port_handle_t>(data.readInt32());
            releaseInput(portId);
            return NO_ERROR;
        } break;

+4 −8
Original line number Diff line number Diff line
@@ -239,20 +239,16 @@ public:
                                    audio_session_t session,
                                    pid_t pid,
                                    uid_t uid,
                                    const String16& opPackageName,
                                    const audio_config_base_t *config,
                                    audio_input_flags_t flags,
                                    audio_port_handle_t *selectedDeviceId,
                                    audio_port_handle_t *portId);

    static status_t startInput(audio_io_handle_t input,
                               audio_session_t session,
                               audio_devices_t device,
                               uid_t uid,
    static status_t startInput(audio_port_handle_t portId,
                               bool *silenced);
    static status_t stopInput(audio_io_handle_t input,
                              audio_session_t session);
    static void releaseInput(audio_io_handle_t input,
                             audio_session_t session);
    static status_t stopInput(audio_port_handle_t portId);
    static void releaseInput(audio_port_handle_t portId);
    static status_t initStreamVolume(audio_stream_type_t stream,
                                      int indexMin,
                                      int indexMax);
+4 −8
Original line number Diff line number Diff line
@@ -80,19 +80,15 @@ public:
                              audio_session_t session,
                              pid_t pid,
                              uid_t uid,
                              const String16& opPackageName,
                              const audio_config_base_t *config,
                              audio_input_flags_t flags,
                              audio_port_handle_t *selectedDeviceId,
                              audio_port_handle_t *portId) = 0;
    virtual status_t startInput(audio_io_handle_t input,
                                audio_session_t session,
                                audio_devices_t device,
                                uid_t uid,
    virtual status_t startInput(audio_port_handle_t portId,
                                bool *silenced) = 0;
    virtual status_t stopInput(audio_io_handle_t input,
                               audio_session_t session) = 0;
    virtual void releaseInput(audio_io_handle_t input,
                              audio_session_t session) = 0;
    virtual status_t stopInput(audio_port_handle_t portId) = 0;
    virtual void releaseInput(audio_port_handle_t portId) = 0;
    virtual status_t initStreamVolume(audio_stream_type_t stream,
                                      int indexMin,
                                      int indexMax) = 0;
+5 −3
Original line number Diff line number Diff line
@@ -321,6 +321,7 @@ status_t AudioFlinger::openMmapStream(MmapStreamInterface::stream_direction_t di
                                              actualSessionId,
                                              client.clientPid,
                                              client.clientUid,
                                              client.packageName,
                                              config,
                                              AUDIO_INPUT_FLAG_MMAP_NOIRQ, deviceId, &portId);
    }
@@ -340,7 +341,7 @@ status_t AudioFlinger::openMmapStream(MmapStreamInterface::stream_direction_t di
        if (direction == MmapStreamInterface::DIRECTION_OUTPUT) {
            AudioSystem::releaseOutput(io, streamType, actualSessionId);
        } else {
            AudioSystem::releaseInput(io, actualSessionId);
            AudioSystem::releaseInput(portId);
        }
        ret = NO_INIT;
    }
@@ -1663,7 +1664,7 @@ sp<media::IAudioRecord> AudioFlinger::createRecord(const CreateRecordInput& inpu
    // release previously opened input if retrying.
    if (output.inputId != AUDIO_IO_HANDLE_NONE) {
        recordTrack.clear();
        AudioSystem::releaseInput(output.inputId, sessionId);
        AudioSystem::releaseInput(portId);
        output.inputId = AUDIO_IO_HANDLE_NONE;
    }
    lStatus = AudioSystem::getInputForAttr(&input.attr, &output.inputId,
@@ -1671,6 +1672,7 @@ sp<media::IAudioRecord> AudioFlinger::createRecord(const CreateRecordInput& inpu
                                    // FIXME compare to AudioTrack
                                      clientPid,
                                      clientUid,
                                      input.opPackageName,
                                      &input.config,
                                      output.flags, &output.selectedDeviceId, &portId);

@@ -1739,7 +1741,7 @@ Exit:
        }
        recordTrack.clear();
        if (output.inputId != AUDIO_IO_HANDLE_NONE) {
            AudioSystem::releaseInput(output.inputId, sessionId);
            AudioSystem::releaseInput(portId);
        }
    }

Loading