diff --git a/core/jni/android_media_AudioSystem.cpp b/core/jni/android_media_AudioSystem.cpp index 7ec68edddf52e..bba09ce38d31c 100644 --- a/core/jni/android_media_AudioSystem.cpp +++ b/core/jni/android_media_AudioSystem.cpp @@ -608,9 +608,10 @@ android_media_AudioSystem_getOutputLatency(JNIEnv *env, jobject clazz, jint stre } static jint -android_media_AudioSystem_setLowRamDevice(JNIEnv *env, jobject clazz, jboolean isLowRamDevice) +android_media_AudioSystem_setLowRamDevice( + JNIEnv *env, jobject clazz, jboolean isLowRamDevice, jlong totalMemory) { - return (jint) AudioSystem::setLowRamDevice((bool) isLowRamDevice); + return (jint) AudioSystem::setLowRamDevice((bool) isLowRamDevice, (int64_t) totalMemory); } static jint @@ -1801,7 +1802,7 @@ static const JNINativeMethod gMethods[] = { {"getPrimaryOutputSamplingRate", "()I", (void *)android_media_AudioSystem_getPrimaryOutputSamplingRate}, {"getPrimaryOutputFrameCount", "()I", (void *)android_media_AudioSystem_getPrimaryOutputFrameCount}, {"getOutputLatency", "(I)I", (void *)android_media_AudioSystem_getOutputLatency}, - {"setLowRamDevice", "(Z)I", (void *)android_media_AudioSystem_setLowRamDevice}, + {"setLowRamDevice", "(ZJ)I", (void *)android_media_AudioSystem_setLowRamDevice}, {"checkAudioFlinger", "()I", (void *)android_media_AudioSystem_checkAudioFlinger}, {"listAudioPorts", "(Ljava/util/ArrayList;[I)I", (void *)android_media_AudioSystem_listAudioPorts}, diff --git a/media/java/android/media/AudioSystem.java b/media/java/android/media/AudioSystem.java index 2cd764df2c547..cbdecf9d02db3 100644 --- a/media/java/android/media/AudioSystem.java +++ b/media/java/android/media/AudioSystem.java @@ -792,7 +792,7 @@ public class AudioSystem public static native int getPrimaryOutputFrameCount(); public static native int getOutputLatency(int stream); - public static native int setLowRamDevice(boolean isLowRamDevice); + public static native int setLowRamDevice(boolean isLowRamDevice, long totalMemory); public static native int checkAudioFlinger(); public static native int listAudioPorts(ArrayList ports, int[] generation); diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index 7604b6b8f2df4..b932fa14dd43d 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -6583,7 +6583,19 @@ public class AudioService extends IAudioService.Stub // Inform AudioFlinger of our device's low RAM attribute private static void readAndSetLowRamDevice() { - int status = AudioSystem.setLowRamDevice(ActivityManager.isLowRamDeviceStatic()); + boolean isLowRamDevice = ActivityManager.isLowRamDeviceStatic(); + long totalMemory = 1024 * 1024 * 1024; // 1GB is the default if ActivityManager fails. + + try { + final ActivityManager.MemoryInfo info = new ActivityManager.MemoryInfo(); + ActivityManager.getService().getMemoryInfo(info); + totalMemory = info.totalMem; + } catch (RemoteException e) { + Log.w(TAG, "Cannot obtain MemoryInfo from ActivityManager, assume low memory device"); + isLowRamDevice = true; + } + + final int status = AudioSystem.setLowRamDevice(isLowRamDevice, totalMemory); if (status != 0) { Log.w(TAG, "AudioFlinger informed of device's low RAM attribute; status " + status); }