Linux_ALSA声卡驱动原理分析

合集下载

关于Linux的alsa音频问题解决

关于Linux的alsa音频问题解决

关于Linux的alsa音频问题解决cset 到今日,在android平台上调试声音的方面终于有了进展,原来是需要改一个配置文件,目前只是解决了问题,具体原因以后再分析。

硬件平台是6410+WM9714,软件平台是ANDROID。

现在由于android系统启动时,加载音频服务不成功,处于一个死循环中,老停在登陆界面。

此时打印的Logcat信息如下:.........AudioFlinger not published, waiting............。

一开始我以为是WM9714的内核音频驱动有问题,所以先验证音频驱动是否OK。

(1)用cat xxx.wav > /dev/snd/audio时耳机全是播出滋滋的噪声,没有一点音乐声;(2)用aplay xxx.wav时没有声音,会提示Unable to install hw params。

由此分析是alsa配置存在问题,但具体是什么参数不得而知;(3)在实验方法(1)播放出噪声时,直接用语句读出WM9714的全部寄存器值。

读出的ID号正确,说明AC97与codec的通讯无误;后来将寄存器值发给wofson原厂工程师烧到他们自己的平台上,播放音频文件正常。

进一步证明寄存器设置是无误的,AC-LINK通讯无误,寄存器设置正常,驱动无误。

由此原因集中在配置上。

后来同事分析和试了一把,改动\vendor\sec\smdk6410\init.smdk6410.rc中的setprop ro.radio.noril yes改成setprop ro.radio.noril no。

虽然我们做的是MID产品,没有RIL电话功能硬件,但还是要将这部分服务加载上去。

(但最后试验过,no值也OK)另一个需要补充的地方在于:同目录下的init.rc中的:service media /system/bin/mediaserveruser mediagroup system audio camera graphics inet net_bt net_bt_admin。

ALSA声卡驱动详解解析

ALSA声卡驱动详解解析

DAPM是Dynamic Audio Power Management的缩写,直译过来就是动态音频电源管理的意思,DAPM是为了使基于linux的移动设备上的音频子系统,在任何时候都工作在最小功耗状态下。

DAPM对用户空间的应用程序来说是透明的,所有与电源相关的开关都在ASoc core中完成。

用户空间的应用程序无需对代码做出修改,也无需重新编译,DAPM根据当前激活的音频流(playback/capture)和声卡中的mixer等的配置来决定那些音频控件的电源开关被打开或关闭。

/******************************************************************************************* **********/声明:本博内容均由/droidphone原创,转载请注明出处,谢谢!/******************************************************************************************* **********/DAPM控件是由普通的soc音频控件演变而来的,所以本章的内容我们先从普通的soc音频控件开始。

snd_kcontrol_new结构在正式讨论DAPM之前,我们需要先搞清楚ASoc中的一个重要的概念:kcontrol,不熟悉的读者需要浏览一下我之前的文章:Linux ALSA声卡驱动之四:Control设备的创建。

通常,一个kcontrol代表着一个mixer(混音器),或者是一个mux(多路开关),又或者是一个音量控制器等等。

从上述文章中我们知道,定义一个kcontrol主要就是定义一个snd_kcontrol_new 结构,为了方便讨论,这里再次给出它的定义:[cpp]view plaincopystruct snd_kcontrol_new {snd_ctl_elem_iface_t iface; /* interface identifier * /unsigned int device; /* device/client number * /unsigned int subdevice; /* subdevice (substream) number */const unsigned char *name; /* ASCII name of item */ unsigned int index; /* index of item */unsigned int access; /* access rights */unsigned int count; /* count of same elements */snd_kcontrol_info_t *info;snd_kcontrol_get_t *get;snd_kcontrol_put_t *put;union {1snd_kcontrol_tlv_rw_t *c;const unsigned int *p;} tlv;unsigned long private_value;};回到Linux ALSA声卡驱动之四:Control设备的创建中,我们知道,对于每个控件,我们需要定义一个和他对应的snd_kcontrol_new结构,这些snd_kcontrol_new结构会在声卡的初始化阶段,通过snd_soc_add_codec_controls函数注册到系统中,用户空间就可以通过amixer或alsamixer等工具查看和设定这些控件的状态。

alsa 中 s24_le 与s24_3le 的差别 -回复

alsa 中 s24_le 与s24_3le 的差别 -回复

alsa 中s24_le 与s24_3le 的差别-回复ALSA (Advanced Linux Sound Architecture) 是Linux操作系统上的一个音频架构子系统,它提供了一套给应用程序使用的音频设备驱动接口。

在ALSA中,s24_le和s24_3le是两种不同的音频采样格式。

在本文中,我们将详细解释这两种格式的差异,并探讨它们在音频处理中的不同应用。

在音频处理中,采样是将连续的声音信号转换为数字表示的过程。

采样格式定义了数字表示中用于存储和表示声音的规则。

s24_le和s24_3le都是24位线性编码的采样格式,它们的主要区别在于字节顺序和数值范围。

s24_le是指24位线性编码的采样,使用小端字节顺序。

在小端字节顺序中,最低有效字节保存在内存的低地址处,而最高有效字节保存在内存的高地址处。

因此,s24_le采样的字节顺序为:低有效字节、中间字节、高有效字节。

这种字节顺序在许多x86架构的计算机上是常见的。

相比之下,s24_3le采用了不同的字节顺序,它是指使用小端字节顺序并将声音采样的最低8位拆分到附加的三个字节中。

实际上,s24_3le被视为32位线性编码的采样格式,因为它将附加的3个位用于存储额外的采样信息。

这样的编码允许更高的精度和动态范围。

字节顺序为:低有效字节、中间字节1、中间字节2、中间字节3、高有效字节。

以上是s24_le和s24_3le之间的差异。

那么,为什么会有两种24位的线性编码采样格式?首先,s24_le和s24_3le可以用于不同的音频应用需求。

s24_le适用于大多数应用,它提供了足够的精度和动态范围。

然而,在某些领域,例如专业音频处理或高保真音频中,更高的精度和动态范围可能是必要的,这就是s24_3le派上用场的时候。

其次,s24_3le作为32位线性编码的采样格式,可以存储更多的信息。

附加的3个位可以用于实现更好的信噪比、更低的失真和更高的动态范围。

linux audio buffer机制

linux audio buffer机制

在 Linux 系统中,音频缓冲机制是实现实时音频处理和播放的关键组成部分。

Linux 提供了 ALSA(Advanced Linux Sound Architecture)作为其音频子系统,其中包括了音频缓冲机制。

下面是有关 Linux 音频缓冲机制的详细解释:ALSA 驱动模型:ALSA 是 Linux 上的音频架构,它为音频设备提供了一个标准的驱动模型。

在ALSA 中,音频设备的驱动分为两个部分:1.硬件相关的部分(硬件层):这部分由 ALSA 驱动程序提供,负责与硬件通信。

这包括将音频数据发送到硬件和从硬件接收音频数据。

2.用户空间 API(用户空间层):这部分由用户空间的应用程序使用,通过ALSA API 与硬件通信。

用户空间 API 允许应用程序读取或写入音频数据,以及配置音频设备的参数。

音频缓冲机制:在 ALSA 中,音频缓冲主要涉及两个方面:1.应用程序缓冲区: ALSA 允许应用程序创建和使用自己的音频缓冲区。

应用程序可以通过 ALSA API 读取或写入这些缓冲区,以与硬件进行交互。

这允许应用程序按照其自己的速度生成或接收音频数据。

2.硬件缓冲区: ALSA 驱动程序管理硬件的音频缓冲区。

硬件缓冲区是用于存储音频数据的内存区域,它负责将数据传输到硬件或从硬件接收数据。

硬件缓冲区的大小和设置影响了音频的延迟和性能。

音频流程:在音频处理中,典型的流程如下:1.应用程序写入数据:应用程序将音频数据写入应用程序缓冲区,通过ALSA API 将数据传递给 ALSA 驱动。

2.ALSA 驱动传递给硬件: ALSA 驱动程序将应用程序缓冲区的数据传递给硬件缓冲区。

硬件缓冲区充满数据后,可以触发硬件开始播放音频。

3.硬件播放或录制:硬件根据其内部时钟从硬件缓冲区读取音频数据并播放,或者将录制的音频数据写入硬件缓冲区。

4.循环过程:这个过程不断循环,直到应用程序停止写入数据或关闭音频设备。

ALSA 配置参数:在 ALSA 中,一些关键的配置参数包括:•周期(Period):指的是音频数据在硬件缓冲区中的一个小片段。

Linux系统如何安装声卡驱动

Linux系统如何安装声卡驱动

Linux系统如何安装声卡驱动有时候,装了某个软件或驱动后,破坏了声卡本身的驱动程序,这时候可能通过重装声卡驱动来解决。

就让店铺来告诉大家Linux系统如何安装声卡驱动的方法吧,希望对大家有所帮助。

Linux系统安装声卡驱动方法一Linux下安装声卡驱动,用的是alsa,它就好像是万能的一样,可以支持很多类型的声卡,如:这里更麻烦的是,alsa里面有三个东西,一个是alsa-driver;一个是alsa-lib;最后一个是alsa-untils。

安装步骤:1、把前面的三个东西给解压出来,解压之后会产生文件夹,比如:文件夹——alsa-driver、alsa-lib、alsa-untils2、打开终端,先进入alsa-driver文件夹,然后输入……34小项不要之外,一切照旧。

4、进入alsa-untils文件夹,一切同第三项。

上面的都操作完之后接着就是修改系统文件了。

在/ect目录下有一个moudules.conf的文件,在里面加入:查过之后,有一张表可以对照,如下:根据自己的实际情况然后修改自己的把snd-xxxx改成相对应的名称。

好了保存重启,一般就OK了第一次操作很麻烦,但习惯了会觉得那是一种乐趣的,至少我自己是这么觉得的。

注:如果是初次操作,需要修改到系统本身的一些东西的话,建议最好先备份,错了改过来就比较容易点,备份,其实就是复制一份同样的东西到另一个安全的地方。

Linux系统安装声卡驱动方法二环境 ubuntu12.04因为桌面版的默认装了,而且调声音也很方便,这里说一下server版下的配置,毕竟做开发经常还是用server版的1.安装apt-get install alsa-base 它会把alsa-utils也一块装了,这是个工具包,如果没装的话直接 apt-get install alsa-utils2.配置在server版下装完alsa后声音默认是静音的执行 alsamixer 会出现一个图形界面会看到有的是 MM 有的是OO 用“m”键切换时静音还是打开,一般设置 Master 和 PCM 就可以了,其他的自己看着办就行了,千万不要被图片误导了,前两个一定要设置为OO!!。

alsa 原理

alsa 原理

alsa 原理ALSA原理解析什么是ALSA?ALSA(Advanced Linux Sound Architecture)是Linux操作系统中的一种音频处理架构。

它提供了一种标准的音频设备驱动程序接口,用于操作和控制音频设备,如声卡、麦克风、扬声器等。

ALSA的组成部分ALSA由以下几个主要的组成部分组成:1.音频设备驱动程序:负责与硬件之间的通信,将音频设备的输入输出转换为数字信号,并通过内核提供的接口向应用程序提供访问。

2.音频库:提供高级的音频操作接口,为应用程序提供简化的音频处理功能。

3.控制工具:用于配置和控制音频设备的命令行工具,如alsactl和amixer。

ALSA的工作原理ALSA的工作原理可以简单概括为以下几个步骤:1.设备检测:当系统启动或插入音频设备时,ALSA会进行设备检测,并加载相应的设备驱动程序。

2.设备配置:ALSA会自动对音频设备进行配置,包括设定采样率、位深度、声道数等参数。

3.应用程序访问:应用程序通过调用ALSA提供的API接口来访问音频设备。

应用程序可以使用ALSA提供的库函数来进行音频采集、播放、混音等操作。

4.数据传输:ALSA通过DMA(Direct Memory Access)技术将音频数据从内存传输到音频设备,或者从音频设备传输到内存。

5.数据处理:音频数据在传输过程中,可以经过一系列的处理,例如音频编码、解码、混音等。

6.音量控制:ALSA提供了音量控制接口,应用程序可以通过调用API来调整音频设备的输入和输出音量。

7.音频事件处理:ALSA可以捕捉音频设备发出的事件,并通过回调函数通知应用程序。

例如,当音频设备的状态发生变化时,应用程序可以接收到相应的通知。

总结通过以上解析,我们了解了ALSA的基本原理和工作流程。

ALSA提供了一个标准的音频处理框架,使应用程序能够方便地访问和控制音频设备。

它的底层驱动程序负责和硬件进行通信,而高级的音频库则提供了简化和抽象的接口,方便应用程序进行音频处理。

alsa中pulseaudio的工作原理

alsa中pulseaudio的工作原理

alsa中pulseaudio的工作原理1. 概述PulseAudio 是 Linux 系统上的一款音频服务器,他的主要作用是为应用程序提供音频输入输出的服务,提供音频的混音、重采样等功能。

PulseAudio 可以与 ALSA(Advanced Linux Sound Architecture)配合使用,将音频数据传递给硬件设备进行播放。

2. ALSA 和 PulseAudio 的关系在 Linux 系统中, ALSA 是默认的音频框架。

它负责管理硬件设备以及音频流的输入输出。

PulseAudio 则是在 ALSA 的基础上提供了更强大的音频处理能力,比如支持多应用程序同时播放音频、应用级别的音量控制和音频混音等功能。

3. PulseAudio 的工作原理PulseAudio 通过客户端-服务器的模式工作。

当用户在应用程序中播放音频时,音频数据首先被传递给 PulseAudio 客户端,然后经过PulseAudio 服务器进行处理,最终再由 ALSA 将数据传递给硬件设备进行播放。

4. PulseAudio 的主要组件PulseAudio 主要由以下几个组件组成:- 客户端库(libpulse):提供给应用程序使用的接口,用于将音频数据传递给 PulseAudio 服务器。

- 服务器守护进程(pulseaudio):负责管理音频的输入输出,包括混音、重采样、音量控制等功能。

- 控制面板(pavucontrol):提供了一个图形化的用户界面,用于用户对音频设备进行配置和控制。

- 模块(module):提供了各种功能模块,包括网络音频传输、蓝牙音频支持、JACK 集成等。

5. PulseAudio 的工作流程PulseAudio 的工作流程可以概括为以下几个步骤:- 应用程序向 PulseAudio 客户端库注册音频流。

- PulseAudio 客户端库将音频数据传递给 PulseAudio 服务器。

ALSA声卡驱动详解

ALSA声卡驱动详解

DAPM是Dynamic Audio Power Management的缩写,直译过来就是动态音频电源管理的意思,DAPM是为了使基于linux的移动设备上的音频子系统,在任何时候都工作在最小功耗状态下。

DAPM对用户空间的应用程序来说是透明的,所有与电源相关的开关都在ASoc core中完成。

用户空间的应用程序无需对代码做出修改,也无需重新编译,DAPM根据当前激活的音频流(playback/capture)和声卡中的mixer等的配置来决定那些音频控件的电源开关被打开或关闭。

/******************************************************************************************* **********/声明:本博内容均由/droidphone原创,转载请注明出处,谢谢!/******************************************************************************************* **********/DAPM控件是由普通的soc音频控件演变而来的,所以本章的内容我们先从普通的soc音频控件开始。

snd_kcontrol_new结构在正式讨论DAPM之前,我们需要先搞清楚ASoc中的一个重要的概念:kcontrol,不熟悉的读者需要浏览一下我之前的文章:Linux ALSA声卡驱动之四:Control设备的创建。

通常,一个kcontrol代表着一个mixer(混音器),或者是一个mux(多路开关),又或者是一个音量控制器等等。

从上述文章中我们知道,定义一个kcontrol主要就是定义一个snd_kcontrol_new 结构,为了方便讨论,这里再次给出它的定义:[cpp]view plaincopystruct snd_kcontrol_new {snd_ctl_elem_iface_t iface; /* interface identifier * /unsigned int device; /* device/client number * /unsigned int subdevice; /* subdevice (substream) number */const unsigned char *name; /* ASCII name of item */ unsigned int index; /* index of item */unsigned int access; /* access rights */unsigned int count; /* count of same elements */snd_kcontrol_info_t *info;snd_kcontrol_get_t *get;snd_kcontrol_put_t *put;union {1snd_kcontrol_tlv_rw_t *c;const unsigned int *p;} tlv;unsigned long private_value;};回到Linux ALSA声卡驱动之四:Control设备的创建中,我们知道,对于每个控件,我们需要定义一个和他对应的snd_kcontrol_new结构,这些snd_kcontrol_new结构会在声卡的初始化阶段,通过snd_soc_add_codec_controls函数注册到系统中,用户空间就可以通过amixer或alsamixer等工具查看和设定这些控件的状态。

Linux--ALSA

Linux--ALSA

Linux ALSA 声卡驱动的分析一、ALSA && OSS在linux系统中,先后出现了音频设备的两种主要框架:OSS和ALSA.针对不同的数字音频子系统,出现了几种微处理器或DSP与音频器件间用于数字转换的接口。

1.1 音频设备的硬件接口:(1)PCM接口。

(2)IIS(I2S)接口。

(3)AC97接口。

在CD,MD,MP3随身听多采用IIS接口,移动电话会采用PCM接口,具有音频功能的PDA则多使用和PC一样的AC97编码格式。

1.2 linux OSS音频设备驱动OSS标准中有两个最基本的音频设备:mixer(混音器)和dsp(数字信号处理器)。

在声卡的硬件电路中,mixer是一个很重要的组成部分,它的作用是将多个信号组合或者叠加在一起,对于不同的声卡来说,其混音器的作用可能各不相同。

在OSS驱动中,/dev/mixer设备文件时应用程序对mixer进行操作的软件接口。

1.2.1 OSS用户空间编程(dsp编程)对OSS驱动声卡的编程使用linux文件接口函数,dsp接口的操作一般包括如下几个步骤(1)打开设备文件/dev/dsp。

(2)如果有需要,设置缓冲区大小。

(3)设置声道(channel)数量。

根据硬件设备和驱动程序的具体情况,可以设置为单声道或者立体声。

(4)设置采样格式和采样频率。

(5)读写/dev/dsp实现播放和录音。

1.3 linux ALSA音频设备驱动1.3.1 ALSA的主要特点.(1)支持多种声卡设备。

(2)模块化的内核驱动程序。

(3)支持SMP和多线程。

(4)提供应用开发函数库(alsa-lib)以简化应用程序开发。

(5)支持OSS API,兼容OSS应用程序。

ALSA系统包括驱动包alsa-driver,开发包alsa-libs,开发板插件alsa-libplugins,设置管理工具包alsa-utils,其他声音相关处理小程序包alsa-tools,特殊音频固件支持包alsa-firmware,OSS接口兼容模拟层工具alsa-oss,其中只有驱动包是必需的。

Ubuntu_编译Alsa声卡驱动

Ubuntu_编译Alsa声卡驱动

使用最新ALSA 驱动解决UBUNTU LINUX INTEL 集成声卡问题目前用户所抱怨的Ubuntu 系列的声卡问题,基本上归结为几类:一,找不到声音设备;二,不发声;三,耳机和音箱同时发声;四、话筒没声。

大部分这种问题都是由笔记本上Intel 集成声卡驱动引起的,关于这个问题的具体描述和解决方案,可以查看下面两个页面:BUG:https:///ubuntu/+source/linux-source-2.6.22/+bug/131133SOLUTION:https:///Gutsy_Intel_HD_Audio_Controller其实大部分问题都可以通过自己动手编译安装最新ALSA 驱动解决,解决方法上面两个链接中已经解释得很清楚了,我这里介绍一下我的思路:第一,查看ALSA 版本,如果最新,就不用重新安装了,仔细查看一下配置吧。

$ alsactl -v如果打印出:alsactl version 1.0.20,那么ALSA 已经是最新了。

第二,在ALSA 官方网站 上,下载最新的ALSA 驱动,怎么解压我就不说了吧。

$ wget ftp:///pub/driver/alsa-driver-1.0.20.tar.bz2$ wget ftp:///pub/lib/alsa-lib-1.0.20.tar.bz2$ wget ftp:///pub/utils/alsa-utils-1.0.20.tar.bz2第三,查看自己的内核版本和声卡解码芯片是否被支持。

查看支持的内核版本$ less alsa-driver-1.0.15/SUPPORTED_KERNELS查看自己声卡解码芯片(如果系统不能识别声卡,可能无法由下面两个查到,那么查看你电脑配置单吧)$ tail -2 /proc/asound/oss/sndstat或$ head -1 /proc/asound/card0/codec#0比如我的DELL D630 就显示的是下面这个Codec: SigmaTel STAC9205在alsa-driver-1.0.20/sound/Documentation/ALSA-Configuration.txt 中查找自己声卡解码芯片对应的model 名字,比如我的STAC9205 对应的就是:STAC9205/9254ref Reference boarddell-m42 Dell (unknown)dell-m43 Dell Precisiondell-m44 Dell Inspiron如果存在对应的model,恭喜你可以继续安装了。

Linux中用ALSA驱动声卡流程详解-电脑资料

Linux中用ALSA驱动声卡流程详解-电脑资料

Linux中用ALSA驱动声卡流程详解-电脑资料一、什么是ALSA ;Advanced Linux Sound Architecture 的简称为 ALSA ,译成中文的意思是Linux 高级声音体系(这是我直译的,可能译的不对);一谈到体系就有点范围就太大了,所以ALSA不仅仅是包括对声卡的支持和驱动;ALSA具有如下特征:代码:1、对所有音频接口的高效支持,从普通用户的声卡到专业级别多路音频设备;2、声卡驱动完全模块化设计;3、SMP and thread-safe design.4、开发库(alsa-lib)为程序设计提供了简单、方便,并且拥有有高级的效果和功能;5、支持旧版本的OSS API 结口,能为大多数的OSS应用程序提供兼容;OSS是一个商业性的驱动,OSS有一个简装本的代码已经移入内核和ALSA,其中alsa-oss就是;OSS公司据说目前已经并不存在了;我们没有必要用OSS 公司提供的商业版本;用ALSA和OSS简装版足够;二、关于硬件驱动驱动的必备基础;1、如何查看硬件芯片;在Linux操作系统中,所有的硬件都是以芯片组来区分的,品牌并不是最重要的;硬件最重要的标识是芯片组;所以您在讨论区求助的时候,只说硬件品牌,而不提供芯片组,大家是帮助不了您的,切记;我们查看硬件的芯片组是的命令是 lspci -v 或者是dmesg,由于dmesg输出的信息不太多,不够直观;所以经常用的还是lspci -v ;也可以用lshal 获取;最方便的还是lspci -v;初学者还是用lspci -v 更好一点;代码:[root@localhost beinan]# lspci -v我们运行lspci -v 后,如果查看声卡芯片组,发会现有类似下面的一段;[root@localhost beinan]# lspci -vMultimedia audio controller: Intel Corporation 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M)AC'97 Audio Controller (rev 03)Subsystem: Hewlett-Packard Company: Unknown device 3080Flags: bus master, medium devsel, latency 0, IRQ 5I/O ports at 1c00 size=256I/O ports at 18c0 size=64Memory at e0100c00 (32-bit, non-prefetchable) size=512 Memory at e0100800 (32-bit, non-prefetchable) size=256 Capabilities: [50] Power Management version 22、系统内核版本;[root@localhost beinan]# uname -r -m -p -i2.6.11-1.1369_FC4 i686 i686 i386上面的表示的是系统的内核版本,处理器架构等;提示:如果您自己编译内核,还要安装kernel-devel (或kernel-source),这个是在系统光盘或者映像文件中有带;如果您想自己用 下载内核,自己编译,然后再来驱动声卡,也可以到 上下载最新的内核源码;一般情况下,如果系统默认的内核不能驱动声卡,大多得更换内核,我们建议您先从发行版所提供的升级包来升级内核及源码;比如Fedora 的扩展项目软件包更新速度极快,我们能通过apt和yum进行kernel的升级;在启用新内核时,我们不建议您删除老内核;因为现在Fedora / Redhat 引入apt和yum 更新工具,系统的完整性极为重要;如果系统被破坏,用更新工具变得极为困难;比如Fedora 的apt和yum升级源升级的内核也解决不了您的问题,我们可能需要自己通过 下载内核来编译;但也不能删除以前的内核包及源码包;一是为了安全,毕竟我们自己编译内核不是百分之百的成功;另外系统自带的内核及源码包被系统很多软件依赖;apt和yum 每次更新软件包的时候都要检查系统的完整性;对于有些发行版,可以直接从从 下载最新的内核;如果从系统提供的内核源码(kernel-devel或kernel-source)编译,可能解决不了您的问题;3、modprobe.conf的内容;在Fedora Core 4.0 中,内核模块的添加或定义别名是在/etc/modprobe.conf 文件;在其它版本可能是modules.conf ;如果您的系统中存在modprobe.conf ,我们就以这个文件为准;不同发行版有不同的定义文件,比如slackware 是定义在/etc/modules.conf 中,但也要在/etc/rc.d/rc.modules 打开相关驱动模块;modprobe.conf 或者module.conf就是对系统已经加载的模块进行相应的配置,比如设置别名等;这些一般都是自通过工具自动生成的,我们也可以通过查看硬件的文档和站点,也可以自己添加,。

基于TCC8801的嵌入式Linux ALSA音频驱动设计与研究

基于TCC8801的嵌入式Linux ALSA音频驱动设计与研究
2 0 1 3年
第2 3 期
S C I E N C E&T E C H N OL OG Y I N F O R MA T I ON
O I T论坛 0
科技信息
基于 T C C 8 8 0 1 的嵌入式 L i n u x A L S A 音频驱动设计与研究
Th e Re s e a r c h o f Em b e d d e d Li n u x ALS A Au d i o Dr i v e r Ba s e d o n TCC8 8 0 1
Ma na g e me n t ( D A P M) w i d g e t a n d t h e c o n f i g u r a t i o n o f a u d i o p a t h i n t h e d i r v e r w a s i n t r o d u c e d i n d e t a i l . A t l a s t , t h e t e s t r e s u l t s s h o w ha t t he t d i r v e r c a n
t o t h e s p e c i f i c h a r d wa r e p l a t f o r m,AL S A d iv r e r o f t h e a u d i o c o d e c TL V3 2 0 AI C3 1 1 0 wa s y o u g h l y d e s c ib r e d.Me a n wh i l e 。Dy na mi c Au d i o P o we r
了音频编解码器 T L V 3 2 0 A I C 3 1 1 0的 A A架构驱动。 同时在驱动 中具体介绍 了D y n a m i c A u d i o P o w e r Ma n a g e m e n t ( D A P M ) Wi d g e t 和 音频路 径 的 配置A L S A驱动框架 ; T L V 3 2 0 A I C 3 l 1 0 ; T C C 8 8 0 1 ; D A P M Wi d g e t ; 音频路径 【 A b s t r a c t ] A d v a n c e d L i n u x S o u n d A r c h i t e c t u r e( A L S A ) a u d i o s y s t e m f r a m e w o r k h a s b e c o m e t h e m a i n s t r e a m a u d i o s y s t e m f r a m e w o r k . A c c o r d i n g

SoPC平台下ALSA标准声卡驱动设计与实现

SoPC平台下ALSA标准声卡驱动设计与实现

中图分类号:TP316 文献标识码:A 文章编号:1009-2552(2009)01-0073-03SoPC平台下ALSA标准声卡驱动设计与实现林 钦,刘佩林,应忍冬(上海交通大学电子工程系,上海200240)摘 要:介绍了SoPC平台下嵌入式Linux系统的ALSA音频子系统,针对Xilinx开发板的AC97控制器IP核,给出在嵌入式SoPC平台下音频驱动的设计方法及实现。

该设计方法充分利用Linux 内核对音频子系统提供的支持,克服嵌入式AC97控制器IP核IO缓冲区小的缺点,实现对该IP 核的驱动程序。

该驱动程序满足实时性要求,且在各SoPC平台具有可移植性。

关键词:SoPC;Linux;ALSA;驱动Design and implementation of ALSA sound driver on SoPC systemLIN Qin,LI U Pe-i lin,YING Ren-dong(Department of Electronic Engineering,Shanghai Jiaotong University,Shanghai200240,China) Abstract:A design method of ALSA sound driver based on AC97controller IP core in Xilinx SoPC Linux system is described,with introductions to architecture and sound driver ALSA which is a subsystem of Linux.B y taking full advantage of Linux sound subsystem,this design method largely decreases program complexity,and overcomes the shortcoming of e mbedded AC97controller whose I P core lacks IO me mory.The driver designed by this method meets the rea-l time specification and can be transplanted to other SoPC system.Key w ords:SoPC;Linux;ALSA;driver0 引言可编程片上系统SoPC(Syste m on a Program ming Chip)是一种新兴的嵌入式微处理器系统,其综合了通用处理器的灵活性和ASIC的高速性,是SoC (System on a Chip)片上系统和FPGA的结合。

linux ALSA 声卡驱动之Asoc架构中的Platform

linux ALSA 声卡驱动之Asoc架构中的Platform

1.Platform驱动在ASoC中的作用前面说过,ASoC被分为Machine、Platform和Codec三大部分,Platform驱动的主要作用是完成音频数据的管理,最终通过CPU的数字音频接口(DAI)把音频数据传送给codec进行处理,最终由codec输出驱动耳机或者喇叭的音频信号。

在具体的实现上。

ASoC把platform驱动分为两个部分:snd_soc_platform_driver和snd_soc_dai_driver。

其中。

Paltform_driver负责管理音频数据,把音频数据通过dma或者其他操作传送到cpu dai中,dai_driver主要完成cpu的dai的参数配置,同时会通过一定的途径把必要的dma 等参数与snd_soc_platform_driver进行交互2.snd_soc_platform_driver的注册通常,ASoC把snd_soc_platform_driver注册为一个系统的platform_driver,不要被这两个术语锁迷惑,前者是针对ASoC子系统,后者是来自linux的设备驱动模型,我们要做的就是. 定义一个snd_soc_platform_driver结构的实例. 在platform_driver的probe回调中利用ASoC的API:snd_soc_register_platform()注册上面定义的实例;. 实现snd_soc_pllatform_driver中的各个回调函数以kernel2.6.37中的/sound/soc/davinci/davinici-pcm.c为例Snd_soc_register_platform()该函数用于注册一个snd_soc_platform,只有注册以后,它才可以被Machine驱动使用,它的代码已经清晰的表达了它的实现过程. 为snd_soc_platform实例申请内存. 从platform_device中获取他的名字,用于Machine驱动的匹配工作;. 初始化snd_soc_platform的字段. 把snd_soc_platform实例链接到全局链表platform_list中. 调用snd_soc_instantiate_cards,触发声卡的machine、platform、codec、dai等的匹配工作3.cpu的snd_soc_dai driver驱动的注册dai驱动通常对应cpu的一个或者几个I2S/PCM接口,与snd_soc_platform一样,dai 驱动也就实现为一个platform driver,实现一个dai驱动大致可以分为以下几个步骤:. 定义一个snd_soc_dai_driver结构的实例;. 在对应的platform_driver中的probe回调中通过API:snd_soc_register_dai或者snd_soc_register_dais,注册snd_soc_dai实例;. 实现snd_soc_dai_driver结构中的probe、suspend等回调;. 实现snd_soc_dai_driver结构中的snd_soc_dai_ops字段中的回调函数;Snd_soc_register_dai这个函数在上一篇codec驱动总有介绍Snd_soc_dai该结构在snd_soc_register_dai函数中通过动态内存申请获得,有如下几个重要字段:. driver 指向关联的snd_soc_dai_sriver结构,由注册时通过参数传入;. Playback_dma_data用于保存该dai播放stream的dma信息,例如dma的目标地址,dma传送单元大小和通道号. Capture_dma_data同上,用于录音stream;. Platform 指向关联的snd_soc_platform结构;Snd_soc_dai_driver该结构需要自己根据不同的soc芯片进行定义,关键字段如下. probe、remove回调函数,分别在声卡加载和预卸时被调用;. suspend、resume 电源管理回调函数. Ops 指向snd_soc_dai_ops结构,用于配置和控制该dai;. Playback snd_soc_pcm_stream结构,用于指出该dai支持的声道数,码率,数据格式等. Capture snd_soc_pcm_stream结构,用于指出该dai支持的声道数,码率,数据格式4.Snd_soc_dai_driver中的ops字段Ops字段指向一个snd_soc_dai_ops结构,该结构实际上是一组回调函数的集合,dai的配置和控制几乎都是通过这些回调函数来实现的,这些回调函数基本可以分为3大类,驱动程序可以根据实际情况实现其中的一个部分工作始终配置函数通常由machine驱动调用:. set_sysclk 设置dai的主时钟. set_pll 设置PLL参数. set_clkdiv 设置分频系数. dai的格式配置函数通常由machine驱动调用:. set_fmt 设置dai的格式. set_tdm_slot 如果dai支持时分复用,用于设置时分复用的slot;. set_channel_map 声道的时分复用映射设置;. set_tristate 设置dai引脚的状态,当与其他dai并联使用同一个引脚时需要使用该回调标准的snd_soc_ops回调通常由soc-core在进行PCM操作时调用:. startup. Shutdown. Hw_params. Hw_free. Prepare. Trygger抗pop,pop声由soc-core调用;.digital_mute以下这些api通常被machine驱动使用,machine驱动在他的snd_pcm_ops字段中的hw_paarams回调中使用这些api:. Snd_soc_daiPset_fmt() 实际上会调用snd_soc_dai_ops或者codec driver中的set_fmt回调. Snd_soc_dai_set_pll() 实际上会调用snd_soc_dai_ops或者codec driver中的set_pll回调. Snd_soc_dai_set_sysclk() 实际上会调用snd_soc_dai_ops或者codec driver中的set_sysclk回调. Snd_soc_dai_set_clkdiv() 实际上会调用snd_soc_dai_ops或者codec driver中的set_clkdiv回调Snd_soc_dai_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)的第二个参数fmt在这里特别说一下,ASoC目前只是用了它的低16位,并且为它专门定义了一些宏来方便我们使用:Bit 0-3用于设置接口的格式:Bit 4-7用于设置接口时钟的开关特性:Bit 8-11用于设置接口时钟的相位Bit 12-15用于设置接口的主从格式5.snd_soc_platform_driver中的ops字段该字段是一个snd_pcm_ops结构,实现该结构中的各个回调函数式soc platform驱动的主要工作,他们基本都涉及dma操作以及dma buffer的管理等工作。

linux下ALSA-arecord 使用

linux下ALSA-arecord 使用

linux 下 ALSA-arecord 使用一.alsa-utils 介绍ALSA 是 kernel 中的一个声音驱动程序.它包括 alsa 核心和其他声卡的驱动. alsa-utils 是 alsa 的一个工具包,里面包含有声卡测试和音频编辑的工具.二.alsa-utils 的安装1.RPM 包方式Turbolinux 10.5,11 版本已经包含有 alsa-utils 的 rpm 包,你可以直接安装:# rpm -ivh alsa-utils-xxx.rpm2.源码包方式下载地址:/main/index.php/Download源码包安装方法:# tar zxvf alsa-utils-1.0.6.tar.gz # cd alsa-utils-1.0.6 # ./configure # make install三.alsa-utils 工具的使用alsa-utils 包含的工具有:alsactl, aconnect, alsamixer, amidi, amixer, aplay, aplaymidi, arecord, arecordmidi,aseqnet, iecset, speaker-test1.alsactl 的使用alsactl 用来对 alsa 声卡驱动进行一些高级的设置.系统中装有多个声卡,它也可 以支持. 有时在音量控制面板无法调整的选项,可以使用 alsactl 来实现. alsactl 可以将指定声卡的驱动程序设置信息保存到配置文件 .或从配置文件中 恢复指定 声卡的驱动程序的设置信息.alsactl 格式:alsactl [options] [store|restore] <card # or id>选项:-h, --help 打印帮助信息-f, --file 指定使用的配置文件,默认为/etc/asound.state. Select the configuration file to use. The default is/etc/asound.state-F, --force 与恢复命令一起使用.表示最大限度的恢复设置值.-d, --debug 调试模式,输出更多细节信息.-v, --version 打印 alsactl 版本号.文件: /etc/asound.state(或使用-f 指定的文件)保存有声卡所有混合器的设置信息.示例:# rm /etc/asound.state -f # alsactl store2.aconnect 的使用aconnect 是 ALSA 音序器的连接管理器.用来连接或断开 ALSA 音序器上的端 口.端口是 可以随意定义的. 如,使用 aconnect 可以连接到任何由 aseqview 建立的设备端口. 命令格式:aconnect [-d] [-options] sender receiver aconnect -i|-o [-options] aconnect -x选项: 连接管理 -d, --disconnect 断开连接.-e, --exclusive 使用独占模式连接端口.发送和接收端口将不能再与其他端口相连.-r, --real queue 将时间包的时间戳,转换为真实时间队列的当前值.显示端口 -i, --input 显示存在的输入端口.-o, --output 显示存在的输出端口.-l, --list 显示当前的连接状态.删除连接 -x, --removeall 删除所有连接.示例:连接端口 64:0 到 65:0: % aconnect 64:0 65:0 这个连接是单向的,所有到发送端口 64:0 的数据,将被重定向到接收 65:0 端口.如果有另一个端口 65:1, 也使用 64:0 作为发送端口,则数据会同时发送到 2 个接收端口. 端口连接时,使用: % aconnect -d 64:0 65:0地址也可以使用客户端的名字来代替: % aconnect External:0 Emu8000:1使用-i 打印出输入端口信息.-o 打印出输出端口信息. % aconnect -i client 0: ’System’ [type=kernel] 0 ’Timer 1 ’Announce ’ ’client 64: ’External MIDI-0’ [type=kernel] 0 ’MIDI 0-0 ’可以使用-x 选项来清除所有的连接. % aconnect -x3.alsamixer 的使用alsamixer 是一个终端界面的声卡音量调节器.如图:命令格式: alsamixer [options]选项: -h, -help 显示帮助信息.-c <card number or idenfication> 指定需要设置的声卡.默认为 0.-D <device identification> 选择需要控制的调节器.-g 设置界面颜色.-s 最小化界面窗口.快捷键: 进入 alsamixer 界面后,可以使用下面快捷键进行控制:常规控制: 左右箭头或 n,p 用来选择通道.上下箭头或+,-同时调整选定通道的左右声道的音量.B,=设置左右声道音量相同.M静音当前通道.<,>分别对左,右声道静音.空格选择录音源.在选定的通道上按"空格",可以标记此通道为录音源.此操作仅限 输入设备.插入键或";",删除键或"'"分别选定左右通道.L刷新屏幕.快捷设置 PageUp 增大 5 格音量.PageDown减小 5 格音量.End设置音量为 0.分别调整左,右或整个通道的音量. Q,W,E 增大 左,右,通道 的音量.Z,X,C减小 左,右,通道 的音量.alt-q,ESC 退出.4.amidi 的使用amidi 的作用是对 ALSA 的 RawMIDI 端口进行读写. amidi 是一个命令行工具,允许你以独占模式向 MIDI 设备读/写数据.命令格式: amidi options选项: -h,-V,-l,-L -s,-r,-S,-d 用于显示信息. 用于发送/接收数据.-h, --help 打印帮助信息.-V, --version 打印版本号.-l, --list-devices打印所有硬件 MIDI 端口的列表.-L, --list-rawmidis 打印所有 RawMIDI 定义.-p, --port=name 设置要使用的 ALSA RawMIDI 端口.若不指定,则使用声卡 0 的端口 0.-s, --send=filename 发送指定文件的内容到 MIDI 端口.文件中必须包含 raw MIDI 命令(.syx,.mid 文 件).-r, --receive=filename 将 MIDI 端口接收的数据写入指定文件.-S, --send-hex="..." 发送十六进制字节到 MIDI 端口.-d, --dump 从 MIDI 端口接收数据,然后以十六进制形式打印出来.-t, --timeout=秒 指定超时,当端口无数据输出达到超时时长时,将停止接收数据.示例:amidi -p hw:0 -s my_settings.syx 发送 my_settings.syx 终端 MIDI 命令到端口 hw:0.amidi -S ’ 发送 XG 复位到默认端口.amidi -p virtual -d 建立一个虚拟 RawMIDI 端口,然后发送所有数据到这个端口.5.amixer 的使用amixer 是命令行的 ALSA 声卡驱动调节器工具. amixer 用来在命令行控制 ALSA 的调节器,并且支持多声卡. amixer 不加参数时,将打印默认声卡的设置信息. 命令格式:amixer [-c card] [cmd]命令: help 显示语法帮助.info显示调节器设备的信息.scontrols显示调节器器的完整列表 .scontents显示包含详细信息的调节器的完整列表.set or sset <SCONTROL> <PARAMETER> ... 设置调节器信息.get or sget <SCONTROL> 显示调节器的信息.controls显示声卡控制器的信息.contents显示完整的声卡控制器信息.cset <CONTROL> <PARAMETER> ... 设置声卡控制器信息.cget <CONTROL>显示声卡控制器的信息.选项: [-c card] 选择指定的声卡.[-D device] 选择需要控制的设备名.默认是 default.-hHelp 显示帮助信息.-q 安静模式.不输出设置结果.示例:# amixer -c 1 sset Line,0 80%,40% unmute cap 设置第 2 块声卡的"line"的左声道音量为 80%,右声道为 40%,取消静音,并设置 它为声音源.# amixer -c 2 cset numid=34 40% 设置第 34 个声卡元素为 40%.6.arecord,aplay 的使用arecord,aplay 是命令行的 ALSA 声卡驱动的录音和播放工具. arecord 是命令行 ALSA 声卡驱动的录音程序.支持多种文件格式和多个声卡. aplay 是命令行播放工具,支持多种文件格式. 命令格式:arecord [flags] [filename] aplay [flags] [filename [filename]] ...选项:-h, --help 帮助.--version 打印版本信息.-l, --list-devices 列出全部声卡和数字音频设备.-L, --list-pcms 列出全部 PCM 定义.-D, --device=NAME 指定 PCM 设备名称.-q --quiet 安静模式.-t, --file-type TYPE 文件类型(voc,wav,raw 或 au).-c, --channels=# 设置通道号.-f --format=FORMAT 设置格式.格式包括:S8 U8 U16_BE S16_LE S16_BE U16_LES24_LE S24_BE U24_LE U24_BE S32_LE S32_BE U32_LE U32_BE FLOAT64_LE FLOAT64_BE IEC958_SUBFRAME_LEFLOAT_LE FLOAT_BEIEC958_SUBFRAME_BE MU_LAW A_LAW IMA_ADPCM MPEG GSM-r, --rate=#<Hz> 设置频率.-d, --duration=# 设置持续时间,单位为秒.-s, --sleep-min=# 设置最小休眠时间.-M, --mmap mmap 流.-N, --nonblock 设置为非块模式.-B, --buffer-time=# 缓冲持续时长.单位为微妙.-v, --verbose 显示 PCM 结构和设置.-I, --separate-channels 设置为每个通道一个单独文件.示例:aplay -c 1 -t raw -r 22050 -f mu_law foobar 播放 raw 文件 foobar.以 22050Hz,单声道,8 位,mu_law 格式.arecord -d 10 -f cd -t wav -D copy foobar.wav 以 CD 质量录制 foobar.wav 文件 10 秒钟.使用 PCM 的"copy".7.aplaymidi 的使用aplaymidi 用来播放标准的 MIDI 文件. aplaymidi 是一个命令行工具,可以在一个或多个 ALSA 端口上播放 MIDI 文件. 命令格式:aplaymidi -p client:port[,...] [-d delay] midifile ...选项: -h, --help 输出帮助信息.-V, --version 输出版本信息.-l, --list 输出可以使用的输出端口列表.-p, --port=client:port,... 设置端口.-d, --delay=seconds 设置 MIDI 文件结束后,等待时长.8.arecordmidi 的使用arecordmidi 用于录制标准的 MIDI 文件. arecordmidi 可以从一个或多个 ALSA 端口上,录制一个标准 MIDI 文件. 命令格式:arecordmidi -p client:port[,...] [options] midifile选项: -h,--help 打印帮助信息.-V,--version 打印版本号.-l,--list 打印可以使用的输入端口.-p,--port=client:port,... 设置端口.-b,--bpm=beats 设置 MIDI 文件的速率,默认为 120 BPM.-f,--fps=frames 设置帧率.-s,--split-channels 设置每个通道将录制成一个单独的 MIDI 文件.-d,--dump 在标准输出上,以文本形式显示接受到的事件信息9.aseqnet 的使用aseqnet 是 ALSA 调节器的网络连接工具. aseqnet 是 ALSA 调节器的客户端程序,可以从网络上发送和接收事件数据包.网络上有主机 A,主机 B.A 为服务器端,B 为客户端.ALSA 调节器系统必须同事运 行 在两个服务器上.然后建立服务器端口:hostA% aseqnet sequencer opened: 128:0在 HostB 上执行:hostB% aseqnet hostA sequencer opened: 132:0现在所有发送到 HostA:128:0 的数据将被传送到 HostB:132:0 上,反之亦然. 命令格式:aseqnet [remotehost]选项: -p port 指定 TCP 端口号或服务名.-s addr 设置指定地址用于读操作.-d addr 设置指定地址用于写操作. -v详细输出模式.10.iecset 的使用设置或输出 IEC958 状态位. iecset 是个小工具,通过 ALSA 的 API,设置或输出 IEC958(或称 S/PDIF)状态 位信息. 直接运行 iecset 将输出当前 IEC958 的状态信息. 命令格式:iecset [options] [cmd arg...]选项: -D device 设置需要打开的设备名.-c card 设置需要打开的网卡名.-x 输出 AESx 字节格式的状态信息.-i 从标准输入读取命令信息,每行一个命令.命令: professional <bool>专业模式(true)或用户模式(false).audio <bool> 音频模式(true).rate <int> 采样频率,单位 Hz.emphasis <int> 设置加强值.0 = none, 1 = 50/15us, 2 = CCITT.lock <bool> 速率锁.sbits <int> 采样位:2 = 20bit, 4 = 24bit, 6 = undefined.wordlength <int> 设置字长:0 = No, bit, 6 = 20-16 bit. 2 = 22-18 bit, 4 = 23-19 bit, 5 = 24-20category <int> 分类:值从 0 到 0x7f.copyright <bool> 设置是否包含版权.original <boo> 原始标记:示例:输出当前 IEC958 信息. $ iecset Mode: consumer Data: audio Rate: 44100 Hz Copyright: permitted Emphasis: none Category: general Original: 1st generation Clock: 1000 ppm显示当前第 1 块声卡的 IEC958 状态位. $ iecset -Dhw:0 Mode: consumer Data: non-audio Rate: 44100 Hz Copyright: permitted Emphasis: noneCategory: general Original: 1st generation Clock: 1000 ppm设置当前为用户模式,并打开"非音频"位. $ iecset pro off audio off Mode: consumer Data: non-audio Rate: 44100 Hz Copyright: permitted Emphasis: none Category: general Original: 1st generation Clock: 1000 ppm11.speaker-test 的使用speaker-test 是一个针对 ALSA 驱动的声音测试工具. speaker-test 可以分别对左右声道进行单独的测试. 命令格式:speaker-test [-options]选项: -c | --channels NUM设置通道数目.-D | --device NAME 设置使用的 PCM 设备名.-f | --frequency FREQ 设置声音频率.--help 输出帮助信息.-b | --buffer TIME 设置缓冲区时长.0 为使用最大的缓冲区大小.-p | --period TIME 设置节拍为多少微秒.-r | --rate RATE 设置音频率.-t | --test pink|sine|wav -t pink -t sine -t wav 表示测试时使用噪声. 表示测试时使用音频信号声. 表示测试时使用 WAV 文件.-l | --nloops COUNT 设置测试循环的次数.-w | --wavfile 设置测试时播放的 wav 文件.-W | --wavdir 设置一个包含 wav 文件的目录.默认为/usr/share/sounds/alsa.示例:在一个音频接口上进行立体声测试 # speaker-test -Dplug:front -c2在两个音频接口上进行 4 声道测试. # speaker-test -Dplug:surround40 -c4在立体声接口上进行 5.1 声道测试. # speaker-test -Dplug:surround51 -c6测试低音扬声器. # speaker-test -Dplug:surround51 -c6 -s1 -f75。

ALSA---amixer控制声卡驱动实现Line-in功能

ALSA---amixer控制声卡驱动实现Line-in功能

ALSA---amixer控制声卡驱动实现Line-in功能ALSA --- amixer控制声卡驱动实现Line-in功能分类: ARM2012-07-17 16:29 491⼈阅读评论(1) 收藏举报开发环境:Ubuntu12.04 开发板:OK6410,Linux3.0alsamixer是Linux ⾳频架构ALSA⼯具的其中⼀个,⽤于配置⾳频的各个参数。

alsamixer是基于⽂本下的图形界⾯的,可以通过键盘的上下键,左右键等,很⽅便地设置需要的⾳量,开关某个switch(开关)等等操作,下图是在Ubuntu12.04系统上图形配置界⾯,操作⾮常的简单,这⾥使⽤的是Ubuntu12.04的Line-in功能(实现⽴体声功能):声⾳播放输出通道设置:声⾳输⼊设备通道设置:笔者测试Ubuntu12.04的Line-in功能,所以选择⾳频输⼊通道为 Line。

amixer,是alsamixer的⽂本模式,即命令⾏模式,需要⽤amixer命令的形式去配置你的声卡的各个选项,可以这么说,你也许会直接修改Linux内核⾳频驱动源码来满⾜您的需求,⽐如选择⾳频输⼊通道是Mic输⼊,还是Line 输⼊,需要修改WM9714的寄存器来决定,⽽amixer可以从应⽤层来修改⾳频芯⽚的寄存器值,决定采⽤Mic输⼊或者Line输⼊。

这样就⼤⼤简化了代码修改的难度,毕竟⽐直接修改Linux Kernel ALSA会简单些。

对于amixer的使⽤,你⾸先需要搞懂你要设置的参数是哪些,然后才可能去了解,如何去配置对应的值,整体来说,相对alsamixer来说,是有点繁琐,下⾯简要介绍其具体⽤法:1.先看看amixer⽀持哪些命令,⼤概有哪些功能# amixer --helpUsage: amixer <options> [command]Available options:-h,--help this help-c,--card N select the card-D,--device N select the device,default 'default'-d,--debug debug mode-n,--nocheck do not perform range checking-v,--versionprint version of this program-q,--quiet be quiet-i,--inactive show also inactive controls-a,--abstract L select abstraction level (none or basic)-s,--stdin Read and execute commands from stdin sequentiallyAvailable commands:scontrols show all mixer simple controlsscontents show contents of all mixer simple controls (default command)sset sID P set contents for one mixer simple controlsget sID get contents for one mixer simple controlcontrols show all controls for given cardcontents show contents of all controls for given cardcset cID P set control contents for one controlcget cID get control contents for one control2.再看看当前你的⾳频系统(不同的⾳频驱动对应不同的内容和操作接⼝)提供了那些供你使⽤的接⼝去操作关于驱动⾥⾯已经提供了多少接⼝可以去操作,可以⽤命令:amixer contents查看,⽐如:[root@FORLINX6410]# ./amixer controlsnumid=49,iface=MIXER,name='Headphone Mixer Aux Playback Volume'numid=43,iface=MIXER,name='Headphone Mixer Beep Playback Volume'numid=32,iface=MIXER,name='Headphone Playback ZC Switch'numid=4,iface=MIXER,name='Headphone Playback Switch'numid=3,iface=MIXER,name='Headphone Playback Volume'numid=6,iface=MIXER,name='PCM Playback Volume'numid=5,iface=MIXER,name='Line In Volume'××××××××××××××××××××××××××××××××××××××××××××××××⽽对于所有的配置的值,可以通过 amixer contents打印:[root@FORLINX6410]# ./amixer contentsnumid=49,iface=MIXER,name='Headphone Mixer Aux Playback Volume'; type=INTEGER,access=rw---R--,values=1,min=0,max=7,step=0: values=5| dBscale-min=-15.00dB,step=3.00dB,mute=0numid=43,iface=MIXER,name='Headphone Mixer Beep Playback Volume'; type=INTEGER,access=rw---R--,values=1,min=0,max=7,step=0: values=5| dBscale-min=-15.00dB,step=3.00dB,mute=0numid=32,iface=MIXER,name='Headphone Playback ZC Switch'; type=BOOLEAN,access=rw------,values=2: values=off,off。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

11/12/2011
三、准备工作
4. 流程图结构说明 (1) 图示为函数的调用关系,向下为同一级调用,向右为函数内部的子函数调用。 (2) 绿色文字函数名(如function2)表示该函数是调用流程中比较关键的点。 (3) 红底白字的函数名(如function…)表示和其它层(如app和lib、lib和driver、alsa-driver和device-driver)的接口 函数或kernel的回调函数。 (4) 蓝色双虚线为函数实参等形式的输出值或函数返回值(如sun_function…有输出值到function1)。
11/12/2011
目录
一、导读 二、ALSA架构简介 三、准备工作 四、设备打开过程和数据流程 i. 整体分析 ii. 设备驱动程序insmod流程图 iii. 应用程序主流程图 iv. 声卡打开流程图 v. 数据写入流程图 五、ALSA其它形式的数据写入方法流程图
11/12/2011
三、准备工作
11/12/2011
目录
一、导读 二、ALSA架构简介 三、准备工作 四、设备打开过程和数据流程 i. 整体分析 ii. 设备驱动程序insmod流程图 iii. 应用程序主流程图 iv. 声卡打开流程图 v. 数据写入流程图 五、ALSA其它形式的数据写入方法流程图
11/12/2011
一、导 读
主函数()
function1()
sub_function1() function2() ......() sun_functionnction...()
function...()
11/12/2011
目录
一、导读 二、ALSA架构简介 三、准备工作 四、设备打开过程和数据流程 i. 整体分析 ii. 设备驱动程序insmod流程图 iii. 应用程序主流程图 iv. 声卡打开流程图 v. 数据写入流程图 五、ALSA其它形式的数据写入方法流程图
11/12/2011
四、设备打开过程和数据流程
ii.设备驱动程序insmod流程图
module_init(alsa_card_ens137x_init) alsa_card_ens137x_init() pci_register_driver(&driver) snd_audiopci_probe() snd_card_new() snd_ensoniq_create() pci_enable_device() snd_ensoniq_1371_mixer() snd_ac97_bus() snd_ac97_mixer() snd_ensoniq_pcm() snd_pcm_new() pci_request_regions() pci_resource_start() request_irq() pci_set_master() snd_ensoniq_chip_init() snd_device_new() snd_pcm_set_ops() snd_card_set_dev(card, &pci->dev) snd_pcm_lib _preallocate_pages_for_all() outl(…) 通过设置硬件寄存器 初始化硬件
ALSA-lib
control
timer
… pcm
dmix
内核API ALSA-driver 设备驱动
hardware
ens1371
11/12/2011
目录
一、导读 二、ALSA架构简介 三、准备工作 四、设备打开过程和数据流程 i. 整体分析 ii. 设备驱动程序insmod流程图 iii. 应用程序主流程图 iv. 声卡打开流程图 v. 数据写入流程图 五、ALSA其它形式的数据写入方法流程图
11/12/2011
二、 ALSA架构简介
左图是从代码的角度体现了alsa-lib和alsa-driver 及hardware的交互关系。用户层的alsa-lib通 过操作alsa-driver创建的设备文件 /dev/snd/pcmC0D0p等对内核层进行访问。内 核层的alsa-drivier驱动再经由sound core对硬 件声卡芯片进行访问。从而实现了 app alsa-lib alsa-driver hardware的操 作。 图中右上角OSS相关部分是为了兼容OSS驱动模 型而存在的。不是本实践的相关部分。
1. ALSA是Advanced Linux Sound Architecture ,高级Linux声音架构的简称,它在Linux操作系 统上提供了音频和MIDI(Musical Instrument Digital Interface,音乐设备数字化接口)的支 持。它包含API 库和工具、内核驱动集合, 对 Linux 声音进行支持。 ALSA 包含一系列内核 驱动对不同的声卡进行支持,还提供了 libasound 的 API 库。用这些进行写程序不需 要打开设备等操作,所以编程人员在写程序的 时候不会被底层的东西困扰。 2. ALSA自带的应用程序是alsa-utils工具包,包 括aplay、alsamixer等。aplay用于在ASLA上 播放音频。alsamixer用于改变音频信号的音 量。 3. alsa-lib是用户空间的函数库,提供了 libasound.so给应用程序使用,应用程序应包 含头文件asoundlib.h。这个库通过提供封装函 数(ALSA-API),使ALSA应用程序不需要涉及 具体硬件,编写起来更容易。alsa-lib中有 control,timer,dmix,pcm等,都是以插件 (plugin)的形式存在的。alsa-lib通过硬件访问 层的系统调用与内核层进行交互。 4. alsa-driver是音频设备的alsa内核部分的驱 动。集成在内核里面,大多是以模块的方式存 在。可分为三层。 (1)最底层是硬件操控层,负责实现硬件操纵 访问的功能,这也是声卡驱动程序中用户需实 现的主要部分; (2)中间层是ASLA驱动的核心部分,它由各种 功能的音频设备组件构成,为用户提供了一些 预定义组件(如PCM、AC97、音序器和控制 器等),另外用户也可以自行定义设备组件; (3)驱动的最上层是声卡对象描述层,它是声 卡硬件的抽象描述,内核通过这些描述可以得 知该声卡硬件的功能、设备组件和操作方法 等。
三、准备工作
2. ALSA-lib调试方法示例。
图中红色表示为在 shell中输入的命令, 具体命令要根据具体 环境自己修改。
跟踪代码时可以在 gdb中使用 bt(backtrace)指令跟 踪调用栈查看函数调 用关系。
11/12/2011
三、准备工作
3. 生成alsa-lib文档 alsa-lib中可以用文档生成工具doxygen生成API及相关说明文档。在alsa-lib-1.0.16中依次执行如下: #cd /opt/alsa-lib-1.0.16 #cd doc #doxygen doxygen.cfg 在新生成的文件夹 doxygen/html中就会有网页形式的文档,首页为index.html
Linux ALSA声卡驱动原理分析
设备打开过程和数据流程
11/12/2011
目录
一、导读 二、ALSA架构简介 三、准备工作 四、设备打开过程和数据流程 i. 整体分析 ii. 设备驱动程序insmod流程图 iii. 应用程序主流程图 iv. 声卡打开流程图 v. 数据写入流程图 五、ALSA其它形式的数据写入方法流程图
为了更有效的跟踪ALSA的流程,需要在开始前进行一些准备工作,这包括用户层ALSA-lib库的调试方法和文档生 成。alsa-driver的调试方法参见《Linux 基础培训(2)-驱动开发最佳实践-1.pptx》。对调用流程和数据流程进行分析 时,这部分内容起到辅助作用。 1. ALSA-lib调试方法 alsa-utils中的aplay程序可以进行应用程序和lib库的调试。 操作如下: (1) 复制alsa-utils和alsa-lib到linux文件系统下,如: #cp -rf alsa-utils-1.0.16 /opt/ #cp -rf alsa-lib-1.0.16 /opt/ ※红色文字表示shell中输入的命令,具体命令要根据具体环境自己修改。 alsa-utils-1.0.16和alsa-lib-1.0.16从网上下,也可以在光盘debian-506-source-DVD-1.iso中的pool/main/a/文件夹 下找到。 (2). 复制音频文件,如复制test_files文件夹到/opt下, #cp -rf test_files /opt/ (3). 在alsa-lib-1.0.16中依次执行如下: #cd /opt/alsa-lib-1.0.16 #./configure #make #make install ※系统需要安装gcc等工具。 (4). 在alsa-utils-1.0.16 中中依次执行如下: #cd /opt/alsa-utils-1.0.16 #./configure #cd aplay #make 就会生成执行文件aplay。 (5). 执行aplay文件播放.wav声音文件。如: #./aplay /opt/test_files/pcm.wav 注意命令前面的” ./”如果不加,而系统中又安装了alsa-utils工具,就会执行/usr/bin/aplay,注意不要混了。 (6). 通过gdb可以对alsa-utils的aplay和alsa-lib的libsound.so进行本地调试。 #gdb aplay (gdb)set args /opt/test_files/pcm.wav (gdb)b main 11/12/2011 (gdb)r … … ... …
本文主要针对ALSA声卡硬件驱动,从应用程序的角度展示了从用户层到内核层再 到硬件驱动程序控制声卡硬件的过程。主要包括insmod、声卡打开、数据写入 三个流程。rmmod和声卡关闭的流程与insmod、声卡打开类似,本文没有描 述。ALSA的其他部分如控制、录音等,不在本文叙述范围内。其中的insmod是 系统初始化时或手动加载,不需要具体的应用程序参与。具体到硬件,使用的是 ENS1371芯片,关于最小化的ENS1371芯片驱动程序,可以参考《 Linux ALSA声卡驱动开发最佳实践.pptx》。
相关文档
最新文档