概述

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下:
  1. root@test:~/k3.18/kernel/sound$ ls
  2. ac97_bus.c  atmel    firewire  Kconfig   mips    pci     sh            sound_firmware.c  synth
  3. aoa         core     i2c       last.c    oss     pcmcia  soc           sparc             usb
  4. arm         drivers  isa       Makefile  parisc  ppc     sound_core.c  spi

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

ALSA接口信息

proc接口

关于音频的proc接口,位于/proc/asound目录下:(以我的pc机为例,ubuntu12.04)
  1. root@test:/proc/asound$ ls -l
  2. 总用量 0
  3. dr-xr-xr-x 5 root root 0 11月 22 13:41 card0
  4. -r--r--r-- 1 root root 0 11月 22 13:41 cards
  5. -r--r--r-- 1 root root 0 11月 22 13:41 devices
  6. -r--r--r-- 1 root root 0 11月 22 13:41 hwdep
  7. -r--r--r-- 1 root root 0 11月 22 13:41 modules
  8. dr-xr-xr-x 2 root root 0 11月 22 13:41 oss
  9. lrwxrwxrwx 1 root root 5 11月 22 13:41 PCH -> card0
  10. -r--r--r-- 1 root root 0 11月 22 13:41 pcm
  11. dr-xr-xr-x 2 root root 0 11月 22 13:41 seq
  12. -r--r--r-- 1 root root 0 11月 22 13:41 timers
  13. -r--r--r-- 1 root root 0 11月 22 13:41 version

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

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

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

 
card0:    其中0代表的是声卡号,每个声卡系统都存在这样的目录。
cards:    列出系统中可用的,注册的声卡。
  1. root@test:/proc/asound$ cat cards
  2. 0 [PCH            ]: HDA-Intel - HDA Intel PCH
  3. HDA Intel PCH at 0xf7d00000 irq 45

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

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

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

modoles:  列出所有ALSA声卡驱动模块列表。
oss:          此目录下包含了ALSA用来模拟OSS的模拟仿真模块。
pcm:         列去出系统的cpm设备,包括capture和playback。
  1. root@test:/proc/asound$ cat pcm
  2. 00-00: ALC662 rev1 Analog : ALC662 rev1 Analog : playback 1 : capture 1
  3. 00-02: ALC662 rev1 Analog : ALC662 rev1 Analog : capture 1

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

timers:    描述一些ALSA相关的定时器信息。
version:  描述ALSA版本信息。
  1. root@test:/proc/asound$ cat version
  2. 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下。
  1. root@test:/dev/snd$ ls -l
  2. 总用量 0
  3. drwxr-xr-x  2 root root       60 11月 16 10:47 by-path
  4. crw-rw---T+ 1 root audio 116,  6 11月 16 10:47 controlC0
  5. crw-rw---T+ 1 root audio 116,  5 11月 16 10:47 hwC0D0
  6. crw-rw---T+ 1 root audio 116,  4 11月 16 11:00 pcmC0D0c
  7. crw-rw---T+ 1 root audio 116,  3 11月 22 14:45 pcmC0D0p
  8. crw-rw---T+ 1 root audio 116,  2 11月 16 10:47 pcmC0D2c
  9. crw-rw---T+ 1 root audio 116,  1 11月 16 10:47 seq
  10. crw-rw---T+ 1 root audio 116, 33 11月 16 10:47 timer

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

介绍写各个设备文件的功能:
control:            用于声卡的控制。
pcmC0D0c:     用于录音的pcm设备。
pcmC0D0p:     用于播音的pcm设备。
seq:                 音序器接口。
timer:              定时器接口。
 
linux内核定义了如下的设备类型:
  1. enum {
  2. SNDRV_DEVICE_TYPE_CONTROL,
  3. SNDRV_DEVICE_TYPE_SEQUENCER,
  4. SNDRV_DEVICE_TYPE_TIMER,
  5. SNDRV_DEVICE_TYPE_HWDEP,
  6. SNDRV_DEVICE_TYPE_RAWMIDI,
  7. SNDRV_DEVICE_TYPE_PCM_PLAYBACK,
  8. SNDRV_DEVICE_TYPE_PCM_CAPTURE,
  9. SNDRV_DEVICE_TYPE_COMPRESS,
  10. };

通常更关心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三个方面入手。

Linux音频驱动-ALSA概述的更多相关文章

  1. Linux音频驱动学习之:(1)ASOC分析

    一.音频架构概述 (1)ALSA是Advanced Linux Sound Architecture 的缩写,目前已经成为了linux的主流音频体系结构,想了解更多的关于ALSA的这一开源项目的信息和 ...

  2. Linux音频驱动简述

    一.数字音频 音频信号是一种连续变化的模拟信号,但计算机仅仅能处理和记录二进制的数字信号.由自然音源得到的音频信号必须经过一定的变换,成为数字音频信号之后,才干送到计算机中作进一步的处理. 数字音频系 ...

  3. 小白自制Linux开发板 八. Linux音频驱动配置

    不知不觉小白自制开发板系列已经到第八篇了,本篇要配置的是音频驱动,也算是硬件部分的最后一片了,积攒的文章也差不多全放完了,后续更新可能会放缓,还请见谅. 对于F1C200s是自带了多媒体处理功能的,所 ...

  4. Linux音频驱动学习之:(2)移植wm8976声卡驱动(linux-3.4.2)

    1.wm8976驱动程序: /* * wm8976.h -- WM8976 Soc Audio driver * * This program is free software; you can re ...

  5. linux 音频驱动

    转:https://wenku.baidu.com/view/7394e16d7e21af45b307a8dc.html?pn=51 linux_sound_alsa_ALSA体系SOC子系统中数据流 ...

  6. Linux设备驱动开发详解-Note(5)---Linux 内核及内核编程(1)

    Linux 内核及内核编程(1) 成于坚持,败于止步 Linux 2.6 内核的特点 Linux 2.6 相对于 Linux 2.4 有相当大的改进,主要体现在如下几个方面. 1.新的调度器 2.6 ...

  7. 嵌入式驱动开发之---Linux ALSA音频驱动(一)

    本文的部分内容参考来自DroidPhone的博客(http://blog.csdn.net/droidphone/article/details/6271122),关于ALSA写得很不错的文章,只是少 ...

  8. 基于Linux ALSA音频驱动的wav文件解析及播放程序 2012

    本设计思路:先打开一个普通wav音频文件,从定义的文件头前面的44个字节中,取出文件头的定义消息,置于一个文件头的结构体中.然后打开alsa音频驱动,从文件头结构体取出采样精度,声道数,采样频率三个重 ...

  9. linux音频alsa-uda134x驱动文档阅读之一转自http://blog.csdn.net/wantianpei/article/details/7817293

    前言 目前,linux系统常用的音频驱动有两种形式:alsa oss alsa:现在是linux下音频驱动的主要形式,与简单的oss兼容.oss:过去的形式而我们板子上的uda1341用的就是alsa ...

随机推荐

  1. HDU_6016_(Bestcoder round #92 1002)_(dfs)(暴力)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6016 题意:给定男羊和女羊的朋友关系,即给定一个图,问从任意一只羊开始连续数四只不相同的羊的方法数. ...

  2. reversed()函数和sorted()函数

    #reversed()反转排序,可对列表.元组.区间等进行排序 #练习1 a = range(10) a_list = [x for x in reversed(a)] print(a_list) # ...

  3. 对vuex的一点理解

    vuex是vue.js的一个状态管理工具,它适用于解决平行组件之间的数据共享问题.一般情况下,我们更多的是父子组件之间通过props或$emit来实现传值,如何不满足以上情况那只有使用vuex进行解决 ...

  4. libevent reference Mannual II--library

    FYI: http://www.wangafu.net/~nickm/libevent-book/TOC.html The Libevent Reference Manual: Preliminari ...

  5. Jmeter - 获取返回结果中的字段值

    Jmeter测试场景:一个web系统,需要先发送登录请求,获取到登录Token之后,后续每次请求都需要在请求头中附带Token才有权限操作.现在需要在Jmeter中自动获取每次登录请求返回的Token ...

  6. linux性能优化cpu-02平均负载

    每次我们系统变慢时,我们通常做的第一件事就是top命令或者uptime命令,看一下系统的负载情况,比如下面: 我在命令行中输入uptime 22:15:51    表示当前系统时间 up 13 min ...

  7. 简述systemd的新特性及unit常见类型分析、使用systemd管理编译安装的nginx

    1. systemd新特性 并行处理(同时启动)所有服务. 基于依赖关系定义的服务控制逻辑 系统状态快照 按需激活进程,只有第一次被访问时才会真正启动: 2. systemd的常见unit类型 Ser ...

  8. 个人 NABCD

    失物招领APP个人NABCD Need: 在朋友圈中,QQZone中我们长仓可以看到失物招领这方面的信息,又没有学校中专门使用的失物招领平台,所以根据这个信息,决定开发一款解决这方面问题的APP来满足 ...

  9. CF441D

    题目大意 给出一个有n个数的序列 求符合 区间各数或起来的数大于区间最大数 的区间的个数 题解 预处理出每个数每一位是0的那位左边最近的1和右边最近的1,用单调栈找出每个最大值所在的区间的左右端点,统 ...

  10. Maven_运行时环境

    首先,创建一动态web工程. Src-----源码目录 build文件夹在java结构下看不出,但可以在Navigator下可以看出是个源码目录,如下图: 以下图中是运行时环境. 它其实是一组jar包 ...