mirror of
https://github.com/QubesOS/qubes-doc.git
synced 2024-12-27 00:09:26 -05:00
70 lines
3.8 KiB
Markdown
70 lines
3.8 KiB
Markdown
---
|
|
lang: en
|
|
layout: doc
|
|
permalink: /doc/audio-virtualization/
|
|
ref: 60
|
|
title: Audio virtualization
|
|
---
|
|
|
|
VMs on Qubes OS have access to virtualized audio through the PulseAudio module.
|
|
It consists of two parts:
|
|
|
|
- `pacat-simple-vchan` running in a dom0/Audio VM (standalone application, one per VM, connected to the PulseAudio daemon)
|
|
- `module-vchan-sink` running in a VM (loaded into the PulseAudio process)
|
|
|
|
Protocol
|
|
--------
|
|
|
|
The protocol between these two parts is designed to be as simple as possible.
|
|
Specifically, there is no audio format negotiation, no compression, etc.
|
|
All the audio data is transferred as raw 44.1kHz samples in S16LE format, 2 channels.
|
|
|
|
These two parts are connected with two vchan links:
|
|
|
|
1. Connection on vchan port 4713 used to transfer audio from VM to dom0/Audio VM.
|
|
There is no negotiation, no headers, etc.
|
|
Only raw samples are sent over this channel.
|
|
2. Connection on vchan port 4714 used to transfer audio from dom0/Audio VM to VM.
|
|
Like the previous one, audio data is sent as raw samples.
|
|
|
|
Additionally, the second vchan connection (on port 4714) is used in the opposite direction (VM to dom0) to send simple notifications/commands about the audio state.
|
|
Each such notification is a 4-byte number in little-endian format.
|
|
|
|
List of defined codes:
|
|
|
|
- `0x00010001` -- VM wants to receive audio input (some process is listening); prior to this message, `pacat-simple-vchan` will not send any audio samples to the VM.
|
|
- `0x00010000` -- VM does not want to receive audio input (no process is listening anymore); after this message, `pacat-simple-vchan` will not send any audio samples to the VM.
|
|
- `0x00020000` -- VM does not want to send audio output; informational for dom0, to avoid buffer under runs (may affect PulseAudio calculated delays).
|
|
- `0x00020001` -- VM does want to send audio output.
|
|
|
|
pacat-simple-vchan
|
|
------------------
|
|
|
|
This is the dom0 (or Audio VM) part of the audio virtualization.
|
|
It is responsible for transferring audio samples between the PulseAudio daemon in dom0/Audio VM (which has access to the actual audio hardware) and a VM playing/recording sounds.
|
|
A separate `pacat-simple-vchan` process runs in dom0 for each VM with audio.
|
|
Each of them opens separate input and output streams to their local PulseAudio, which allows for controlling the volume of each VM separately (using the `pavucontrol` tool, for example).
|
|
In order to (re)create a stream for a VM in dom0, `pacat-simple-vchan` can be used. In order to find the needed parameters, domid and domain name, the command `xl list` can be used.
|
|
|
|
Audio input to the VM is not sent by default.
|
|
It needs to be both requested by the VM part and explicitly enabled in `pacat-simple-vchan`.
|
|
The mechanism to do this differs between Qubes versions.
|
|
In Qubes before R4.1, `pacat-simple-vchan` is controlled over system D-Bus:
|
|
|
|
- destination: `org.qubesos.Audio.VMNAME` (where `VMNAME` is the VM's name)
|
|
- object path: `/org/qubesos/audio`
|
|
- interface: `org.qubesos.Audio`
|
|
- property: `RecAllowed` (which can be set using the `org.freedesktop.DBus.Properties` interface)
|
|
|
|
In Qubes R4.1 and later, `pacat-simple-vchan` is controlled over a UNIX socket at `/var/run/qubes/audio-control.VMNAME` (where `VMNAME` is the VM's name).
|
|
Supported commands:
|
|
|
|
- `audio-input 1\n` - enable audio input
|
|
- `audio-input 0\n` - disable audio input
|
|
|
|
These commands can be sent using the `qubes.AudioInputEnable+VMNAME` and `qubes.AudioInputDisable+VMNAME` qrexec services, respectively.
|
|
The current status is written into QubesDB at `/audio-input/VMNAME` (where `VMNAME` is the VM's name) with either `1` or `0` values.
|
|
The lack of a key means that the `pacat-simple-vchan` for a given VM is not running.
|
|
|
|
In either version, it is exposed to the user as device of class `mic`, which can be attached to a VM (for example, using the `qvm-device mic` command).
|