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

Commit fec2f93f authored by jiabin's avatar jiabin
Browse files

Add AudioRouting interface in AudioRecorder.

Bug: 64038649
Test: Run cts in RoutingTest
      Switching input device when using MediaRecorder

Change-Id: I53f22974f8c3dacaef6044ea742e62951961c1fd
parent b6549b62
Loading
Loading
Loading
Loading
+8 −4
Original line number Diff line number Diff line
@@ -89,7 +89,8 @@ AudioRecord::AudioRecord(
        audio_input_flags_t flags,
        uid_t uid,
        pid_t pid,
        const audio_attributes_t* pAttributes)
        const audio_attributes_t* pAttributes,
        audio_port_handle_t selectedDeviceId)
    : mActive(false),
      mStatus(NO_INIT),
      mOpPackageName(opPackageName),
@@ -97,12 +98,11 @@ AudioRecord::AudioRecord(
      mPreviousPriority(ANDROID_PRIORITY_NORMAL),
      mPreviousSchedulingGroup(SP_DEFAULT),
      mProxy(NULL),
      mSelectedDeviceId(AUDIO_PORT_HANDLE_NONE),
      mPortId(AUDIO_PORT_HANDLE_NONE)
{
    mStatus = set(inputSource, sampleRate, format, channelMask, frameCount, cbf, user,
            notificationFrames, false /*threadCanCallJava*/, sessionId, transferType, flags,
            uid, pid, pAttributes);
            uid, pid, pAttributes, selectedDeviceId);
}

AudioRecord::~AudioRecord()
@@ -148,7 +148,8 @@ status_t AudioRecord::set(
        audio_input_flags_t flags,
        uid_t uid,
        pid_t pid,
        const audio_attributes_t* pAttributes)
        const audio_attributes_t* pAttributes,
        audio_port_handle_t selectedDeviceId)
{
    ALOGV("set(): inputSource %d, sampleRate %u, format %#x, channelMask %#x, frameCount %zu, "
          "notificationFrames %u, sessionId %d, transferType %d, flags %#x, opPackageName %s "
@@ -156,6 +157,8 @@ status_t AudioRecord::set(
          inputSource, sampleRate, format, channelMask, frameCount, notificationFrames,
          sessionId, transferType, flags, String8(mOpPackageName).string(), uid, pid);

    mSelectedDeviceId = selectedDeviceId;

    switch (transferType) {
    case TRANSFER_DEFAULT:
        if (cbf == NULL || threadCanCallJava) {
@@ -489,6 +492,7 @@ status_t AudioRecord::setInputDevice(audio_port_handle_t deviceId) {
                mAudioRecord->stop();
            }
            android_atomic_or(CBLK_INVALID, &mCblk->mFlags);
            mProxy->interrupt();
        }
    }
    return NO_ERROR;
+4 −2
Original line number Diff line number Diff line
@@ -185,7 +185,8 @@ public:
                                    audio_input_flags_t flags = AUDIO_INPUT_FLAG_NONE,
                                    uid_t uid = AUDIO_UID_INVALID,
                                    pid_t pid = -1,
                                    const audio_attributes_t* pAttributes = NULL);
                                    const audio_attributes_t* pAttributes = NULL,
                                    audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE);

    /* Terminates the AudioRecord and unregisters it from AudioFlinger.
     * Also destroys all resources associated with the AudioRecord.
@@ -223,7 +224,8 @@ public:
                            audio_input_flags_t flags = AUDIO_INPUT_FLAG_NONE,
                            uid_t uid = AUDIO_UID_INVALID,
                            pid_t pid = -1,
                            const audio_attributes_t* pAttributes = NULL);
                            const audio_attributes_t* pAttributes = NULL,
                            audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE);

    /* Result of constructing the AudioRecord. This must be checked for successful initialization
     * before using any AudioRecord API (except for set()), because using
+89 −0
Original line number Diff line number Diff line
@@ -61,6 +61,9 @@ enum {
    PAUSE,
    RESUME,
    GET_METRICS,
    SET_INPUT_DEVICE,
    GET_ROUTED_DEVICE_ID,
    ENABLE_AUDIO_DEVICE_CALLBACK,

};

@@ -337,6 +340,57 @@ public:
        remote()->transact(RELEASE, data, &reply);
        return reply.readInt32();
    }

    status_t setInputDevice(audio_port_handle_t deviceId)
    {
        ALOGV("setInputDevice");
        Parcel data, reply;
        data.writeInterfaceToken(IMediaRecorder::getInterfaceDescriptor());
        data.writeInt32(deviceId);

        status_t status = remote()->transact(SET_INPUT_DEVICE, data, &reply);
        if (status != OK) {
            ALOGE("setInputDevice binder call failed: %d", status);
            return status;
        }
        return reply.readInt32();;
    }

    audio_port_handle_t getRoutedDeviceId(audio_port_handle_t *deviceId)
    {
        ALOGV("getRoutedDeviceId");
        Parcel data, reply;
        data.writeInterfaceToken(IMediaRecorder::getInterfaceDescriptor());

        status_t status = remote()->transact(GET_ROUTED_DEVICE_ID, data, &reply);
        if (status != OK) {
            ALOGE("getRoutedDeviceid binder call failed: %d", status);
            *deviceId = AUDIO_PORT_HANDLE_NONE;
            return status;
        }

        status = reply.readInt32();
        if (status != NO_ERROR) {
            *deviceId = AUDIO_PORT_HANDLE_NONE;
        } else {
            *deviceId = reply.readInt32();
        }
        return status;
    }

    status_t enableAudioDeviceCallback(bool enabled)
    {
        ALOGV("enableAudioDeviceCallback");
        Parcel data, reply;
        data.writeInterfaceToken(IMediaRecorder::getInterfaceDescriptor());
        data.writeBool(enabled);
        status_t status = remote()->transact(ENABLE_AUDIO_DEVICE_CALLBACK, data, &reply);
        if (status != OK) {
            ALOGE("enableAudioDeviceCallback binder call failed: %d, %d", enabled, status);
            return status;
        }
        return reply.readInt32();
    }
};

IMPLEMENT_META_INTERFACE(MediaRecorder, "android.media.IMediaRecorder");
@@ -543,6 +597,41 @@ status_t BnMediaRecorder::onTransact(
            }
            return NO_ERROR;
        } break;
        case SET_INPUT_DEVICE: {
            ALOGV("SET_INPUT_DEVICE");
            CHECK_INTERFACE(IMediaRecorder, data, reply);
            audio_port_handle_t deviceId;
            status_t status = data.readInt32(&deviceId);
            if (status == NO_ERROR) {
                reply->writeInt32(setInputDevice(deviceId));
            } else {
                reply->writeInt32(BAD_VALUE);
            }
            return NO_ERROR;
        } break;
        case GET_ROUTED_DEVICE_ID: {
            ALOGV("GET_ROUTED_DEVICE_ID");
            CHECK_INTERFACE(IMediaRecorder, data, reply);
            audio_port_handle_t deviceId;
            status_t status = getRoutedDeviceId(&deviceId);
            reply->writeInt32(status);
            if (status == NO_ERROR) {
                reply->writeInt32(deviceId);
            }
            return NO_ERROR;
        } break;
        case ENABLE_AUDIO_DEVICE_CALLBACK: {
            ALOGV("ENABLE_AUDIO_DEVICE_CALLBACK");
            CHECK_INTERFACE(IMediaRecorder, data, reply);
            bool enabled;
            status_t status = data.readBool(&enabled);
            if (status == NO_ERROR) {
                reply->writeInt32(enableAudioDeviceCallback(enabled));
            } else {
                reply->writeInt32(BAD_VALUE);
            }
            return NO_ERROR;
        }
        default:
            return BBinder::onTransact(code, data, reply, flags);
    }
+5 −0
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@
#define ANDROID_IMEDIARECORDER_H

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

namespace android {

@@ -64,6 +65,10 @@ public:
    virtual status_t release() = 0;
    virtual status_t setInputSurface(const sp<PersistentSurface>& surface) = 0;
    virtual sp<IGraphicBufferProducer> querySurfaceMediaSource() = 0;

    virtual status_t setInputDevice(audio_port_handle_t deviceId) = 0;
    virtual status_t getRoutedDeviceId(audio_port_handle_t *deviceId) = 0;
    virtual status_t enableAudioDeviceCallback(bool enabled) = 0;
};

// ----------------------------------------------------------------------------
+5 −0
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@

#define MEDIA_RECORDER_BASE_H_

#include <media/AudioSystem.h>
#include <media/mediarecorder.h>

#include <system/audio.h>
@@ -62,6 +63,10 @@ struct MediaRecorderBase {
    virtual status_t dump(int fd, const Vector<String16>& args) const = 0;
    virtual status_t setInputSurface(const sp<PersistentSurface>& surface) = 0;
    virtual sp<IGraphicBufferProducer> querySurfaceMediaSource() const = 0;
    virtual status_t setInputDevice(audio_port_handle_t deviceId) = 0;
    virtual status_t getRoutedDeviceId(audio_port_handle_t* deviceId) = 0;
    virtual void setAudioDeviceCallback(const sp<AudioSystem::AudioDeviceCallback>& callback) = 0;
    virtual status_t enableAudioDeviceCallback(bool enabled) = 0;


protected:
Loading