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

Commit 366b643d authored by Paul McLean's avatar Paul McLean
Browse files

Surface MicrophoneDirection API in MediaRecorder

Bug: 126185930
Test: MicrophoneDirectionTest testbed.
Change-Id: I6024ede50999aa751d63f272a087f578b8aea93d
parent e1e9cad4
Loading
Loading
Loading
Loading
+43 −6
Original line number Diff line number Diff line
@@ -153,7 +153,9 @@ AudioRecord::AudioRecord(const String16 &opPackageName)
    : mActive(false), mStatus(NO_INIT), mOpPackageName(opPackageName),
      mSessionId(AUDIO_SESSION_ALLOCATE),
      mPreviousPriority(ANDROID_PRIORITY_NORMAL), mPreviousSchedulingGroup(SP_DEFAULT),
      mSelectedDeviceId(AUDIO_PORT_HANDLE_NONE), mRoutedDeviceId(AUDIO_PORT_HANDLE_NONE)
      mSelectedDeviceId(AUDIO_PORT_HANDLE_NONE), mRoutedDeviceId(AUDIO_PORT_HANDLE_NONE),
      mSelectedMicDirection(MIC_DIRECTION_UNSPECIFIED),
      mSelectedMicFieldDimension(MIC_FIELD_DIMENSION_DEFAULT)
{
}

@@ -173,7 +175,9 @@ AudioRecord::AudioRecord(
        uid_t uid,
        pid_t pid,
        const audio_attributes_t* pAttributes,
        audio_port_handle_t selectedDeviceId)
        audio_port_handle_t selectedDeviceId,
        audio_microphone_direction_t selectedMicDirection,
        float microphoneFieldDimension)
    : mActive(false),
      mStatus(NO_INIT),
      mOpPackageName(opPackageName),
@@ -184,7 +188,8 @@ AudioRecord::AudioRecord(
{
    (void)set(inputSource, sampleRate, format, channelMask, frameCount, cbf, user,
            notificationFrames, false /*threadCanCallJava*/, sessionId, transferType, flags,
            uid, pid, pAttributes, selectedDeviceId);
            uid, pid, pAttributes, selectedDeviceId,
            selectedMicDirection, microphoneFieldDimension);
}

AudioRecord::~AudioRecord()
@@ -233,7 +238,9 @@ status_t AudioRecord::set(
        uid_t uid,
        pid_t pid,
        const audio_attributes_t* pAttributes,
        audio_port_handle_t selectedDeviceId)
        audio_port_handle_t selectedDeviceId,
        audio_microphone_direction_t selectedMicDirection,
        float microphoneFieldDimension)
{
    status_t status = NO_ERROR;
    uint32_t channelCount;
@@ -249,6 +256,8 @@ status_t AudioRecord::set(
          sessionId, transferType, flags, String8(mOpPackageName).string(), uid, pid);

    mSelectedDeviceId = selectedDeviceId;
    mSelectedMicDirection = selectedMicDirection;
    mSelectedMicFieldDimension = microphoneFieldDimension;

    switch (transferType) {
    case TRANSFER_DEFAULT:
@@ -436,6 +445,10 @@ status_t AudioRecord::start(AudioSystem::sync_event_t event, audio_session_t tri
        status = restoreRecord_l("start");
    }

    // Call these directly because we are already holding the lock.
    mAudioRecord->setMicrophoneDirection(mSelectedMicDirection);
    mAudioRecord->setMicrophoneFieldDimension(mSelectedMicFieldDimension);

    if (status != NO_ERROR) {
        mActive = false;
        ALOGE("%s(%d): status %d", __func__, mPortId, status);
@@ -653,6 +666,8 @@ status_t AudioRecord::dump(int fd, const Vector<String16>& args __unused) const
             mNotificationFramesAct, mNotificationFramesReq);
    result.appendFormat("  input(%d), latency(%u), selected device Id(%d), routed device Id(%d)\n",
                        mInput, mLatency, mSelectedDeviceId, mRoutedDeviceId);
    result.appendFormat("  mic direction(%d) mic field dimension(%f)",
                        mSelectedMicDirection, mSelectedMicFieldDimension);
    ::write(fd, result.string(), result.size());
    return NO_ERROR;
}
@@ -1405,13 +1420,35 @@ status_t AudioRecord::getActiveMicrophones(std::vector<media::MicrophoneInfo>* a
status_t AudioRecord::setMicrophoneDirection(audio_microphone_direction_t direction)
{
    AutoMutex lock(mLock);
    if (mSelectedMicDirection == direction) {
        // NOP
        return OK;
    }

    mSelectedMicDirection = direction;
    if (mAudioRecord == 0) {
        // the internal AudioRecord hasn't be created yet, so just stash the attribute.
        return OK;
    } else {
        return mAudioRecord->setMicrophoneDirection(direction).transactionError();
    }
}

status_t AudioRecord::setMicrophoneFieldDimension(float zoom) {
    AutoMutex lock(mLock);
    if (mSelectedMicFieldDimension == zoom) {
        // NOP
        return OK;
    }

    mSelectedMicFieldDimension = zoom;
    if (mAudioRecord == 0) {
        // the internal AudioRecord hasn't be created yet, so just stash the attribute.
        return OK;
    } else {
        return mAudioRecord->setMicrophoneFieldDimension(zoom).transactionError();
    }
}

// =========================================================================

+11 −2
Original line number Diff line number Diff line
@@ -189,7 +189,10 @@ public:
                                    uid_t uid = AUDIO_UID_INVALID,
                                    pid_t pid = -1,
                                    const audio_attributes_t* pAttributes = NULL,
                                    audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE);
                                    audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE,
                                    audio_microphone_direction_t
                                        selectedMicDirection = MIC_DIRECTION_UNSPECIFIED,
                                    float selectedMicFieldDimension = MIC_FIELD_DIMENSION_DEFAULT);

    /* Terminates the AudioRecord and unregisters it from AudioFlinger.
     * Also destroys all resources associated with the AudioRecord.
@@ -228,7 +231,10 @@ public:
                            uid_t uid = AUDIO_UID_INVALID,
                            pid_t pid = -1,
                            const audio_attributes_t* pAttributes = NULL,
                            audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE);
                            audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE,
                            audio_microphone_direction_t
                                selectedMicDirection = MIC_DIRECTION_UNSPECIFIED,
                            float selectedMicFieldDimension = MIC_FIELD_DIMENSION_DEFAULT);

    /* Result of constructing the AudioRecord. This must be checked for successful initialization
     * before using any AudioRecord API (except for set()), because using
@@ -716,6 +722,9 @@ private:
                                              // activity and connected devices
    wp<AudioSystem::AudioDeviceCallback> mDeviceCallback;

    audio_microphone_direction_t mSelectedMicDirection;
    float mSelectedMicFieldDimension;

private:
    class MediaMetrics {
      public:
+37 −0
Original line number Diff line number Diff line
@@ -66,6 +66,8 @@ enum {
    ENABLE_AUDIO_DEVICE_CALLBACK,
    GET_ACTIVE_MICROPHONES,
    GET_PORT_ID,
    SET_MICROPHONE_DIRECTION,
    SET_MICROPHONE_FIELD_DIMENSION
};

class BpMediaRecorder: public BpInterface<IMediaRecorder>
@@ -407,6 +409,24 @@ public:
        return status;
    }

    status_t setMicrophoneDirection(audio_microphone_direction_t direction) {
        ALOGV("setMicrophoneDirection(%d)", direction);
        Parcel data, reply;
        data.writeInterfaceToken(IMediaRecorder::getInterfaceDescriptor());
        data.writeInt32(direction);
        status_t status = remote()->transact(SET_MICROPHONE_DIRECTION, data, &reply);
        return status == NO_ERROR ? (status_t)reply.readInt32() : status;
    }

    status_t setMicrophoneFieldDimension(float zoom) {
        ALOGV("setMicrophoneFieldDimension(%f)", zoom);
        Parcel data, reply;
        data.writeInterfaceToken(IMediaRecorder::getInterfaceDescriptor());
        data.writeFloat(zoom);
        status_t status = remote()->transact(SET_MICROPHONE_FIELD_DIMENSION, data, &reply);
        return status == NO_ERROR ? (status_t)reply.readInt32() : status;
    }

    status_t getPortId(audio_port_handle_t *portId)
    {
        ALOGV("getPortId");
@@ -689,6 +709,23 @@ status_t BnMediaRecorder::onTransact(
            }
            return NO_ERROR;
        }
        case SET_MICROPHONE_DIRECTION: {
            ALOGV("SET_MICROPHONE_DIRECTION");
            CHECK_INTERFACE(IMediaRecorder, data, reply);
            int direction = data.readInt32();
            status_t status =
                setMicrophoneDirection(static_cast<audio_microphone_direction_t>(direction));
            reply->writeInt32(status);
            return NO_ERROR;
        }
        case SET_MICROPHONE_FIELD_DIMENSION: {
            ALOGV("SET_MICROPHONE_FIELD_DIMENSION");
            CHECK_INTERFACE(IMediaRecorder, data, reply);
            float zoom = data.readFloat();
            status_t status = setMicrophoneFieldDimension(zoom);
            reply->writeInt32(status);
            return NO_ERROR;
        }
        default:
            return BBinder::onTransact(code, data, reply, flags);
    }
+2 −0
Original line number Diff line number Diff line
@@ -73,6 +73,8 @@ public:
    virtual status_t enableAudioDeviceCallback(bool enabled) = 0;
    virtual status_t getActiveMicrophones(
                        std::vector<media::MicrophoneInfo>* activeMicrophones) = 0;
    virtual status_t setMicrophoneDirection(audio_microphone_direction_t direction) = 0;
    virtual status_t setMicrophoneFieldDimension(float zoom) = 0;
    virtual status_t getPortId(audio_port_handle_t *portId) = 0;
};

+2 −0
Original line number Diff line number Diff line
@@ -72,6 +72,8 @@ struct MediaRecorderBase {
    virtual status_t enableAudioDeviceCallback(bool enabled) = 0;
    virtual status_t getActiveMicrophones(
                        std::vector<media::MicrophoneInfo>* activeMicrophones) = 0;
    virtual status_t setMicrophoneDirection(audio_microphone_direction_t direction) = 0;
    virtual status_t setMicrophoneFieldDimension(float zoom) = 0;
    virtual status_t getPortId(audio_port_handle_t *portId) const = 0;


Loading