首页 理论教育 Linux驱动程序开发实例:ALSA应用编程接口

Linux驱动程序开发实例:ALSA应用编程接口

时间:2023-10-19 理论教育 版权反馈
【摘要】:在应用层,ALSA音频设备用“plughw:x,y”表示,如“hw:0,0”表示第一个声卡上第一个ALSA音频设备。如果是播放,则ALSA自动将设备名转化为pcmCxDyp,如果是录音则转化为pcmCxDyc。Rn数据传送模式ALSA支持两种数据传送模式:1)常规模式:使用读写函数如snd_pcm_write和snd_pcm_read操作数据。下面介绍ALSA API函数。例15.1 基本的ALSA音频回环实例代码见\samples\15alsa\15-1loop。

Linux驱动程序开发实例:ALSA应用编程接口

应用层,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。音频初始化代码如下:

线程负责音频采集,并将数据送给播放缓冲。代码如下:

音频播放线程从音频缓冲获取数据并播放,代码如下:

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈