没有合适的资源?快使用搜索试试~ 我知道了~
音频设备驱动
需积分: 0 2 下载量 160 浏览量
2012-07-27
14:08:04
上传
评论
收藏 87KB DOC 举报
温馨提示
试读
19页
音频设备驱动开发必备资料:在Linux中,先后出现了音频设备的两种框架OSS和ALSA,本节将在介绍数字音频设备及音频设备硬件接口的基础上,展现OSS和ALSA驱动的结构。
资源详情
资源评论
资源推荐
本章导读
在 中,先后出现了音频设备的两种框架 和 ,本节将在介绍数字音频设备及音频设备硬件
接口的基础上,展现 和 驱动的结构。
音频编解码器是数字音频系统的核心,衡量它的指标主要有:
采样频率
采样的过程就是将通常的模拟音频信号的电信号转换成二进制码 和 的过程,这些 和 便构成了数字
音频文件。如图 中的正弦曲线代表原始音频曲线,方格代表采样后得到的结果,二者越吻合说明采
样结果越好。
采样频率是每秒钟的采样次数,我们常说的采样频率就是每秒钟采样 次。理论上采样频
率越高,转换精度越高,目前主流的采样频率是 。
量化精度
量化精度是指对采样数据分析的精度,比如 量化精度就是是将标准电平信号按照 的 次方进行分
析,也就是说将图 中的纵坐标等分为 等分。量化精度越高,声音就越逼真。
音频设备硬件接口
接口
针对不同的数字音频子系统,出现了几种微处理器或 与音频器件间用于数字转换的接口。
最简单的音频接口是 (脉冲编码调制)接口,该接口由时钟脉冲()、帧同步信号( )及
接收数据()和发送数据()组成。在 信号的上升沿,数据传输从 ( !"#$%
)字开始, 频率等于采样率。 信号之后开始数据字的传输,单个的数据位按顺序进行传输, 个
时钟周期传输 个数据字。发送 时,信号的等级首先降到最低,以避免在不同终端的接口使用不同
的数据方案时造成 的丢失。
接口很容易实现,原则上能够支持任何数据方案和任何采样率,但需要每个音频通道获得一个独立
的数据队列。
&& 接口
&& 接 口 ( &'()& * ) 在 世 纪 年 代 首 先 被 飞 利 浦 用 于 消 费 音 频 , 并 在 一 个 称 为
('#+",)的信号机制中经过多路转换,将两路音频信号变成单一的数据队列。当
为高时,左声道数据被传输; 为低时,右声道数据被传输。与 相比,&& 更适合于立
体声系统。对于多通道系统,在同样的 和 条件下,并行执行几个数据队列也是可能的。
-. 接口
/.(* *'$..)是以 &'0 为首的五个 厂商 &'0、('%1'%!、2、%0 "'1$'
与 3%4%,% 共同提出的规格标准。与 和 && 不同,/. 不只是一种数据格式,用于音频编码的内
部架构规格,它还具有控制功能。/. 采用 ) 与外部的编解码器相连,) 接口包括位时钟
( &5 ) 、 同 步 信 号 校 正 ( 32 ) 和 从 编 码 到 处 理 器 及 从 处 理 器 中 解 码 ( 5&2 与
565)的数据队列。/. 数据帧以 32 脉冲开始,包括 个 位时间段(时间段为标准中
定义的不同的目的服务)及 7 位“%"8段,共计 97 个数据序列。例如,时间段“8和“8用于访问编码的控
制寄存器,而时间段“-8和“8分别负载左、右两个音频通道。“%"8段表示其他段中哪一个包含有效数据。
把帧分成时间段使传输控制信号和音频数据仅通过 根线到达 . 个音频通道或转换成其他数据流成为可能。
与具有分离控制接口的 && 方案相比,/. 明显减少了整体管脚数。一般来说,/.编解码器采用
5: 封装,如图 - 所示。
图 -. *'$ 芯片
、&& 和 . 各有其优点和应用范围,例如在 、、- 随身听多采用 && 接口,移动电话会
采用 接口,具有音频功能的 则多使用和 一样的 /. 编码格式。
- 音频设备驱动
- 驱动的组成
标准中有 个最基本的音频设备:4'((混音器)和 (数字信号处理器)。
在声卡的硬件电路中,4'( 是一个很重要的组成部分,它的作用是将多个信号组合或者叠加在一起,对
于不同的声卡来说,其混音器的作用可能各不相同。 驱动中,+*'1+4'( 设备文件是应用程序对
4'( 进行操作的软件接口。
混音器电路通常由两个部分组成:输入混音器(;4'()和输出混音器( ;4'()。输入混音
器负责从多个不同的信号源接收模拟信号,这些信号源有时也被称为混音通道或者混音设备。模拟信号通
过增益控制器和由软件控制的音量调节器后,在不同的混音通道中进行级别(0'1'0)调制,然后被送到输
入混音器中进行声音的合成。混音器上的电子开关可以控制哪些通道中有信号与混音器相连,有些声卡只
允许连接一个混音通道作为录音的音源,而有些声卡则允许对混音通道做任意的连接。经过输入混音器处
理后的信号仍然为模拟信号,它们将被送到 + 转换器进行数字化处理。
输出混音器的工作原理与输入混音器类似,同样也有多个信号源与混音器相连,并且事先都经过了增益调
节。当输出混音器对所有的模拟信号进行了混合之后,通常还会有一个总控增益调节器来控制输出声音的
大小,此外还有一些音调控制器来调节输出声音的音调。经过输出混音器处理后的信号也是模拟信号,它
们最终会被送给喇叭或者其它的模拟输出设备。对混音器的编程包括如何设置增益控制器的级别,以及怎
样在不同的音源间进行切换,这些操作通常来讲是不连续的,而且不会像录音或者放音那样需要占用大量
的计算机资源。由于混音器的操作不符合典型的读+写操作模式,因此除了 ;'<=和 $0 !'<=两个系统调用
之外,大部分的操作都是通过 $0<=系统调用来完成的。与+*'1+*!; 不同,+*'1+4'( 允许多个应用程序
同时访问,并且混音器的设置值会一直保持到对应的设备文件被关闭为止。
也称为编解码器,实现录音(录音)和放音(播放),其对应的设备文件是 +*'1+*!; 或+*'1+! *+*
!;。 声卡驱动程序提供的+*'1+*!; 是用于数字采样和数字录音的设备文件,向该设备写数据即意味
着激活声卡上的 + 转换器进行放音,而向该设备读数据则意味着激活声卡上的 + 转换器进行录音。
在从 设备读取数据时,从声卡输入的模拟信号经过 + 转换器变成数字采样后的样本,保存在声卡
驱动程序的内核缓冲区中,当应用程序通过('%*<=系统调用从声卡读取数据时,保存在内核缓冲区中的数
字采样结果将被复制到应用程序所指定的用户缓冲区中。需要指出的是,声卡采样频率是由内核中的驱动
程序所决定的,而不取决于应用程序从声卡读取数据的速度。如果应用程序读取数据的速度过慢,以致低
于声卡的采样频率,那么多余的数据将会被丢弃(即 1'(#0 >);如果读取数据的速度过快,以致高于声
卡的采样频率,那么声卡驱动程序将会阻塞那些请求数据的应用程序,直到新的数据到来为止。
在向 设备写入数据时,数字信号会经过 + 转换器变成模拟信号,然后产生出声音。应用程序写入
数据的速度应该至少等于声卡的采样频率,过慢会产生声音暂停或者停顿的现象(即 *'(#0 >)。如果
用户写入过快的话,它会被内核中的声卡驱动程序阻塞,直到硬件有能力处理新的数据为止。
与其它设备有所不同,声卡通常不需要支持非阻塞( )0 $")的 &+ 操作。即便内核 驱动提供
了非阻塞的 &+ 支持,用户空间也不宜采用。
无论是从声卡读取数据,或是向声卡写入数据,事实上都具有特定的格式( # (4%),如无符号 位、
单声道、 采样率,如果默认值无法达到要求,可以通过 $0<=系统调用来改变它们。通常说来,在
应用程序中打开设备文件+*'1+*!; 之后,接下去就应该为其设置恰当的格式,然后才能从声卡读取或者写
入数据。
-4'( 接口
('"!'(?! *?4'(<!($#0'? ;'(% !@# ;!A*'1=B
上述函数用于注册 个混音器,第 个参数 # ;! 即是文件操作接口,第 个参数 *'1 是设备编号,如果
填入),则系统自动分配 个设备编号。4'( 是 个典型的字符设备,因此编码的主要工作是实现
#0'? ;'(% ! 中的 ;'<=、 $0<=等函数。
4'( 接口 #0'? ;'(% ! 中的最重要函数是 $0<=,它实现混音器的不同 & 控制命令,代码清单 给
出了 个 $0<=的范例。
代码清单 4'(<=接口 $0<=函数范例
!%$4*'1? $0<!($ *'@ *'A!($#0'@#0'A!"'*$4*A!"'*0 "%("=
C
-DDD
DDD!>$,<$4*=
9DDDC
7DDDDD$%!'62?&E?E?&F
DDDDDDD
DDDDD$%!'62?&E?G&5E?&F
.DDDDDDD
DDDD$%!'62?&E?G&5E?EF
DDDDDD
DDDD$%!'62?&E?G&5E?65EF
-DDDDDD
DDH
9DD++其它命令
7DD('(4'(? $0<$ *'$A$4*A%("=B
H
-- 接口
('"!'(?! *?*!;<!($#0'? ;'(% !@# ;!A*'1=B
上述函数与 ('"!'(?! *?4'(<=类似,它用于注册 个 *!; 设备,第 个参数 # ;! 即是文件操作接口,
第 个参数 *'1 是设备编号,如果填入),则系统自动分配 个设备编号。*!; 也是 个典型的字符设备,
因此编码的主要工作是实现 #0'? ;'(% ! 中的('%*<=、>('<=、 $0<=等函数。
*!; 接口 #0'? ;'(% ! 中的 ('%*<=和 >('<=函数非常重要,('%*<=函数从音频控制器中获取录音数据到
缓冲区并拷贝到用户空间,>('<=函数从用户空间拷贝音频数据到内核空间缓冲区并最终发送到音频控制
器。
*!; 接口 #0'? ;'(% ! 中的 $0<=函数处理对采样率、量化精度、 缓冲区块大小等参数设置 & 控
制命令的处理。
在数据从缓冲区拷贝到音频控制器的过程中,通常会使用 , 对声卡而言非常重要。例如,在放
音时,驱动设置完 控制器的源数据地址(内存中 缓冲区)、目的地址(音频控制器 &)和
的数据长度, 控制器会自动发送缓冲区的数据填充 &,直到发送完相应的数据长度后才中
断一次。
在 驱动中,建立存放音频数据的环形缓冲区( ("##'()通常是值得推荐的方法。此外,在
驱动中,一 般 会 将 个较大的 缓冲区分成若干个 大 小 相 同 的 块 ( 这 些 块也 被 称 为 “段 ” ,即
#(%"4'),驱动程序使用 每次在声音缓冲区和声卡之间搬移一个 #(%"4'。在用户空间,可以
使用 $0<=系统调用来调整块的大小和个数。
除了 ('%*<=、>('<=和 $0<=外,*!; 接口的 ; 00<=函数通常也需要被实现,以向用户反馈目前能否读写
缓冲区。
在 驱动初始化过程中,会调用 ('"!'(?! *?*!;<=和 ('"!'(?! *?4'(<=注册 *!; 和 4'( 设
备;在模块卸载的时候,会调用如代码清单 。
代码清单 驱动初始化注册 *!; 和 4'( 设备
!%$?<1 *=
C
-DDD!($?!%'@!IJ?!%'B
DDD
9DDD++注册 *!; 设备
7DDD#<<%* ?*'1?*!;I('"!'(?! *?*!;<J?%* ?# ;!A)==K=
DDDDD" '((?*'1B
DDD++设备 4'( 设备
.DDD#<<%* ?*'1?4'(I('"!'(?! *?4'(<J?4'(?# ;!A)==K=
DDDD" '((?*'1B
DD
H
-
1 *??'?'<1 *=
9C
7++注销 *!; 和 4'( 设备接口
('"!'(?! *?*!;<%* ?*'1?*!;=B
('"!'(?! *?4'(<%* ?*'1?4'(=B
.
H
根据 - 和 -- 节的分析,可以画出一个 驱动结构的简图,如图 所示。
图 驱动结构
- 用户空间编程
、 编程
对 驱动声卡的编程使用 文件接口函数,如图 9, 接口的操作一般包括如下几个步骤:
①打开设备文件+*'1+*!;。
采用何种模式对声卡进行操作也必须在打开设备时指定,对于不支持全双工的声卡来说,应该使用只读或
者只写的方式打开,只有那些支持全双工的声卡,才能以读写的方式打开,这还依赖于驱动程序的具体实
现。 允许应用程序多次打开或者关闭与声卡对应的设备文件,从而能够很方便地在放音状态和录音
状态之间进行切换。
②如果有需要,设置缓冲区大小。
运行在 内核中的声卡驱动程序专门维护了一个缓冲区,其大小会影响到放音和录音时的效果,使用
$0<=系统调用可以对它的尺寸进行恰当的设置。调节驱动程序中缓冲区大小的操作不是必须的,如果没
有特殊的要求,一般采用默认的缓冲区大小也就可以了。如果想设置缓冲区的大小,则通常应紧跟在设备
文件打开之后,这是因为对声卡的其它操作有可能会导致驱动程序无法再修改其缓冲区的大小。
③设置声道($,%'0)数量。
根据硬件设备和驱动程序的具体情况,可以设置为单声道或者立体声。
④设置采样格式和采样频率
采样格式包括 5?6(无符号 位)、5?(有符号 位)、5?67?E(小端模式,无符
号 7 位 ) 、 5?67?E (大 端模 式 , 无 符号 7 位)、 5?EL 、 5?- 等。使用
25??E55& 控制命令可以设置采样格式。
对于大多数声卡来说,其支持的采样频率范围一般为 9 到 或者 ,但并不意味着该范围
内 的 所 有 连 续 频 率 都 会 被 硬 件 支 持 , 在 下 进 行 音 频 编 程 时 最 常 用 到 的 几 种 采 样 频 率 是
剩余18页未读,继续阅读
wunianwoaINI
- 粉丝: 0
- 资源: 5
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0