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

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

audio policy: add routing update client interface

Added IAudioPolicyServiceClient client binder interface
for client process to receive notifications from AudioPolicyService
when audio ports are added/removed or audio patches created/released.

The audio patches owned by a given client are automatically released when
this client binder dies.

Bug: 14815883.

Change-Id: I6013f6aec03b50565cffb1ad2cd1f0f8852032c5
parent 6a94d69d
Loading
Loading
Loading
Loading
+24 −1
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@

#include <hardware/audio_effect.h>
#include <media/IAudioFlingerClient.h>
#include <media/IAudioPolicyServiceClient.h>
#include <system/audio.h>
#include <system/audio_policy.h>
#include <utils/Errors.h>
@@ -301,6 +302,21 @@ public:

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

    class AudioPortCallback : public RefBase
    {
    public:

                AudioPortCallback() {}
        virtual ~AudioPortCallback() {}

        virtual void onAudioPortListUpdate() = 0;
        virtual void onAudioPatchListUpdate() = 0;
        virtual void onServiceDied() = 0;

    };

    static void setAudioPortCallback(sp<AudioPortCallback> callBack);

private:

    class AudioFlingerClient: public IBinder::DeathRecipient, public BnAudioFlingerClient
@@ -319,7 +335,8 @@ private:
        virtual void ioConfigChanged(int event, audio_io_handle_t ioHandle, const void *param2);
    };

    class AudioPolicyServiceClient: public IBinder::DeathRecipient
    class AudioPolicyServiceClient: public IBinder::DeathRecipient,
                                    public BnAudioPolicyServiceClient
    {
    public:
        AudioPolicyServiceClient() {
@@ -327,6 +344,10 @@ private:

        // DeathRecipient
        virtual void binderDied(const wp<IBinder>& who);

        // IAudioPolicyServiceClient
        virtual void onAudioPortListUpdate();
        virtual void onAudioPatchListUpdate();
    };

    static sp<AudioFlingerClient> gAudioFlingerClient;
@@ -349,6 +370,8 @@ private:
    // list of output descriptors containing cached parameters
    // (sampling rate, framecount, channel count...)
    static DefaultKeyedVector<audio_io_handle_t, OutputDescriptor *> gOutputs;

    static sp<AudioPortCallback> gAudioPortCallback;
};

};  // namespace android
+2 −0
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@
#include <utils/Errors.h>
#include <binder/IInterface.h>
#include <media/AudioSystem.h>
#include <media/IAudioPolicyServiceClient.h>

#include <system/audio_policy.h>

@@ -124,6 +125,7 @@ public:
    /* Set audio port configuration */
    virtual status_t setAudioPortConfig(const struct audio_port_config *config) = 0;

    virtual void registerClient(const sp<IAudioPolicyServiceClient>& client) = 0;
};


+56 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2009 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef ANDROID_IAUDIOPOLICYSERVICECLIENT_H
#define ANDROID_IAUDIOPOLICYSERVICECLIENT_H


#include <utils/RefBase.h>
#include <binder/IInterface.h>
#include <system/audio.h>

namespace android {

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

class IAudioPolicyServiceClient : public IInterface
{
public:
    DECLARE_META_INTERFACE(AudioPolicyServiceClient);

    // Notifies a change of audio port configuration.
    virtual void onAudioPortListUpdate() = 0;
    // Notifies a change of audio patch configuration.
    virtual void onAudioPatchListUpdate() = 0;
};


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

class BnAudioPolicyServiceClient : public BnInterface<IAudioPolicyServiceClient>
{
public:
    virtual status_t    onTransact( uint32_t code,
                                    const Parcel& data,
                                    Parcel* reply,
                                    uint32_t flags = 0);
};

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

}; // namespace android

#endif // ANDROID_IAUDIOPOLICYSERVICECLIENT_H
+1 −0
Original line number Diff line number Diff line
@@ -44,6 +44,7 @@ LOCAL_SRC_FILES:= \
    JetPlayer.cpp \
    IOMX.cpp \
    IAudioPolicyService.cpp \
    IAudioPolicyServiceClient.cpp \
    MediaScanner.cpp \
    MediaScannerClient.cpp \
    CharacterEncodingDetector.cpp \
+29 −1
Original line number Diff line number Diff line
@@ -45,6 +45,7 @@ audio_format_t AudioSystem::gPrevInFormat;
audio_channel_mask_t AudioSystem::gPrevInChannelMask;
size_t AudioSystem::gInBuffSize = 0;    // zero indicates cache is invalid

sp<AudioSystem::AudioPortCallback> AudioSystem::gAudioPortCallback;

// establish binder interface to AudioFlinger service
const sp<IAudioFlinger>& AudioSystem::get_audio_flinger()
@@ -528,6 +529,7 @@ void AudioSystem::setErrorCallback(audio_error_callback cb)
    gAudioErrorCallback = cb;
}


bool AudioSystem::routedToA2dpOutput(audio_stream_type_t streamType)
{
    switch (streamType) {
@@ -566,6 +568,7 @@ const sp<IAudioPolicyService>& AudioSystem::get_audio_policy_service()
        }
        binder->linkToDeath(gAudioPolicyServiceClient);
        gAudioPolicyService = interface_cast<IAudioPolicyService>(binder);
        gAudioPolicyService->registerClient(gAudioPolicyServiceClient);
        gLock.unlock();
    } else {
        gLock.unlock();
@@ -880,14 +883,39 @@ status_t AudioSystem::setAudioPortConfig(const struct audio_port_config *config)
    return aps->setAudioPortConfig(config);
}

void AudioSystem::setAudioPortCallback(sp<AudioPortCallback> callBack)
{
    Mutex::Autolock _l(gLock);
    gAudioPortCallback = callBack;
}

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

void AudioSystem::AudioPolicyServiceClient::binderDied(const wp<IBinder>& who __unused)
{
    Mutex::Autolock _l(AudioSystem::gLock);
    Mutex::Autolock _l(gLock);
    if (gAudioPortCallback != 0) {
        gAudioPortCallback->onServiceDied();
    }
    AudioSystem::gAudioPolicyService.clear();

    ALOGW("AudioPolicyService server died!");
}

void AudioSystem::AudioPolicyServiceClient::onAudioPortListUpdate()
{
    Mutex::Autolock _l(gLock);
    if (gAudioPortCallback != 0) {
        gAudioPortCallback->onAudioPortListUpdate();
    }
}

void AudioSystem::AudioPolicyServiceClient::onAudioPatchListUpdate()
{
    Mutex::Autolock _l(gLock);
    if (gAudioPortCallback != 0) {
        gAudioPortCallback->onAudioPatchListUpdate();
    }
}

}; // namespace android
Loading