blob: 91bcba32696fab663291aae682ca6f0b59d1aae0 [file] [log] [blame]
<!-- This file is provided as a reference for writing config files
It does NOT represent any particular device and will NOT work on
real hardware. You must create a file with the correct settings for
your hardware, and the comments here will explain the layout of this
file and expected content.
On the target device this file must be located in /system/etc and named
audio.<device>.xml, where <device> is the string returned by the system
property ro.product.device
-->
<audiohal>
<!-- mixer element _must_ appear before any of the other definitions.
The ALSA card can be identified either by card number or by name.
Connect to ALSA card 0:
<mixer card="0">
Connect to ALSA card called "FooSound"
<mixer name="FooSound">
When the card is given by name, TinyHAL searches all /proc/asound/card*/id
files for a matching name.
-->
<mixer card="0"> <!-- <mixer name="sdm845" > -->
<!-- A pre_init element lists control settings that will cause new ALSA
controls to be added. Typically this is used to load firmware into a
DSP, causing new ALSA controls to be added for controls exported by the
firmware. After processing a pre_init element the ALSA controls are
reloaded to pick up any new controls. Other elements in the
configuration can then use those controls.
Multiple pre_init elements can be used, so that a pre_init can depend
on controls populated by a previous pre_init.
All pre_init elements must appear before the init element.
-->
<pre_init>
<!-- A list of ctl elements - see description of init element -->
<!-- <ctl name="DSP1 Preload Switch" val="1" /> -->
</pre_init>
<!-- An init element lists control settings required to initialize the
hardware and driver. These settings are applied only once when the
library is first loaded during boot.
-->
<init>
<!-- A sequence of ctl elements. Each entry sets a mixer
control to a given value. The entries are applied in the
order they are listed here.
Each entry _must_ have these attributes
name - name of the ALSA mixer control
val - value to set it to
It can also have an index attribute giving the numeric index
of the control value to set. This is used where a control
has multiple value slots (for example a volume control
with two values, one for left channel and one for right), If
an index attribute is not given the content of the val attribute
will be applied to all value slots of the control.
The numbers in val and index attributes can be given in either
decimal, or hex (hex is prefixed with 0x). For a control with
enumerated values the val attribute must be a string
BYTE ARRAYS: for controls that are a byte array val must be
a string of comma-separated byte values. This can be shorter
than the total size of the control, combined with the
optional index attribute this allows any subset of the byte
array to be changed. Alternatively, a file attribute can be given
instead of the val attribute, and the raw byte content of the file
will be copied into the control. Note that the bytes in the file
must already be correctly formatted for writing into the ALSA
control. The file is read once when TinyHAL starts and this
cached content is used every time this <ctl> element is invoked.
-->
<ctl name="QUAT_MI2S_RX Audio Mixer MultiMedia1" val="1" />
<ctl name="SLIMBUS_0_RX Audio Mixer MultiMedia2" val="1" />
<ctl name="MultiMedia3 Mixer SLIMBUS_0_TX" val="1" />
<ctl name="AIF1_CAP Mixer SLIM TX7" val="1" />
<ctl name="CDC_IF TX7 MUX" val="DEC7" />
<ctl name="SLIM RX0 MUX" val="AIF1_PB" />
<ctl name="SLIM RX1 MUX" val="AIF1_PB" />
<ctl name="SLIM RX2 MUX" val="AIF1_PB" />
<ctl name="SLIM RX3 MUX" val="AIF1_PB" />
<ctl name="SLIM RX4 MUX" val="ZERO" />
<ctl name="SLIM RX5 MUX" val="ZERO" />
<ctl name="SLIM RX6 MUX" val="ZERO" />
<ctl name="SLIM RX7 MUX" val="ZERO" />
<ctl name="RX INT7_1 MIX1 INP0" val="RX0" />
<ctl name="RX INT8_1 MIX1 INP0" val="RX1" />
<ctl name="RX INT1_2 MUX" val="RX0" />
<ctl name="RX INT2_2 MUX" val="RX1" />
</init>
</mixer>
<!-- Next you must list all the devices supported by the hardware. The
name attribute of the <device> element identifies the device. These names are
recognized:
"global" dummy global device - see explanation below
"speaker" AUDIO_DEVICE_OUT_SPEAKER
"earpiece" AUDIO_DEVICE_OUT_EARPIECE
"headset" AUDIO_DEVICE_OUT_WIRED_HEADSET
"headset_in" AUDIO_DEVICE_IN_WIRED_HEADSET
"headphone" AUDIO_DEVICE_OUT_WIRED_HEADPHONE
"sco" AUDIO_DEVICE_OUT_ALL_SCO
"sco_in" AUDIO_DEVICE_IN_ALL_SCO
"a2dp" AUDIO_DEVICE_OUT_ALL_A2DP
"usb" AUDIO_DEVICE_OUT_ALL_USB
"mic" AUDIO_DEVICE_IN_BUILTIN_MIC
"back mic" AUDIO_DEVICE_IN_BACK_MIC
"voice" AUDIO_DEVICE_IN_VOICE_CALL
"aux" AUDIO_DEVICE_IN_AUX_DIGITAL
Within the <device> element you can declare a number of "paths", each path
defines a group of control settings to be applied. Each path is identified by
a name. The "on" and "off" paths are special and list a global enable and
disable setting for the device. Use of devices is reference-counted, when
routing of a stream is changed to use a device that is currently disabled its
"on" path will be applied. When no streams are using a device its "off"
path will be applied.
Other paths are user-defined and you can give them any name you choose.
They are used to apply custom paths when required by a stream and will
be used only when a stream is connected to or disconnected from a
device if the <stream> element has an <enable> or <disable> element requesting
that path.
It is not mandatory to provide paths. You only need to define paths
if there are specific control settings that must be applied. So for example
if no controls need be applied to enable or disable a device then you
do not need to define the "on" and "off" paths.
The <ctl> elements within each path have the same format and behaviour
as described under <mixer><init>.
The "global" device is a special device the represents the audio system as a
whole and is used to invoke mixer settings that are independent of any real
device and which apply globally to the audio system. A stream is automatically
connected to "global" when it is opened and disconnected when it is closed.
The behaviour is identical to the way paths are invoked in any other <device>
entry so the effect is
- the "on" path will be applied when a stream is opened and there are
no other streams already open. As an example this could be used to
bring the audio hardware out of a standby state
- the "off" path will be applied when the last open stream is closed.
As an example this could be used to put the audio hardware into a
standby state
- the custom paths will be applied when the stream that requests them
is opened or closed.
-->
<device name="speaker">
<path name="on">
<!-- List of ctl element for control values to apply
when this device is enabled -->
<!-- <ctl name="Amp DSP Switch" val="1"/> -->
</path>
<path name="off">
<!-- List of ctl element for control values to apply
when this device is disabled -->
<!-- <ctl name="Amp DSP Switch" val="0"/> -->
</path>
<!-- Following paths are user-defined and are applied when a
<stream> elements' routing is changed to add or remove this
device. If the path name matches the name given in the <stream>
element it will be applied. A stream could be routed to multiple
inputs or outputs - the paths for connecting and disconnecting
a stream to a device must therefore have the same name in each
<device>.
It is not mandatory to declare custom paths - depending on your
hardware there may not be any specific action required to route
a stream to a particular device. Also you do not have to define
the path in every device, only the devices where some action must
be taken to connect or disconnect a stream.
For this example four custom paths are defined:
pcm_out_en = control setting to connect PCM output to this device
pcm_out_dis = control setting to disconnect PCM output from this device
-->
<path name="pcm_out_en">
<ctl name="I2S RX0 MUX" val="AIF1_PB" />
<ctl name="MI2S_RX Channels" val="One" />
<ctl name="CDC_IF RX0 MUX" val="I2S RX0" />
<ctl name="RX INT8_1 MIX1 INP0" val="RX0" />
<ctl name="COMP8 Switch" val="1" />
<ctl name="SpkrRight COMP Switch" val="1" />
<ctl name="SpkrRight BOOST Switch" val="1" />
<ctl name="SpkrRight VISENSE Switch" val="1" />
<ctl name="SpkrRight SWR DAC_Port Switch" val="1" />
</path>
<path name="pcm_out_dis">
</path>
</device>
<device name="headset">
<!-- <path name="on">
<ctl name="SLIM RX2 MUX" val="AIF1_PB"/>
<ctl name="SLIM RX3 MUX" val="AIF1_PB"/>
<ctl name="RX INT1 DEM MUX" val="CLSH_DSM_OUT"/>
<ctl name="RX INT2 DEM MUX" val="CLSH_DSM_OUT"/>
<ctl name="RX INT1_1 MIX1 INP0" val="RX2"/>
<ctl name="RX INT2_1 MIX1 INP0" val="RX3"/>
<ctl name="RX INT1_1 INTERP" val="RX INT1_1 MI"/>
<ctl name="RX INT2_1 INTERP" val="RX INT2_1 MI"/>
<ctl name="RX0 Digital Volume" val="0"/>
<ctl name="RX1 Digital Volume" val="80"/>
<ctl name="RX2 Digital Volume" val="80"/>
</path>
<path name="off">
<ctl name="SLIM RX2 MUX" val="ZERO"/>
<ctl name="SLIM RX3 MUX" val="ZERO"/>
<ctl name="RX INT1 DEM MUX" val="ZERO"/>
<ctl name="RX INT2 DEM MUX" val="ZERO"/>
<ctl name="RX INT1_1 MIX1 INP0" val="ZERO"/>
<ctl name="RX INT2_1 MIX1 INP0" val="ZERO"/>
<ctl name="RX INT1_1 INTERP" val="ZERO"/>
<ctl name="RX INT2_1 INTERP" val="ZERO"/>
<ctl name="RX1 Digital Volume" val="0"/>
<ctl name="RX2 Digital Volume" val="0"/>
</path> -->
<path name="pcm_out_en">
<!-- <ctl name="SLIM RX2 MUX" val="AIF4_PB" />
<ctl name="SLIM RX3 MUX" val="AIF4_PB" />
<ctl name="RX INT1_2 MUX" val="RX2" />
<ctl name="RX INT2_2 MUX" val="RX3" /> -->
</path>
<path name="pcm_out_dis">
<ctl name="SLIM RX2 MUX" val="ZERO" />
<ctl name="SLIM RX3 MUX" val="ZERO" />
<ctl name="RX INT1_2 MUX" val="ZERO" />
<ctl name="RX INT2_2 MUX" val="ZERO" />
</path>
</device>
<!-- Following the device definitions there must be a <stream> entry
for every output and input stream supported by the hardware. It is also
possible to define a 'global' stream that is not associated with any particular
audio input or output but instead can be used to handle actions that are
global to the audio hardware.
There are two types of stream that can be declared here:
- anonymous streams, these will be used to supply playback and record
streams for AudioFlinger
- named streams, which are mainly used to declare custom streams to handle
special routing use-cases that are external to the normal Android audio
path - typically where the audio is routed entirely in hardware without
being passed through Android, for example the baseband audio link or
FM radio.
The global stream is a special case of a named stream and must have the
name "global"
For standard anonymous streams there are two that would normally be on
any device: PCM input and PCM output. It is also possible to declare a stream
as "compress" - this is intended for cases where a playback stream is
decompressed in hardware, or a record stream provides raw compressed data that
must be decompressed in software.
Named streams can be declared as type "hw", to represent a hardware-hardware
link.
The "global" named stream can be used to handle events that are not specific
to any particular stream. Typically this is used to implement usecase handlers
(see below) to handle set_parameter messages sent to the HAL's global
(struct audio_device*)->hw_device.set_parameters function (for example, the
"orientation" parameter that is sent by Android.)
Mandatory attributes for PCM and compressed streams:
type must be "pcm" or "compress"
dir direction of stream, either "in" (recording) or "out" (playback)
Mandatory for named streams:
type must be "pcm", "compress" or "hw"
dir direction of stream, either "in" (recording) or "out" (playback)
name a custom name for a named stream. The name you choose here must
match the name your HAL will use to request this stream
Mandatory for hw streams:
type must be "hw"
dir direction of stream, either "in" (recording) or "out" (playback)
name a custom name for the stream (hw streams must be named streams)
Mandatory for the global stream:
type must be "hw"
name must be "global"
Optional attributes:
card ALSA card number. If not given this defaults to 0
device ALSA device number. If not given this defaults to 0
instances limits the maximum number of instances of this stream, if not
specified the number of instances is unlimited
name a custom name for a named stream. The name you choose here must
match the name your HAL will use to request this stream
Anonymous PCM streams should not normally have an instance limit.
TinyHAL defines a specific named stream:
"voice recognition" - a PCM or compressed stream for voice recognition input.
If a stream with this name is not defined TinyHAL will
use the normal PCM input stream for voice recognition audio.
-->
<stream type="pcm" dir="out" card="0" device="0">
<!-- The <enable> and <disable> tags give the name of a path
to apply for each connected device when the stream is either connected
to (enable) or disconnected from (disable) that device.
The way this works is that when stream routing changes, the HAL will
look through the paths of each device this stream is connected to,
- for each device the stream is being disconnected from, if it
contains a path matching the path name in <disable>, that path
will be applied.
- for each device the stream is being connected to, if it
contains a path matching the path name in <enable>, that path
will be applied.
-->
<enable path="pcm_out_en"/>
<disable path="pcm_out_dis"/>
<!-- The optional usecase block allows you to define custom use-cases that
are triggered by set_parameter() calls to the HAL. The set_parameter()
is a string of the form <setting>=<value>. The HAL will search for a
usecase block whose name attribute matches <setting> and within that
a case block whose name attribute matches <value>. If a matching case
block is found the enclosed <ctl> blocks will be applied.
The example below defines a use case for switching a codec algorithm
between wideband and narrowband response. The two cases will be
triggered by a set_parameter() of "bandwidth=narrow" or "bandwidth=wide".
-->
<!-- <usecase name="bandwidth">
<case name="narrow">
<ctl name="Codec Wideband" val="0" />
</case>
<case name="wide">
<ctl name="Codec Wideband" val="1" />
</case>
</usecase> -->
<!-- Constant values. These allow setting named values that can
be read by the audio HAL at runtime. Values are 32-bit unsigned.
This is useful for setting HAL-specific or hardware-specific
information.
The names have no meaning to the config manager, and are
entirely defined by the audio HAL.
If you want to set constants that are global, rather than part
of a stream, define a hw stream called "global".
to hold the values.
-->
<!-- <set name="foo" val="42"/> -->
</stream>
<stream type="pcm" dir="out" card="0" device="1">
<enable path="pcm_out_en"/>
<disable path="pcm_out_dis"/>
</stream>
<!-- Example named stream, in this case for an FM radio path . This will not
be available for standard AudioFlinger playback and record paths. It must
be explicitly requested by the audio HAL when FM radio is enabled
-->
<!-- control paths to be enabled when this stream is enabled or disabled -->
<!-- <stream name="FM radio" type="pcm" dir="in" card="0" device="0">
<enable path="fm_radio_en"/>
<disable path="fm_radio_dis"/>
</stream> -->
</audiohal>