# Customize audio use cases Customize audio use cases at the platform abstraction layer (PAL) level using PAL APIs, configuration files, and audio graph modifications. Each audio use case is a graph with subgraphs of a specific type. Each subgraph has one or more functional software blocks (referred to as modules) that perform a specific function. ## Customize audio at the PAL level PAL provides higher-level audio-specific APIs to access audio hardware and drivers. Customizing at the PAL level allows you to control stream behavior, device routing, buffer configuration, and platform-specific audio settings. The PipeWire PAL plug-in (`pw-pal-plugin`) bridges PipeWire streams directly to the PAL API. It runs as a PipeWire module and handles all audio routing between PipeWire and the AudioReach hardware stack.The plug-in performs the following operations: - Opens and manages PAL streams for playback and capture. - Configures mixer controls to set up hardware codec devices and stream configurations. - Invokes PAL APIs to open and start audio sessions. - Routes audio data between PipeWire buffers and PAL DMA buffers. The following table describes the components of the PipeWire PAL plug-in. Components of the PipeWire PAL plugin | Component | Description | | --- | --- | | Source | A node that produces a stream of data (audio/video frames) and exposes output ports. A PipeWire source node:
| | Sink | A node that consumes incoming data and exposes input ports. A PipeWire sink node:
| The PAL resource manager tracks all active sessions and devices to enable concurrencies. It parses and loads configuration from the following platform XML files: - `Resource_manager.xml`: Contains device-to-backend mapping and policy making attributes. - `Card-defs.xml`: Contains virtual PCM and compress nodes and their options. - `mixer_paths.xml`: Defines all low-level audio routing paths and controls that determine how sound is recorded, processed, and played on the device. - `plugin_manager.xml`: Links audio streams, sessions, and devices to their corresponding plugin libraries and functions for runtime audio handling. - `usecaseKvManager.xml`: Maps audio streams and devices to DSP processing graphs, deciding how audio is processed internally on the chip. You can find the PipeWire PAL plug-in source code at `build-qcom-wayland/workspace/sources/pipewire`. You can find the PAL source code at `build-qcom-wayland/workspace/sources/qcom-pal/opensource/arpal-lx`. The file `build-qcom-wayland/workspace/sources/qcom-pal/opensource/arpal-lx/inc/PalApi.h` lists all APIs exposed by the PAL module. ### PAL APIs The following are common PAL APIs for controlling and configuring audio sessions and devices. #### pal\_init Initializes PAL, parses the related configuration files, and stores them in a local structure for use. int32_t pal_init( Copy to clipboard - Parameters: None. - Return value: 0 on success, or an error code on failure. #### pal\_deinit De-initializes PAL and frees the resources allocated during initialization. void pal_deinit() Copy to clipboard - Parameters: None. #### pal\_stream\_open Opens a stream with the specified configuration, such as source and sink devices and media configuration. Returns the stream handle on success. int32_t pal_stream_open( struct pal_stream_attributes *attributes, uint32_t no_of_devices, struct pal_device *devices, uint32_t no_of_modifiers, struct modifier_kv *modifiers, pal_stream_callback cb, uint64_t cookie, pal_stream_handle_t **stream_handle) Copy to clipboard - Parameters > > > pal_stream_open parameters > > > | Parameter | Description | > | --- | --- | > | `attributes` | Valid stream attributes obtained from `pal_stream_open`. | > | `no_of_devices` | Number of audio devices with which to first start the stream. | > | `devices` | Array of `pal_devices`. Bases the size of the array on the number of devices specified by the client in `no_of_devices`. | > | `no_of_modifiers` | Number of modifiers. | > | `modifiers` | Array of modifiers. Modifiers add more key-value pairs. | > | `cb` | Callback function associated with the stream. This callback function notifies any event. | > | `cookie` | Client data associated with the stream. The callback function returns this cookie. | > | `stream_handle` | Updates with the valid stream handle if the operation is successful. | - Return value: 0 on success, or an error code on failure. #### pal\_stream\_start Starts a stream. int32_t pal_stream_start( pal_stream_handle_t *stream_handle) Copy to clipboard - Parameters: stream\_handle - Valid stream handle from `pal_stream_open`. - Return value: 0 on success, or an error code on failure. #### pal\_stream\_read Reads the audio buffer captured from the audio source device. ssize_t pal_stream_read( pal_stream_handle_t *stream_handle, struct pal_buffer *buf) Copy to clipboard - Parameters > > > pal_stream_read parameters > > > | Parameter | Description | > | --- | --- | > | `stream_handle` | Valid stream handle from `pal_stream_open`. | > | `buf` | Pointer to `pal_buffer` that holds audio samples and metadata. | - Return value: Number of bytes read, or an error code on failure. #### pal\_stream\_write Writes the audio buffer for stream rendering over a sink device. ssize_t pal_stream_write( pal_stream_handle_t *stream_handle, struct pal_buffer *buf) Copy to clipboard - Parameters > > > pal_stream_write parameters > > > | Parameter | Description | > | --- | --- | > | `stream_handle` | Valid stream handle from `pal_stream_open`. | > | `buf` | Pointer to pal\_buffer that holds audio samples and metadata. | - Return value: Number of bytes written, or an error code on failure. #### pal\_stream\_stop Stops a stream. int32_t pal_stream_stop( pal_stream_handle_t *stream_handle) Copy to clipboard - Parameters: `stream_handle` - Valid stream handle from `pal_stream_open`. - Return value: 0 on success, or an error code on failure. #### pal\_stream\_close Closes a stream. int32_t pal_stream_close( pal_stream_handle_t *stream_handle) Copy to clipboard - Parameters: `stream_handle` - Valid stream handle from `pal_stream_open`. - Return value: 0 on success, or an error code on failure. ### Configure PAL configuration files Configure audio use cases at the PAL level using the `mixer_paths`, `resourcemanager`, and `usecasekvmanager` XML files. `mixer_paths_GLYMUR_CRD.xml` and `resourcemanager_GLYMUR_CRD.xml` are used for Glymur Linux. #### Customize the mixer paths XML file A mixer control is a control variable exposed from the advanced Linux sound architecture (ALSA) mixer to user space. It lets user space access set and get functions and pass parameters to the ALSA mixer. For example, the following entry enables the mono speaker device in the `mixer_paths.xml` file. When playback triggers and the selected device is a speaker, these mixer controls run through the audio route helper class: Copy to clipboard The platform uses the `mixer_paths_.xml` file as the mixer path. This file is in the `/etc/` folder on the target. #### Customize the resource manager XML file The `resourcemanager.xml` file includes all possible devices, use cases, and combinations. It also includes other configurations, module parameters, and global parameters. The following example shows a speaker device entry in the resource manager XML file. It includes all configurations for the speaker device, such as back-end name, channels, sample rate, and bit width. PAL_DEVICE_OUT_SPEAKER CODEC_DMA-LPAIF_WSA-RX-0 2 2 48000 16 speaker Copy to clipboard #### Customize the usecasekvmanager XML file The `usecasekvmanager.xml` file holds the graph key vector (GKV) details for each use case. PAL uses this file to get the key-value (KV) configuration for each use case, then uses that configuration to get graph information from the ACDB files. This file is in the `/etc` folder on the device. The following examples show one stream and device graph key vector configuration. - Stream KV > > > > > > > > Copy to clipboard - Device KV > > > > > > > Copy to clipboard - DevicePP KV > > > > > > > > Copy to clipboard ## Customize the audio graph Each audio use case is a graph with subgraphs of a specific type. Each subgraph has one or more functional software blocks (referred to as modules) that perform a specific function. Use the graph terminology, segments, and sample graph to design and route a custom use case. The following table defines the audio graph terms. Audio graph terms | Term | Definition | | --- | --- | | Use case | A graph of modules from source endpoints to sink endpoints that meets the product-defined use case. | | Graph | A logical interpretation of a group of one or more subgraphs connected together to create a specific use case. | | Subgraph | A logical abstraction for a group of modules that connect and are manipulated as a single entity. | | Container | An object that lets the system designer group and run audio processing modules together in a single software thread. | | Module | The smallest independent processing unit in the signal processing framework. | | Key-value (KV) pair | The individual key and associated value in a key vector. For example, a key can be a sound device and a value can be headphone, speaker, or another sound device. | | Key vector | Uniquely identifies a graph or subgraph through a set of KV pairs. | | Graph key vector (GKV) | A unique identifier that gets a graph, represented by KV pairs.The graph or system designer associates a set of unique keys and values when creating a subgraph from the QACT UI canvas. | | Calibration key vector (CKV) | A unique identifier that gets calibration data, represented by KV pairs. The graph or system designer associates a set of unique keys and values when storing calibration data. | | Tag and tag key vector (TKV) | A tag is an identifier that sets runtime parameters for one or more modules. It updates module configurations, for example enabling or disabling echo cancellation or equalization, in a graph at runtime. | An audio use case has the following segments. The front-end represents the stream and StreamPP subgraphs, and the back-end represents the per-stream per-device (PSPD), DevicePP, and device subgraphs. The following table describes the audio graph segments. Audio use case segments | Segment | Description | | --- | --- | | Stream | Provides a data write and read interface and performs decoding and encoding of compressed data. | | StreamPP | Contains stream-based processing modules, for example an equalizer. | | PSPD | Contains a module to convert the stream media format to the device media format. | | DevicePP | Contains processing modules for sound device tuning. | | Device | Hardware endpoint such as CodecDMA (SoundWire), I2S, or TDM port. | After a front-end connects to a back-end through a routing mixer control, the full GKV forms by concatenating the subgraph GKVs and the CKVs assigned through mixer controls. When you open the front-end PCM or compress device, AGM invokes GSL APIs with the concatenated GKVs and CKVs to set up the graph in ARE and apply calibration. At the same time, AGM opens a kernel PCM device that corresponds to the connected back-ends to begin audio peripheral setup. The following figure shows an example audio graph for a playback scenario. The following figure shows an example audio graph for a playback scenario. VBackground-1 Solid Page-1 Sheet.37 Round Corner Rectangle.36 Round Corner Rectangle.41 Round Corner Rectangle.42 Round Corner Rectangle.43 Round Corner Rectangle CONT#1 CONT#1 Round Corner Rectangle.1017 PCM Converter PCM Converter Round Corner Rectangle.1024 PCM Decoder PCM Decoder Round Corner Rectangle.1025 Write SHMEM EP Write SHMEM EP Dynamic connector.1032 Dynamic connector.1033 Round Corner Rectangle.7 CONT#6 CONT#6 Round Corner Rectangle.8 Media Format Converter Media Format Converter Round Corner Rectangle.9 CONT#2 CONT#2 Round Corner Rectangle.10 Splitter Splitter Round Corner Rectangle.11 PP2 PP2 Round Corner Rectangle.21 PP1 PP1 Dynamic connector.13 Dynamic connector.23 Round Corner Rectangle.15 CONT#8 CONT#8 Round Corner Rectangle.16 HW EP HW EP Round Corner Rectangle.17 CONT#7 CONT#7 Round Corner Rectangle.28 PP6 PP6 Round Corner Rectangle.29 PP5 PP5 Round Corner Rectangle.30 Mixer Mixer Dynamic connector.21 Dynamic connector.22 Sheet.23 Client PCM Data Client PCM Data Dynamic connector.46 Dynamic connector.47 Dynamic connector.48 Dynamic connector.49 Dynamic connector.50 Sheet.33 SGKV: [StreamRx: PCM Low Latency Playback Instance: instance 1] SGKV: [StreamRx: PCM Low Latency PlaybackInstance: instance 1] Sheet.34 SGKV: [StreamRx: PCM Low Latency Playback Device: Speaker Ins... SGKV: [StreamRx: PCM Low Latency Playback Device: SpeakerInstance: instance 1] Sheet.35 SGKV: [DeviceRx:Speaker DevicePP rx: Speaker PP] SGKV: [DeviceRx:SpeakerDevicePP rx: Speaker PP] Sheet.36 SGKV: [DeviceRx:Speaker] SGKV: [DeviceRx:Speaker] Playback audio graph routing client PCM data through containers with decoders, converters, and mixers, labeled with SGKV metadata. The graph works as follows: 1. The stream subgraph has a write shared memory endpoint, PCM decoder, and PCM converter. The client passes PCM samples to the write shared memory endpoint. 2. If conversion is necessary, the PCM converter converts PCM samples to a format supported by the stream-specific postprocessing modules. 3. The output of the stream subgraph feeds into the stream-device subgraph, which has the media format converter (MFC). The MFC converts the stream-subgraph PCM to the device-subgraph PCM format. 4. After conversion, the output of the stream-device subgraph feeds into the DevicePP subgraph for device-specific postprocessing. A mixer is placed at the beginning of the subgraph to mix input streams. 5. The output of the DevicePP subgraph feeds into the device subgraph, which has a hardware endpoint module such as an I2S driver. The following is the GKV for this example graph: GKV1: GKV2: Copy to clipboard ### Audio graph manager The Audio Graph Manager (AGM) provides interfaces that let TinyALSA-based mixer controls and PCM or compress plug-ins interact and enable audio use cases. AGM runs as part of the PipeWire service in user space. It provides APIs for mixer plug-ins and PCM or compress APIs to set up audio use cases, maintains many ALSA clients to set up use cases, and manages front-end to back-end connections. The following figure shows the AGM software block at a high level. VBackground-1 Solid Page-1 Sheet.33 Rectangle Kernel space Kernel space Rectangle.23 Userspace Userspace Square AGM service AGM service Sheet.2 AGM API AGM API Sheet.4 PAL PAL Sheet.3 Session objects Session objects Sheet.7 GSL GSL Sheet.13 ALSA devices ALSA devices Sheet.18 Sheet.17 Graph objects Graph objects Sheet.21 Sheet.9 Device objects Device objects Dynamic connector.28 Dynamic connector.30 Dynamic connector.31 Sheet.32 Dynamic connector AGM service architecture from the AGM API and session objects to graph objects on GSL and device objects on ALSA devices, across user and kernel space. The following table describes the AGM objects. AGM objects | Object | Description | | --- | --- | | Session | An audio playback or capture session. Invoking session- specific mixer controls or APIs creates sessions.
It provides APIs for TinyALSA plug-ins to configure streams and manages state transitions of graph and device objects. | | Graph | An audio use case. It interacts with GSL to open, manage, and close graphs.
It provides APIs for graph creation, manages graphs, and configures stream and device endpoints. | | Device | An ALSA device from the ALSA sound card. It enumerates available audio interfaces and provides device APIs for transitioning device states. | ### AudioReach graph services The AudioReachâ„¢ Signal Processing Framework graph services (ARGS) consists of the graph service layer (GSL), generic packet router (GPR), and acdb management layer (AML). ARGS handles initialization and creation of graphs, and builds packets that send a series of commands to the AudioReach Engine (ARE). The following table describes the ARGS components. ARGS components | Component | Description | | --- | --- | | GSL | The graph service layer is a software driver for ARE that manages graphs, subgraphs, buffers, and configurations.
It loads and initializes graphs using graph key vectors (GKVs) and handles data commands and ARE module calibration. | | GPR | The generic packet router routes audio message packets across ARE and the graph service library.
It handles commands for constructing audio graphs and processing audio. | | AML | The ADCB management layer provides get and set APIs to get and adjust data in acdb files.
It provides data abstractions and organization for how the audio driver and its components consume calibration data. | ### Audio calibration database The audio calibration database (ADCB) is a static database on the application processor. It holds all tuning and calibration parameters for the LPAI. The `*.acdb` file format organizes calibration data for various audio modules and use cases. Edit the `*.acdb` file format with QACT (a PC tool) and place it on the device file system in the `/etc/acdbdata/` folder. During use case initialization or a device switch, the AML queries the ACDB database with a specified GKV and pushes the device calibration data to ARE. ### AudioReach Engine The AudioReach Engine (ARE) runs in the LPAI subsystem and performs audio data processing. The following figure shows the high-level functional blocks used in ARE. ![../_images/audioreach-engine.png](data:image/png;base64,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) AudioReach Engine architecture showing its components, processing domains, and interaction with modules, hardware drivers, and the RTOS. The following table describes the ARE components. ARE components | Component | Description | | --- | --- | | APM | The audio processing manager (APM) sets up and manages the use case graphs in ARE.
It provides the standard APIs to the graph management library and the APM client to set up and configure audio use cases. | | Modules | A module is a functional block in ARE. It performs real-time audio processing in the LPAI subsystem. | | Containers | A container is a framework implementation that runs a group of data processing modules together in the same software thread.
Each container runs in its own software thread. | Last Published: Sep 08, 2026 [Previous Topic Enable audio](https://docs.qualcomm.com/bundle/publicresource/80-A0399-50/topics/enable-audio.md) [Next Topic Troubleshoot audio](https://docs.qualcomm.com/bundle/publicresource/80-A0399-50/topics/troubleshoot.md)