Merge "audio: Use auto-generated MicrophoneInfoFw class"
diff --git a/core/jni/android_media_AudioRecord.cpp b/core/jni/android_media_AudioRecord.cpp
index 8012e0c..5f8721e 100644
--- a/core/jni/android_media_AudioRecord.cpp
+++ b/core/jni/android_media_AudioRecord.cpp
@@ -18,29 +18,25 @@
 
 #define LOG_TAG "AudioRecord-JNI"
 
-#include <inttypes.h>
-#include <jni.h>
-#include <nativehelper/JNIHelp.h>
-#include "core_jni_helpers.h"
-
-#include <utils/Log.h>
-#include <media/AudioRecord.h>
-#include <media/MicrophoneInfo.h>
-#include <vector>
-
 #include <android/content/AttributionSourceState.h>
 #include <android_os_Parcel.h>
-
+#include <inttypes.h>
+#include <jni.h>
+#include <media/AudioRecord.h>
+#include <nativehelper/JNIHelp.h>
 #include <nativehelper/ScopedUtfChars.h>
+#include <utils/Log.h>
+
+#include <vector>
 
 #include "android_media_AudioAttributes.h"
-#include "android_media_AudioFormat.h"
 #include "android_media_AudioErrors.h"
+#include "android_media_AudioFormat.h"
 #include "android_media_DeviceCallback.h"
 #include "android_media_JNIUtils.h"
 #include "android_media_MediaMetricsJNI.h"
 #include "android_media_MicrophoneInfo.h"
-
+#include "core_jni_helpers.h"
 
 // ----------------------------------------------------------------------------
 
@@ -721,7 +717,7 @@
     }
 
     jint jStatus = AUDIO_JAVA_SUCCESS;
-    std::vector<media::MicrophoneInfo> activeMicrophones;
+    std::vector<media::MicrophoneInfoFw> activeMicrophones;
     status_t status = lpRecorder->getActiveMicrophones(&activeMicrophones);
     if (status != NO_ERROR) {
         ALOGE_IF(status != NO_ERROR, "AudioRecord::getActiveMicrophones error %d", status);
diff --git a/core/jni/android_media_AudioSystem.cpp b/core/jni/android_media_AudioSystem.cpp
index 47057a4..cdb0580 100644
--- a/core/jni/android_media_AudioSystem.cpp
+++ b/core/jni/android_media_AudioSystem.cpp
@@ -27,7 +27,6 @@
 #include <media/AudioContainers.h>
 #include <media/AudioPolicy.h>
 #include <media/AudioSystem.h>
-#include <media/MicrophoneInfo.h>
 #include <nativehelper/JNIHelp.h>
 #include <nativehelper/ScopedLocalRef.h>
 #include <system/audio.h>
@@ -2325,7 +2324,7 @@
     }
 
     jint jStatus;
-    std::vector<media::MicrophoneInfo> microphones;
+    std::vector<media::MicrophoneInfoFw> microphones;
     status_t status = AudioSystem::getMicrophones(&microphones);
     if (status != NO_ERROR) {
         ALOGE("AudioSystem::getMicrophones error %d", status);
diff --git a/core/jni/android_media_MicrophoneInfo.cpp b/core/jni/android_media_MicrophoneInfo.cpp
index b70190f..65e30d8 100644
--- a/core/jni/android_media_MicrophoneInfo.cpp
+++ b/core/jni/android_media_MicrophoneInfo.cpp
@@ -15,6 +15,9 @@
  */
 
 #include "android_media_MicrophoneInfo.h"
+
+#include <media/AidlConversion.h>
+
 #include "android_media_AudioErrors.h"
 #include "core_jni_helpers.h"
 
@@ -46,8 +49,17 @@
 namespace android {
 
 jint convertMicrophoneInfoFromNative(JNIEnv *env, jobject *jMicrophoneInfo,
-        const media::MicrophoneInfo *microphoneInfo)
-{
+                                     const media::MicrophoneInfoFw *microphoneInfo) {
+    // The Java object uses the same enum values as the C enum values, which are
+    // generated from HIDL. Thus, we can use the legacy structure as the source for
+    // creating the Java object. Once we start removing legacy types, we can add
+    // direct converters between Java and AIDL, this will eliminate the need
+    // to have JNI code like this one.
+    auto conv = aidl2legacy_MicrophoneInfoFw_audio_microphone_characteristic_t(*microphoneInfo);
+    if (!conv.ok()) {
+        return nativeToJavaStatus(conv.error());
+    }
+
     jint jStatus = (jint)AUDIO_JAVA_SUCCESS;
     jstring jDeviceId = NULL;
     jstring jAddress = NULL;
@@ -56,36 +68,23 @@
     jobject jFrequencyResponses = NULL;
     jobject jChannelMappings = NULL;
 
-    jDeviceId = env->NewStringUTF(microphoneInfo->getDeviceId().c_str());
-    jAddress = env->NewStringUTF(microphoneInfo->getAddress().c_str());
-    if (microphoneInfo->getGeometricLocation().size() != 3 ||
-            microphoneInfo->getOrientation().size() != 3) {
-        jStatus = nativeToJavaStatus(BAD_VALUE);
-        goto exit;
-    }
-    jGeometricLocation = env->NewObject(gMicrophoneInfoCoordinateClass,
-                                        gMicrophoneInfoCoordinateCstor,
-                                        microphoneInfo->getGeometricLocation()[0],
-                                        microphoneInfo->getGeometricLocation()[1],
-                                        microphoneInfo->getGeometricLocation()[2]);
-    jOrientation = env->NewObject(gMicrophoneInfoCoordinateClass,
-                                  gMicrophoneInfoCoordinateCstor,
-                                  microphoneInfo->getOrientation()[0],
-                                  microphoneInfo->getOrientation()[1],
-                                  microphoneInfo->getOrientation()[2]);
+    const auto &micInfo = conv.value();
+    jDeviceId = env->NewStringUTF(micInfo.device_id);
+    jAddress = env->NewStringUTF(micInfo.address);
+    jGeometricLocation =
+            env->NewObject(gMicrophoneInfoCoordinateClass, gMicrophoneInfoCoordinateCstor,
+                           micInfo.geometric_location.x, micInfo.geometric_location.y,
+                           micInfo.geometric_location.z);
+    jOrientation =
+            env->NewObject(gMicrophoneInfoCoordinateClass, gMicrophoneInfoCoordinateCstor,
+                           micInfo.orientation.x, micInfo.orientation.y, micInfo.orientation.z);
     // Create a list of Pair for frequency response.
-    if (microphoneInfo->getFrequencyResponses().size() != 2 ||
-            microphoneInfo->getFrequencyResponses()[0].size() !=
-                    microphoneInfo->getFrequencyResponses()[1].size()) {
-        jStatus = nativeToJavaStatus(BAD_VALUE);
-        goto exit;
-    }
     jFrequencyResponses = env->NewObject(gArrayListClass, gArrayListCstor);
-    for (size_t i = 0; i < microphoneInfo->getFrequencyResponses()[0].size(); i++) {
-        jobject jFrequency = env->NewObject(gFloatClass, gFloatCstor,
-                                            microphoneInfo->getFrequencyResponses()[0][i]);
-        jobject jResponse = env->NewObject(gFloatClass, gFloatCstor,
-                                          microphoneInfo->getFrequencyResponses()[1][i]);
+    for (size_t i = 0; i < micInfo.num_frequency_responses; i++) {
+        jobject jFrequency =
+                env->NewObject(gFloatClass, gFloatCstor, micInfo.frequency_responses[0][i]);
+        jobject jResponse =
+                env->NewObject(gFloatClass, gFloatCstor, micInfo.frequency_responses[1][i]);
         jobject jFrequencyResponse = env->NewObject(gPairClass, gPairCstor, jFrequency, jResponse);
         env->CallBooleanMethod(jFrequencyResponses, gArrayListMethods.add, jFrequencyResponse);
         env->DeleteLocalRef(jFrequency);
@@ -93,13 +92,9 @@
         env->DeleteLocalRef(jFrequencyResponse);
     }
     // Create a list of Pair for channel mapping.
-    if (microphoneInfo->getChannelMapping().size() != AUDIO_CHANNEL_COUNT_MAX) {
-        jStatus = nativeToJavaStatus(BAD_VALUE);
-        goto exit;
-    }
-    jChannelMappings = env->NewObject(gArrayListClass, gArrayListCstor);
-    for (size_t i = 0; i < microphoneInfo->getChannelMapping().size(); i++) {
-        int channelMappingType = microphoneInfo->getChannelMapping()[i];
+    const auto &channelMapping = micInfo.channel_mapping;
+    for (size_t i = 0; i < std::size(channelMapping); i++) {
+        int channelMappingType = channelMapping[i];
         if (channelMappingType != AUDIO_MICROPHONE_CHANNEL_MAPPING_UNUSED) {
             jobject jChannelIndex = env->NewObject(gIntegerClass, gIntegerCstor, i);
             jobject jChannelMappingType = env->NewObject(gIntegerClass, gIntegerCstor,
@@ -113,18 +108,11 @@
         }
     }
     *jMicrophoneInfo = env->NewObject(gMicrophoneInfoClass, gMicrophoneInfoCstor, jDeviceId,
-                                      microphoneInfo->getType(), jAddress,
-                                      microphoneInfo->getDeviceLocation(),
-                                      microphoneInfo->getDeviceGroup(),
-                                      microphoneInfo->getIndexInTheGroup(),
-                                      jGeometricLocation, jOrientation,
-                                      jFrequencyResponses, jChannelMappings,
-                                      microphoneInfo->getSensitivity(),
-                                      microphoneInfo->getMaxSpl(),
-                                      microphoneInfo->getMinSpl(),
-                                      microphoneInfo->getDirectionality());
+                                      micInfo.device, jAddress, micInfo.location, micInfo.group,
+                                      micInfo.index_in_the_group, jGeometricLocation, jOrientation,
+                                      jFrequencyResponses, jChannelMappings, micInfo.sensitivity,
+                                      micInfo.max_spl, micInfo.min_spl, micInfo.directionality);
 
-exit:
     if (jDeviceId != NULL) {
         env->DeleteLocalRef(jDeviceId);
     }
@@ -145,7 +133,6 @@
     }
     return jStatus;
 }
-
 }
 
 int register_android_media_MicrophoneInfo(JNIEnv *env)
diff --git a/core/jni/android_media_MicrophoneInfo.h b/core/jni/android_media_MicrophoneInfo.h
index 241b6d0..dc531c6 100644
--- a/core/jni/android_media_MicrophoneInfo.h
+++ b/core/jni/android_media_MicrophoneInfo.h
@@ -17,8 +17,8 @@
 #ifndef ANDROID_MEDIA_MICROPHONEINFO_H
 #define ANDROID_MEDIA_MICROPHONEINFO_H
 
+#include <android/media/MicrophoneInfoFw.h>
 #include <system/audio.h>
-#include <media/MicrophoneInfo.h>
 
 #include "jni.h"
 
@@ -27,7 +27,7 @@
 // Conversion from C++ MicrophoneInfo object to Java MicrophoneInfo object
 
 extern jint convertMicrophoneInfoFromNative(JNIEnv *env, jobject *jMicrophoneInfo,
-        const media::MicrophoneInfo *microphoneInfo);
+                                            const media::MicrophoneInfoFw *microphoneInfo);
 } // namespace android
 
-#endif
\ No newline at end of file
+#endif
diff --git a/media/jni/android_media_MediaRecorder.cpp b/media/jni/android_media_MediaRecorder.cpp
index 7ef0f77..9a6d5d7 100644
--- a/media/jni/android_media_MediaRecorder.cpp
+++ b/media/jni/android_media_MediaRecorder.cpp
@@ -30,7 +30,6 @@
 #include <camera/Camera.h>
 #include <media/mediarecorder.h>
 #include <media/MediaMetricsItem.h>
-#include <media/MicrophoneInfo.h>
 #include <media/stagefright/PersistentSurface.h>
 #include <utils/threads.h>
 
@@ -774,7 +773,7 @@
     }
 
     jint jStatus = AUDIO_JAVA_SUCCESS;
-    std::vector<media::MicrophoneInfo> activeMicrophones;
+    std::vector<media::MicrophoneInfoFw> activeMicrophones;
     status_t status = mr->getActiveMicrophones(&activeMicrophones);
     if (status != NO_ERROR) {
         ALOGE_IF(status != NO_ERROR, "MediaRecorder::getActiveMicrophones error %d", status);