专栏首页Linux内核深入分析Linux音频驱动-ALSA概述

Linux音频驱动-ALSA概述

概述

ALSA(Advanced Linux Sound Architecture)是linux上主流的音频结构,在没有出现ALSA架构之前,一直使用的是OSS(Open Sound System)音频架构。关于OSS的退出以及ALSA的出现,可以看 Linux音频驱动-OSS和ALSA声音系统简介及其比较

关于OSS和ALSA音频架构之间的区别图如下:

主要的区别就是在OSS架构下,App访问底层是直接通过Sound设备节点访问的。而在ALSA音频架构下,App是通过ALSA提供的alsa-lib库访问底层硬件的操作,不再访问Sound设备节点了。这样做的好处可以简化App实现的难度。

同样ALSA为了兼容OSS,ALSA提供了内核模块来模拟OSS声音驱动,所以在OSS架构下编写的App无需修改就可以在ALSA下运行。另外libaoos库也可以模拟OSS,无需OSS相关的内核模块。

音频子系统文件目录结构

音频系统的文件位于kernel/sound下:

root@test:~/k3.18/kernel/sound$ ls
ac97_bus.c  atmel    firewire  Kconfig   mips    pci     sh            sound_firmware.c  synth
aoa         core     i2c       last.c    oss     pcmcia  soc           sparc             usb
arm         drivers  isa       Makefile  parisc  ppc     sound_core.c  spi

主要的目录的介绍信息如下:

ALSA接口信息

proc接口

关于音频的proc接口,位于/proc/asound目录下:(以我的pc机为例,ubuntu12.04)

root@test:/proc/asound$ ls -l
总用量 0
dr-xr-xr-x 5 root root 0 11月 22 13:41 card0
-r--r--r-- 1 root root 0 11月 22 13:41 cards
-r--r--r-- 1 root root 0 11月 22 13:41 devices
-r--r--r-- 1 root root 0 11月 22 13:41 hwdep
-r--r--r-- 1 root root 0 11月 22 13:41 modules
dr-xr-xr-x 2 root root 0 11月 22 13:41 oss
lrwxrwxrwx 1 root root 5 11月 22 13:41 PCH -> card0
-r--r--r-- 1 root root 0 11月 22 13:41 pcm
dr-xr-xr-x 2 root root 0 11月 22 13:41 seq
-r--r--r-- 1 root root 0 11月 22 13:41 timers
-r--r--r-- 1 root root 0 11月 22 13:41 version

如下是我手机的中的详细信息,会个pc机上的有差别。

test:/proc/asound # ls -l
total 0
dr-xr-xr-x 21 root root 0 2012-01-02 03:19 card0
-r--r--r--  1 root root 0 2012-01-02 03:19 cards
-r--r--r--  1 root root 0 2012-01-02 03:19 devices
-r--r--r--  1 root root 0 2012-01-02 03:19 pcm
lrwxrwxrwx  1 root root 5 2012-01-02 03:19 xxx -> card0
-r--r--r--  1 root root 0 2012-01-02 03:19 timers
-r--r--r--  1 root root 0 2012-01-02 03:19 version

相比的话,差不了多少,只是手机上没有一些功能而已。接下来详细介绍每个目录的大体含义。

card0: 其中0代表的是声卡号,每个声卡系统都存在这样的目录。

cards: 列出系统中可用的,注册的声卡。

root@test:/proc/asound$ cat cards 
 0 [PCH            ]: HDA-Intel - HDA Intel PCH
                      HDA Intel PCH at 0xf7d00000 irq 45

devices: 列出系统card下所有注册的device,包括control,pcm,timer,seq等等。

root@test:/proc/asound$ cat devices 
  1:        : sequencer
  2: [ 0- 2]: digital audio capture
  3: [ 0- 0]: digital audio playback
  4: [ 0- 0]: digital audio capture
  5: [ 0- 0]: hardware dependent
  6: [ 0]   : control
 33:        : timer

hwdep: 列出所有硬件依赖(hardward dependent)的设备。此设备不是所有系统上都存在的。

modoles: 列出所有ALSA声卡驱动模块列表。

oss: 此目录下包含了ALSA用来模拟OSS的模拟仿真模块。

pcm: 列去出系统的cpm设备,包括capture和playback。

root@test:/proc/asound$ cat pcm 
00-00: ALC662 rev1 Analog : ALC662 rev1 Analog : playback 1 : capture 1
00-02: ALC662 rev1 Analog : ALC662 rev1 Analog : capture 1

seq: 此目录保护一些音序相关的信息。

timers: 描述一些ALSA相关的定时器信息。

version: 描述ALSA版本信息。

root@test:/proc/asound$ cat version 
Advanced Linux Sound Architecture Driver Version 1.0.25.

devices字段详细解释,会在后面更了解各个字段的含义。

有关proc的详细信息可以见:http://alsa.opensrc.org/Proc_asound_documentation#The_.2Fproc.2Fasound.2Foss.2F_directory

dev接口信息

关于sound的dev节点信息,位于/dev/snd下。

root@test:/dev/snd$ ls -l
总用量 0
drwxr-xr-x  2 root root       60 11月 16 10:47 by-path
crw-rw---T+ 1 root audio 116,  6 11月 16 10:47 controlC0
crw-rw---T+ 1 root audio 116,  5 11月 16 10:47 hwC0D0
crw-rw---T+ 1 root audio 116,  4 11月 16 11:00 pcmC0D0c
crw-rw---T+ 1 root audio 116,  3 11月 22 14:45 pcmC0D0p
crw-rw---T+ 1 root audio 116,  2 11月 16 10:47 pcmC0D2c
crw-rw---T+ 1 root audio 116,  1 11月 16 10:47 seq
crw-rw---T+ 1 root audio 116, 33 11月 16 10:47 timer

上述是sound下的常见的设备文件。首先看看各个字段的含义:

介绍写各个设备文件的功能:

control: 用于声卡的控制。

pcmC0D0c: 用于录音的pcm设备。

pcmC0D0p: 用于播音的pcm设备。

seq: 音序器接口。

timer: 定时器接口。

linux内核定义了如下的设备类型:

enum {
	SNDRV_DEVICE_TYPE_CONTROL,
	SNDRV_DEVICE_TYPE_SEQUENCER,
	SNDRV_DEVICE_TYPE_TIMER,
	SNDRV_DEVICE_TYPE_HWDEP,
	SNDRV_DEVICE_TYPE_RAWMIDI,
	SNDRV_DEVICE_TYPE_PCM_PLAYBACK,
	SNDRV_DEVICE_TYPE_PCM_CAPTURE,
	SNDRV_DEVICE_TYPE_COMPRESS,
};

通常更关心control和pcm设备。

代码入口分析

ALSA的proc接口信息的代码实现在kernel/sound/core/sound.c中。

大概的逻辑图如下:

下一步就需要分析是谁调用snd_register_device_for_dev函数来注册sound设备的。

以上只是列出了pcm和control设备的流程,并没有关心timer, seq等设备的流程。其实大致流程一致。

因为pcm,control,timer,seq等这些设备都在所谓的card下管理着。所以下面几节就从card,control,pcm三个方面入手。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 线程的创建以及线程的本质

    上节详细学习了进程的创建,通过实例学习了fork和vfork的区别。本节将学习线程的创建,只涉及应用层的线程,内核线程的创建在后面学习。

    DragonKingZhu
  • Linux电源管理-wakeup events framework

    通常新机制/事物的出现往往是解决某些问题的,同样wakeup events framework机制也不例外。先带大家了解下wakeup events frame...

    DragonKingZhu
  • Linux电源管理-wakelock

    之前说过Google为了在user space阻止系统suspend,为Android设计出一套新的电源管理: wakelocks, early_suspen...

    DragonKingZhu
  • django中mysql配置及使用

    # Django settings for mysite2 project. DEBUG = True TEMPLATE_DEBUG = DEBUG ADMIN...

    闵开慧
  • BST & AVL 二分搜索树 & 平衡二叉树的实现原理

    本文完整的实现了基本的BST,由于注重的是逻辑和原理的实现,所以没有采用泛型。注意方法的访问修饰符。

    大学里的混子
  • 二叉树高频题

    Given a binary tree, return the preorder traversal of its nodes' values.

    用户5934629
  • Golang Leetcode 230. Kth Smallest Element in a BST.go

    版权声明:原创勿转 https://blog.csdn.net/anakinsun/article/details/89043444

    anakinsun
  • leecode刷题(24)-- 翻转二叉树

    二叉树问题,我们首先要想到的使用递归的方式来解决,有了这个思路,处理这道问题就很简单了:先互换根节点的左右节点,然后递归地处理左子树,再递归地处理右子树,直到所...

    希希里之海
  • mkdir dxs

    chown将指定文件的拥有者改为指定的用户或组,用户可以是用户名或者用户ID;组可以是组名或者组ID;文件是以空格分开的要改变权限的文件列表,支持通配符。系统管...

    joshua317
  • 安装CDSW数据磁盘初始化异常问题分析

    本文主要讲述基于Kerberos环境下的CDH5.13.1版本安装CDSW1.3.0数据磁盘初始化异常问题分析及解决办法。

    Fayson

扫码关注云+社区

领取腾讯云代金券