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/virtualizationmanager/src/aidl.rs b/virtualizationmanager/src/aidl.rs
index 10dafdf..671a012 100644
--- a/virtualizationmanager/src/aidl.rs
+++ b/virtualizationmanager/src/aidl.rs
@@ -17,7 +17,7 @@
 use crate::{get_calling_pid, get_calling_uid, get_this_pid};
 use crate::atom::{write_vm_booted_stats, write_vm_creation_stats};
 use crate::composite::make_composite_image;
-use crate::crosvm::{CrosvmConfig, DiskFile, DisplayConfig, GpuConfig, InputDeviceOption, PayloadState, VmContext, VmInstance, VmState};
+use crate::crosvm::{AudioConfig, CrosvmConfig, DiskFile, DisplayConfig, GpuConfig, InputDeviceOption, PayloadState, VmContext, VmInstance, VmState};
 use crate::debug_config::DebugConfig;
 use crate::dt_overlay::{create_device_tree_overlay, VM_DT_OVERLAY_MAX_SIZE, VM_DT_OVERLAY_PATH};
 use crate::payload::{add_microdroid_payload_images, add_microdroid_system_images, add_microdroid_vendor_image};
@@ -578,8 +578,12 @@
         } else {
             None
         };
-        let virtio_snd_backend =
-            if cfg!(paravirtualized_devices) { Some(String::from("aaudio")) } else { None };
+
+        let audio_config = if cfg!(paravirtualized_devices) {
+            config.audioConfig.as_ref().map(AudioConfig::new)
+        } else {
+            None
+        };
 
         // Actually start the VM.
         let crosvm_config = CrosvmConfig {
@@ -610,10 +614,10 @@
             input_device_options,
             hugepages: config.hugePages,
             tap,
-            virtio_snd_backend,
             console_input_device: config.consoleInputDevice.clone(),
             boost_uclamp: config.boostUclamp,
             gpu_config,
+            audio_config,
         };
         let instance = Arc::new(
             VmInstance::new(
diff --git a/virtualizationmanager/src/crosvm.rs b/virtualizationmanager/src/crosvm.rs
index 13c018b..a9a91fe 100644
--- a/virtualizationmanager/src/crosvm.rs
+++ b/virtualizationmanager/src/crosvm.rs
@@ -46,6 +46,7 @@
 use android_system_virtualizationservice::aidl::android::system::virtualizationservice::{
     MemoryTrimLevel::MemoryTrimLevel,
     VirtualMachineAppConfig::DebugLevel::DebugLevel,
+    AudioConfig::AudioConfig as AudioConfigParcelable,
     DisplayConfig::DisplayConfig as DisplayConfigParcelable,
     GpuConfig::GpuConfig as GpuConfigParcelable,
 };
@@ -131,10 +132,22 @@
     pub input_device_options: Vec<InputDeviceOption>,
     pub hugepages: bool,
     pub tap: Option<File>,
-    pub virtio_snd_backend: Option<String>,
     pub console_input_device: Option<String>,
     pub boost_uclamp: bool,
     pub gpu_config: Option<GpuConfig>,
+    pub audio_config: Option<AudioConfig>,
+}
+
+#[derive(Debug)]
+pub struct AudioConfig {
+    pub use_microphone: bool,
+    pub use_speaker: bool,
+}
+
+impl AudioConfig {
+    pub fn new(raw_config: &AudioConfigParcelable) -> Self {
+        AudioConfig { use_microphone: raw_config.useMicrophone, use_speaker: raw_config.useSpeaker }
+    }
 }
 
 #[derive(Debug)]
@@ -1159,8 +1172,12 @@
     command.preserved_fds(preserved_fds);
 
     if cfg!(paravirtualized_devices) {
-        if let Some(virtio_snd_backend) = &config.virtio_snd_backend {
-            command.arg("--virtio-snd").arg(format!("backend={}", virtio_snd_backend));
+        if let Some(audio_config) = &config.audio_config {
+            command.arg("--virtio-snd").arg(format!(
+                "backend=aaudio,num_input_devices={},num_output_devices={}",
+                if audio_config.use_microphone { 1 } else { 0 },
+                if audio_config.use_speaker { 1 } else { 0 }
+            ));
         }
     }