book/protocols/synit/audio
Audio control
The audio control protocol configures sound sources and sinks, for instance for call audio control on a mobile phone. This protocol is still experimental, as configuration of audio stacks is complex and I have only a few simple examples to work from thus far. As Synit is ported to new systems (e.g. new mobile handsets, to desktop machines, and so on), this protocol will be refined.
Implementation. The protocol is (as of October 2022)
implemented entirely within the SqueakPhone Smalltalk image, in class
AudioProfileDaemon. The audio profile daemon has three
tasks: first, to track Linux input HEADPHONE_INSERT and
MICROPHONE_INSERT events and state, producing
HeadsetSpeakerPresent and
HeadsetMicrophonePresent assertions in response; second, to
track application state such as whether a call is in progress or not;
and third, to respond to changes in device and application state, along
with changes in sink/source mapping configuration, by using the external
amixer program to enable and disable audio sinks and
sources. The schema definition file contains a few comments
that give some of the flavour of the logic involved.
Source/Sink mappings
Each different kind of device asserts Mapping records to
connect abstract Endpoint names to concrete ALSA device
names.
Mapping = <alsa-mapping @abstract Endpoint @concrete string> .
Endpoint = <source @value Source> / <sink @value Sink> .
Sink = =speaker / =headset / =earpiece .
Source = =speakerphone / =headset / =handset .
Example. When the Smalltalk code detects that it is running on a PinePhone, it asserts
<alsa-mapping <sink speaker> "Line Out"><alsa-mapping <sink headset> "Headphone"><alsa-mapping <sink earpiece> "Earpiece"><alsa-mapping <source speakerphone> "Mic1"><alsa-mapping <source handset> "Mic1">
Audio device state
The current daemon interprets low-level Linux input subsystem events,
asserting HeadsetSpeakerPresent and
HeadsetMicrophonePresent when the relevant hardware is
physically attached to the system. These assertions are in turn used
when selecting an audio profile to enable.
HeadsetSpeakerPresent = <headset-speaker-present> .
HeadsetMicrophonePresent = <headset-microphone-present> .
Relevant application state
The current daemon reacts to changes in AlertSoundPlaying,
PhoneRinging, CallInProgress, and
Speakerphone when
selecting an audio profile to enable.
Copyright © 2021–2023 Tony Garnock-Jones, CC BY 4.0
