Support query active microphones in MediaRecorder.
This is part of device enumeration. With the new add API, developer
could get the active microphones information for each channel.
Bug: 64038649
Test: Run cts and check the print log.
Change-Id: I01941d8d1ca0f49d0af48210ef8b1149de31676a
diff --git a/media/libmedia/IMediaRecorder.cpp b/media/libmedia/IMediaRecorder.cpp
index 72f5f58..b2c91c4 100644
--- a/media/libmedia/IMediaRecorder.cpp
+++ b/media/libmedia/IMediaRecorder.cpp
@@ -64,6 +64,7 @@
SET_INPUT_DEVICE,
GET_ROUTED_DEVICE_ID,
ENABLE_AUDIO_DEVICE_CALLBACK,
+ GET_ACTIVE_MICROPHONES,
};
@@ -391,6 +392,21 @@
}
return reply.readInt32();
}
+
+ status_t getActiveMicrophones(std::vector<media::MicrophoneInfo>* activeMicrophones)
+ {
+ ALOGV("getActiveMicrophones");
+ Parcel data, reply;
+ data.writeInterfaceToken(IMediaRecorder::getInterfaceDescriptor());
+ status_t status = remote()->transact(GET_ACTIVE_MICROPHONES, data, &reply);
+ if (status != OK
+ || (status = (status_t)reply.readInt32()) != NO_ERROR) {
+ return status;
+ }
+ status = reply.readParcelableVector(activeMicrophones);
+ return status;
+ }
+
};
IMPLEMENT_META_INTERFACE(MediaRecorder, "android.media.IMediaRecorder");
@@ -631,6 +647,19 @@
reply->writeInt32(BAD_VALUE);
}
return NO_ERROR;
+ } break;
+ case GET_ACTIVE_MICROPHONES: {
+ ALOGV("GET_ACTIVE_MICROPHONES");
+ CHECK_INTERFACE(IMediaRecorder, data, reply);
+ std::vector<media::MicrophoneInfo> activeMicrophones;
+ status_t status = getActiveMicrophones(&activeMicrophones);
+ reply->writeInt32(status);
+ if (status != NO_ERROR) {
+ return NO_ERROR;
+ }
+ reply->writeParcelableVector(activeMicrophones);
+ return NO_ERROR;
+
}
default:
return BBinder::onTransact(code, data, reply, flags);
diff --git a/media/libmedia/include/media/IMediaRecorder.h b/media/libmedia/include/media/IMediaRecorder.h
index 3cef329..379000e 100644
--- a/media/libmedia/include/media/IMediaRecorder.h
+++ b/media/libmedia/include/media/IMediaRecorder.h
@@ -19,7 +19,9 @@
#define ANDROID_IMEDIARECORDER_H
#include <binder/IInterface.h>
+#include <media/MicrophoneInfo.h>
#include <system/audio.h>
+#include <vector>
namespace android {
@@ -69,6 +71,9 @@
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;
+ virtual status_t getActiveMicrophones(
+ std::vector<media::MicrophoneInfo>* activeMicrophones) = 0;
+
};
// ----------------------------------------------------------------------------
diff --git a/media/libmedia/include/media/MediaRecorderBase.h b/media/libmedia/include/media/MediaRecorderBase.h
index 748153c..5340dde 100644
--- a/media/libmedia/include/media/MediaRecorderBase.h
+++ b/media/libmedia/include/media/MediaRecorderBase.h
@@ -19,10 +19,13 @@
#define MEDIA_RECORDER_BASE_H_
#include <media/AudioSystem.h>
+#include <media/MicrophoneInfo.h>
#include <media/mediarecorder.h>
#include <system/audio.h>
+#include <vector>
+
namespace android {
class ICameraRecordingProxy;
@@ -67,6 +70,9 @@
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;
+ virtual status_t getActiveMicrophones(
+ std::vector<media::MicrophoneInfo>* activeMicrophones) = 0;
+
protected:
diff --git a/media/libmedia/include/media/mediarecorder.h b/media/libmedia/include/media/mediarecorder.h
index 5f2a6fe..d8b0fe7 100644
--- a/media/libmedia/include/media/mediarecorder.h
+++ b/media/libmedia/include/media/mediarecorder.h
@@ -24,6 +24,7 @@
#include <utils/Errors.h>
#include <media/IMediaRecorderClient.h>
#include <media/IMediaDeathNotifier.h>
+#include <media/MicrophoneInfo.h>
namespace android {
@@ -258,6 +259,7 @@
status_t setInputDevice(audio_port_handle_t deviceId);
status_t getRoutedDeviceId(audio_port_handle_t *deviceId);
status_t enableAudioDeviceCallback(bool enabled);
+ status_t getActiveMicrophones(std::vector<media::MicrophoneInfo>* activeMicrophones);
private:
void doCleanUp();
diff --git a/media/libmedia/mediarecorder.cpp b/media/libmedia/mediarecorder.cpp
index aab845b..721a043 100644
--- a/media/libmedia/mediarecorder.cpp
+++ b/media/libmedia/mediarecorder.cpp
@@ -829,4 +829,15 @@
return mMediaRecorder->enableAudioDeviceCallback(enabled);
}
+status_t MediaRecorder::getActiveMicrophones(std::vector<media::MicrophoneInfo>* activeMicrophones)
+{
+ ALOGV("getActiveMicrophones");
+
+ if (mMediaRecorder == NULL) {
+ ALOGE("media recorder is not initialized yet");
+ return INVALID_OPERATION;
+ }
+ return mMediaRecorder->getActiveMicrophones(activeMicrophones);
+}
+
} // namespace android
diff --git a/media/libmediaplayerservice/MediaRecorderClient.cpp b/media/libmediaplayerservice/MediaRecorderClient.cpp
index dcd393b..4206647 100644
--- a/media/libmediaplayerservice/MediaRecorderClient.cpp
+++ b/media/libmediaplayerservice/MediaRecorderClient.cpp
@@ -527,4 +527,14 @@
}
return NO_INIT;
}
+
+status_t MediaRecorderClient::getActiveMicrophones(
+ std::vector<media::MicrophoneInfo>* activeMicrophones) {
+ ALOGV("getActiveMicrophones");
+ Mutex::Autolock lock(mLock);
+ if (mRecorder != NULL) {
+ return mRecorder->getActiveMicrophones(activeMicrophones);
+ }
+ return NO_INIT;
+}
}; // namespace android
diff --git a/media/libmediaplayerservice/MediaRecorderClient.h b/media/libmediaplayerservice/MediaRecorderClient.h
index 538b461..d2e681f 100644
--- a/media/libmediaplayerservice/MediaRecorderClient.h
+++ b/media/libmediaplayerservice/MediaRecorderClient.h
@@ -107,6 +107,8 @@
virtual status_t setInputDevice(audio_port_handle_t deviceId);
virtual status_t getRoutedDeviceId(audio_port_handle_t* deviceId);
virtual status_t enableAudioDeviceCallback(bool enabled);
+ virtual status_t getActiveMicrophones(
+ std::vector<media::MicrophoneInfo>* activeMicrophones);
private:
friend class MediaPlayerService; // for accessing private constructor
diff --git a/media/libmediaplayerservice/StagefrightRecorder.cpp b/media/libmediaplayerservice/StagefrightRecorder.cpp
index 77eaefe..a514f95 100644
--- a/media/libmediaplayerservice/StagefrightRecorder.cpp
+++ b/media/libmediaplayerservice/StagefrightRecorder.cpp
@@ -2163,6 +2163,15 @@
return NO_ERROR;
}
+status_t StagefrightRecorder::getActiveMicrophones(
+ std::vector<media::MicrophoneInfo>* activeMicrophones) {
+ if (mAudioSourceNode != 0) {
+ return mAudioSourceNode->getActiveMicrophones(activeMicrophones);
+ }
+ return NO_INIT;
+}
+
+
status_t StagefrightRecorder::dump(
int fd, const Vector<String16>& args) const {
ALOGV("dump");
diff --git a/media/libmediaplayerservice/StagefrightRecorder.h b/media/libmediaplayerservice/StagefrightRecorder.h
index ec7e8ed..18c9256 100644
--- a/media/libmediaplayerservice/StagefrightRecorder.h
+++ b/media/libmediaplayerservice/StagefrightRecorder.h
@@ -76,6 +76,8 @@
virtual status_t getRoutedDeviceId(audio_port_handle_t* deviceId);
virtual void setAudioDeviceCallback(const sp<AudioSystem::AudioDeviceCallback>& callback);
virtual status_t enableAudioDeviceCallback(bool enabled);
+ virtual status_t getActiveMicrophones(std::vector<media::MicrophoneInfo>* activeMicrophones);
+
private:
mutable Mutex mLock;
diff --git a/media/libstagefright/AudioSource.cpp b/media/libstagefright/AudioSource.cpp
index b8da980..70ce38c 100644
--- a/media/libstagefright/AudioSource.cpp
+++ b/media/libstagefright/AudioSource.cpp
@@ -498,4 +498,12 @@
return NO_INIT;
}
+status_t AudioSource::getActiveMicrophones(
+ std::vector<media::MicrophoneInfo>* activeMicrophones) {
+ if (mRecord != 0) {
+ return mRecord->getActiveMicrophones(activeMicrophones);
+ }
+ return NO_INIT;
+}
+
} // namespace android
diff --git a/media/libstagefright/include/media/stagefright/AudioSource.h b/media/libstagefright/include/media/stagefright/AudioSource.h
index 9414aab..f66b92d 100644
--- a/media/libstagefright/include/media/stagefright/AudioSource.h
+++ b/media/libstagefright/include/media/stagefright/AudioSource.h
@@ -21,11 +21,14 @@
#include <media/AudioRecord.h>
#include <media/AudioSystem.h>
#include <media/MediaSource.h>
+#include <media/MicrophoneInfo.h>
#include <media/stagefright/MediaBuffer.h>
#include <utils/List.h>
#include <system/audio.h>
+#include <vector>
+
namespace android {
class AudioRecord;
@@ -64,6 +67,9 @@
status_t addAudioDeviceCallback(const sp<AudioSystem::AudioDeviceCallback>& callback);
status_t removeAudioDeviceCallback(const sp<AudioSystem::AudioDeviceCallback>& callback);
+ status_t getActiveMicrophones(std::vector<media::MicrophoneInfo>* activeMicrophones);
+
+
protected:
virtual ~AudioSource();