Loading services/core/java/com/android/server/audio/InputDeviceVolumeHelper.java +12 −16 Original line number Diff line number Diff line Loading @@ -23,10 +23,10 @@ import android.annotation.Nullable; import android.content.ContentResolver; import android.media.AudioDeviceAttributes; import android.media.AudioDeviceInfo; import android.media.AudioManager; import android.media.AudioSystem; import android.os.UserHandle; import android.util.IntArray; import android.util.Log; import android.util.SparseIntArray; import java.util.HashSet; Loading @@ -48,7 +48,7 @@ import java.util.Set; // A map between device internal type (e.g. AudioSystem.DEVICE_IN_BUILTIN_MIC) to its input gain // index. private final SparseIntArray mInputGainIndexMap; private final Set<Integer> mSupportedDeviceTypes; private final Set<Integer> mSupportedDeviceTypes = new HashSet<>(); InputDeviceVolumeHelper( SettingsAdapter settings, Loading @@ -60,20 +60,16 @@ import java.util.Set; IntArray internalDeviceTypes = new IntArray(); int status = AudioSystem.getSupportedDeviceTypes(GET_DEVICES_INPUTS, internalDeviceTypes); mInputGainIndexMap = new SparseIntArray( status == AudioManager.SUCCESS ? internalDeviceTypes.size() : AudioSystem.DEVICE_IN_ALL_SET.size()); if (status == AudioManager.SUCCESS) { Set<Integer> supportedDeviceTypes = new HashSet<>(); for (int i = 0; i < internalDeviceTypes.size(); i++) { supportedDeviceTypes.add(internalDeviceTypes.get(i)); if (status != AudioSystem.SUCCESS) { Log.e(TAG, "AudioSystem.getSupportedDeviceTypes(GET_DEVICES_INPUTS) failed. status:" + status); } mSupportedDeviceTypes = supportedDeviceTypes; } else { mSupportedDeviceTypes = AudioSystem.DEVICE_IN_ALL_SET; // Note that in a rare case, if AudioSystem.getSupportedDeviceTypes call fails, both // mInputGainIndexMap and mSupportedDeviceTypes will be empty. mInputGainIndexMap = new SparseIntArray(internalDeviceTypes.size()); for (int i = 0; i < internalDeviceTypes.size(); i++) { mSupportedDeviceTypes.add(internalDeviceTypes.get(i)); } readSettings(); Loading services/tests/servicestests/src/com/android/server/audio/AudioServiceTest.java +26 −3 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.server.audio; import static android.media.AudioDeviceInfo.TYPE_BUILTIN_MIC; import static android.media.AudioManager.GET_DEVICES_INPUTS; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; Loading @@ -34,7 +35,9 @@ import android.media.AudioSystem; import android.os.Looper; import android.os.PermissionEnforcer; import android.os.UserHandle; import android.os.test.TestLooper; import android.platform.test.annotations.EnableFlags; import android.util.IntArray; import android.util.Log; import androidx.test.InstrumentationRegistry; Loading Loading @@ -80,12 +83,15 @@ public class AudioServiceTest { private static boolean sLooperPrepared = false; private TestLooper mTestLooper; @Before public void setUp() throws Exception { if (!sLooperPrepared) { Looper.prepare(); sLooperPrepared = true; } mTestLooper = new TestLooper(); mContext = InstrumentationRegistry.getTargetContext(); mSpyAudioSystem = spy(new NoOpAudioSystemAdapter()); mSettingsAdapter = new NoOpSettingsAdapter(); Loading @@ -93,8 +99,11 @@ public class AudioServiceTest { when(mMockAppOpsManager.noteOp(anyInt(), anyInt(), anyString(), anyString(), anyString())) .thenReturn(AppOpsManager.MODE_ALLOWED); mAudioService = new AudioService(mContext, mSpyAudioSystem, mSpySystemServer, mSettingsAdapter, mAudioVolumeGroupHelper, mMockAudioPolicy, null, mMockAppOpsManager, mMockPermissionEnforcer, mMockPermissionProvider, r -> r.run()); mSettingsAdapter, mAudioVolumeGroupHelper, mMockAudioPolicy, mTestLooper.getLooper(), mMockAppOpsManager, mMockPermissionEnforcer, mMockPermissionProvider, r -> r.run()); mTestLooper.dispatchAll(); } /** Loading Loading @@ -216,7 +225,19 @@ public class AudioServiceTest { public void testInputGainIndex() throws Exception { Log.i(TAG, "running testInputGainIndex"); Assert.assertNotNull(mAudioService); Thread.sleep(MAX_MESSAGE_HANDLING_DELAY_MS); // wait for full AudioService initialization IntArray internalDeviceTypes = new IntArray(); int status = AudioSystem.getSupportedDeviceTypes(GET_DEVICES_INPUTS, internalDeviceTypes); if (status != AudioSystem.SUCCESS) { Log.e(TAG, "AudioSystem.getSupportedDeviceTypes(GET_DEVICES_INPUTS) failed. status:" + status); } // Make sure TYPE_BUILTIN_MIC, aka DEVICE_IN_BUILTIN_MIC in terms of internal device type, // is supported. if (!internalDeviceTypes.contains(AudioSystem.DEVICE_IN_BUILTIN_MIC)) { return; } AudioDeviceAttributes ada = new AudioDeviceAttributes( Loading @@ -229,6 +250,8 @@ public class AudioServiceTest { int inputGainIndex = 20; mAudioService.setInputGainIndex(ada, inputGainIndex); mTestLooper.dispatchAll(); Assert.assertEquals( "input gain index reporting wrong value", inputGainIndex, Loading Loading
services/core/java/com/android/server/audio/InputDeviceVolumeHelper.java +12 −16 Original line number Diff line number Diff line Loading @@ -23,10 +23,10 @@ import android.annotation.Nullable; import android.content.ContentResolver; import android.media.AudioDeviceAttributes; import android.media.AudioDeviceInfo; import android.media.AudioManager; import android.media.AudioSystem; import android.os.UserHandle; import android.util.IntArray; import android.util.Log; import android.util.SparseIntArray; import java.util.HashSet; Loading @@ -48,7 +48,7 @@ import java.util.Set; // A map between device internal type (e.g. AudioSystem.DEVICE_IN_BUILTIN_MIC) to its input gain // index. private final SparseIntArray mInputGainIndexMap; private final Set<Integer> mSupportedDeviceTypes; private final Set<Integer> mSupportedDeviceTypes = new HashSet<>(); InputDeviceVolumeHelper( SettingsAdapter settings, Loading @@ -60,20 +60,16 @@ import java.util.Set; IntArray internalDeviceTypes = new IntArray(); int status = AudioSystem.getSupportedDeviceTypes(GET_DEVICES_INPUTS, internalDeviceTypes); mInputGainIndexMap = new SparseIntArray( status == AudioManager.SUCCESS ? internalDeviceTypes.size() : AudioSystem.DEVICE_IN_ALL_SET.size()); if (status == AudioManager.SUCCESS) { Set<Integer> supportedDeviceTypes = new HashSet<>(); for (int i = 0; i < internalDeviceTypes.size(); i++) { supportedDeviceTypes.add(internalDeviceTypes.get(i)); if (status != AudioSystem.SUCCESS) { Log.e(TAG, "AudioSystem.getSupportedDeviceTypes(GET_DEVICES_INPUTS) failed. status:" + status); } mSupportedDeviceTypes = supportedDeviceTypes; } else { mSupportedDeviceTypes = AudioSystem.DEVICE_IN_ALL_SET; // Note that in a rare case, if AudioSystem.getSupportedDeviceTypes call fails, both // mInputGainIndexMap and mSupportedDeviceTypes will be empty. mInputGainIndexMap = new SparseIntArray(internalDeviceTypes.size()); for (int i = 0; i < internalDeviceTypes.size(); i++) { mSupportedDeviceTypes.add(internalDeviceTypes.get(i)); } readSettings(); Loading
services/tests/servicestests/src/com/android/server/audio/AudioServiceTest.java +26 −3 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.server.audio; import static android.media.AudioDeviceInfo.TYPE_BUILTIN_MIC; import static android.media.AudioManager.GET_DEVICES_INPUTS; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; Loading @@ -34,7 +35,9 @@ import android.media.AudioSystem; import android.os.Looper; import android.os.PermissionEnforcer; import android.os.UserHandle; import android.os.test.TestLooper; import android.platform.test.annotations.EnableFlags; import android.util.IntArray; import android.util.Log; import androidx.test.InstrumentationRegistry; Loading Loading @@ -80,12 +83,15 @@ public class AudioServiceTest { private static boolean sLooperPrepared = false; private TestLooper mTestLooper; @Before public void setUp() throws Exception { if (!sLooperPrepared) { Looper.prepare(); sLooperPrepared = true; } mTestLooper = new TestLooper(); mContext = InstrumentationRegistry.getTargetContext(); mSpyAudioSystem = spy(new NoOpAudioSystemAdapter()); mSettingsAdapter = new NoOpSettingsAdapter(); Loading @@ -93,8 +99,11 @@ public class AudioServiceTest { when(mMockAppOpsManager.noteOp(anyInt(), anyInt(), anyString(), anyString(), anyString())) .thenReturn(AppOpsManager.MODE_ALLOWED); mAudioService = new AudioService(mContext, mSpyAudioSystem, mSpySystemServer, mSettingsAdapter, mAudioVolumeGroupHelper, mMockAudioPolicy, null, mMockAppOpsManager, mMockPermissionEnforcer, mMockPermissionProvider, r -> r.run()); mSettingsAdapter, mAudioVolumeGroupHelper, mMockAudioPolicy, mTestLooper.getLooper(), mMockAppOpsManager, mMockPermissionEnforcer, mMockPermissionProvider, r -> r.run()); mTestLooper.dispatchAll(); } /** Loading Loading @@ -216,7 +225,19 @@ public class AudioServiceTest { public void testInputGainIndex() throws Exception { Log.i(TAG, "running testInputGainIndex"); Assert.assertNotNull(mAudioService); Thread.sleep(MAX_MESSAGE_HANDLING_DELAY_MS); // wait for full AudioService initialization IntArray internalDeviceTypes = new IntArray(); int status = AudioSystem.getSupportedDeviceTypes(GET_DEVICES_INPUTS, internalDeviceTypes); if (status != AudioSystem.SUCCESS) { Log.e(TAG, "AudioSystem.getSupportedDeviceTypes(GET_DEVICES_INPUTS) failed. status:" + status); } // Make sure TYPE_BUILTIN_MIC, aka DEVICE_IN_BUILTIN_MIC in terms of internal device type, // is supported. if (!internalDeviceTypes.contains(AudioSystem.DEVICE_IN_BUILTIN_MIC)) { return; } AudioDeviceAttributes ada = new AudioDeviceAttributes( Loading @@ -229,6 +250,8 @@ public class AudioServiceTest { int inputGainIndex = 20; mAudioService.setInputGainIndex(ada, inputGainIndex); mTestLooper.dispatchAll(); Assert.assertEquals( "input gain index reporting wrong value", inputGainIndex, Loading