alsa&tinyalsa

一、alsa&tinyalsa介绍

ALSA(Advanced Linux Sound Architecture)是一个开源项目,涵盖了用户空间和内核空间对音频设备的操作接口,通过应用层使用alsalib可以实现对音频设备的控制

TinyAlsa是android推出的一个精简的ALSA库,当然alsa-driver这块没有改动

alsa包含:1、内核 alsa-driver 2.用户空间 alsa-lib(android使用的TinyAlsa)

二、查看声卡和pcm设备

1、查看当前的声卡:

cat /proc/asound/cards

2、查看pcm设备列表:

cat /proc/asound/pcm

3、查看当前有哪些进程占用了pcm设备节点

lsof |grep pcm

4、查看有哪些音频设备节点

ls /dev/snd/

音频设备的命名规则为 [device type]C[card index]D[device index][capture/playback],即名字中含有4部分的信息:

device type

设备类型,通常只有comtrol/pcm这2种。从上图可以看到声卡会管理很多设备,PCM设备只是其中的一种设备。

card index

声卡的id,代表第几块声卡。通常都是0,代表第一块声卡。手机上通常都只有一块声卡。

device index

设备的id,代表这个设备是声卡上的第几个设备。设备的ID只和驱动中配置的DAI link的次序有关。如果驱动没有改变,那么这些ID就是固定的。

capture/playback

只有PCM设备才有这部分,只有c和p两种。c代表capture,说明这是一个提供录音的设备,p代表palyback,说明这是一个提供播放的设备。

系统会在/proc/asound/pcm文件中列出所有的音频设备的信息,如果是肉眼查看,cat /proc/asound/pcm中的信息会更直观一些。

三、tinyalsa的使用

1、编译tinyalsa

aosp/external/tinyalsa$ mma

编译完后就生成tinyplay、tinymix、tinycap等工具。

xxxx/aosp/out/target/product/ecarxICp1_64/system/bin$ ls tiny*
tinycap  tinyhostless  tinymix  tinypcminfo  tinyplay

将生成的这些可执行bin文件拷贝到开发板的/system/bin下,并加可执行权限。

xxxx:/system/bin $ ls tiny* -l                                                                                                                                                
-rwxr-xr-x 1 root shell 68488 2021-12-06 22:56 tinycap
-rwxr-xr-x 1 root shell 68408 2021-12-06 22:56 tinyhostless
-rwxr-xr-x 1 root shell 68656 2021-12-06 22:56 tinymix
-rwxr-xr-x 1 root shell 68448 2021-12-06 22:56 tinypcminfo
-rwxr-xr-x 1 root shell 68408 2021-12-06 22:56 tinyplay

2、tinyplay

tinyplay只能播放wav格式的音频文件 :

:/sdcard # tinymix |  grep -E "V01|SRC3"
33      ENUM    1       xxxxx Audio Noise Clean Type             V01
97      ENUM    1       SRC3 Sync Domain                         SD3
199     ENUM    1       SRC3 Digital Filter                      HF
203     ENUM    1       SRC3 Group Delay Matching                Disable
207     BOOL    1       SRC3 Soft Mute                           Off
211     ENUM    1       SRC3 Soft Mute Mode                      Manual
215     BOOL    1       SRC3 Lock Signal Output                  Off
219     BOOL    1       SRC3 Lock Status                         On
223     BOOL    1       SRC3 Overflow Status                     Off
522     ENUM    1       SRC3 Source Selector                     SDIN2

3、tinymix

直接输入tinymix可以得到音频通路相关的各项配置参数。也可以通过添加参数修改其中的配置。

:/sdcard # tinymix |  grep -E "V01|SRC3"
33      ENUM    1       xxxxx Audio Noise Clean Type             V01
97      ENUM    1       SRC3 Sync Domain                         SD3
199     ENUM    1       SRC3 Digital Filter                      HF
203     ENUM    1       SRC3 Group Delay Matching                Disable
207     BOOL    1       SRC3 Soft Mute                           Off
211     ENUM    1       SRC3 Soft Mute Mode                      Manual
215     BOOL    1       SRC3 Lock Signal Output                  Off
219     BOOL    1       SRC3 Lock Status                         On
223     BOOL    1       SRC3 Overflow Status                     Off
522     ENUM    1       SRC3 Source Selector                     SDIN2
:/ # tinymix 33                                                                
Ecarx Audio Noise Clean Type: SW Baidu >V01

设置:

:/ # tinymix 33 SW

再查看:

127|:/ # tinymix | grep 33                                                     
33      ENUM    1       xxxxx Audio Noise Clean Type             SW
:/ # tinymix 33
xxxxx Audio Noise Clean Type: >SW Baidu V01
:/ # tinymix | grep SRC3                                                       
97      ENUM    1       SRC3 Sync Domain                         SD3
199     ENUM    1       SRC3 Digital Filter                      HF
203     ENUM    1       SRC3 Group Delay Matching                Disable
207     BOOL    1       SRC3 Soft Mute                           Off
211     ENUM    1       SRC3 Soft Mute Mode                      Manual
215     BOOL    1       SRC3 Lock Signal Output                  Off
219     BOOL    1       SRC3 Lock Status                         On
223     BOOL    1       SRC3 Overflow Status                     Off
522     ENUM    1       SRC3 Source Selector                     ADC1

4、tinycap

接上mic就可以录音了:

:/ # tinycap /sdcard/456.wav -d 1                                              
Capturing sample: 2 ch, 44100 hz, 16 bit
^CCaptured 307200 frames

5、tinypcminfo

tinypcminfo用于查看pcm通道的相关信息:

xxxx:/storage/emulated/0/Music # tinypcminfo -D /proc/asound/cards
Info for card 0, device 0:
 
PCM out:
      Access:	0x000009
   Format[0]:	0x000ccc
   Format[1]:	00000000
 Format Name:	S16_LE, S16_BE, S24_LE, S24_BE, S32_LE, S32_BE
   Subformat:	0x000001
        Rate:	min=8000Hz	max=192000Hz
    Channels:	min=1		max=2
 Sample bits:	min=16		max=32
 Period size:	min=0		max=24576
Period count:	min=1		max=16
 
PCM in:
cannot open device '/dev/snd/pcmC0D0c'
Device does not exist.

也可以直接带上声卡和设备信息来查看:

如:device id:0,表示playback

:/ # tinypcminfo -D 0 -d 0                                                     
Info for card 0, device 0:
 
PCM out:
      Access:   0x000009
   Format[0]:   0x000ccc
   Format[1]:   00000000
 Format Name:   S16_LE, S16_BE, S24_LE, S24_BE, S32_LE, S32_BE
   Subformat:   0x000001
        Rate:   min=8000Hz      max=192000Hz
    Channels:   min=1           max=2
 Sample bits:   min=16          max=32
 Period size:   min=0           max=24576
Period count:   min=1           max=16
 
PCM in:
cannot open device '/dev/snd/pcmC0D0c'
Device does not exist.

如:device id:1,表示capture

:/ # tinypcminfo -D 0 -d 1                                                     
Info for card 0, device 1:
 
PCM out:
cannot open device '/dev/snd/pcmC0D1p'
Device does not exist.
 
PCM in:
      Access:   0x000009
   Format[0]:   0x000ccc
   Format[1]:   00000000
 Format Name:   S16_LE, S16_BE, S24_LE, S24_BE, S32_LE, S32_BE
   Subformat:   0x000001
        Rate:   min=8000Hz      max=192000Hz
    Channels:   min=1           max=4
 Sample bits:   min=16          max=32
 Period size:   min=0           max=24576
Period count:   min=1           max=49152

从上面获得的信息中可以知道PCM的采样率,通道个数,采样点数等信息。

6、tinyhostless

tinyhostless用于回环测试,可以测试PCM音频从输入到输出之间的通路和时间。

测试命令

tinyhostless -P playback_dev -C capture_dev -p period_size -n count -c channels -r Rate loopback

tinyhostless -P 0 -C 0 -p 160 -n 2 -c 8 -r 16000 -l

四、TinyalsaAPI

ALSA API说明:

 ALSA project - the C library reference: Modules (alsa-project.org) 

五、Tinyalsa流程

Tinyplay流程:

Tinycap流程:

以下是将TinyALSA转换为ALSA SoC驱动程序的示例代码: 1. 定义硬件描述符 ``` static struct snd_soc_dai_driver my_dai = { .name = "my_dai", .playback = { .stream_name = "Playback", .channels_min = 1, .channels_max = 2, .rates = SNDRV_PCM_RATE_8000_48000, .formats = SNDRV_PCM_FMTBIT_S16_LE, }, .capture = { .stream_name = "Capture", .channels_min = 1, .channels_max = 2, .rates = SNDRV_PCM_RATE_8000_48000, .formats = SNDRV_PCM_FMTBIT_S16_LE, }, }; ``` 2. 注册SoC驱动程序 ``` static int my_probe(struct platform_device *pdev) { int ret; ret = snd_soc_register_dai(&pdev->dev, &my_dai); if (ret) { dev_err(&pdev->dev, "Failed to register DAI: %d\n", ret); return ret; } return 0; } static int my_remove(struct platform_device *pdev) { snd_soc_unregister_dai(&pdev->dev); return 0; } static const struct of_device_id my_of_match[] = { { .compatible = "my,codec" }, {}, }; MODULE_DEVICE_TABLE(of, my_of_match); static struct platform_driver my_driver = { .driver = { .name = "my-driver", .owner = THIS_MODULE, .of_match_table = my_of_match, }, .probe = my_probe, .remove = my_remove, }; module_platform_driver(my_driver); ``` 3. 在SoC DAI中实现PCM操作 ``` static int my_dai_playback_trigger(struct snd_pcm_substream *substream, int cmd) { struct snd_soc_pcm_runtime *rtd = substream->private_data; struct snd_soc_dai *codec_dai = rtd->codec_dai; struct snd_soc_dai *cpu_dai = rtd->cpu_dai; switch (cmd) { case SNDRV_PCM_TRIGGER_START: // 实现开始播放的操作 break; case SNDRV_PCM_TRIGGER_STOP: // 实现停止播放的操作 break; } return 0; } static int my_dai_playback_prepare(struct snd_pcm_substream *substream) { return 0; } static struct snd_soc_ops my_dai_ops = { .trigger = my_dai_playback_trigger, .prepare = my_dai_playback_prepare, }; static struct snd_soc_dai_driver my_dai = { .name = "my_dai", .playback = { .stream_name = "Playback", .channels_min = 1, .channels_max = 2, .rates = SNDRV_PCM_RATE_8000_48000, .formats = SNDRV_PCM_FMTBIT_S16_LE, }, .ops = &my_dai_ops, }; ``` 以上是将TinyALSA转换为ALSA SoC驱动程序的示例代码,其中包括定义硬件描述符、注册SoC驱动程序、在SoC DAI中实现PCM操作等步骤。开发者可以根据自己的需求进行修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值