Add config of audio device
Use audioConfig{bool useMicrophone, bool useSpeaker} to configure the
audio device.
Bug: 325930215
Test: play and capture sound on a Pixel device
Test: arecord -D hw:0,0 -f dat /tmp/tmp
Test: aplay -D hw:0,0 -f dat /tmp/tmp
Change-Id: I2949e48abd9a9226007e069a5141813021557977
diff --git a/vmlauncher_app/AndroidManifest.xml b/vmlauncher_app/AndroidManifest.xml
index bae3227..f39e53b 100644
--- a/vmlauncher_app/AndroidManifest.xml
+++ b/vmlauncher_app/AndroidManifest.xml
@@ -5,6 +5,7 @@
<uses-permission android:name="android.permission.MANAGE_VIRTUAL_MACHINE" />
<uses-permission android:name="android.permission.USE_CUSTOM_VIRTUAL_MACHINE" />
<uses-permission android:name="android.permission.INTERNET" />
+ <uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-feature android:name="android.software.virtualization_framework" android:required="true" />
<application
android:label="VmLauncherApp">
diff --git a/vmlauncher_app/java/com/android/virtualization/vmlauncher/MainActivity.java b/vmlauncher_app/java/com/android/virtualization/vmlauncher/MainActivity.java
index e13d2c9..e9262ed 100644
--- a/vmlauncher_app/java/com/android/virtualization/vmlauncher/MainActivity.java
+++ b/vmlauncher_app/java/com/android/virtualization/vmlauncher/MainActivity.java
@@ -16,8 +16,10 @@
package com.android.virtualization.vmlauncher;
+import static android.content.pm.PackageManager.PERMISSION_GRANTED;
import static android.system.virtualmachine.VirtualMachineConfig.CPU_TOPOLOGY_MATCH_HOST;
+import android.Manifest.permission;
import android.app.Activity;
import android.crosvm.ICrosvmAndroidDisplayService;
import android.graphics.PixelFormat;
@@ -31,6 +33,7 @@
import android.system.virtualmachine.VirtualMachineCallback;
import android.system.virtualmachine.VirtualMachineConfig;
import android.system.virtualmachine.VirtualMachineCustomImageConfig;
+import android.system.virtualmachine.VirtualMachineCustomImageConfig.AudioConfig;
import android.system.virtualmachine.VirtualMachineCustomImageConfig.DisplayConfig;
import android.system.virtualmachine.VirtualMachineCustomImageConfig.GpuConfig;
import android.system.virtualmachine.VirtualMachineException;
@@ -76,6 +79,7 @@
private ExecutorService mExecutorService;
private VirtualMachine mVirtualMachine;
private ParcelFileDescriptor mCursorStream;
+ private static final int RECORD_AUDIO_PERMISSION_REQUEST_CODE = 101;
private VirtualMachineConfig createVirtualMachineConfig(String jsonPath) {
VirtualMachineConfig.Builder configBuilder =
@@ -191,6 +195,10 @@
customImageConfigBuilder.useSwitches(true);
customImageConfigBuilder.useNetwork(true);
+ AudioConfig.Builder audioConfigBuilder = new AudioConfig.Builder();
+ audioConfigBuilder.setUseMicrophone(true);
+ audioConfigBuilder.setUseSpeaker(true);
+ customImageConfigBuilder.setAudioConfig(audioConfigBuilder.build());
configBuilder.setCustomImageConfig(customImageConfigBuilder.build());
} catch (JSONException | IOException e) {
@@ -224,6 +232,7 @@
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
+ checkAndRequestRecordAudioPermission();
mExecutorService = Executors.newCachedThreadPool();
try {
// To ensure that the previous display service is removed.
@@ -519,6 +528,14 @@
}
}
+ private void checkAndRequestRecordAudioPermission() {
+ if (getApplicationContext().checkSelfPermission(permission.RECORD_AUDIO)
+ != PERMISSION_GRANTED) {
+ requestPermissions(
+ new String[] {permission.RECORD_AUDIO}, RECORD_AUDIO_PERMISSION_REQUEST_CODE);
+ }
+ }
+
/** Reads data from an input stream and posts it to the output data */
static class Reader implements Runnable {
private final String mName;