这里以pcm文件在hda(High Definition Audio architecture)协议中的实现给出一个简图。选择hda的原因是intel给出的文档比较详细,而且是公开的。而其它一些硬件,没办法得到说明书,有代码也很难理解其中的一些内容。
pcm 文件结构简图
这里以类图的形式来表示结构体,以snd开始的结构都属于alsa的中间层(或者叫做框架层更贴切)。驱动程序的职责之一就是在启动的时候构造这么一个树形结构,而在运行open,write等操作的时候,都有固定的步骤。对于设备自身的一些操作,就留给了snd_pcm_ops这样的函数集去完成。而这些函数集在启动的时候,具体的驱动程序负责给它指定具体的实现。整个结构和文件系统看起来也很像。
3.1 构建snd目录
在前面讲到过driver/base/devtmpfs.c中构建了dev目录,而音频驱动文件是保存在/dev/snd目录下。snd目录是什么时候构建的,并不是太重要,不过有时候会照成困惑,这里简单讲一下。
sound目录下的sound_core.c文件,看样子是为linux之前使用的音频驱动oss保留的,但还有部分代码与当前的alsa相关。
static char *sound_devnode(struct device *dev, umode_t *mode)
{
if (MAJOR(dev->devt) == SOUND_MAJOR)
return NULL;
return kasprintf(GFP_KERNEL, "snd/%s", dev_name(dev));
}
static int __init init_soundcore(void)
{
int rc;
rc = init_oss_soundcore();
if (rc)
return rc;
sound_class = class_create(THIS_MODULE, "sound");
if (IS_ERR(sound_class)) {
cleanup_oss_soundcore();
return PTR_ERR(sound_class);
}
sound_class->devnode