Linux上的声卡驱动分两种,一种为OSS系列,另外一种为ALSA系列。
ALSA (Advanced Linux Sound Architecture(高级Linux声音体系)的缩写) 是为声卡提供驱动的Linux内核组件。 一部分的目的是支持声卡的自动配置,以及完美的处理系统中的多个声音设备,这些目的大多都已达到。另一个声音框架JACK使用 ALSA 提供低延迟的专业级音频编辑和混音能力。ALSA是一个完全开放源代码的音频驱动程序集,而且完全兼容OSS。
OSS(Open Sound System)是 linux 平台上一个统一的音频接口, 即只要音频处理应用程序按照OSS的API来编写,那么在移植到另外一个平台时,只需要重新编译即可。值得注意的是OSS只是部分开源。
无论是选择ALSA还是OSS都是为了一个目的:将声卡抽象为一个统一的设备供linux程序员使用。我们前期测试选用的OSS系列。
6.3.3.2 安装声卡驱动
驱动源程序使用的是厂商附带的uda1341.c文件。
a、将该文件放置到sound/oss/目录下。 将bitfield.h放到include/asm-arm/plat-yc24xx/目录
b、在该目录下的Makfile文件的适当部位(和别的obj一起的地方)添加:
Obj-$(CONFIG_yC2440_UDA1341)+= yc2440_uda1341.o
以便能选择编译该文件。
c、在该目录下的kconfig文件的头部添加:
config yC2410_SND_UDA1341
tristate "yC2440 UDA1341 driver (yC2440)"
depends on SOUND_PRIME && SOUND && ARCH_yC2440
help
The UDA1341 can be found in Samsung's yC24XX
platforms. If you have a board based on one
of these. Say Y or Nhere.
If unsure, say N.
以便能在menuconfig的时候能选择到这个声卡。
d、在arch/arm/mach-yc2440/mach-smdk2440.c文件中添加iss的platform_device( 默认已经有了 )
static struct platform_device *smdk2440_devices[] __initdata = {
....
....
&s3c_device_iis,
....
....
};
e、make menuconfig 选择driver->sound->oss->uda1341 ,选择对声卡的支持。编译完毕,下载到yc2440开发板,使用madplay播放mp3文件。
录音实现的大体流程:
A 测试声卡是否正常工作
B 通过mixer调节声卡输入和输出时的音量大小及各种效果(比较重要)
C 打开声卡设备 默认目录为/dev/dsp
D 打开声音文件
E 将wav头信息读入声音文件
F 从dsp声卡设备中读入pcm数据
G 关闭设备及保存声音文件
大体流程的伪代码分两部分给出,一部分为基于mixer编程的专门负责调节声卡的录音效果,第二部分为录音程序。
mixer混音编程
为了更好的进一步检测我们的录音数据的正确性和录音效果决定写一专门播放wav文件的控制台播放器。其实录音功能实现以后,
放音功能的实现就可以类比实现了,只不过将过程反过来具体流程如下:
A 读wav文件的头,将各部分参数保存
B 通过ioctl来设置各个参数
C 将pcm数据读入/dev/dsp
完成以上功能以后,就能开发板上播放任何一首wav格式的声音文件了,以下为缩减版代码(一些和录音相当的部分就略去了)
将程序用交叉编译器编译成二进制可执行文件后,下载到yc2440开发版,就可以开始享受放音程序了。