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

Commit 554a277d authored by Eric Laurent's avatar Eric Laurent
Browse files

audio policy: add binder calls for audio source control

Add binder methods to IAudioPolicyService to control activity
of external audio sources (e.g FM tuner).

Change-Id: I2008308a6a996baeae502b68a790d87281efe2ff
parent 32495581
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -332,6 +332,12 @@ public:

    static status_t registerPolicyMixes(Vector<AudioMix> mixes, bool registration);

    static status_t startAudioSource(const struct audio_port_config *source,
                                      const audio_attributes_t *attributes,
                                      audio_io_handle_t *handle);
    static status_t stopAudioSource(audio_io_handle_t handle);


    // ----------------------------------------------------------------------------

    class AudioPortCallback : public RefBase
+5 −0
Original line number Diff line number Diff line
@@ -155,6 +155,11 @@ public:
    virtual audio_mode_t getPhoneState() = 0;

    virtual status_t registerPolicyMixes(Vector<AudioMix> mixes, bool registration) = 0;

    virtual status_t startAudioSource(const struct audio_port_config *source,
                                      const audio_attributes_t *attributes,
                                      audio_io_handle_t *handle) = 0;
    virtual status_t stopAudioSource(audio_io_handle_t handle) = 0;
};


+16 −0
Original line number Diff line number Diff line
@@ -985,6 +985,22 @@ status_t AudioSystem::registerPolicyMixes(Vector<AudioMix> mixes, bool registrat
    return aps->registerPolicyMixes(mixes, registration);
}

status_t AudioSystem::startAudioSource(const struct audio_port_config *source,
                                       const audio_attributes_t *attributes,
                                       audio_io_handle_t *handle)
{
    const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
    if (aps == 0) return PERMISSION_DENIED;
    return aps->startAudioSource(source, attributes, handle);
}

status_t AudioSystem::stopAudioSource(audio_io_handle_t handle)
{
    const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
    if (aps == 0) return PERMISSION_DENIED;
    return aps->stopAudioSource(handle);
}

// ---------------------------------------------------------------------------

status_t AudioSystem::AudioPolicyServiceClient::addAudioPortCallback(
+59 −0
Original line number Diff line number Diff line
@@ -71,6 +71,8 @@ enum {
    RELEASE_SOUNDTRIGGER_SESSION,
    GET_PHONE_STATE,
    REGISTER_POLICY_MIXES,
    START_AUDIO_SOURCE,
    STOP_AUDIO_SOURCE
};

#define MAX_ITEMS_PER_LIST 1024
@@ -714,6 +716,42 @@ public:
        }
        return status;
    }

    virtual status_t startAudioSource(const struct audio_port_config *source,
                                      const audio_attributes_t *attributes,
                                      audio_io_handle_t *handle)
    {
        Parcel data, reply;
        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
        if (source == NULL || attributes == NULL || handle == NULL) {
            return BAD_VALUE;
        }
        data.write(source, sizeof(struct audio_port_config));
        data.write(attributes, sizeof(audio_attributes_t));
        status_t status = remote()->transact(START_AUDIO_SOURCE, data, &reply);
        if (status != NO_ERROR) {
            return status;
        }
        status = (status_t)reply.readInt32();
        if (status != NO_ERROR) {
            return status;
        }
        *handle = (audio_io_handle_t)reply.readInt32();
        return status;
    }

    virtual status_t stopAudioSource(audio_io_handle_t handle)
    {
        Parcel data, reply;
        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
        data.writeInt32(handle);
        status_t status = remote()->transact(STOP_AUDIO_SOURCE, data, &reply);
        if (status != NO_ERROR) {
            return status;
        }
        status = (status_t)reply.readInt32();
        return status;
    }
};

IMPLEMENT_META_INTERFACE(AudioPolicyService, "android.media.IAudioPolicyService");
@@ -1224,6 +1262,27 @@ status_t BnAudioPolicyService::onTransact(
            return NO_ERROR;
        } break;

        case START_AUDIO_SOURCE: {
            CHECK_INTERFACE(IAudioPolicyService, data, reply);
            struct audio_port_config source;
            data.read(&source, sizeof(struct audio_port_config));
            audio_attributes_t attributes;
            data.read(&attributes, sizeof(audio_attributes_t));
            audio_io_handle_t handle;
            status_t status = startAudioSource(&source, &attributes, &handle);
            reply->writeInt32(status);
            reply->writeInt32(handle);
            return NO_ERROR;
        } break;

        case STOP_AUDIO_SOURCE: {
            CHECK_INTERFACE(IAudioPolicyService, data, reply);
            audio_io_handle_t handle = (audio_io_handle_t)data.readInt32();
            status_t status = stopAudioSource(handle);
            reply->writeInt32(status);
            return NO_ERROR;
        } break;

        default:
            return BBinder::onTransact(code, data, reply, flags);
    }
+5 −0
Original line number Diff line number Diff line
@@ -218,6 +218,11 @@ public:

    virtual status_t registerPolicyMixes(Vector<AudioMix> mixes) = 0;
    virtual status_t unregisterPolicyMixes(Vector<AudioMix> mixes) = 0;

    virtual status_t startAudioSource(const struct audio_port_config *source,
                                      const audio_attributes_t *attributes,
                                      audio_io_handle_t *handle) = 0;
    virtual status_t stopAudioSource(audio_io_handle_t handle) = 0;
};


Loading