T113 音频播放

Audio Codec

Posted by LXG on November 4, 2023

Linux_Audio_开发指南.pdf

音频基础

  1. 采样频率(sample rate):录音设备在一秒钟内对声音信号的采样次数。
  2. 通道数(channel):分为单声道mono;立体声stereo。两个声道,说明只有左右两边有声音传过来。
  3. 比特率(bitrate):也叫码率。针对编码格式,表示压缩编码后每秒的音频数据量大小。计算公式:比特率 = 采样率 x 采样精度 x 声道数。单位kbps。
  4. 量化位数:指每个采样点里传输的数字信号次数,一般有8位、16位、32位等。S3C2440只支持8位和16位。

全志声卡

在 Sunxi 中,从 Linux 软件上通常存在 4 类音频设备。分别为 audiocodec,daudio,dmic,spdif

音频硬件框架图

audio_hardware_arch

AudioCodec 模块

芯片内置音频接口

  • 支持多种采样率格式(8KHz,11.025KHz,12KHz,16KHz,22.0KHz,24KHz,32KHz,44.1KHz ,48KHz,96KHz,192KHz),其中录音最大支持 48KHz;
  • 支持同时 playback 和 record(全双工模式);
  • 支持 mixer 接口;
  • 支持 dapm 接口;
  • 支持 16bit/20bit 数据精度;
  • 支持 DAC,采样率为 8KHz~192KHz,支持差分输出;
  • 支持 ADC,采样率为 8KHz~48KHz,支持差分输入;

Daudio模块

数字音频接口,可配置成 i2s/pcm 格式标准音频接口

  • 支持多种采样率格式(8KHz,11.025KHz,16KHz,22.05KHz,24KHz,32KHz,44.1KHz,48KHz,88.2KHz,96KHz,176.4KHz,192KHz)
  • 支持 mono 和 stereo 模式,支持 1-8 通道;
  • 支持同时 playback 和 record(全双工模式);
  • 支持 i2s、pcm 协议格式配置;
  • 支持 16bit/24bit/32bit 数据精度;

DMIC 模块

外置数字 MIC 接口

  • 支持多种采样率格式(8KHz,11.025KHz,16KHz,22.05KHz,24KHz,32KHz,44.1KHz,48KHz)
  • 最多支持 8 通道;
  • 只支持 record;
  • 支持 64 OSR 以及 128 OSR;
  • 支持 16bit/24bit 数据精度

S/PDIF 模块功能

外置音响音频设备接口,一般使用同轴电缆或光纤接口

  • 支持多种采样率格式 (44.1KHz,48KHz,96KHz,192KHz);
  • 支持单声道和立体声输出;
  • 支持 16bit/20bit/24bit 数据精度

查看声卡


sh-4.4# cat /proc/asound/cards                      
 0 [audiocodec     ]: audiocodec - audiocodec
                      audiocodec


sh-4.4# ls -al dev/snd/
total 0
drwxr-xr-x    3 root     root           140 Jan  1 00:00 .
drwxr-xr-x   12 root     root          2660 Jan  1 00:00 ..
drwxr-xr-x    2 root     root            60 Jan  1 00:00 by-path
crw-rw----    1 root     root      116,   0 Jan  1 00:00 controlC0
crw-rw----    1 root     root      116,  24 Jan  1 00:00 pcmC0D0c
crw-rw----    1 root     root      116,  16 Jan  1 00:00 pcmC0D0p
crw-rw----    1 root     root      116,  33 Jan  1 00:00 timer

声卡驱动


t113_linux/kernel/linux-5.4/sound/soc/sunxi$ tree -L 2
.
├── Kconfig
├── Makefile
├── sun20iw1-codec.c
├── sun20iw1-codec.h
├── sun20iw1-sndcodec.c
├── sun4i-codec.c
├── sun4i-i2s.c
├── sun4i-spdif.c
├── sun50i-codec-analog.c
├── sun50iw10-codec.c
├── sun50iw10-codec.h
├── sun50iw10-sndcodec.c
├── sun50iw12-codec.c
├── sun50iw12-codec.h
├── sun50iw12-sndcodec.c
├── sun8i-adda-pr-regmap.c
├── sun8i-adda-pr-regmap.h
├── sun8i-codec-analog.c
├── sun8i-codec.c
├── sun8iw20-codec.c                     // Sunxi平台具体芯片codec解码器代码
├── sun8iw20-codec.h
├── sun8iw20-sndcodec.c
├── sunxi-daudio.c
├── sunxi-daudio.h
├── sunxi-dmic.c
├── sunxi-dmic.h
├── sunxi-dummy-cpudai.c
├── sunxi-hdmi.c
├── sunxi-pcm.c
├── sunxi-pcm.h
├── sunxi-rpaf
│   ├── component
│   └── sunxi-hifi
├── sunxi-rx-sync.c
├── sunxi-rx-sync.h
├── sunxi-simple-card.c
├── sunxi_sound_log.h
├── sunxi-spdif.c
└── sunxi-spdif.h

音频软件框架图

audio_software_arch

为了更好地支持嵌入式处理器和移动设备中的音频 codec 的一套软件体系,ASOC 将音频系统分为 3 部分:Machine,Platform 和 Codec。

Codec 驱动

ASoC 中的一个重要设计原则就是要求 Codec 驱动是平台无关的,它包含了一些音频的控件(Controls),音频接口,DAMP(动态音频电源管理)的定义和某些 Codec IO 功能。 为了保证硬件无关性,任何特定于平台和机器的代码都要移到 Platform 和 Machine 驱动中。

Platform 驱动

它包含了该 SoC 平台的音频 DMA 和音频接口的配置和控制(I2S,PCM 等等);一般不包含与板子或 codec 相关的代码。

Machine 驱动

单独的 Platform 和 Codec 驱动是不能工作的,它必须由 Machine 驱动把它们结合在一起才能完成整个设备的音频处理工作。

音频播放命令 aplay

aplay -Dhw:audiocodec -vvv rp_test/test.wav


sh-4.4# aplay -Dhw:audiocodec -vvv rp_test/test.wav 
Playing WAVE 'rp_test/test.wav' : Signed 16 bit Little Endian, Rate 44100 Hz, Stereo
Hardware PCM card 0 'audiocodec' device 0 subdevice 0
Its setup is:
  stream       : PLAYBACK
  access       : RW_INTERLEAVED
  format       : S16_LE
  subformat    : STD
  channels     : 2
  rate         : 44100
  exact rate   : 44100 (44100/1)
  msbits       : 16
  buffer_size  : 22052
  period_size  : 5513
  period_time  : 125011
  tstamp_mode  : NONE
  tstamp_type  : MONOTONIC
  period_step  : 1
  avail_min    : 5513
  period_event : 0
  start_threshold  : 22052
  stop_threshold   : 22052
  silence_threshold: 0
  silence_size : 0
  boundary     : 1445199872
  appl_ptr     : 0
  hw_ptr       : 0

./buildroot/buildroot-201902/package/alsa-utils

./out/t113/evb1_auto/longan/buildroot/target/usr/bin/aplay

音频播放命令 tinyplay

tinyplay rp_test/test.wav

tinyplay -v 50 rp_test/test.wav