Surface MicrophoneDirection API in MediaRecorder

Bug: 126185930
Test: MicrophoneDirectionTest testbed.
Change-Id: I6024ede50999aa751d63f272a087f578b8aea93d
gugelfrei
Paul McLean 5 years ago
parent e1e9cad4d0
commit 366b643d1e

@ -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,12 +1420,34 @@ status_t AudioRecord::getActiveMicrophones(std::vector<media::MicrophoneInfo>* a
status_t AudioRecord::setMicrophoneDirection(audio_microphone_direction_t direction)
{
AutoMutex lock(mLock);
return mAudioRecord->setMicrophoneDirection(direction).transactionError();
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);
return mAudioRecord->setMicrophoneFieldDimension(zoom).transactionError();
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();
}
}
// =========================================================================

@ -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:

@ -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);
}

@ -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;
};

@ -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;

@ -264,6 +264,9 @@ public:
status_t getRoutedDeviceId(audio_port_handle_t *deviceId);
status_t enableAudioDeviceCallback(bool enabled);
status_t getActiveMicrophones(std::vector<media::MicrophoneInfo>* activeMicrophones);
status_t setMicrophoneDirection(audio_microphone_direction_t direction);
status_t setMicrophoneFieldDimension(float zoom);
status_t getPortId(audio_port_handle_t *portId) const;
private:

@ -842,6 +842,16 @@ status_t MediaRecorder::getActiveMicrophones(std::vector<media::MicrophoneInfo>*
return mMediaRecorder->getActiveMicrophones(activeMicrophones);
}
status_t MediaRecorder::setMicrophoneDirection(audio_microphone_direction_t direction) {
ALOGV("setMicrophoneDirection(%d)", direction);
return mMediaRecorder->setMicrophoneDirection(direction);
}
status_t MediaRecorder::setMicrophoneFieldDimension(float zoom) {
ALOGV("setMicrophoneFieldDimension(%f)", zoom);
return mMediaRecorder->setMicrophoneFieldDimension(zoom);
}
status_t MediaRecorder::getPortId(audio_port_handle_t *portId) const
{
ALOGV("getPortId");

@ -538,6 +538,22 @@ status_t MediaRecorderClient::getActiveMicrophones(
return NO_INIT;
}
status_t MediaRecorderClient::setMicrophoneDirection(audio_microphone_direction_t direction) {
ALOGV("setMicrophoneDirection(%d)", direction);
if (mRecorder != NULL) {
return mRecorder->setMicrophoneDirection(direction);
}
return NO_INIT;
}
status_t MediaRecorderClient::setMicrophoneFieldDimension(float zoom) {
ALOGV("setMicrophoneFieldDimension(%f)", zoom);
if (mRecorder != NULL) {
return mRecorder->setMicrophoneFieldDimension(zoom);
}
return NO_INIT;
}
status_t MediaRecorderClient::getPortId(audio_port_handle_t *portId) {
ALOGV("getPortId");
Mutex::Autolock lock(mLock);

@ -109,6 +109,8 @@ public:
virtual status_t enableAudioDeviceCallback(bool enabled);
virtual status_t getActiveMicrophones(
std::vector<media::MicrophoneInfo>* activeMicrophones);
virtual status_t setMicrophoneDirection(audio_microphone_direction_t direction);
virtual status_t setMicrophoneFieldDimension(float zoom);
status_t getPortId(audio_port_handle_t *portId) override;
private:

@ -118,7 +118,9 @@ StagefrightRecorder::StagefrightRecorder(const String16 &opPackageName)
mVideoSource(VIDEO_SOURCE_LIST_END),
mStarted(false),
mSelectedDeviceId(AUDIO_PORT_HANDLE_NONE),
mDeviceCallbackEnabled(false) {
mDeviceCallbackEnabled(false),
mSelectedMicDirection(MIC_DIRECTION_UNSPECIFIED),
mSelectedMicFieldDimension(MIC_FIELD_DIMENSION_NORMAL) {
ALOGV("Constructor");
@ -1090,7 +1092,9 @@ sp<MediaCodecSource> StagefrightRecorder::createAudioSource() {
mSampleRate,
mClientUid,
mClientPid,
mSelectedDeviceId);
mSelectedDeviceId,
mSelectedMicDirection,
mSelectedMicFieldDimension);
status_t err = audioSource->initCheck();
@ -2269,6 +2273,24 @@ status_t StagefrightRecorder::getActiveMicrophones(
return NO_INIT;
}
status_t StagefrightRecorder::setMicrophoneDirection(audio_microphone_direction_t direction) {
ALOGV("setMicrophoneDirection(%d)", direction);
mSelectedMicDirection = direction;
if (mAudioSourceNode != 0) {
return mAudioSourceNode->setMicrophoneDirection(direction);
}
return NO_INIT;
}
status_t StagefrightRecorder::setMicrophoneFieldDimension(float zoom) {
ALOGV("setMicrophoneFieldDimension(%f)", zoom);
mSelectedMicFieldDimension = zoom;
if (mAudioSourceNode != 0) {
return mAudioSourceNode->setMicrophoneFieldDimension(zoom);
}
return NO_INIT;
}
status_t StagefrightRecorder::getPortId(audio_port_handle_t *portId) const {
if (mAudioSourceNode != 0) {
return mAudioSourceNode->getPortId(portId);

@ -77,6 +77,8 @@ struct StagefrightRecorder : public MediaRecorderBase {
virtual void setAudioDeviceCallback(const sp<AudioSystem::AudioDeviceCallback>& callback);
virtual status_t enableAudioDeviceCallback(bool enabled);
virtual status_t getActiveMicrophones(std::vector<media::MicrophoneInfo>* activeMicrophones);
virtual status_t setMicrophoneDirection(audio_microphone_direction_t direction);
virtual status_t setMicrophoneFieldDimension(float zoom);
status_t getPortId(audio_port_handle_t *portId) const override;
private:
@ -159,6 +161,9 @@ private:
bool mDeviceCallbackEnabled;
wp<AudioSystem::AudioDeviceCallback> mAudioDeviceCallback;
audio_microphone_direction_t mSelectedMicDirection;
float mSelectedMicFieldDimension;
static const int kMaxHighSpeedFps = 1000;
status_t prepareInternal();

@ -52,7 +52,9 @@ static void AudioRecordCallbackFunction(int event, void *user, void *info) {
AudioSource::AudioSource(
audio_source_t inputSource, const String16 &opPackageName,
uint32_t sampleRate, uint32_t channelCount, uint32_t outSampleRate,
uid_t uid, pid_t pid, audio_port_handle_t selectedDeviceId)
uid_t uid, pid_t pid, audio_port_handle_t selectedDeviceId,
audio_microphone_direction_t selectedMicDirection,
float selectedMicFieldDimension)
: mStarted(false),
mSampleRate(sampleRate),
mOutSampleRate(outSampleRate > 0 ? outSampleRate : sampleRate),
@ -103,7 +105,9 @@ AudioSource::AudioSource(
uid,
pid,
NULL /*pAttributes*/,
selectedDeviceId);
selectedDeviceId,
selectedMicDirection,
selectedMicFieldDimension);
mInitCheck = mRecord->initCheck();
if (mInitCheck != OK) {
mRecord.clear();
@ -506,6 +510,22 @@ status_t AudioSource::getActiveMicrophones(
return NO_INIT;
}
status_t AudioSource::setMicrophoneDirection(audio_microphone_direction_t direction) {
ALOGV("setMicrophoneDirection(%d)", direction);
if (mRecord != 0) {
return mRecord->setMicrophoneDirection(direction);
}
return NO_INIT;
}
status_t AudioSource::setMicrophoneFieldDimension(float zoom) {
ALOGV("setMicrophoneFieldDimension(%f)", zoom);
if (mRecord != 0) {
return mRecord->setMicrophoneFieldDimension(zoom);
}
return NO_INIT;
}
status_t AudioSource::getPortId(audio_port_handle_t *portId) const {
if (mRecord != 0) {
*portId = mRecord->getPortId();

@ -44,7 +44,9 @@ struct AudioSource : public MediaSource, public MediaBufferObserver {
uint32_t outSampleRate = 0,
uid_t uid = -1,
pid_t pid = -1,
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_NORMAL);
status_t initCheck() const;
@ -68,6 +70,8 @@ struct AudioSource : public MediaSource, public MediaBufferObserver {
status_t removeAudioDeviceCallback(const sp<AudioSystem::AudioDeviceCallback>& callback);
status_t getActiveMicrophones(std::vector<media::MicrophoneInfo>* activeMicrophones);
status_t setMicrophoneDirection(audio_microphone_direction_t direction);
status_t setMicrophoneFieldDimension(float zoom);
status_t getPortId(audio_port_handle_t *portId) const;

@ -7653,14 +7653,14 @@ status_t AudioFlinger::RecordThread::getActiveMicrophones(
status_t AudioFlinger::RecordThread::setMicrophoneDirection(audio_microphone_direction_t direction)
{
ALOGV("RecordThread::setMicrophoneDirection");
ALOGV("setMicrophoneDirection(%d)", direction);
AutoMutex _l(mLock);
return mInput->stream->setMicrophoneDirection(direction);
}
status_t AudioFlinger::RecordThread::setMicrophoneFieldDimension(float zoom)
{
ALOGV("RecordThread::setMicrophoneFieldDimension");
ALOGV("setMicrophoneFieldDimension(%f)", zoom);
AutoMutex _l(mLock);
return mInput->stream->setMicrophoneFieldDimension(zoom);
}

Loading…
Cancel
Save