diff --git a/core/jni/android_media_AudioSystem.cpp b/core/jni/android_media_AudioSystem.cpp index 6417b283f5200..541b937860c3f 100644 --- a/core/jni/android_media_AudioSystem.cpp +++ b/core/jni/android_media_AudioSystem.cpp @@ -2250,6 +2250,20 @@ android_media_AudioSystem_setRttEnabled(JNIEnv *env, jobject thiz, jboolean enab return (jint) check_AudioSystem_Command(AudioSystem::setRttEnabled(enabled)); } +static jint +android_media_AudioSystem_setAudioHalPids(JNIEnv *env, jobject clazz, jintArray jPids) +{ + if (jPids == NULL) { + return (jint)AUDIO_JAVA_BAD_VALUE; + } + pid_t *nPidsArray = (pid_t *)env->GetIntArrayElements(jPids, NULL); + std::vector nPids(nPidsArray, nPidsArray + env->GetArrayLength(jPids)); + status_t status = AudioSystem::setAudioHalPids(nPids); + env->ReleaseIntArrayElements(jPids, nPidsArray, 0); + jint jStatus = nativeToJavaStatus(status); + return jStatus; +} + // ---------------------------------------------------------------------------- static const JNINativeMethod gMethods[] = { @@ -2328,6 +2342,7 @@ static const JNINativeMethod gMethods[] = { (void*)android_media_AudioSystem_getHwOffloadEncodingFormatsSupportedForA2DP}, {"setAllowedCapturePolicy", "(II)I", (void *)android_media_AudioSystem_setAllowedCapturePolicy}, {"setRttEnabled", "(Z)I", (void *)android_media_AudioSystem_setRttEnabled}, + {"setAudioHalPids", "([I)I", (void *)android_media_AudioSystem_setAudioHalPids}, }; static const JNINativeMethod gEventHandlerMethods[] = { diff --git a/media/java/android/media/AudioSystem.java b/media/java/android/media/AudioSystem.java index bb731a8189f96..900572dabc942 100644 --- a/media/java/android/media/AudioSystem.java +++ b/media/java/android/media/AudioSystem.java @@ -1124,6 +1124,12 @@ public class AudioSystem */ public static native boolean isHapticPlaybackSupported(); + /** + * Send audio HAL server process pids to native audioserver process for use + * when generating audio HAL servers tombstones + */ + public static native int setAudioHalPids(int[] pids); + // Items shared with audio service /** diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index 48f08e3226e36..bae96804171ba 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -61,6 +61,7 @@ import android.hardware.hdmi.HdmiPlaybackClient; import android.hardware.hdmi.HdmiTvClient; import android.hardware.input.InputManager; import android.hardware.usb.UsbManager; +import android.hidl.manager.V1_0.IServiceManager; import android.media.AudioAttributes; import android.media.AudioFocusInfo; import android.media.AudioFocusRequest; @@ -148,10 +149,12 @@ import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; +import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.NoSuchElementException; import java.util.Objects; +import java.util.Set; import java.util.concurrent.Executor; import java.util.concurrent.atomic.AtomicBoolean; @@ -721,6 +724,8 @@ public class AudioService extends IAudioService.Stub AudioSystem.setErrorCallback(mAudioSystemCallback); + updateAudioHalPids(); + boolean cameraSoundForced = readCameraSoundForced(); mCameraSoundForced = new Boolean(cameraSoundForced); sendMsg(mAudioHandler, @@ -949,6 +954,8 @@ public class AudioService extends IAudioService.Stub } Log.e(TAG, "Audioserver started."); + updateAudioHalPids(); + // indicate to audio HAL that we start the reconfiguration phase after a media // server crash // Note that we only execute this when the media server @@ -7290,6 +7297,41 @@ public class AudioService extends IAudioService.Stub return (AudioSystem.checkAudioFlinger() == AudioSystem.AUDIO_STATUS_OK); } + //====================== + // Audio HAL process dump + //====================== + + private static final String AUDIO_HAL_SERVICE_PREFIX = "android.hardware.audio"; + + private Set getAudioHalPids() { + try { + IServiceManager serviceManager = IServiceManager.getService(); + ArrayList dump = + serviceManager.debugDump(); + HashSet pids = new HashSet<>(); + for (IServiceManager.InstanceDebugInfo info : dump) { + if (info.pid != IServiceManager.PidConstant.NO_PID + && info.interfaceName != null + && info.interfaceName.startsWith(AUDIO_HAL_SERVICE_PREFIX)) { + pids.add(info.pid); + } + } + return pids; + } catch (RemoteException e) { + return new HashSet(); + } + } + + private void updateAudioHalPids() { + Set pidsSet = getAudioHalPids(); + if (pidsSet.isEmpty()) { + Slog.w(TAG, "Could not retrieve audio HAL service pids"); + return; + } + int[] pidsArray = pidsSet.stream().mapToInt(Integer::intValue).toArray(); + AudioSystem.setAudioHalPids(pidsArray); + } + //====================== // misc //======================