在应用层,ALSA音频设备用“plughw:x,y”表示,如“hw:0,0”表示第一个声卡上第一个ALSA音频设备。如果是播放,则ALSA自动将设备名转化为pcmCxDyp,如果是录音则转化为pcmCxDyc。
在介绍ALSA API函数之前,先来了解两个概念:
(1)交织与非交织音频
交织音频数据是指音频数据按帧存放,每帧包含所有声道的音频数据。双声道音频包含左右两个声道,假如L1~Ln表示左声道数据,R1~Rn表示右声道数据,16-bit双声道的交织音频流数据格式如下:
L1 R1 L2 R2 L3 R3 L4 R4 L5 R5 L6 R6 L7 R7 L8 R8 L9 R9…Ln Rn
音频按照周期(period)来存储与处理。
非交织音频数据指一个周期内,音频数据按照声道来存放,例如在双声道情况下,先放左声道数据,后放右声道数据。周期的单位为音频帧。假设周期为n帧,16-bit双声道的非交织音频流数据格式如下:
L1 L2 L3 L4 L5 L6 L7 L8 L9…Ln R1 R2 R3 R4 R5 R6 R7 R8 R9…Rn
(2)数据传送模式
ALSA支持两种数据传送模式:
1)常规模式:使用读写函数如snd_pcm_write和snd_pcm_read操作数据。
2)内存映射模式:直接将数据写到一个映射后的内存地址。
下面介绍ALSA API函数。
PCM硬件设备参数结构(snd_pcm_hw_params_t)的设置和初始化的函数有:
数据传送模式(snd_pcm_access_t)包括四种:
●SND_PCM_ACCESS_MMAP_INTERLEAVED:内存映射和交织
●SND_PCM_ACCESS_MMAP_NONINTERLEAVED:内存映射和非交织(www.xing528.com)
●SND_PCM_ACCESS_RW_INTERLEAVED:常规模式和交织
●SND_PCM_ACCESS_RW_NONINTERLEAVED:常规模式和非交织
snd_pcm_hw_params_set_format用来设置数据格式,主要控制输入的音频数据的类型、无符号还是有符号、是little-endian还是big-endian。
snd_pcm_hw_params_set_channels设置音频设备的声道,常见的就是单声道和立体声,如果是立体声,最后一个参数val为2。
snd_pcm_hw_params_set_rate_near设置音频数据的最接近目标的采样率。
snd_pcm_open函数打开PCM设备:
int snd_pcm_open(snd_pcm_t**pcm,const char*name,snd_pcm_stream_t stream,int mode);
snd_pcm_hw_params函数用来设置PCM音频设备的参数:
int snd_pcm_hw_params(snd_pcm_t*pcm,snd_pcm_hw_params_t*params);
PCM音频设备的读写接口函数如下:
Alsalib库设备打开函数为snd_pcm_open,打开设备后可以对设备设置参数,最后读写数据。所有参数先存放到snd_pcm_hw_params_t结构中,设置好snd_pcm_hw_params_t结构后,将参数整体写入设备驱动。参数设置完毕就可以调用snd_pcm_writei和snd_pcm_readi进行音频数据读写了。
例15.1 基本的ALSA音频回环实例
代码见\samples\15alsa\15-1loop。音频初始化代码如下:
主线程负责音频采集,并将数据送给播放缓冲。代码如下:
音频播放线程从音频缓冲获取数据并播放,代码如下:
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。