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

Commit c16bf1d9 authored by Jean-Michel Trivi's avatar Jean-Michel Trivi Committed by Android (Google) Code Review
Browse files

Merge "AudioPolicy: callback for recording configuration change"

parents 31fc6604 2f4fe9f7
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -91,6 +91,12 @@ public:
    uint32_t        mCbFlags; // flags indicating which callbacks to use, see kCbFlag*
};


// definitions for audio recording configuration updates
// which update type is reported
#define RECORD_CONFIG_EVENT_START 1
#define RECORD_CONFIG_EVENT_STOP  0

}; // namespace android

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

typedef void (*audio_error_callback)(status_t err);
typedef void (*dynamic_policy_callback)(int event, String8 regId, int val);
typedef void (*record_config_callback)(int event, int session, int source);

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

    static void setErrorCallback(audio_error_callback cb);
    static void setDynPolicyCallback(dynamic_policy_callback cb);
    static void setRecordConfigCallback(record_config_callback);

    // helper function to obtain AudioFlinger service handle
    static const sp<IAudioFlinger> get_audio_flinger();
@@ -421,6 +423,8 @@ private:
        virtual void onAudioPortListUpdate();
        virtual void onAudioPatchListUpdate();
        virtual void onDynamicPolicyMixStateUpdate(String8 regId, int32_t state);
        virtual void onRecordingConfigurationUpdate(int event, audio_session_t session,
                        audio_source_t source);

    private:
        Mutex                               mLock;
@@ -440,6 +444,7 @@ private:
    static sp<IAudioFlinger> gAudioFlinger;
    static audio_error_callback gAudioErrorCallback;
    static dynamic_policy_callback gDynPolicyCallback;
    static record_config_callback gRecordConfigCallback;

    static size_t gInBuffSize;
    // previous parameters for recording buffer size queries
+3 −0
Original line number Diff line number Diff line
@@ -37,6 +37,9 @@ 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 a change of audio recording configuration
    virtual void onRecordingConfigurationUpdate(int event, audio_session_t session,
            audio_source_t source) = 0;
};


+20 −0
Original line number Diff line number Diff line
@@ -37,6 +37,7 @@ sp<IAudioFlinger> AudioSystem::gAudioFlinger;
sp<AudioSystem::AudioFlingerClient> AudioSystem::gAudioFlingerClient;
audio_error_callback AudioSystem::gAudioErrorCallback = NULL;
dynamic_policy_callback AudioSystem::gDynPolicyCallback = NULL;
record_config_callback  AudioSystem::gRecordConfigCallback = NULL;


// establish binder interface to AudioFlinger service
@@ -652,6 +653,12 @@ status_t AudioSystem::AudioFlingerClient::removeAudioDeviceCallback(
    gDynPolicyCallback = cb;
}

/*static*/ void AudioSystem::setRecordConfigCallback(record_config_callback cb)
{
    Mutex::Autolock _l(gLock);
    gRecordConfigCallback = cb;
}

// client singleton for AudioPolicyService binder interface
// protected by gLockAPS
sp<IAudioPolicyService> AudioSystem::gAudioPolicyService;
@@ -1237,6 +1244,19 @@ void AudioSystem::AudioPolicyServiceClient::onDynamicPolicyMixStateUpdate(
    }
}

void AudioSystem::AudioPolicyServiceClient::onRecordingConfigurationUpdate(
        int event, audio_session_t session, audio_source_t source) {
    record_config_callback cb = NULL;
    {
        Mutex::Autolock _l(AudioSystem::gLock);
        cb = gRecordConfigCallback;
    }

    if (cb != NULL) {
        cb(event, session, source);
    }
}

void AudioSystem::AudioPolicyServiceClient::binderDied(const wp<IBinder>& who __unused)
{
    {
+21 −2
Original line number Diff line number Diff line
@@ -30,7 +30,8 @@ namespace android {
enum {
    PORT_LIST_UPDATE = IBinder::FIRST_CALL_TRANSACTION,
    PATCH_LIST_UPDATE,
    MIX_STATE_UPDATE
    MIX_STATE_UPDATE,
    RECORDING_CONFIGURATION_UPDATE
};

class BpAudioPolicyServiceClient : public BpInterface<IAudioPolicyServiceClient>
@@ -63,6 +64,16 @@ public:
        data.writeInt32(state);
        remote()->transact(MIX_STATE_UPDATE, data, &reply, IBinder::FLAG_ONEWAY);
    }

    void onRecordingConfigurationUpdate(int event, audio_session_t session,
            audio_source_t source) {
        Parcel data, reply;
        data.writeInterfaceToken(IAudioPolicyServiceClient::getInterfaceDescriptor());
        data.writeInt32(event);
        data.writeInt32(session);
        data.writeInt32(source);
        remote()->transact(RECORDING_CONFIGURATION_UPDATE, data, &reply, IBinder::FLAG_ONEWAY);
    }
};

IMPLEMENT_META_INTERFACE(AudioPolicyServiceClient, "android.media.IAudioPolicyServiceClient");
@@ -89,7 +100,15 @@ status_t BnAudioPolicyServiceClient::onTransact(
            int32_t state = data.readInt32();
            onDynamicPolicyMixStateUpdate(regId, state);
            return NO_ERROR;
    }
        } break;
    case RECORDING_CONFIGURATION_UPDATE: {
            CHECK_INTERFACE(IAudioPolicyServiceClient, data, reply);
            int event = (int) data.readInt32();
            audio_session_t session = (audio_session_t) data.readInt32();
            audio_source_t source = (audio_source_t) data.readInt32();
            onRecordingConfigurationUpdate(event, session, source);
            return NO_ERROR;
        } break;
    default:
        return BBinder::onTransact(code, data, reply, flags);
    }
Loading