zoukankan      html  css  js  c++  java
  • 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下:
    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    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)
    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    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机上的有差别。
    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    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:    列出系统中可用的,注册的声卡。
    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    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等等。
    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    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。
    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    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版本信息。
    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    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下。
    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    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内核定义了如下的设备类型:
    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    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三个方面入手。
  • 相关阅读:
    面向对象的继承关系体现在数据结构上时,如何表示
    codeforces 584C Marina and Vasya
    codeforces 602A Two Bases
    LA 4329 PingPong
    codeforces 584B Kolya and Tanya
    codeforces 584A Olesya and Rodion
    codeforces 583B Robot's Task
    codeforces 583A Asphalting Roads
    codeforces 581C Developing Skills
    codeforces 581A Vasya the Hipster
  • 原文地址:https://www.cnblogs.com/Ph-one/p/6293353.html
Copyright © 2011-2022 走看看