ALSA project - the C library reference: Topology Interface

ALSA project - the C library reference

Loading...
Searching...
No Matches
Data Structures | Macros | Typedefs | Enumerations | Enumerator | Functions | Variables
Topology Interface

## Data Structures
struct | snd_tplg_tlv_template
| Template type for all TLV objects. More...
struct | snd_tplg_tlv_dbscale_template
| Template type for TLV Scale objects. More...
struct | snd_tplg_channel_elem
struct | snd_tplg_channel_map_template
| Template type for channel mapping. More...
struct | snd_tplg_pdata_template
| Template type for private data objects. More...
struct | snd_tplg_io_ops_template
| Template type for object operations mapping. More...
struct | snd_tplg_ctl_template
| Template type for control objects. More...
struct | snd_tplg_mixer_template
| Template type for mixer control objects. More...
struct | snd_tplg_enum_template
| Template type for enumerated control objects. More...
struct | snd_tplg_bytes_template
| Template type for TLV Scale objects. More...
struct | snd_tplg_graph_elem
| Template type for single DAPM graph element. More...
struct | snd_tplg_graph_template
| Template type for array of DAPM graph elements. More...
struct | snd_tplg_widget_template
| Template type for DAPM widget objects. More...
struct | snd_tplg_stream_template
| Stream configurations. More...
struct | snd_tplg_stream_caps_template
| Stream Capabilities. More...
struct | snd_tplg_pcm_template
| Template type for PCM (FE DAI & DAI links). More...
struct | snd_tplg_hw_config_template
| Template type to describe a physical link runtime supported hardware config, i.e. hardware audio formats. More...
struct | snd_tplg_dai_template
| Template type for physical DAI. It can be used to configure backend DAIs for DPCM. More...
struct | snd_tplg_link_template
| Template type for physical DAI Links. More...
struct | snd_tplg_obj_template_t
struct | snd_tplg_channel_template
| Template type for single channel mapping. More...
struct | snd_tplg_obj_template
| Generic Template Object. More...

## Macros
#define | SND_TPLG_MAX_CHAN 8
#define | SND_TPLG_INDEX_ALL 0
#define | SND_TPLG_CREATE_VERBOSE (1<<0)
#define | SND_TPLG_CREATE_DAPM_NOSORT (1<<1)
#define | SND_TPLG_SAVE_SORT (1<<0)
#define | SND_TPLG_SAVE_GROUPS (1<<1)
#define | SND_TPLG_SAVE_NOCHECK (1<<16)

## Typedefs
typedef struct snd_tplg | snd_tplg_t

## Enumerations
enum | snd_tplg_type { SND_TPLG_TYPE_TLV = 0 , SND_TPLG_TYPE_MIXER , SND_TPLG_TYPE_ENUM , SND_TPLG_TYPE_TEXT , SND_TPLG_TYPE_DATA , SND_TPLG_TYPE_BYTES , SND_TPLG_TYPE_STREAM_CONFIG , SND_TPLG_TYPE_STREAM_CAPS , SND_TPLG_TYPE_PCM , SND_TPLG_TYPE_DAPM_WIDGET , SND_TPLG_TYPE_DAPM_GRAPH , SND_TPLG_TYPE_BE , SND_TPLG_TYPE_CC , SND_TPLG_TYPE_MANIFEST , SND_TPLG_TYPE_TOKEN , SND_TPLG_TYPE_TUPLE , SND_TPLG_TYPE_LINK , SND_TPLG_TYPE_HW_CONFIG , SND_TPLG_TYPE_DAI }

## Functions
const char * | snd_tplg_version (void)
| Return the version of the topology library. More...
snd_tplg_t * | snd_tplg_new (void)
| Create a new topology parser instance. More...
snd_tplg_t * | snd_tplg_create (int flags)
| Create a new topology parser instance. More...
void | snd_tplg_free (snd_tplg_t *tplg)
| Free a topology parser instance. More...
int | snd_tplg_load (snd_tplg_t *tplg, const char *buf, size_t size)
| Load topology from the text buffer. More...
int | snd_tplg_build_file (snd_tplg_t *tplg, const char *infile, const char *outfile)
| Parse and build topology text file into binary file. More...
void | snd_tplg_verbose (snd_tplg_t *tplg, int verbose)
| Enable verbose reporting of binary file output. More...
int | snd_tplg_add_object (snd_tplg_t *tplg, snd_tplg_obj_template_t *t)
| Register topology template object. More...
int | snd_tplg_build (snd_tplg_t *tplg, const char *outfile)
| Build all registered topology data into binary file. More...
int | snd_tplg_build_bin (snd_tplg_t *tplg, void **bin, size_t *size)
| Build all registered topology data into memory. More...
int | snd_tplg_set_manifest_data (snd_tplg_t *tplg, const void *data, int len)
| Attach private data to topology manifest. More...
int | snd_tplg_set_version (snd_tplg_t *tplg, unsigned int version)
| Set an optional vendor specific version number. More...
int | snd_tplg_save (snd_tplg_t *tplg, char **dst, int flags)
| Save the topology to the text configuration string. More...
int | snd_tplg_decode (snd_tplg_t *tplg, void *bin, size_t size, int dflags)
| Decode the binary topology contents. More...

## Variables
int | snd_tplg_tlv_template::type
struct snd_tplg_tlv_template | snd_tplg_tlv_dbscale_template::hdr
int | snd_tplg_tlv_dbscale_template::min
int | snd_tplg_tlv_dbscale_template::step
int | snd_tplg_tlv_dbscale_template::mute
int | snd_tplg_channel_elem::size
int | snd_tplg_channel_elem::reg
int | snd_tplg_channel_elem::shift
int | snd_tplg_channel_elem::id
int | snd_tplg_channel_map_template::num_channels
struct snd_tplg_channel_elem | snd_tplg_channel_map_template::channel [SND_TPLG_MAX_CHAN]
unsigned int | snd_tplg_pdata_template::length
const void * | snd_tplg_pdata_template::data
int | snd_tplg_io_ops_template::get
int | snd_tplg_io_ops_template::put
int | snd_tplg_io_ops_template::info
int | snd_tplg_ctl_template::type
const char * | snd_tplg_ctl_template::name
int | snd_tplg_ctl_template::access
struct snd_tplg_io_ops_template | snd_tplg_ctl_template::ops
struct snd_tplg_tlv_template * snd_tplg_ctl_template::tlv
struct snd_tplg_tlv_dbscale_template * snd_tplg_ctl_template::tlv_scale
union {
struct snd_tplg_tlv_template * snd_tplg_ctl_template::tlv
struct snd_tplg_tlv_dbscale_template * snd_tplg_ctl_template::tlv_scale
}; |
struct snd_tplg_ctl_template | snd_tplg_mixer_template::hdr
struct snd_tplg_channel_map_template * | snd_tplg_mixer_template::map
int | snd_tplg_mixer_template::min
int | snd_tplg_mixer_template::max
int | snd_tplg_mixer_template::platform_max
int | snd_tplg_mixer_template::invert
struct snd_soc_tplg_private * | snd_tplg_mixer_template::priv
struct snd_tplg_ctl_template | snd_tplg_enum_template::hdr
struct snd_tplg_channel_map_template * | snd_tplg_enum_template::map
int | snd_tplg_enum_template::items
int | snd_tplg_enum_template::mask
const char ** | snd_tplg_enum_template::texts
const int ** | snd_tplg_enum_template::values
struct snd_soc_tplg_private * | snd_tplg_enum_template::priv
struct snd_tplg_ctl_template | snd_tplg_bytes_template::hdr
int | snd_tplg_bytes_template::max
int | snd_tplg_bytes_template::mask
int | snd_tplg_bytes_template::base
int | snd_tplg_bytes_template::num_regs
struct snd_tplg_io_ops_template | snd_tplg_bytes_template::ext_ops
struct snd_soc_tplg_private * | snd_tplg_bytes_template::priv
const char * | snd_tplg_graph_elem::src
const char * | snd_tplg_graph_elem::ctl
const char * | snd_tplg_graph_elem::sink
int | snd_tplg_graph_template::count
struct snd_tplg_graph_elem | snd_tplg_graph_template::elem [0]
int | snd_tplg_widget_template::id
const char * | snd_tplg_widget_template::name
const char * | snd_tplg_widget_template::sname
int | snd_tplg_widget_template::reg
int | snd_tplg_widget_template::shift
int | snd_tplg_widget_template::mask
int | snd_tplg_widget_template::subseq
unsigned int | snd_tplg_widget_template::invert
unsigned int | snd_tplg_widget_template::ignore_suspend
unsigned short | snd_tplg_widget_template::event_flags
unsigned short | snd_tplg_widget_template::event_type
struct snd_soc_tplg_private * | snd_tplg_widget_template::priv
int | snd_tplg_widget_template::num_ctls
struct snd_tplg_ctl_template * | snd_tplg_widget_template::ctl [0]
const char * | snd_tplg_stream_template::name
int | snd_tplg_stream_template::format
int | snd_tplg_stream_template::rate
int | snd_tplg_stream_template::period_bytes
int | snd_tplg_stream_template::buffer_bytes
int | snd_tplg_stream_template::channels
const char * | snd_tplg_stream_caps_template::name
uint64_t | snd_tplg_stream_caps_template::formats
unsigned int | snd_tplg_stream_caps_template::rates
unsigned int | snd_tplg_stream_caps_template::rate_min
unsigned int | snd_tplg_stream_caps_template::rate_max
unsigned int | snd_tplg_stream_caps_template::channels_min
unsigned int | snd_tplg_stream_caps_template::channels_max
unsigned int | snd_tplg_stream_caps_template::periods_min
unsigned int | snd_tplg_stream_caps_template::periods_max
unsigned int | snd_tplg_stream_caps_template::period_size_min
unsigned int | snd_tplg_stream_caps_template::period_size_max
unsigned int | snd_tplg_stream_caps_template::buffer_size_min
unsigned int | snd_tplg_stream_caps_template::buffer_size_max
unsigned int | snd_tplg_stream_caps_template::sig_bits
const char * | snd_tplg_pcm_template::pcm_name
const char * | snd_tplg_pcm_template::dai_name
unsigned int | snd_tplg_pcm_template::pcm_id
unsigned int | snd_tplg_pcm_template::dai_id
unsigned int | snd_tplg_pcm_template::playback
unsigned int | snd_tplg_pcm_template::capture
unsigned int | snd_tplg_pcm_template::compress
struct snd_tplg_stream_caps_template * | snd_tplg_pcm_template::caps [2]
unsigned int | snd_tplg_pcm_template::flag_mask
unsigned int | snd_tplg_pcm_template::flags
struct snd_soc_tplg_private * | snd_tplg_pcm_template::priv
int | snd_tplg_pcm_template::num_streams
struct snd_tplg_stream_template | snd_tplg_pcm_template::stream [0]
int | snd_tplg_hw_config_template::id
unsigned int | snd_tplg_hw_config_template::fmt
unsigned char | snd_tplg_hw_config_template::clock_gated
unsigned char | snd_tplg_hw_config_template::invert_bclk
unsigned char | snd_tplg_hw_config_template::invert_fsync
unsigned char | snd_tplg_hw_config_template::bclk_provider
unsigned char | snd_tplg_hw_config_template::fsync_provider
unsigned char | snd_tplg_hw_config_template::mclk_direction
unsigned short | snd_tplg_hw_config_template::reserved
unsigned int | snd_tplg_hw_config_template::mclk_rate
unsigned int | snd_tplg_hw_config_template::bclk_rate
unsigned int | snd_tplg_hw_config_template::fsync_rate
unsigned int | snd_tplg_hw_config_template::tdm_slots
unsigned int | snd_tplg_hw_config_template::tdm_slot_width
unsigned int | snd_tplg_hw_config_template::tx_slots
unsigned int | snd_tplg_hw_config_template::rx_slots
unsigned int | snd_tplg_hw_config_template::tx_channels
unsigned int * | snd_tplg_hw_config_template::tx_chanmap
unsigned int | snd_tplg_hw_config_template::rx_channels
unsigned int * | snd_tplg_hw_config_template::rx_chanmap
const char * | snd_tplg_dai_template::dai_name
unsigned int | snd_tplg_dai_template::dai_id
unsigned int | snd_tplg_dai_template::playback
unsigned int | snd_tplg_dai_template::capture
struct snd_tplg_stream_caps_template * | snd_tplg_dai_template::caps [2]
unsigned int | snd_tplg_dai_template::flag_mask
unsigned int | snd_tplg_dai_template::flags
struct snd_soc_tplg_private * | snd_tplg_dai_template::priv
const char * | snd_tplg_link_template::name
int | snd_tplg_link_template::id
const char * | snd_tplg_link_template::stream_name
int | snd_tplg_link_template::num_streams
struct snd_tplg_stream_template * | snd_tplg_link_template::stream
struct snd_tplg_hw_config_template * | snd_tplg_link_template::hw_config
int | snd_tplg_link_template::num_hw_configs
int | snd_tplg_link_template::default_hw_config_id
unsigned int | snd_tplg_link_template::flag_mask
unsigned int | snd_tplg_link_template::flags
struct snd_soc_tplg_private * | snd_tplg_link_template::priv
enum snd_tplg_type | snd_tplg_obj_template_t::type
int | snd_tplg_obj_template_t::index
int | snd_tplg_obj_template_t::version
int | snd_tplg_obj_template_t::vendor_type
struct snd_tplg_widget_template * snd_tplg_obj_template_t::widget
struct snd_tplg_mixer_template * snd_tplg_obj_template_t::mixer
struct snd_tplg_bytes_template * snd_tplg_obj_template_t::bytes_ctl
struct snd_tplg_enum_template * snd_tplg_obj_template_t::enum_ctl
struct snd_tplg_graph_template * snd_tplg_obj_template_t::graph
struct snd_tplg_pcm_template * snd_tplg_obj_template_t::pcm
struct snd_tplg_link_template * snd_tplg_obj_template_t::link
struct snd_tplg_dai_template * snd_tplg_obj_template_t::dai
union {
struct snd_tplg_widget_template * snd_tplg_obj_template_t::widget
struct snd_tplg_mixer_template * snd_tplg_obj_template_t::mixer
struct snd_tplg_bytes_template * snd_tplg_obj_template_t::bytes_ctl
struct snd_tplg_enum_template * snd_tplg_obj_template_t::enum_ctl
struct snd_tplg_graph_template * snd_tplg_obj_template_t::graph
struct snd_tplg_pcm_template * snd_tplg_obj_template_t::pcm
struct snd_tplg_link_template * snd_tplg_obj_template_t::link
struct snd_tplg_dai_template * snd_tplg_obj_template_t::dai
}; |

## Detailed Description

### ALSA Topology Interface

The topology interface allows developers to define DSP topologies in a text file format and to convert the text topology to a binary topology representation that can be understood by the kernel. The topology core currently recognises the following object types :-

- Controls (mixer, enumerated and byte) including TLV data.
- PCMs (Front End DAI & DAI link)
- DAPM widgets
- DAPM graph elements.
- Physical DAI & DAI links
- Private data for each object type.
- Manifest (containing count of each object type)

### Topology File Format

The topology text format uses the standard ALSA configuration file format to describe each topology object type. This allows topology objects to include other topology objects as part of their definition. i.e. a TLV data object can be shared amongst many control objects that use the same TLV data.

#### Controls

Topology audio controls can belong to three different types :-

- Mixer control
- Enumerated control
- Byte control

Each control type can contain TLV data, private data, operations and also belong to widget objects.

##### Control Operations

Driver Kcontrol callback info(), get() and put() operations are mapped with the CTL ops section in topology configuration files. The ctl ops section can assign operations using the standard names (listed below) for the standard kcontrol types or use ID numbers (>256) to map to bespoke driver controls.

        ops."ctl" {
            info "volsw"
            get "257"
            put "257"
        }

This mapping shows info() using the standard "volsw" info callback whilst the get() and put() are mapped to bespoke driver callbacks.
The Standard operations names for control get(), put() and info calls are :-

- volsw
- volsw_sx
- volsw_xr_sx
- enum
- bytes
- enum_value
- range
- strobe

##### Control Access

Controls access can be specified using the "access" section. If no "access" section is defined then default RW access flags are set for normal and TLV controls.

        access [
            read
            write
            tlv_command
        ]

The standard access flags are as follows :-

- read
- write
- read_write
- volatile
- timestamp
- tlv_read
- tlv_write
- tlv_read_write
- tlv_command
- inactive
- lock
- owner
- tlv_callback
- user

##### Control TLV Data

Controls can also use TLV data to represent dB information. This can be done by defining a TLV section and using the TLV section within the control. The TLV data for DBScale types are defined as follows :-

        scale {
            min "-9000"
            step "300"
            mute "1"
        }

Where the meanings and values for min, step and mute are exactly the same as defined in driver code.

##### Control Channel Mapping

Controls can also specify which channels they are mapped with. This is useful for userspace as it allows applications to determine the correct control channel for Left and Right etc. Channel maps are defined as follows :-

        channel."name" {
            reg "0"
            shift "0"
        }

The channel map reg is the register offset for the control, shift is the bit shift within the register for the channel and the section name is the channel name and can be one of the following :-

      * mono        # mono stream
      * fl      # front left
      * fr      # front right
      * rl      # rear left
      * rr      # rear right
      * fc      # front center
      * lfe     # LFE
      * sl      # side left
      * sr      # side right
      * rc      # rear center
      * flc     # front left center
      * frc     # front right center
      * rlc     # rear left center
      * rrc     # rear right center
      * flw     # front left wide
      * frw     # front right wide
      * flh     # front left high
      * fch     # front center high
      * frh     # front right high
      * tc      # top center
      * tfl     # top front left
      * tfr     # top front right
      * tfc     # top front center
      * trl     # top rear left
      * trr     # top rear right
      * trc     # top rear center
      * tflc        # top front left center
      * tfrc        # top front right center
      * tsl     # top side left
      * tsr     # top side right
      * llfe        # left LFE
      * rlfe        # right LFE
      * bc      # bottom center
      * blc     # bottom left center
      * brc     # bottom right center

##### Control Private Data

Controls can also have private data. This can be done by defining a private data section and including the section within the control. The private data section is defined as follows :-

     SectionData."pdata for EQU1" {
        file "/path/to/file"
        bytes "0x12,0x34,0x56,0x78"
        shorts "0x1122,0x3344,0x5566,0x7788"
        words "0xaabbccdd,0x11223344,0x66aa77bb,0xefef1234"
        tuples "section id of the vendor tuples"
     };

The file, bytes, shorts, words and tuples keywords are all mutually exclusive as the private data should only be taken from one source. The private data can either be read from a separate file or defined in the topology file using the bytes, shorts, words or tuples keywords. The keyword tuples is to define vendor specific tuples. Please refer to section Vendor Tokens and Vendor tuples.It's easy to use a vendor tuples object to define a C structure instance. And a data section can include multiple vendor tuples objects:

     SectionData."data element name" {
        index "1"   #Index number
        tuples [
            "id of the 1st vendor tuples section"
            "id of the 2nd vendor tuples section"
            ...
        ]
     };

##### How to define an element with private data

An element can refer to a single data section or multiple data sections.

###### To refer to a single data section:

     Sectionxxx."element name" {
        ...
        data "name of data section"     # optional private data
     }

###### To refer to multiple data sections:

     Sectionxxx."element name" {
        ...
        data [                      # optional private data
            "name of 1st data section"
            "name of 2nd data section"
            ...
        ]
     }

And data of these sections will be merged in the same order as they are in the list, as the element's private data for kernel.

###### Vendor Tokens

A vendor token list is defined as a new section. Each token element is a pair of string ID and integer value. And both the ID and value are vendor-specific.

     SectionVendorTokens."id of the vendor tokens" {
        comment "optional comments"
        VENDOR_TOKEN_ID1 "1"
        VENDOR_TOKEN_ID2 "2"
        VENDOR_TOKEN_ID3 "3"
        ...
     }

###### Vendor Tuples

Vendor tuples are defined as a new section. It contains a reference to a vendor token list and several tuple arrays. All arrays share a vendor token list, defined by the tokens keyword. Each tuple array is for a specific type, defined by the string following the tuples keyword. Supported types are: string, uuid, bool, byte, short and word.

     SectionVendorTuples."id of the vendor tuples" {
        tokens "id of the vendor tokens"

        tuples."string" {
            VENDOR_TOKEN_ID1 "character string"
            ...
        }

        tuples."uuid" {         # 16 characters separated by commas
            VENDOR_TOKEN_ID2 "0x01,0x02,...,0x0f"
            ...
        }

        tuples."bool" {
            VENDOR_TOKEN_ID3 "true/false"
            ...
        }

        tuples."byte" {
            VENDOR_TOKEN_ID4 "0x11"
            VENDOR_TOKEN_ID5 "0x22"
            ...
        }

        tuples."short" {
            VENDOR_TOKEN_ID6 "0x1122"
            VENDOR_TOKEN_ID7 "0x3344"
            ...
        }

        tuples."word" {
            VENDOR_TOKEN_ID8 "0x11223344"
            VENDOR_TOKEN_ID9 "0x55667788"
            ...
        }
     }

To define multiple vendor tuples of same type, please append some characters after the type string ("string", "uuid", "bool", "byte", "short" or "word"), to avoid ID duplication in the SectionVendorTuples.
The parser will check the first few characters in ID to get the tuple type. Here is an example:

     SectionVendorTuples."id of the vendor tuples" {
        ...
        tuples."word.module0" {
            VENDOR_TOKEN_PARAM_ID1 "0x00112233"
            VENDOR_TOKEN_PARAM_ID2 "0x44556677"
            ...
        }

        tuples."word.module2" {
            VENDOR_TOKEN_PARAM_ID1 "0x11223344"
            VENDOR_TOKEN_PARAM_ID2 "0x55667788"
            ...
        }
        ...
     }

##### Mixer Controls

A mixer control is defined as a new section that can include channel mapping, TLV data, callback operations and private data. The mixer section also includes a few other config options that are shown here :-

     SectionControlMixer."mixer name" {
        comment "optional comments"

        index "1"           # Index number

        channel."name" {        # Channel maps
           ....
        }

        ops."ctl" {         # Ops callback functions
           ....
        }

        max "32"            # Max control value
        invert "0"          # Whether control values are inverted

        tlv "tld_data"          # optional TLV data

        data "pdata for mixer1"     # optional private data
     }

The section name is used to define the mixer name. The index number can be used to identify topology objects groups(index "0" is common, fit for all user cases).This allows driver operations on objects with index number N and can be used to add/remove pipelines of objects whilst other objects are unaffected.

##### Byte Controls

A byte control is defined as a new section that can include channel mapping, TLV data, callback operations and private data. The bytes section also includes a few other config options that are shown here :-

     SectionControlBytes."name" {
        comment "optional comments"

        index "1"           # Index number

        channel."name" {        # Channel maps
           ....
        }

        ops."ctl" {         # Ops callback functions
           ....
        }

        base "0"            # Register base
        num_regs "16"           # Number of registers
        mask "0xff"         # Mask
        max "255"           # Maximum value

        tlv "tld_data"          # optional TLV data

        data "pdata for mixer1"     # optional private data
     }

##### Enumerated Controls

A enumerated control is defined as a new section (like mixer and byte) that can include channel mapping, callback operations, private data and text strings to represent the enumerated control options.
The text strings for the enumerated controls are defined in a separate section as follows :-

     SectionText."name" {

            Values [
                "value1"
                "value2"
            "value3"
            ]
     }

All the enumerated text values are listed in the values list.
The enumerated control is similar to the other controls and defined as follows :-

     SectionControlMixer."name" {
        comment "optional comments"

        index "1"           # Index number

        texts "EQU1"            # Enumerated text items

        channel."name" {        # Channel maps
           ....
        }

        ops."ctl" {         # Ops callback functions
           ....
        }

        data "pdata for mixer1"     # optional private data
     }

#### DAPM Graph

DAPM graphs can easily be defined using the topology file. The format is very similar to the DAPM graph kernel format. :-

     SectionGraph."dsp" {
        index "1"           # Index number

        lines [
            "sink1, control, source1"
            "sink2, , source2"
        ]
     }

The lines in the graph are defined as a variable size list of sinks, controls and sources. The control name is optional as some graph lines have no associated controls. The section name can be used to differentiate the graph with other graphs, it's not used by the kernel atm.

#### DAPM Widgets

DAPM widgets are similar to controls in that they can include many other objects. Widgets can contain private data, mixer controls and enum controls.The following widget types are supported and match the driver types :-

- input
- output
- mux
- mixer
- pga
- out_drv
- adc
- dac
- switch
- pre
- post
- aif_in
- aif_out
- dai_in
- dai_out
- dai_link

Widgets are defined as follows :-

     SectionWidget."name" {

        index "1"           # Index number

        type "aif_in"           # Widget type - detailed above
        stream_name "name"      # Stream name

        no_pm "true"            # No PM control bit.
        reg "20"            # PM bit register offset
        shift "0"           # PM bit register shift
        invert "1           # PM bit is inverted
        subseq "8"          # subsequence number

        event_type "1"          # DAPM widget event type
        event_flags "1"         # DAPM widget event flags

        mixer "name"            # Optional Mixer Control
        enum "name"         # Optional Enum Control

        data "name"         # optional private data
     }
     </pre>

     The section name is the widget name. The mixer and enum fields are mutually
     exclusive and used to include controls into the widget. The index and data
     fields are the same for widgets as they are for controls whilst the other
     fields map on very closely to the driver widget fields.

     <h5>Widget Private Data</h5>
     Widget can have private data. For the format of the private data, please
     refer to section Control Private Data.

     <h4>PCM Capabilities</h4>
     Topology can also define the PCM capabilities of front end or physical DAIs.
     Capabilities can be defined with the following section :-

     <pre>
     SectionPCMCapabilities."name" {

        formats "S24_LE,S16_LE"     # Supported formats
        rates "48000"           # Supported rates
        rate_min "48000"        # Max supported sample rate
        rate_max "48000"        # Min supported sample rate
        channels_min "2"        # Min number of channels
        channels_max "2"        # max number of channels
     }
     </pre>
     The supported formats use the same naming convention as the driver macros.
     The PCM capabilities name can be referred to and included by PCM and
     physical DAI sections.

     <h4>PCM Configurations</h4>
     PCM runtime configurations can be defined for playback and capture stream
     directions with the following section  :-

     <pre>
     SectionPCMConfig."name" {

        config."playback" {     # playback config
            format "S16_LE"     # playback format
            rate "48000"        # playback sample rate
            channels "2"        # playback channels
            tdm_slot "0xf"      # playback TDM slot
        }

        config."capture" {      # capture config
            format "S16_LE"     # capture format
            rate "48000"        # capture sample rate
            channels "2"        # capture channels
            tdm_slot "0xf"      # capture TDM slot
        }
     }
     </pre>

     The supported formats use the same naming convention as the driver macros.
     The PCM configuration name can be referred to and included by PCM and
     physical link sections.

     <h4>PCM (Front-end DAI & DAI link) </h4>
     PCM sections define the supported capabilities and configurations for
     supported playback and capture streams, names and flags for front end
     DAI & DAI links. Topology kernel driver will use a PCM object to create
     a pair of FE DAI & DAI links.

     <pre>
     SectionPCM."name" {

        index "1"           # Index number

        id "0"              # used for binding to the PCM

        dai."name of front-end DAI" {
            id "0"      # used for binding to the front-end DAI
        }

        pcm."playback" {
            capabilities "capabilities1"    # capabilities for playback

            configs [       # supported configs for playback
                "config1"
                "config2"
            ]
        }

        pcm."capture" {
            capabilities "capabilities2"    # capabilities for capture

            configs [       # supported configs for capture
                "config1"
                "config2"
                "config3"
            ]
        }

        # Optional boolean flags
        symmetric_rates         "true"
        symmetric_channels      "true"
        symmetric_sample_bits       "false"

        data "name"         # optional private data
     }
     </pre>

     <h4>Physical DAI Link Configurations</h4>
     The runtime configurations of a physical DAI link can be defined by
     SectionLink. <br> Backend DAI links belong to physical links, and can
     be configured by either SectionLink or SectionBE, with same syntax.
     But SectionBE is deprecated atm since the internal processing is
     actually same.

     <pre>
     SectionLink."name" {

        index "1"           # Index number

        id "0"              # used for binding to the link

        stream_name "name"      # used for binding to the link

        hw_configs [    # runtime supported HW configurations, optional
            "config1"
            "config2"
            ...
        ]

        default_hw_conf_id "1"      #default HW config ID for init

        # Optional boolean flags
        symmetric_rates         "true"
        symmetric_channels      "false"
        symmetric_sample_bits       "true"

        data "name"         # optional private data
     }
     </pre>

     A physical link can refer to multiple runtime supported hardware
     configurations, which is defined by SectionHWConfig.

     <pre>
     SectionHWConfig."name" {

        id "1"              # used for binding to the config
        format "I2S"            # physical audio format.
        bclk   "codec_provider"     # Codec provides the bit clock
        fsync  "codec_consumer"     # Codec follows the fsync
     }
     </pre>

     <h4>Physical DAI</h4>
     A physical DAI (e.g. backend DAI for DPCM) is defined as a new section
     that can include a unique ID, playback and capture stream capabilities,
     optional flags, and private data. <br>
     Its PCM stream capablities are same as those for PCM objects,
     please refer to section 'PCM Capabilities'.

     <pre>
     SectionDAI."name" {

        index "1"           # Index number

        id "0"              # used for binding to the Backend DAI

        pcm."playback" {
            capabilities "capabilities1"    # capabilities for playback
        }

        pcm."capture" {
            capabilities "capabilities2"    # capabilities for capture
        }

        symmetric_rates "true"          # optional flags
        symmetric_channels "true"
        symmetric_sample_bits "false"

        data "name"         # optional private data
     }
     </pre>

     <h4>Manifest Private Data</h4>
     Manfiest may have private data. Users need to define a manifest section
     and add the references to 1 or multiple data sections. Please refer to
     section 'How to define an element with private data'. <br>
     And the text conf file can have at most 1 manifest section. <br><br>

     Manifest section is defined as follows :-

     <pre>
     SectionManifest"name" {

        data "name"         # optional private data
     }
     </pre>

     <h4>Include other files</h4>
     Users may include other files in a text conf file via alsaconf syntax
     <path/to/configuration-file>. This allows users to define common info
     in separate files (e.g. vendor tokens, tuples) and share them for
     different platforms, thus save the total size of config files. <br>
     Users can also specifiy additional configuraiton directories relative
     to "/usr/share/alsa/" to search the included files,  via alsaconf syntax
     <searchfdir:/relative-path/to/usr/share/alsa>. <br><br>

     For example, file A and file B are two text conf files for platform X,
     they will be installed to /usr/share/alsa/topology/platformx. If we
     need file A to include file B, in file A we can add: <br>

     <searchdir:topology/platformx> <br>
     <name-of-file-B> <br><br>

     ALSA conf will search and open an included file in the following order
     of priority:
      1. directly open the file by its name;
      2. search for the file name in "/usr/share/alsa";
      3. search for the file name in user specified subdirectories under
         "/usr/share/alsa".

     The order of the included files need not to be same as their
     dependencies, since the topology library will load them all before
     parsing their dependencies.

     The configuration directories defined by a file will only be used to search
     the files included by this file.

## Macro Definition Documentation

## ◆ SND_TPLG_CREATE_DAPM_NOSORT

#define SND_TPLG_CREATE_DAPM_NOSORT (1<<1)

Do not sort DAPM objects by index

## ◆ SND_TPLG_CREATE_VERBOSE

#define SND_TPLG_CREATE_VERBOSE (1<<0)

Flags for the snd_tplg_create Verbose output

## ◆ SND_TPLG_INDEX_ALL

#define SND_TPLG_INDEX_ALL 0

Fit for all user cases

## ◆ SND_TPLG_MAX_CHAN

#define SND_TPLG_MAX_CHAN 8

Maximum number of channels supported in one control

## ◆ SND_TPLG_SAVE_GROUPS

#define SND_TPLG_SAVE_GROUPS (1<<1)

create the structure by group index

## ◆ SND_TPLG_SAVE_NOCHECK

#define SND_TPLG_SAVE_NOCHECK (1<<16)

unchecked output for debugging

## ◆ SND_TPLG_SAVE_SORT

#define SND_TPLG_SAVE_SORT (1<<0)

sort identifiers

## Typedef Documentation

## ◆ snd_tplg_t

typedef struct snd_tplg snd_tplg_t

Topology context

## Enumeration Type Documentation

## ◆ snd_tplg_type

enum snd_tplg_type

Topology object types

Enumerator
SND_TPLG_TYPE_TLV | TLV Data
SND_TPLG_TYPE_MIXER | Mixer control
SND_TPLG_TYPE_ENUM | Enumerated control
SND_TPLG_TYPE_TEXT | Text data
SND_TPLG_TYPE_DATA | Private data
SND_TPLG_TYPE_BYTES | Byte control
SND_TPLG_TYPE_STREAM_CONFIG | PCM Stream configuration
SND_TPLG_TYPE_STREAM_CAPS | PCM Stream capabilities
SND_TPLG_TYPE_PCM | PCM stream device
SND_TPLG_TYPE_DAPM_WIDGET | DAPM widget
SND_TPLG_TYPE_DAPM_GRAPH | DAPM graph elements
SND_TPLG_TYPE_BE | BE DAI link
SND_TPLG_TYPE_CC | Hostless codec <-> codec link
SND_TPLG_TYPE_MANIFEST | Topology manifest
SND_TPLG_TYPE_TOKEN | Vendor tokens
SND_TPLG_TYPE_TUPLE | Vendor tuples
SND_TPLG_TYPE_LINK | Physical DAI link
SND_TPLG_TYPE_HW_CONFIG | Link HW config
SND_TPLG_TYPE_DAI | Physical DAI

## Function Documentation

## ◆ snd_tplg_add_object()

int snd_tplg_add_object | ( | snd_tplg_t * | tplg,
|  | snd_tplg_obj_template_t * | t
| ) |  |

Register topology template object.

Parameters

  tplg | Topology instance.
  t | Template object.

Returns
  Zero on success, otherwise a negative error code

## ◆ snd_tplg_build()

int snd_tplg_build | ( | snd_tplg_t * | tplg,
|  | const char * | outfile
| ) |  |

Build all registered topology data into binary file.

Parameters

  tplg | Topology instance.
  outfile | Binary topology output file.

Returns
  Zero on success, otherwise a negative error code

## ◆ snd_tplg_build_bin()

int snd_tplg_build_bin | ( | snd_tplg_t * | tplg,
|  | void ** | bin,
|  | size_t * | size
| ) |  |

Build all registered topology data into memory.

Parameters

  tplg | Topology instance.
  bin | Binary topology output buffer (malloc).
  size | Binary topology output buffer size in bytes.

Returns
  Zero on success, otherwise a negative error code

## ◆ snd_tplg_build_file()

int snd_tplg_build_file | ( | snd_tplg_t * | tplg,
|  | const char * | infile,
|  | const char * | outfile
| ) |  |

Parse and build topology text file into binary file.

Parameters

  tplg | Topology instance.
  infile | Topology text input file to be parsed
  outfile | Binary topology output file.

Returns
  Zero on success, otherwise a negative error code

## ◆ snd_tplg_create()

snd_tplg_t * snd_tplg_create | ( | int | flags | ) |

Create a new topology parser instance.

Returns
  New topology parser instance

## ◆ snd_tplg_decode()

int snd_tplg_decode | ( | snd_tplg_t * | tplg,
|  | void * | bin,
|  | size_t | size,
|  | int | dflags
| ) |  |

Decode the binary topology contents.

Parameters

  tplg | Topology instance.
  bin | Binary topology input buffer.
  size | Binary topology input buffer size.

Returns
  Zero on success, otherwise a negative error code

## ◆ snd_tplg_free()

void snd_tplg_free | ( | snd_tplg_t * | tplg | ) |

Free a topology parser instance.

Parameters

  tplg | Topology parser instance

## ◆ snd_tplg_load()

int snd_tplg_load | ( | snd_tplg_t * | tplg,
|  | const char * | buf,
|  | size_t | size
| ) |  |

Load topology from the text buffer.

Parameters

  tplg | Topology instance.
  buf | Text buffer.
  size | Text buffer size in bytes.

Returns
  Zero on success, otherwise a negative error code

## ◆ snd_tplg_new()

snd_tplg_t * snd_tplg_new | ( | void |  | ) |

Create a new topology parser instance.

Returns
  New topology parser instance

## ◆ snd_tplg_save()

int snd_tplg_save | ( | snd_tplg_t * | tplg,
|  | char ** | dst,
|  | int | flags
| ) |  |

Save the topology to the text configuration string.

Parameters

  tplg | Topology instance.
  dst | A pointer to string with result (malloc).

Returns
  Zero on success, otherwise a negative error code

## ◆ snd_tplg_set_manifest_data()

int snd_tplg_set_manifest_data | ( | snd_tplg_t * | tplg,
|  | const void * | data,
|  | int | len
| ) |  |

Attach private data to topology manifest.

Parameters

  tplg | Topology instance.
  data | Private data.
  len | Length of data in bytes.

Returns
  Zero on success, otherwise a negative error code

## ◆ snd_tplg_set_version()

int snd_tplg_set_version | ( | snd_tplg_t * | tplg,
|  | unsigned int | version
| ) |  |

Set an optional vendor specific version number.

Parameters

  tplg | Topology instance.
  version | Vendor specific version number.

Returns
  Zero on success, otherwise a negative error code

## ◆ snd_tplg_verbose()

void snd_tplg_verbose | ( | snd_tplg_t * | tplg,
|  | int | verbose
| ) |  |

Enable verbose reporting of binary file output.

Parameters

  tplg | Topology Instance
  verbose | Enable verbose output level if non zero

## ◆ snd_tplg_version()

const char * snd_tplg_version | ( | void |  | ) |

Return the version of the topology library.

Returns
  A static string with the version number.

## Variable Documentation

## ◆ access

int snd_tplg_ctl_template::access

Control access

## ◆ base

int snd_tplg_bytes_template::base

base register

## ◆ buffer_bytes

int snd_tplg_stream_template::buffer_bytes

size of buffer in bytes.

## ◆ buffer_size_max

unsigned int snd_tplg_stream_caps_template::buffer_size_max

max buffer size bytes

## ◆ buffer_size_min

unsigned int snd_tplg_stream_caps_template::buffer_size_min

min buffer size bytes

## ◆ [1/2]

struct snd_tplg_bytes_template* { ... } ::bytes_ctl

Bytes control

## ◆ bytes_ctl [2/2]

struct snd_tplg_bytes_template* snd_tplg_obj_template_t::bytes_ctl

Bytes control

## ◆ caps [1/2]

struct snd_tplg_stream_caps_template* snd_tplg_pcm_template::caps[2]

playback & capture for DAI

## ◆ caps [2/2]

struct snd_tplg_stream_caps_template* snd_tplg_dai_template::caps[2]

playback & capture for DAI

## ◆ capture [1/2]

unsigned int snd_tplg_pcm_template::capture

supports capture mode

## ◆ capture [2/2]

unsigned int snd_tplg_dai_template::capture

supports capture mode

## ◆ channel

struct snd_tplg_channel_elem snd_tplg_channel_map_template::channel[SND_TPLG_MAX_CHAN]

mapping

## ◆ channels

int snd_tplg_stream_template::channels

number of channels

## ◆ channels_max

unsigned int snd_tplg_stream_caps_template::channels_max

max channels

## ◆ channels_min

unsigned int snd_tplg_stream_caps_template::channels_min

min channels

## ◆ compress

unsigned int snd_tplg_pcm_template::compress

1 = compressed; 0 = PCM

## ◆ count

int snd_tplg_graph_template::count

Number of graph elements

## ◆ ctl [1/2]

const char* snd_tplg_graph_elem::ctl

control name or NULL if no control

## ◆ ctl [2/2]

struct snd_tplg_ctl_template* snd_tplg_widget_template::ctl[0]

array of widget controls

## ◆ [1/2]

struct snd_tplg_dai_template* { ... } ::dai

Physical DAI

## ◆ dai [2/2]

struct snd_tplg_dai_template* snd_tplg_obj_template_t::dai

Physical DAI

## ◆ dai_id [1/2]

unsigned int snd_tplg_pcm_template::dai_id

unique ID - used to match

## ◆ dai_id [2/2]

unsigned int snd_tplg_dai_template::dai_id

unique ID - used to match

## ◆ dai_name [1/2]

const char* snd_tplg_pcm_template::dai_name

DAI name

## ◆ dai_name [2/2]

const char* snd_tplg_dai_template::dai_name

DAI name

## ◆ data

const void* snd_tplg_pdata_template::data

data

## ◆ elem

struct snd_tplg_graph_elem snd_tplg_graph_template::elem[0]

graph elements

## ◆ enum_ctl [1/2]

struct snd_tplg_enum_template* snd_tplg_obj_template_t::enum_ctl

Enum control

## ◆ [2/2]

struct snd_tplg_enum_template* { ... } ::enum_ctl

Enum control

## ◆ event_flags

unsigned short snd_tplg_widget_template::event_flags

PM event sequence flags

## ◆ event_type

unsigned short snd_tplg_widget_template::event_type

PM event sequence type

## ◆ ext_ops

struct snd_tplg_io_ops_template snd_tplg_bytes_template::ext_ops

ops mapping

## ◆ flag_mask [1/2]

unsigned int snd_tplg_pcm_template::flag_mask

bitmask of flags to configure

## ◆ flag_mask [2/2]

unsigned int snd_tplg_dai_template::flag_mask

bitmask of flags to configure

## ◆ flags [1/2]

unsigned int snd_tplg_pcm_template::flags

flag value SND_SOC_TPLG_LNK_FLGBIT_*

## ◆ flags [2/2]

unsigned int snd_tplg_dai_template::flags

SND_SOC_TPLG_DAI_FLGBIT_*

## ◆ format

int snd_tplg_stream_template::format

SNDRV_PCM_FMTBIT_*

## ◆ formats

uint64_t snd_tplg_stream_caps_template::formats

supported formats SNDRV_PCM_FMTBIT_*

## ◆ get

int snd_tplg_io_ops_template::get

get callback ID

## ◆ graph [1/2]

struct snd_tplg_graph_template* snd_tplg_obj_template_t::graph

Graph elements

## ◆ [2/2]

struct snd_tplg_graph_template* { ... } ::graph

Graph elements

## ◆ hdr [1/4]

struct snd_tplg_tlv_template snd_tplg_tlv_dbscale_template::hdr

TLV type header

## ◆ hdr [2/4]

struct snd_tplg_ctl_template snd_tplg_mixer_template::hdr

control type header

## ◆ hdr [3/4]

struct snd_tplg_ctl_template snd_tplg_enum_template::hdr

control type header

## ◆ hdr [4/4]

struct snd_tplg_ctl_template snd_tplg_bytes_template::hdr

control type header

## ◆ hw_config

struct snd_tplg_hw_config_template* snd_tplg_link_template::hw_config

supported HW configs

## ◆ id [1/3]

int snd_tplg_channel_elem::id

ID maps to Left, Right, LFE etc

## ◆ id [2/3]

int snd_tplg_widget_template::id

SND_SOC_DAPM_CTL

## ◆ id [3/3]

int snd_tplg_link_template::id

unique ID - used to match with existing physical links

## ◆ ignore_suspend

unsigned int snd_tplg_widget_template::ignore_suspend

kept enabled over suspend

## ◆ index

int snd_tplg_obj_template_t::index

group index for object

## ◆ info

int snd_tplg_io_ops_template::info

info callback ID

## ◆ invert [1/2]

int snd_tplg_mixer_template::invert

whether controls bits are inverted

## ◆ invert [2/2]

unsigned int snd_tplg_widget_template::invert

invert the power bit

## ◆ items

int snd_tplg_enum_template::items

number of enumerated items in control

## ◆ length

unsigned int snd_tplg_pdata_template::length

data length

## ◆ link [1/2]

struct snd_tplg_link_template* snd_tplg_obj_template_t::link

physical DAI Links

## ◆ [2/2]

struct snd_tplg_link_template* { ... } ::link

physical DAI Links

## ◆ map [1/2]

struct snd_tplg_channel_map_template* snd_tplg_mixer_template::map

channel map

## ◆ map [2/2]

struct snd_tplg_channel_map_template* snd_tplg_enum_template::map

channel map

## ◆ mask [1/3]

int snd_tplg_enum_template::mask

register mask size

## ◆ mask [2/3]

int snd_tplg_bytes_template::mask

byte control mask

## ◆ mask [3/3]

int snd_tplg_widget_template::mask

non-shifted mask

## ◆ max [1/2]

int snd_tplg_mixer_template::max

max value for mixer

## ◆ max [2/2]

int snd_tplg_bytes_template::max

max byte control value

## ◆ min [1/2]

int snd_tplg_tlv_dbscale_template::min

dB minimum value in 0.1dB

## ◆ min [2/2]

int snd_tplg_mixer_template::min

min value for mixer

## ◆ mixer [1/2]

struct snd_tplg_mixer_template* snd_tplg_obj_template_t::mixer

Mixer control

## ◆ [2/2]

struct snd_tplg_mixer_template* { ... } ::mixer

Mixer control

## ◆ mute

int snd_tplg_tlv_dbscale_template::mute

is min dB value mute ?

## ◆ name [1/5]

const char* snd_tplg_ctl_template::name

Control name

## ◆ name [2/5]

const char* snd_tplg_widget_template::name

widget name

## ◆ name [3/5]

const char* snd_tplg_stream_template::name

name of the stream config

## ◆ name [4/5]

const char* snd_tplg_stream_caps_template::name

name of the stream caps

## ◆ name [5/5]

const char* snd_tplg_link_template::name

link name, used to match

## ◆ num_channels

int snd_tplg_channel_map_template::num_channels

number of channel mappings

## ◆ num_ctls

int snd_tplg_widget_template::num_ctls

Number of controls used by widget

## ◆ num_regs

int snd_tplg_bytes_template::num_regs

number of registers

## ◆ num_streams [1/2]

int snd_tplg_pcm_template::num_streams

number of supported configs

## ◆ num_streams [2/2]

int snd_tplg_link_template::num_streams

number of configs

## ◆ ops

struct snd_tplg_io_ops_template snd_tplg_ctl_template::ops

operations

## ◆ [1/2]

struct snd_tplg_pcm_template* { ... } ::pcm

PCM elements

## ◆ pcm [2/2]

struct snd_tplg_pcm_template* snd_tplg_obj_template_t::pcm

PCM elements

## ◆ pcm_id

unsigned int snd_tplg_pcm_template::pcm_id

unique ID - used to match

## ◆ pcm_name

const char* snd_tplg_pcm_template::pcm_name

PCM stream name

## ◆ period_bytes

int snd_tplg_stream_template::period_bytes

size of period in bytes

## ◆ period_size_max

unsigned int snd_tplg_stream_caps_template::period_size_max

max period size bytes

## ◆ period_size_min

unsigned int snd_tplg_stream_caps_template::period_size_min

min period size bytes

## ◆ periods_max

unsigned int snd_tplg_stream_caps_template::periods_max

max number of periods

## ◆ periods_min

unsigned int snd_tplg_stream_caps_template::periods_min

min number of periods

## ◆ platform_max

int snd_tplg_mixer_template::platform_max

max value for platform control

## ◆ playback [1/2]

unsigned int snd_tplg_pcm_template::playback

supports playback mode

## ◆ playback [2/2]

unsigned int snd_tplg_dai_template::playback

supports playback mode

## ◆ priv [1/7]

struct snd_soc_tplg_private* snd_tplg_mixer_template::priv

control private data

## ◆ priv [2/7]

struct snd_soc_tplg_private* snd_tplg_enum_template::priv

control private data

## ◆ priv [3/7]

struct snd_soc_tplg_private* snd_tplg_bytes_template::priv

control private data

## ◆ priv [4/7]

struct snd_soc_tplg_private* snd_tplg_widget_template::priv

widget private data

## ◆ priv [5/7]

struct snd_soc_tplg_private* snd_tplg_pcm_template::priv

private data

## ◆ priv [6/7]

struct snd_soc_tplg_private* snd_tplg_dai_template::priv

private data

## ◆ priv [7/7]

struct snd_soc_tplg_private* snd_tplg_link_template::priv

private data

## ◆ put

int snd_tplg_io_ops_template::put

put callback ID

## ◆ rate

int snd_tplg_stream_template::rate

SNDRV_PCM_RATE_*

## ◆ rate_max

unsigned int snd_tplg_stream_caps_template::rate_max

max rate

## ◆ rate_min

unsigned int snd_tplg_stream_caps_template::rate_min

min rate

## ◆ rates

unsigned int snd_tplg_stream_caps_template::rates

supported rates SNDRV_PCM_RATE_*

## ◆ reg [1/2]

int snd_tplg_channel_elem::reg

channel control register

## ◆ reg [2/2]

int snd_tplg_widget_template::reg

negative reg = no direct dapm

## ◆ shift [1/2]

int snd_tplg_channel_elem::shift

channel shift for control bits

## ◆ shift [2/2]

int snd_tplg_widget_template::shift

bits to shift

## ◆ sig_bits

unsigned int snd_tplg_stream_caps_template::sig_bits

number of bits of content

## ◆ sink

const char* snd_tplg_graph_elem::sink

sink widget name

## ◆ size

int snd_tplg_channel_elem::size

size in bytes of this structure

## ◆ sname

const char* snd_tplg_widget_template::sname

stream name (certain widgets only)

## ◆ src

const char* snd_tplg_graph_elem::src

source widget name

## ◆ step

int snd_tplg_tlv_dbscale_template::step

dB step size in 0.1dB

## ◆ stream [1/2]

struct snd_tplg_stream_template snd_tplg_pcm_template::stream[0]

supported configs

## ◆ stream [2/2]

struct snd_tplg_stream_template* snd_tplg_link_template::stream

supported configs

## ◆ stream_name

const char* snd_tplg_link_template::stream_name

link stream name, used to match

## ◆ subseq

int snd_tplg_widget_template::subseq

sort within widget type

## ◆ texts

const char** snd_tplg_enum_template::texts

control text items

## ◆ [1/2]

struct snd_tplg_tlv_template* { ... } ::tlv

non NULL means we have TLV data

## ◆ tlv [2/2]

struct snd_tplg_tlv_template* snd_tplg_ctl_template::tlv

non NULL means we have TLV data

## ◆ [1/2]

struct snd_tplg_tlv_dbscale_template* { ... } ::tlv_scale

scale TLV data

## ◆ tlv_scale [2/2]

struct snd_tplg_tlv_dbscale_template* snd_tplg_ctl_template::tlv_scale

scale TLV data

## ◆ type [1/3]

int snd_tplg_tlv_template::type

TLV type SNDRV_CTL_TLVT_

## ◆ type [2/3]

int snd_tplg_ctl_template::type

Control type

## ◆ type [3/3]

enum snd_tplg_type snd_tplg_obj_template_t::type

template object type

## ◆ values

const int** snd_tplg_enum_template::values

control value items

## ◆ vendor_type

int snd_tplg_obj_template_t::vendor_type

optional vendor specific type info

## ◆ version

int snd_tplg_obj_template_t::version

optional vendor specific version details

## ◆ [1/2]

struct snd_tplg_widget_template* { ... } ::widget

DAPM widget

## ◆ widget [2/2]

struct snd_tplg_widget_template* snd_tplg_obj_template_t::widget

DAPM widget