Linux ALSA声卡驱动详细分析.docx

上传人:b****5 文档编号:3194541 上传时间:2022-11-20 格式:DOCX 页数:80 大小:598.57KB
下载 相关 举报
Linux ALSA声卡驱动详细分析.docx_第1页
第1页 / 共80页
Linux ALSA声卡驱动详细分析.docx_第2页
第2页 / 共80页
Linux ALSA声卡驱动详细分析.docx_第3页
第3页 / 共80页
Linux ALSA声卡驱动详细分析.docx_第4页
第4页 / 共80页
Linux ALSA声卡驱动详细分析.docx_第5页
第5页 / 共80页
点击查看更多>>
下载资源
资源描述

Linux ALSA声卡驱动详细分析.docx

《Linux ALSA声卡驱动详细分析.docx》由会员分享,可在线阅读,更多相关《Linux ALSA声卡驱动详细分析.docx(80页珍藏版)》请在冰豆网上搜索。

Linux ALSA声卡驱动详细分析.docx

LinuxALSA声卡驱动详细分析

1.LinuxALSA声卡驱动之一:

ALSA架构简介

一. 概述

    ALSA是AdvancedLinuxSoundArchitecture的缩写,目前已经成为了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----+1rootaudio116,82011-02-2321:

38controlC0

crw-rw----+1rootaudio116,42011-02-2321:

38midiC0D0

crw-rw----+1rootaudio116,72011-02-2321:

39pcmC0D0c

crw-rw----+1rootaudio116,62011-02-2321:

56pcmC0D0p

crw-rw----+1rootaudio116,72011-02-2321:

39pcmC0D1c

crw-rw----+1rootaudio116,52011-02-2321:

38pcmC0D1p

crw-rw----+1rootaudio116,32011-02-2321:

38seq

crw-rw----+1rootaudio116,22011-02-2321:

38timer

$

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

∙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] viewplain copy

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的代码,与平台无关

 

2.LinuxALSA声卡驱动之二:

声卡的创建

1.structsnd_card

1.1.snd_card是什么

snd_card可以说是整个ALSA音频驱动最顶层的一个结构,整个声卡的软件逻辑结构开始于该结构,几乎所有与声音相关的逻辑设备都是在snd_card的管理之下,声卡驱动的第一个动作通常就是创建一个snd_card结构体。

正因为如此,本节中,我们也从structcnd_card开始吧。

1.2.snd_card的定义

snd_card的定义位于改头文件中:

include/sound/core.h

[c-sharp] viewplain copy

1./* main structure for soundcard */  

2.  

3.struct snd_card {  

4.    int number;         /* number of soundcard (index to 

5.                                snd_cards) */  

6.  

7.    char id[16];            /* id string of this card */  

8.    char driver[16];        /* driver name */  

9.    char shortname[32];     /* short name of this soundcard */  

10.    char longname[80];      /* name of this soundcard */  

11.    char mixername[80];     /* mixer name */  

12.    char components[128];       /* card components delimited with 

13.                                space */  

14.    struct module *module;      /* top-level module */  

15.  

16.    void *private_data;     /* private data for soundcard */  

17.    void (*private_free) (struct snd_card *card); /* callback for freeing of 

18.                                private data */  

19.    struct list_head devices;   /* devices */  

20.  

21.    unsigned int last_numid;    /* last used numeric ID */  

22.    struct rw_semaphore controls_rwsem; /* controls list lock */  

23.    rwlock_t ctl_files_rwlock;  /* ctl_f

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 唐诗宋词

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1