# TinyALSA

Source: [https://docs.qualcomm.com/doc/80-70014-16Y/topic/tinyalsa_apis.html](https://docs.qualcomm.com/doc/80-70014-16Y/topic/tinyalsa_apis.html)

TinyALSA 是一个库，可将 ALSA 内核接口包装成客户端可以调用的 API，并提供插件接口来模拟 ALSA API。

TinyALSA 源代码可以在以下位置找到：

build-qcom-wayland/workspace/sources/tinyalsa/opensource/tinyalsa 和

build-qcom-wayland/workspace/sources/tinyalsa/opensource/tinycompress。

下面介绍了一些常用的 TinyALSA API。关于所有 API 的完整描述，可参见[开源 TinyALSA 文档](https://github.com/tinyalsa/tinyalsa/blob/master/include/tinyalsa/pcm.h)。

## pcm\_open

用于打开 PCM 音频设备进行输入和输出操作。对通信 PCM 设备进行初始化，允许对音频数据进行后续读/写操作。

    struct pcm *pcm_open(
         unsigned int card, 
         unsigned int device, 
         unsigned int flags, 
         struct pcm_config *config)Copy to clipboard

**参数**

| 卡 | 指定卡号 |
| --- | --- |
| 设备 | 指定所选卡中的设备编号 |
| 标志 | 用于配置 pcm 设备各个方面的标志 |
| 配置 | 用于指定音频流参数的结构变量 |

**返回值**

`pcm* handle`

## pcm\_is\_ready

用于检查 PCM 设备是否准备好进行输入/输出操作。

    int pcm_is_ready (struct pcm *pcm)
    Copy to clipboard

**参数**

| pcm | 指向打开的 PCM 设备的指针 |
| --- | --- |

**返回值**
- 成功时为 0
- 失败时为错误代码

## pcm\_prepare

准备音频设备输入和输出操作。

    int pcm_prepare(
         struct pcm *pcm)
    Copy to clipboard

**参数**

| pcm | 指向打开的 PCM 设备的指针 |
| --- | --- |

**返回值**
- 成功时为 0
- 失败时为错误代码

## pcm\_start

用于启动 PCM 音频设备进行输入和输出操作。

    int pcm_start(
         struct pcm *pcm)Copy to clipboard

**参数**

| pcm | 指向已打开的 PCM 设备的指针 |
| --- | --- |

**返回值**
- 成功时为 0
- 失败时为错误代码

## pcm\_write

用于将音频数据写入音频 PCM 设备。将音频数据作为输入，并将其发送到 PCM 设备进行播放或处理。

    int pcm_write(
         struct pcm *pcm, 
         const void *data, 
         unsigned int count)Copy to clipboard

**参数**

| pcm | 指向已打开的 PCM 设备的指针 |
| --- | --- |
| data | 要写入的音频数据 |
| count | 要写入的音频帧数 |

**返回值**
- 成功时为 0
- 失败时为错误代码

## pcm\_read

从 PCM 设备接收音频数据，允许应用程序从麦克风捕获音频数据。

    int pcm_read(
         struct pcm *pcm, 
         void *data, 
         unsigned int count)Copy to clipboard

**参数**

| pcm | 指向已打开的 PCM 设备的指针 |
| --- | --- |
| data | 要读取的音频数据 |
| count | 要读取的音频帧数 |

**返回值**
- 成功时为 0
- 失败时为错误代码

## pcm\_stop

用于停止 PCM 音频设备进行进一步的输入和输出操作。

    int pcm_stop(
         struct pcm *pcm)Copy to clipboard

**参数**

| pcm | 指向已打开的 PCM 设备的指针 |
| --- | --- |

**返回值**
- 成功时为 0
- 失败时为错误代码

## pcm\_close

用于关闭 PCM 音频设备。这将释放与 PCM 设备关联的资源并释放内存。

    int pcm_close(
         struct pcm *pcm)Copy to clipboard

**参数**

| pcm | 指向已打开的 PCM 设备的指针 |
| --- | --- |

**返回值**
- 成功时为 0
- 失败时为错误代码

## 基于 TinyALSA 的应用程序

要实现 TinyALSA 的音频用例，需配置虚拟混音器控件。这些控件由混音器插件创建，用于搭建音频用例图和模块。大多数都是基于字节数组的，并使用 `mixer_ctl_set_array` API 进行配置。元数据（称为"PCM100 metadata"）使用键值 (KV) 对进行设置。有关实现详细信息，可查看 `set_agm_audio_intf_metadata` API，位置为： *`build-qcom-wayland/workspace/sources/agm/opensource/agm/plugins/tinyalsa/test/agmmixer.c`*

    /**
     * Key Vector pair
     */
    struct agm_key_value {
        uint32_t key; /**< key */
        uint32_t value; /**< value */
    };
    /*Sample allocation for the key value pair*/
    gkv = calloc(num_gkv, sizeof(struct agm_key_value));
    ckv = calloc(num_ckv, sizeof(struct agm_key_value));
    Copy to clipboard

按照此搭建顺序实现和执行音频用例。基于 TinyALSA 的 agmplay 和 agmcap 实用工具的示例代码可以在以下位置找到：

build-qcom-wayland/workspace/sources/agm/opensource/agm/plugins/tinyalsa/test。
1. 设置音频接口（后端）设备配置，包括采样率、通道、格式和数据格式。

        'CODEC_DMA-LPAIF_WSA-RX-0 rate ch fmt' 48000 2 2(PCM_16)Copy to clipboard
2. 设置元数据，包括图形键、设备的校准键和 DevicePP。

        'CODEC_DMA-LPAIF_WSA-RX-0 metadata' bytesCopy to clipboard
3. 设置控件，以表明后续混音器配置将设置 Stream 和 StreamPP 子图的元数据。零表示后续命令用于流。

        'PCM100 control' Zero
        'PCM100 metadata' bytes
        Copy to clipboard
4. 设置控件，以表明后续混音器配置将设置 DevicePP 和流 Device 子图的元数据。`Codec_DMC-LPAIF_WSA-RX-0` 表明后续命令用于流设备。`CODEC_DMA-LPAIF_WSA-RX-0` 是在 ALSA ASOC 框架中注册的音频接口之一。所有音频接口的列表可以在 /proc/asound/pcm 中找到。

        'PCM100 control' CODEC_DMA-LPAIF_WSA-RX-0 
        'PCM100 metadata' bytes
        Copy to clipboard
5. 检索与流和音频接口之间的给定会话关联的所有标签、模块 ID 和实例 ID。

        'PCM100 getTaggedInfo' bytesCopy to clipboard
6. 设置控件，以表明后续混音器配置将设置Stream 子图上模块的参数。

        'PCM100 control' Zero 
        'PCM100 setParam' bytes
        Copy to clipboard
7. 设置控件，以表明后续混音器配置将设置 StreamDevice 和 DevicePP 子图上模块的参数。

        'PCM100 control' CODEC_DMA-LPAIF_WSA-RX-0
        'PCM100 setParam' bytes 
        Copy to clipboard
8. 将前端（流）与后端（编解码器/音频接口）连接。

        'PCM100 connect'CODEC_DMA-LPAIF_WSA-RX-0Copy to clipboard
9. 对通信 PCM 设备进行初始化。

        pcm_openCopy to clipboard
10. 准备用于输入和输出操作的音频设备。

        pcm_prepareCopy to clipboard
11. 启动 PCM 音频设备进行输入/输出操作。

        pcm_startCopy to clipboard
12. 从音频 PCM 设备写入/读取音频数据。

        pcm_write/pcm_readCopy to clipboard
13. 停止 PCM 设备进行进一步的输入/输出操作。

        pcm_stopCopy to clipboard
14. 关闭 PCM 音频设备。

        pcm_closeCopy to clipboard

可以使用以下命令获取虚拟设备的所有混音器控件。

    ssh root@ip-addr
    systemctl stop pulseaudio
    tinymix set -D 100
    Copy to clipboard

## TinyALSA 级别播放和录制测试

**录制**

1. 要使用 TinyALSA 验证录制功能，请执行以下操作：

        ssh root@ip-addr
        systemctl stop pulseaudio
        tinymix set 'VA DMIC MUX0' DMIC0
        tinymix set 'VA_AIF1_CAP Mixer DEC0' 1
        tinymix set 'VA_DEC0 Volume' 100
        agmcap /opt/test.wav -D 100 -d 101 -c 1 -r 48000 -b 16 -i CODEC_DMA-LPAIF_VA-TX-0 -dkv 0xA3000004 -skv 0xB1000009 -dppkv 0 -ikv 0 -T 10
        Copy to clipboard
2. 要拉取录制的文件，在主机上运行以下命令：

        scp root@[ip-addr]:/data/test.wavCopy to clipboard

**播放**

1. 要执行播放，首先使用以下命令将 .wav 文件推送到设备：

        scp test.wav root@[ip-addr]:/data/Copy to clipboard
2. 执行以下命令，启动播放：

        ssh root@ip-addr 
        mount -o remount,rw /
        systemctl stop pulseaudio
        scp test.wav root@[ip-addr]:/data/
        ssh root@ip-addr
        tinymix set 'SpkrLeft PA Volume' 20
        tinymix set 'WSA RX0 MUX' AIF1_PB
        tinymix set 'WSA_RX0 INP0' RX0
        tinymix set 'WSA_COMP1 Switch' 1
        tinymix set 'SpkrLeft WSA MODE' 0
        tinymix set 'SpkrLeft COMP Switch' 1
        tinymix set 'SpkrLeft BOOST Switch' 1
        tinymix set 'SpkrLeft DAC Switch' 1
        tinymix set 'SpkrLeft VISENSE Switch' 0
        tinymix set 'WSA_RX0 Digital Volume'  85
        tinymix set 'SpkrRight WSA MODE' 0
        tinymix set 'SpkrRight PA Volume' 20
        tinymix set 'WSA RX1 MUX' AIF1_PB
        tinymix set 'WSA_RX1 INP0' RX1
        tinymix set 'WSA_COMP2 Switch' 1
        tinymix set 'SpkrRight COMP Switch' 1
        tinymix set 'SpkrRight BOOST Switch' 1
        tinymix set 'SpkrRight DAC Switch' 1
        tinymix set 'SpkrRight VISENSE Switch' 0
        tinymix set 'WSA_RX1 Digital Volume'  85
        agmplay /opt/test.wav -D 100 -d 100 -i CODEC_DMA-LPAIF_WSA-RX-0
        Copy to clipboard

**Parent Topic:** [API 和示例程序](https://docs.qualcomm.com/doc/80-70014-16Y/topic/apis_and_sample_apps.html)

Last Published: Aug 27, 2024

[Previous Topic
平台适配层 (PAL)](https://docs.qualcomm.com/bundle/publicresource/80-70014-16Y/topics/platform_adaptation_layer_pal.md) [Next Topic
软件](https://docs.qualcomm.com/bundle/publicresource/80-70014-16Y/topics/software.md)