From 5a5b2e3f8a9ba72086db96daa08c8a3e0bb12185 Mon Sep 17 00:00:00 2001 From: Ytai Ben-Tsvi Date: Thu, 14 Jan 2021 09:09:53 -0800 Subject: [PATCH 1/2] Respect config_mask in AudioPortConfig conversion The code that converts AudioPortConfig from native to Java previously ignored config_mask and as result risks reading bogus values from the respective fields. This fixes it. Test: Audio tests from CtsMediaTests Change-Id: I6664ea10b47ddd0f2f7843f7051c03dfe72d8383 --- core/jni/android_media_AudioSystem.cpp | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/core/jni/android_media_AudioSystem.cpp b/core/jni/android_media_AudioSystem.cpp index 8dc56ed15d6f3..120686d4fb4ea 100644 --- a/core/jni/android_media_AudioSystem.cpp +++ b/core/jni/android_media_AudioSystem.cpp @@ -1023,7 +1023,9 @@ static jint convertAudioPortConfigFromNative(JNIEnv *env, audio_channel_mask_t nMask; jint jMask; - int gainIndex = nAudioPortConfig->gain.index; + int gainIndex = (nAudioPortConfig->config_mask & AUDIO_PORT_CONFIG_GAIN) + ? nAudioPortConfig->gain.index + : -1; if (gainIndex >= 0) { ALOGV("convertAudioPortConfigFromNative gain found with index %d mode %x", gainIndex, nAudioPortConfig->gain.mode); @@ -1120,7 +1122,9 @@ static jint convertAudioPortConfigFromNative(JNIEnv *env, goto exit; } } - nMask = nAudioPortConfig->channel_mask; + nMask = (nAudioPortConfig->config_mask & AUDIO_PORT_CONFIG_CHANNEL_MASK) + ? nAudioPortConfig->channel_mask + : AUDIO_CONFIG_BASE_INITIALIZER.channel_mask; if (useInMask) { jMask = inChannelMaskFromNative(nMask); ALOGV("convertAudioPortConfigFromNative IN mask java %x native %x", jMask, nMask); @@ -1129,12 +1133,17 @@ static jint convertAudioPortConfigFromNative(JNIEnv *env, ALOGV("convertAudioPortConfigFromNative OUT mask java %x native %x", jMask, nMask); } - *jAudioPortConfig = env->NewObject(clazz, methodID, - jAudioPort, - nAudioPortConfig->sample_rate, - jMask, - audioFormatFromNative(nAudioPortConfig->format), - jAudioGainConfig); + *jAudioPortConfig = + env->NewObject(clazz, methodID, jAudioPort, + (nAudioPortConfig->config_mask & AUDIO_PORT_CONFIG_SAMPLE_RATE) + ? nAudioPortConfig->sample_rate + : AUDIO_CONFIG_BASE_INITIALIZER.sample_rate, + jMask, + audioFormatFromNative( + (nAudioPortConfig->config_mask & AUDIO_PORT_CONFIG_FORMAT) + ? nAudioPortConfig->format + : AUDIO_CONFIG_BASE_INITIALIZER.format), + jAudioGainConfig); if (*jAudioPortConfig == NULL) { ALOGV("convertAudioPortConfigFromNative could not create new port config"); jStatus = (jint)AUDIO_JAVA_ERROR; From 3245b5d12a871802d25d4265682137f0479746af Mon Sep 17 00:00:00 2001 From: Ytai Ben-Tsvi Date: Tue, 19 Jan 2021 16:22:27 -0800 Subject: [PATCH 2/2] Initialize format in AudioMix conversion The code that converts AudioMix from Java to native previously did not set every field of the mFormat structure, resulting in illegal data. This adds initialization. Test: Audio tests from CtsMediaTests Change-Id: Id7e3ab0fdadd30100d9e78a833db2812718a764d --- core/jni/android_media_AudioSystem.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/core/jni/android_media_AudioSystem.cpp b/core/jni/android_media_AudioSystem.cpp index 120686d4fb4ea..94bd28a59e7c2 100644 --- a/core/jni/android_media_AudioSystem.cpp +++ b/core/jni/android_media_AudioSystem.cpp @@ -1945,6 +1945,7 @@ static jint convertAudioMixToNative(JNIEnv *env, nAudioMix->mCbFlags = env->GetIntField(jAudioMix, gAudioMixFields.mCallbackFlags); jobject jFormat = env->GetObjectField(jAudioMix, gAudioMixFields.mFormat); + nAudioMix->mFormat = AUDIO_CONFIG_INITIALIZER; nAudioMix->mFormat.sample_rate = env->GetIntField(jFormat, gAudioFormatFields.mSampleRate); nAudioMix->mFormat.channel_mask = outChannelMaskToNative(env->GetIntField(jFormat,