APP下载

ALSA声卡驱动程序设计

2016-10-19

无线互联科技 2016年17期
关键词:声卡采集卡驱动程序

宋 刚

(重庆城市管理职业学院,重庆 401331)

ALSA声卡驱动程序设计

宋刚

(重庆城市管理职业学院,重庆401331)

文章介绍了Linux 操作系统中负责声音处理的ALSA音频子系统,以及它包含的声卡驱动程序和编程步骤。通过对声卡设备的驱动程序实例分析,文章总结出ALSA声卡设备驱动的通用编程框架。

ALSA;驱动程序;音频子系统

1 ALSA介绍

高级Linux声音架构(Advanced Linux Sound Architecture, ALSA)是Linux操作系统内核中,用来为声音设备提供编程辅助和硬件驱动的子系统。如图1所示,它包含两个组成部分,一个是在用户空间中用来简化编程的ALSA-Lib函数库。功能是用户请求转换为对内核空间中设备字符文件的调用。另外一个是在内核空间中负责硬件控制的驱动程序。它通过对设备字符设备的注册与回调,实现ALSA驱动核心(core.c, pcm.c)。核心再通过回调具体声卡的ALSA驱动,实现对声卡硬件的操作。

图1 ALSA音频驱动结构层次

文章通过一个只包含话音采集功能的PCI总线声卡,来描述内核中ALSA驱动程序的调用步骤和编程框架。具体可分为声卡记录的创建,PCM设备的创建,PCM操作函数的建立3个部分。

2 ALSA声卡记录的创建流程

这里假设声卡的Linux内核模块(Module)框架和PCI总线结构初始化已经完成。这两部分通用结构可由《Linux设备驱动程序》一书中详细给出,本文只关注书中欠缺的ALSA驱动部分。

2.1声卡记录的创建

声卡记录是整个驱动的核心,所有与声卡相关的数据结构和控制代码都保存在声卡记录名下。它的具体结构定义在include/sound/core.h,由函数snd_card_create()来创建和初始化,如图2所示。

图2 声卡的创建

idx:声卡的编号,如为1,则由系统自动分配。

xid:声卡标识符,如为NULL,则以snd_card的shortname或longname代替。

0:声卡私有数据区大小。

card_ret:返回所创建的声卡实例的指针。

2.2设置驱动名和设备号等信息(见图3)

图3 设置驱动程序信息

图3创建了声卡驱动程序名,还有声卡的短描述符和长描述符,以及使用的PCI总线信息。因为用户空间编程时ALSA-LIB需要明确调用的声卡名称,所以声卡的命名必须具备关键字特性。

2.3声卡的私有数据注册为一个低阶设备

这样做的目的在于当声卡被注销时,芯片私有数据所占用的内存可以随着声卡的注销被自动地释放。如图4所示,私有数据为空。

图4 将专有数据注册为一个低阶设备

2.4声卡的注册和注销(见图5)

图5 向ALSA注册声卡

注册成功会生产色卡的设备文件,一般是dev/snd/ pcmCxxDxxp,pcmCxxDxxc,供用户空间中的ALSALib库调用。如果注册失败,可通过snd_card_free函数释放声卡所占有的所有资源。

3 创建PCM设备

通常一块声卡包含多个功能设备,如PCM,Control,Mixer,MIDI等。为便于学习,这里只讨论声卡中必须拥有的PCM设备。在ALSA驱动框架中,每块声卡最多可以包含4个PCM设备。PCM设备由一个Playback stream和一个Capture stream组成,每个Stream又由一个或多个Substreams组成。

3.1声卡中采集PCM设备硬件描述信息(见图6)

图6 采集卡硬件描述

该声卡设备硬件为一简单话音采集卡。结构体中定义了使用U8格式的PCM编码,采样率为8KHz,单声道,缓存区大小为48页,每页32个字节。

3.2创建PCM设备(见图7)

图7 PCM设备的创建

第三个参数,表示声卡第一个PCM设备,从0开始计算。

第四个参数,表示P C M设备有几个回放子流substream,本例中为0。

第五个参数nr_subdevs,为PCM设备下采集子流数量。

3.3定义PCM设备操作函数(见图8)

图8 PCM操作函数定义

该采集卡中的PCM设备只有Capture stream。一般声卡中PCM Playback stream的设计与之相似。函数参数中的my_pcm_ops是函数的操作结构体地址,该操作函数集定义如图9所示。

图9 操作函数集

该函数操作集的操作需要使用snd_pcm_sucstream_ chip()来获得操作指针。具体功能为:open(),在PCM子流打开时分配相应的资源;close(),在PCM之流关闭时释放相应的资源。

ioctl(),完成一些特殊的控制功能;hw_params(),完成硬件参数的设置,如数据格式、缓冲大小等;hw_ free(),用来释放hw_params()函数占用的系统资源;prepare(),在PCM子流开始传输数据前,需要完成的操作;trigger(),在PCM子流开始、停止、暂停时被调用;pointer(),给出当前PCM之流缓冲区地址;copy(),提供内存空间管理需要的数据拷贝功能。下一步是编写单个函数的实现,如图10所示。

图10 操作函数实现

3.4 为操作函数预分配缓冲空间(见图11)

图11 分配DMA缓冲数据区

需要注意的是对缓冲空间的数据填充一定要采用DMA方式存取,否则数据的接收有可能产生中断现象。

3.5PCM子流中断的处理

最后是添加中断处理函数。中断处理的作用是当缓冲区传输完成、硬件复位、总线操作的时候通知PCM中间层。可以通过调用函数snd_pcm_period_elapsed()来通知。中断请求代码为 snd_pcm_period_elapsed(my_ dev->ss)。

4 结语

本文介绍了一个简单的声卡设备的ALSA驱动编制流程,详细地讨论了ALSA架构中驱动程序的架构与编程框架。以此为基础设计的Linux平台多路话音采集卡ALSA驱动程序已用于实践教学中。从学习效果反馈上看,该驱动框架对ALSA架构音频驱动的学习和深入研究具备一定的指导意义。

[1]ALSA development team.ALSA开源项目[EB/OL].(2016-09-15)[2013-10-31].http://www.alsa-project.org/.

[2]TAKASHI IWAI.Writing an ALSA Driver[EB/OL].(2016-09-10)[2005-02-10].http://www.alsa-project.org/~tiwai/writing-an-alsa-driver/.

[3]科波特.Linux设备驱动程序[M].3版.魏永明,耿岳,钟书毅,译.北京:中国电力出版社,2006.

Design of ALSA sound card driver

Song Gang
(Chongqing City Management College, Chongqing 401331, China)

This article described the audio subsystem which is responsible for the ALSA sound processing in Linux operating system,sound card drivers and programming steps contained in it. By the analysis of sound device driver instance, the common programming framework of ALSA device driver was summed up in this paper.

ALSA; driver; audio subsystem

宋刚(1975— ),男,四川资中,专科,实验师;研究方向:计算机操作系统。

猜你喜欢

声卡采集卡驱动程序
高精度AD采集卡性能测试及评价方法研究
计算机硬件设备驱动程序分析
面向数控机床的多通道传感数据采集卡设计
并行高速采样在地震物理模拟采集中的应用
声卡数据采集系统设计方式分析
PCI-e高速数据采集卡的驱动与上位机软件设计
基于MPC8280的CPU单元与内部总线驱动程序设计