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

Commit 28da31bb authored by Paul Mclean's avatar Paul Mclean Committed by Android (Google) Code Review
Browse files

Merge "Surface MicrophoneDirection API in MediaRecorder"

parents 9c971b7f 366b643d
Loading
Loading
Loading
Loading
+43 −6
Original line number Diff line number Diff line
@@ -117,7 +117,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)
{
}

@@ -137,7 +139,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),
@@ -148,7 +152,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()
@@ -197,7 +202,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;
@@ -213,6 +220,8 @@ status_t AudioRecord::set(
          sessionId, transferType, flags, String8(mOpPackageName).string(), uid, pid);

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

    switch (transferType) {
    case TRANSFER_DEFAULT:
@@ -400,6 +409,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);
@@ -617,6 +630,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;
}
@@ -1369,13 +1384,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