diff options
author | Judy Hsiao <judyhsiao@google.com> | 2020-02-04 12:30:01 +0800 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2020-03-20 15:26:02 +0000 |
commit | d5c1e968c9454af0da573242a8dc3dcf63dd1820 (patch) | |
tree | c59a4b27ffdd968725a735c91c1233ee4d5afa9e /src/linux.rs | |
parent | e5113047d5440bf09b2596f8a43f12d8e2b0061d (diff) | |
download | crosvm-d5c1e968c9454af0da573242a8dc3dcf63dd1820.tar crosvm-d5c1e968c9454af0da573242a8dc3dcf63dd1820.tar.gz crosvm-d5c1e968c9454af0da573242a8dc3dcf63dd1820.tar.bz2 crosvm-d5c1e968c9454af0da573242a8dc3dcf63dd1820.tar.lz crosvm-d5c1e968c9454af0da573242a8dc3dcf63dd1820.tar.xz crosvm-d5c1e968c9454af0da573242a8dc3dcf63dd1820.tar.zst crosvm-d5c1e968c9454af0da573242a8dc3dcf63dd1820.zip |
audio: Create AC97 device with --ac97 option
1. Replace --cras-audio, --cras-capture, null-audio options by --ac97 option to create audio devices. 2. "--ac97 backend=BACKEND\ [capture=true,capture_effect=EFFECT]" is comma separated key=value pairs for setting up Ac97 devices. It can be given more than once to create multiple devices. Possible key values are: backend=(null, cras) - Where to route the audio device. `null` for /dev/null, and cras for CRAS server. capture=true - Enable audio capture. capture_effects - | separated effects to be enabled for recording. The only supported effect value now is EchoCancellation or aec. BUG=b:140866281 TEST=1.crosvm run -r ./vm_rootfs.img -c 4 -m 1024 -s /run --cid 5 --host_ip\ 100.115.92.25 --netmask 255.255.255.252 --ac97\ backend=cras,capture=true,capture_effect=aec\ --mac d2:47:f7:c5:9e:53 ./vm_kernel 2. Record with the vm by: arecord -D hw:0,0 -d5 -fS16_LE -c2 -r48000 /tmp/test.mp3 3. Verify that AEC is enabled within the recording stream by cras_test_cleint. Cq-Depend: chromium:2053654 Cq-Depend: chromium:2095644 Cq-Depend: chromium:2038221 Change-Id: Ia9e0e7cda1671a4842ec77a354efaa4a2dc745eb Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/2038413 Tested-by: Judy Hsiao <judyhsiao@chromium.org> Commit-Queue: Judy Hsiao <judyhsiao@chromium.org> Reviewed-by: Chih-Yang Hsia <paulhsia@chromium.org> Auto-Submit: Judy Hsiao <judyhsiao@chromium.org>
Diffstat (limited to 'src/linux.rs')
-rw-r--r-- | src/linux.rs | 37 |
1 files changed, 11 insertions, 26 deletions
diff --git a/src/linux.rs b/src/linux.rs index d63ab32..130644d 100644 --- a/src/linux.rs +++ b/src/linux.rs @@ -27,17 +27,15 @@ use std::time::{Duration, SystemTime, UNIX_EPOCH}; use libc::{self, c_int, gid_t, uid_t}; -use audio_streams::shm_streams::NullShmStreamSource; #[cfg(feature = "gpu")] use devices::virtio::EventDevice; use devices::virtio::{self, VirtioDevice}; use devices::{ - self, HostBackendDeviceProvider, PciDevice, VfioContainer, VfioDevice, VfioPciDevice, - VirtioPciDevice, XhciController, + self, Ac97Backend, Ac97Dev, HostBackendDeviceProvider, PciDevice, VfioContainer, VfioDevice, + VfioPciDevice, VirtioPciDevice, XhciController, }; use io_jail::{self, Minijail}; use kvm::*; -use libcras::CrasClient; use msg_socket::{MsgError, MsgReceiver, MsgSender, MsgSocket}; use net_util::{Error as NetError, MacAddress, Tap}; use rand_ish::SimpleRng; @@ -83,7 +81,7 @@ pub enum Error { BuildVm(<Arch as LinuxArch>::Error), ChownTpmStorage(sys_util::Error), CloneEventFd(sys_util::Error), - CreateCrasClient(libcras::Error), + CreateAc97(devices::PciDeviceError), CreateDiskError(disk::Error), CreateEventFd(sys_util::Error), CreatePollContext(sys_util::Error), @@ -168,7 +166,7 @@ impl Display for Error { BuildVm(e) => write!(f, "The architecture failed to build the vm: {}", e), ChownTpmStorage(e) => write!(f, "failed to chown tpm storage: {}", e), CloneEventFd(e) => write!(f, "failed to clone eventfd: {}", e), - CreateCrasClient(e) => write!(f, "failed to create cras client: {}", e), + CreateAc97(e) => write!(f, "failed to create ac97 device: {}", e), CreateDiskError(e) => write!(f, "failed to create virtual disk: {}", e), CreateEventFd(e) => write!(f, "failed to create eventfd: {}", e), CreatePollContext(e) => write!(f, "failed to create poll context: {}", e), @@ -1150,27 +1148,14 @@ fn create_devices( pci_devices.push((dev, stub.jail)); } - if cfg.cras_audio { - let mut server = Box::new(CrasClient::new().map_err(Error::CreateCrasClient)?); - if cfg.cras_capture { - server.enable_cras_capture(); - } - let cras_audio = devices::Ac97Dev::new(mem.clone(), server); - - pci_devices.push(( - Box::new(cras_audio), - simple_jail(&cfg, "cras_audio_device")?, - )); - } - - if cfg.null_audio { - let server = Box::new(NullShmStreamSource::new()); - let null_audio = devices::Ac97Dev::new(mem.clone(), server); + for ac97_param in &cfg.ac97_parameters { + let dev = Ac97Dev::try_new(mem.clone(), ac97_param.clone()).map_err(Error::CreateAc97)?; + let policy = match ac97_param.backend { + Ac97Backend::CRAS => "cras_audio_device", + Ac97Backend::NULL => "null_audio_device", + }; - pci_devices.push(( - Box::new(null_audio), - simple_jail(&cfg, "null_audio_device")?, - )); + pci_devices.push((Box::new(dev), simple_jail(&cfg, &policy)?)); } // Create xhci controller. let usb_controller = Box::new(XhciController::new(mem.clone(), usb_provider)); |