Merge "Pass vibrator information to audio server." into sc-dev

This commit is contained in:
TreeHugger Robot
2021-04-01 23:36:27 +00:00
committed by Android (Google) Code Review
3 changed files with 92 additions and 2 deletions

View File

@@ -26,6 +26,7 @@
#include <nativehelper/JNIHelp.h>
#include "core_jni_helpers.h"
#include <android/media/AudioVibratorInfo.h>
#include <audiomanager/AudioManager.h>
#include <media/AudioPolicy.h>
#include <media/AudioSystem.h>
@@ -176,7 +177,12 @@ static struct {
jmethodID postRoutingUpdatedFromNative;
} gAudioPolicyEventHandlerMethods;
static struct { jmethodID add; } gListMethods;
jclass gListClass;
static struct {
jmethodID add;
jmethodID get;
jmethodID size;
} gListMethods;
static jclass gAudioDescriptorClass;
static jmethodID gAudiODescriptorCstor;
@@ -195,6 +201,13 @@ jclass gClsAudioRecordRoutingProxy;
jclass gAudioProfileClass;
jmethodID gAudioProfileCstor;
jclass gVibratorClass;
static struct {
jmethodID getId;
jmethodID getResonantFrequency;
jmethodID getQFactor;
} gVibratorMethods;
static Mutex gLock;
enum AudioError {
@@ -2627,6 +2640,29 @@ android_media_AudioSystem_getDevicesForAttributes(JNIEnv *env, jobject thiz,
return jStatus;
}
static jint android_media_AudioSystem_setVibratorInfos(JNIEnv *env, jobject thiz,
jobject jVibrators) {
if (!env->IsInstanceOf(jVibrators, gListClass)) {
return (jint)AUDIO_JAVA_BAD_VALUE;
}
const jint size = env->CallIntMethod(jVibrators, gListMethods.size);
std::vector<media::AudioVibratorInfo> vibratorInfos;
for (jint i = 0; i < size; ++i) {
ScopedLocalRef<jobject> jVibrator(env,
env->CallObjectMethod(jVibrators, gListMethods.get, i));
if (!env->IsInstanceOf(jVibrator.get(), gVibratorClass)) {
return (jint)AUDIO_JAVA_BAD_VALUE;
}
media::AudioVibratorInfo vibratorInfo;
vibratorInfo.id = env->CallIntMethod(jVibrator.get(), gVibratorMethods.getId);
vibratorInfo.resonantFrequency =
env->CallFloatMethod(jVibrator.get(), gVibratorMethods.getResonantFrequency);
vibratorInfo.qFactor = env->CallFloatMethod(jVibrator.get(), gVibratorMethods.getQFactor);
vibratorInfos.push_back(vibratorInfo);
}
return (jint)check_AudioSystem_Command(AudioSystem::setVibratorInfos(vibratorInfos));
}
// ----------------------------------------------------------------------------
static const JNINativeMethod gMethods[] =
@@ -2757,7 +2793,9 @@ static const JNINativeMethod gMethods[] =
(void *)android_media_AudioSystem_setUserIdDeviceAffinities},
{"removeUserIdDeviceAffinities", "(I)I",
(void *)android_media_AudioSystem_removeUserIdDeviceAffinities},
{"setCurrentImeUid", "(I)I", (void *)android_media_AudioSystem_setCurrentImeUid}};
{"setCurrentImeUid", "(I)I", (void *)android_media_AudioSystem_setCurrentImeUid},
{"setVibratorInfos", "(Ljava/util/List;)I",
(void *)android_media_AudioSystem_setVibratorInfos}};
static const JNINativeMethod gEventHandlerMethods[] = {
{"native_setup",
@@ -2959,7 +2997,10 @@ int register_android_media_AudioSystem(JNIEnv *env)
android::GetMethodIDOrDie(env, gClsAudioRecordRoutingProxy, "native_release", "()V");
jclass listClass = FindClassOrDie(env, "java/util/List");
gListClass = MakeGlobalRefOrDie(env, listClass);
gListMethods.add = GetMethodIDOrDie(env, listClass, "add", "(Ljava/lang/Object;)Z");
gListMethods.get = GetMethodIDOrDie(env, listClass, "get", "(I)Ljava/lang/Object;");
gListMethods.size = GetMethodIDOrDie(env, listClass, "size", "()I");
jclass audioProfileClass = FindClassOrDie(env, "android/media/AudioProfile");
gAudioProfileClass = MakeGlobalRefOrDie(env, audioProfileClass);
@@ -2969,6 +3010,13 @@ int register_android_media_AudioSystem(JNIEnv *env)
gAudioDescriptorClass = MakeGlobalRefOrDie(env, audioDescriptorClass);
gAudiODescriptorCstor = GetMethodIDOrDie(env, audioDescriptorClass, "<init>", "(II[B)V");
jclass vibratorClass = FindClassOrDie(env, "android/os/Vibrator");
gVibratorClass = MakeGlobalRefOrDie(env, vibratorClass);
gVibratorMethods.getId = GetMethodIDOrDie(env, vibratorClass, "getId", "()I");
gVibratorMethods.getResonantFrequency =
GetMethodIDOrDie(env, vibratorClass, "getResonantFrequency", "()F");
gVibratorMethods.getQFactor = GetMethodIDOrDie(env, vibratorClass, "getQFactor", "()F");
AudioSystem::addErrorCallback(android_media_AudioSystem_error_callback);
RegisterMethodsOrDie(env, kClassPathName, gMethods, NELEM(gMethods));

View File

@@ -27,6 +27,7 @@ import android.content.pm.PackageManager;
import android.media.audiofx.AudioEffect;
import android.media.audiopolicy.AudioMix;
import android.os.Build;
import android.os.Vibrator;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.util.Pair;
@@ -1937,6 +1938,14 @@ public class AudioSystem
public static native int getDevicesForRoleAndCapturePreset(
int capturePreset, int role, @NonNull List<AudioDeviceAttributes> devices);
/**
* @hide
* Set the vibrators' information. The value will be used to initialize HapticGenerator.
* @param vibrators a list of all available vibrators
* @return command completion status
*/
public static native int setVibratorInfos(@NonNull List<Vibrator> vibrators);
// Items shared with audio service
/**

View File

@@ -128,6 +128,7 @@ import android.os.UserHandle;
import android.os.UserManager;
import android.os.VibrationEffect;
import android.os.Vibrator;
import android.os.VibratorManager;
import android.provider.Settings;
import android.provider.Settings.System;
import android.service.notification.ZenModeConfig;
@@ -1092,6 +1093,33 @@ public class AudioService extends IAudioService.Stub
}
}
private void updateVibratorInfos() {
VibratorManager vibratorManager = mContext.getSystemService(VibratorManager.class);
if (vibratorManager == null) {
Slog.e(TAG, "Vibrator manager is not found");
return;
}
int[] vibratorIds = vibratorManager.getVibratorIds();
if (vibratorIds.length == 0) {
Slog.d(TAG, "No vibrator found");
return;
}
List<Vibrator> vibrators = new ArrayList<>(vibratorIds.length);
for (int id : vibratorIds) {
Vibrator vibrator = vibratorManager.getVibrator(id);
if (vibrator != null) {
vibrators.add(vibrator);
} else {
Slog.w(TAG, "Vibrator(" + id + ") is not found");
}
}
if (vibrators.isEmpty()) {
Slog.w(TAG, "Cannot find any available vibrator");
return;
}
AudioSystem.setVibratorInfos(vibrators);
}
public void onSystemReady() {
mSystemReady = true;
scheduleLoadSoundEffects();
@@ -1149,6 +1177,8 @@ public class AudioService extends IAudioService.Stub
setMicMuteFromSwitchInput();
initMinStreamVolumeWithoutModifyAudioSettings();
updateVibratorInfos();
}
RoleObserver mRoleObserver;
@@ -1341,6 +1371,9 @@ public class AudioService extends IAudioService.Stub
setMicrophoneMuteNoCallerCheck(getCurrentUserId()); // will also update the mic mute cache
setMicMuteFromSwitchInput();
// Restore vibrator info
updateVibratorInfos();
}
private void onReinitVolumes(@NonNull String caller) {