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

Commit 3f9eb321 authored by Steve Kondik's avatar Steve Kondik
Browse files

audiopolicy: Add AudioSessionInfo API

 * This patch introduces a new API which allows applications to
   query the state of the audio effects system, and receive
   callbacks with the necessary information to attach effects
   to any stream.
 * In the future, this may come as part of the AudioPort system,
   but since that's an active area of development by Google, we
   will dodge it for now.
 * The policy now simply keeps a refcounted list of objects which
   hold various bits of stream metadata. Callbacks are sent on
   stream open/close to applications which might be listening
   for them.

Change-Id: I2d554d36e1378f4eb7b276010a3bfe8345c22ecd
parent 244deea8
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@
#include <binder/Parcel.h>
#include <utils/String8.h>
#include <utils/Vector.h>
#include <media/AudioSession.h>

namespace android {

@@ -42,6 +43,7 @@ namespace android {
//   AudioSystem's implementation of the AudioPolicyClient interface
// keep in sync with AudioSystem.java
#define DYNAMIC_POLICY_EVENT_MIX_STATE_UPDATE 0
#define AUDIO_OUTPUT_SESSION_EFFECTS_UPDATE 10

#define MIX_STATE_DISABLED -1
#define MIX_STATE_IDLE 0
+71 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2016 The CyanogenMod 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_AUDIOSESSION_H
#define ANDROID_AUDIOSESSION_H

#include <stdint.h>
#include <sys/types.h>

#include <system/audio.h>

#include <utils/RefBase.h>
#include <utils/Errors.h>
#include <binder/Parcel.h>

namespace android {

// class to store streaminfo
class AudioSessionInfo : public RefBase {
public:
    AudioSessionInfo(int session, audio_stream_type_t stream, audio_output_flags_t flags,
            audio_channel_mask_t channelMask, uid_t uid) :
        mSessionId(session), mStream(stream), mFlags(flags), mChannelMask(channelMask),
        mUid(uid), mRefCount(0) {}

    AudioSessionInfo() : mSessionId(0), mStream(AUDIO_STREAM_DEFAULT), mFlags(AUDIO_OUTPUT_FLAG_NONE), mChannelMask(AUDIO_CHANNEL_NONE), mUid(0) {}

    /*virtual*/ ~AudioSessionInfo() {}

    int mSessionId;
    audio_stream_type_t mStream;
    audio_output_flags_t mFlags;
    audio_channel_mask_t mChannelMask;
    uid_t mUid;

    // AudioPolicyManager keeps mLock, no need for lock on reference count here
    int mRefCount;

    void readFromParcel(const Parcel &parcel)  {
        mSessionId = parcel.readInt32();
        mStream = static_cast<audio_stream_type_t>(parcel.readInt32());
        mFlags = static_cast<audio_output_flags_t>(parcel.readInt32());
        mChannelMask = static_cast<audio_channel_mask_t>(parcel.readInt32());
        mUid = static_cast<uid_t>(parcel.readInt32());
    }

    void writeToParcel(Parcel *parcel) const {
        parcel->writeInt32(mSessionId);
        parcel->writeInt32(mStream);
        parcel->writeInt32(mFlags);
        parcel->writeInt32(mChannelMask);
        parcel->writeInt32(mUid);
    }
};

}; // namespace android

#endif // ANDROID_AUDIOSESSION_H
+7 −0
Original line number Diff line number Diff line
@@ -31,6 +31,8 @@ namespace android {

typedef void (*audio_error_callback)(status_t err);
typedef void (*dynamic_policy_callback)(int event, String8 regId, int val);
typedef void (*audio_session_callback)(int event,
        sp<AudioSessionInfo>& session, bool added);

class IAudioFlinger;
class IAudioPolicyService;
@@ -92,6 +94,7 @@ public:

    static void setErrorCallback(audio_error_callback cb);
    static void setDynPolicyCallback(dynamic_policy_callback cb);
    static status_t setAudioSessionCallback(audio_session_callback cb);

    // helper function to obtain AudioFlinger service handle
    static const sp<IAudioFlinger> get_audio_flinger();
@@ -319,6 +322,8 @@ public:
                                      audio_io_handle_t *handle);
    static status_t stopAudioSource(audio_io_handle_t handle);

    static status_t listAudioSessions(audio_stream_type_t streams,
                                      Vector< sp<AudioSessionInfo>> &sessions);

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

@@ -419,6 +424,7 @@ private:
        virtual void onAudioPortListUpdate();
        virtual void onAudioPatchListUpdate();
        virtual void onDynamicPolicyMixStateUpdate(String8 regId, int32_t state);
        virtual void onOutputSessionEffectsUpdate(sp<AudioSessionInfo>& info, bool added);

    private:
        Mutex                               mLock;
@@ -438,6 +444,7 @@ private:
    static sp<IAudioFlinger> gAudioFlinger;
    static audio_error_callback gAudioErrorCallback;
    static dynamic_policy_callback gDynPolicyCallback;
    static audio_session_callback gAudioSessionCallback;

    static size_t gInBuffSize;
    // previous parameters for recording buffer size queries
+3 −0
Original line number Diff line number Diff line
@@ -165,6 +165,9 @@ public:
                                      const audio_attributes_t *attributes,
                                      audio_io_handle_t *handle) = 0;
    virtual status_t stopAudioSource(audio_io_handle_t handle) = 0;

    virtual status_t listAudioSessions(audio_stream_type_t streams,
                                       Vector< sp<AudioSessionInfo>> &sessions) = 0;
};


+3 −0
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@
#include <utils/RefBase.h>
#include <binder/IInterface.h>
#include <system/audio.h>
#include <media/AudioSession.h>

namespace android {

@@ -37,6 +38,8 @@ public:
    virtual void onAudioPatchListUpdate() = 0;
    // Notifies a change in the mixing state of a specific mix in a dynamic audio policy
    virtual void onDynamicPolicyMixStateUpdate(String8 regId, int32_t state) = 0;
    // Notifies when a default effect set is attached to a session/stream
    virtual void onOutputSessionEffectsUpdate(sp<AudioSessionInfo>& info, bool added) = 0;
};


Loading