zoukankan      html  css  js  c++  java
  • Linux ALSA声卡驱动之一:ALSA架构简介[zz]

    地址:http://blog.csdn.net/droidphone/article/details/6271122

    声明:本博内容均由http://blog.csdn.net/droidphone原创,转载请注明出处,谢谢!


    一.  概述

        ALSA是Advanced Linux Sound Architecture 的缩写,目前已经成为了linux的主流音频体系结构,想了解更多的关于ALSA的这一开源项目的信息和知识,请查看以下网址:http://www.alsa-project.org/

        在内核设备驱动层,ALSA提供了alsa-driver,同时在应用层,ALSA为我们提供了alsa-lib,应用程序只要调用alsa-lib提供的API,即可以完成对底层音频硬件的控制。

                                                               图 1.1   alsa的软件体系结构

    由图1.1可以看出,用户空间的alsa-lib对应用程序提供统一的API接口,这样可以隐藏了驱动层的实现细节,简化了应用程序的实现难度。内 核空间中,alsa-soc其实是对alsa-driver的进一步封装,他针对嵌入式设备提供了一些列增强的功能。本系列博文仅对嵌入式系统中的 alsa-driver和alsa-soc进行讨论。

     二.  ALSA设备文件结构

        我们从alsa在linux中的设备文件结构开始我们的alsa之旅. 看看我的电脑中的alsa驱动的设备文件结构:

    $ cd /dev/snd
    $ ls -l

    crw-rw----+ 1 root audio 116, 8 2011-02-23 21:38 controlC0
    crw-rw----+ 1 root audio 116, 4 2011-02-23 21:38 midiC0D0
    crw-rw----+ 1 root audio 116, 7 2011-02-23 21:39 pcmC0D0c
    crw-rw----+ 1 root audio 116, 6 2011-02-23 21:56 pcmC0D0p
    crw-rw----+ 1 root audio 116, 5 2011-02-23 21:38 pcmC0D1p
    crw-rw----+ 1 root audio 116, 3 2011-02-23 21:38 seq
    crw-rw----+ 1 root audio 116, 2 2011-02-23 21:38 timer
    $


        我们可以看到以下设备文件:

    • controlC0 -->                 用于声卡的控制,例如通道选择,混音,麦克风的控制等
    • midiC0D0  -->                用于播放midi音频
    • pcmC0D0c --〉               用于录音的pcm设备
    • pcmC0D0p --〉               用于播放的pcm设备
    • seq  --〉                        音序器
    • timer --〉                       定时器

    其中,C0D0代表的是声卡0中的设备0,pcmC0D0c最后一个c代表capture,pcmC0D0p最后一个p代表playback,这些 都是alsa-driver中的命名规则。从上面的列表可以看出,我的声卡下挂了6个设备,根据声卡的实际能力,驱动实际上可以挂上更多种类的设备,在 include/sound/core.h中,定义了以下设备类型:

    [c-sharp] view plaincopy
    1. #define SNDRV_DEV_TOPLEVEL  ((__force snd_device_type_t) 0)  
    2. #define SNDRV_DEV_CONTROL   ((__force snd_device_type_t) 1)  
    3. #define SNDRV_DEV_LOWLEVEL_PRE  ((__force snd_device_type_t) 2)  
    4. #define SNDRV_DEV_LOWLEVEL_NORMAL ((__force snd_device_type_t) 0x1000)  
    5. #define SNDRV_DEV_PCM       ((__force snd_device_type_t) 0x1001)  
    6. #define SNDRV_DEV_RAWMIDI   ((__force snd_device_type_t) 0x1002)  
    7. #define SNDRV_DEV_TIMER     ((__force snd_device_type_t) 0x1003)  
    8. #define SNDRV_DEV_SEQUENCER ((__force snd_device_type_t) 0x1004)  
    9. #define SNDRV_DEV_HWDEP     ((__force snd_device_type_t) 0x1005)  
    10. #define SNDRV_DEV_INFO      ((__force snd_device_type_t) 0x1006)  
    11. #define SNDRV_DEV_BUS       ((__force snd_device_type_t) 0x1007)  
    12. #define SNDRV_DEV_CODEC     ((__force snd_device_type_t) 0x1008)  
    13. #define SNDRV_DEV_JACK          ((__force snd_device_type_t) 0x1009)  
    14. #define SNDRV_DEV_LOWLEVEL  ((__force snd_device_type_t) 0x2000)  

     通常,我们更关心的是pcm和control这两种设备。

    三.  驱动的代码文件结构

        在Linux2.6代码树中,Alsa的代码文件结构如下:

        sound
                /core
                         /oss
                        /seq
                /ioctl32
                /include
                /drivers
                /i2c
                /synth
                        /emux
                /pci
                        /(cards)
                /isa
                        /(cards)
                /arm
                /ppc
                /sparc
                /usb
                /pcmcia /(cards)
                /oss
                /soc
                        /codecs

    • core               该目录包含了ALSA驱动的中间层,它是整个ALSA驱动的核心部分
    • core/oss        包含模拟旧的OSS架构的PCM和Mixer模块
    • core/seq        有关音序器相关的代码
    • include          ALSA驱动的公共头文件目录,该目录的头文件需要导出给用户空间的应用程序使用,通常,驱动模块私有的头文件不应放置在这里
    •  drivers           放置一些与CPU、BUS架构无关的公用代码
    • i2c                 ALSA自己的I2C控制代码
    • pci                 pci声卡的顶层目录,子目录包含各种pci声卡的代码
    • isa                 isa声卡的顶层目录,子目录包含各种isa声卡的代码
    • soc                针对system-on-chip体系的中间层代码
    • soc/codecs    针对soc体系的各种codec的代码,与平台无关

  • 相关阅读:
    POJ 1681 Painter's Problem(高斯消元法)
    HDU 3530 Subsequence(单调队列)
    HDU 4302 Holedox Eating(优先队列或者线段树)
    POJ 2947 Widget Factory(高斯消元法,解模线性方程组)
    HDU 3635 Dragon Balls(并查集)
    HDU 4301 Divide Chocolate(找规律,DP)
    POJ 1753 Flip Game(高斯消元)
    POJ 3185 The Water Bowls(高斯消元)
    克琳:http://liyu.eu5.org
    WinDbg使用
  • 原文地址:https://www.cnblogs.com/linucos/p/2982743.html
Copyright © 2011-2022 走看看