2016-11-10 18:10:35 +08:00
|
|
|
==================
|
|
|
|
ALSA Jack Controls
|
|
|
|
==================
|
|
|
|
|
2015-04-27 21:21:02 +08:00
|
|
|
Why we need Jack kcontrols
|
|
|
|
==========================
|
|
|
|
|
|
|
|
ALSA uses kcontrols to export audio controls(switch, volume, Mux, ...)
|
|
|
|
to user space. This means userspace applications like pulseaudio can
|
|
|
|
switch off headphones and switch on speakers when no headphones are
|
2023-01-27 14:39:56 +08:00
|
|
|
plugged in.
|
2015-04-27 21:21:02 +08:00
|
|
|
|
|
|
|
The old ALSA jack code only created input devices for each registered
|
|
|
|
jack. These jack input devices are not readable by userspace devices
|
|
|
|
that run as non root.
|
|
|
|
|
|
|
|
The new jack code creates embedded jack kcontrols for each jack that
|
|
|
|
can be read by any process.
|
|
|
|
|
|
|
|
This can be combined with UCM to allow userspace to route audio more
|
|
|
|
intelligently based on jack insertion or removal events.
|
|
|
|
|
|
|
|
Jack Kcontrol Internals
|
|
|
|
=======================
|
|
|
|
|
|
|
|
Each jack will have a kcontrol list, so that we can create a kcontrol
|
|
|
|
and attach it to the jack, at jack creation stage. We can also add a
|
|
|
|
kcontrol to an existing jack, at anytime when required.
|
|
|
|
|
|
|
|
Those kcontrols will be freed automatically when the Jack is freed.
|
|
|
|
|
|
|
|
How to use jack kcontrols
|
|
|
|
=========================
|
|
|
|
|
|
|
|
In order to keep compatibility, snd_jack_new() has been modified by
|
2016-11-10 18:10:35 +08:00
|
|
|
adding two params:
|
2015-04-27 21:21:02 +08:00
|
|
|
|
2016-11-10 18:10:35 +08:00
|
|
|
initial_kctl
|
|
|
|
if true, create a kcontrol and add it to the jack list.
|
|
|
|
phantom_jack
|
|
|
|
Don't create a input device for phantom jacks.
|
2015-04-27 21:21:02 +08:00
|
|
|
|
|
|
|
HDA jacks can set phantom_jack to true in order to create a phantom
|
|
|
|
jack and set initial_kctl to true to create an initial kcontrol with
|
|
|
|
the correct id.
|
|
|
|
|
|
|
|
ASoC jacks should set initial_kctl as false. The pin name will be
|
|
|
|
assigned as the jack kcontrol name.
|