#导入Word文档图片# Linux下音频编程

Posted DS小龙哥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了#导入Word文档图片# Linux下音频编程相关的知识,希望对你有一定的参考价值。

Linux下音频编程

一、ALSA音频架构简单介绍​

ALSA是Advanced Linux Sound Architecture,高级Linux声音架构的简称,它在Linux操作系统上提供了音频和MIDI(Musical Instrument Digital Interface,音乐设备数字化接口)的支持。在2.6系列内核中,ALSA已经成为默认的声音子系统,用来替换2.4系列内核中的OSS(Open Sound System。开放声音系统)。ALSA的主要特性包含:高效地支持从消费类入门级声卡到专业级音频设备全部类型的音频接口,全然模块化的设计。 支持对称多处理(SMP)和线程安全。对OSS的向后兼容,以及提供了用户空间的alsa-lib库来简化应用程序的开发。

ALSA是一个全然开放源码的音频驱动程序集,除了像OSS那样提供了一组内核驱动程序模块之外,ALSA还专门为简化应用程序的编写提供了对应的函数库,与OSS提供的基于ioctl的原始编程接口相比。ALSA函数库使用起来要更加方便一些。利用该函数库,开发人员能够方便快捷的开发出自己的应用程序,细节则留给函数库内部处理。当然 ALSA也提供了类似于OSS的系统接口,只是ALSA的开发人员建议应用程序开发人员使用音频函数库而不是驱动程序的API。

二、下载安装alsa-lib库​

在ubuntu系统上安装alsa-lib库方法:

sudo apt-get install libasound2-dev


如果是在其他发行版linux系统上或者需要在嵌入式linux系统上使用alsa-lib库,可以下载alsa-lib源码包,自行编译。


开源ALSA架构的官网地址:https://www.alsa-project.org/wiki/Main_Page

#导入Word文档图片#


图2-1

#导入Word文档图片#


图2-2

#导入Word文档图片#



图2-3

三、获取本机上所有声卡设备​

3.1 通过arecord -L命令获取

获取声卡可以使用arecord -L命令。

在ubuntu系统下如果没有这个命令,直接根据提示安装一个即可。

示例:

wbyq@wbyq:/mnt/hgfs/linux-share-dir/linux_c/linux_pcm_save$ arecord -L

default

Playback/recording through the PulseAudio sound server

null

Discard all samples (playback) or generate zero samples (capture)

pulse

PulseAudio Sound Server

sysdefault:CARD=AudioPCI

Ensoniq AudioPCI, ES1371 DAC2/ADC

Default Audio Device

front:CARD=AudioPCI,DEV=0

Ensoniq AudioPCI, ES1371 DAC2/ADC

Front speakers

iec958:CARD=AudioPCI,DEV=0

Ensoniq AudioPCI, ES1371 DAC2/ADC

IEC958 (S/PDIF) Digital Audio Output

dmix:CARD=AudioPCI,DEV=0

Ensoniq AudioPCI, ES1371 DAC2/ADC

Direct sample mixing device

dsnoop:CARD=AudioPCI,DEV=0

Ensoniq AudioPCI, ES1371 DAC2/ADC

Direct sample snooping device

hw:CARD=AudioPCI,DEV=0

Ensoniq AudioPCI, ES1371 DAC2/ADC

Direct hardware device without any conversions

plughw:CARD=AudioPCI,DEV=0

Ensoniq AudioPCI, ES1371 DAC2/ADC

Hardware device with all software conversions

3.2 通过代码获取​

#include <stdio.h>

#include <stdlib.h>

#include <alsa/asoundlib.h>

static void device_list(void)

snd_ctl_t *handle;

int card, err, dev,idx;

snd_ctl_card_info_t *info;

snd_pcm_info_t *pcminfo;

snd_ctl_card_info_alloca(&info);

snd_pcm_info_alloca(&pcminfo);

card = -1;

if (snd_card_next(&card) < 0 || card < 0)

error(_("no soundcards found..."));

return;

printf(_("**** List of %s Hardware Devices ****/n"),

snd_pcm_stream_name(stream));

while (card >= 0)

char name[32];

sprintf(name, "hw:%d", card);

if ((err = snd_ctl_open(&handle, name, 0)) < 0)

error("control open (%i): %s", card, snd_strerror(err));

goto next_card;

if ((err = snd_ctl_card_info(handle, info)) < 0)

error("control hardware info (%i): %s", card, snd_strerror(err));

snd_ctl_close(handle);

goto next_card;

dev = -1;

while (1)

unsigned int count;

if (snd_ctl_pcm_next_device(handle, &dev)<0)

error("snd_ctl_pcm_next_device");

if (dev < 0)

break;

snd_pcm_info_set_device(pcminfo, dev);

snd_pcm_info_set_subdevice(pcminfo, 0);

snd_pcm_info_set_stream(pcminfo, stream);

if ((err = snd_ctl_pcm_info(handle, pcminfo)) < 0)

if (err != -ENOENT)

error("control digital audio info (%i): %s", card, snd_strerror(err));

continue;

printf(_("card %i: %s [%s], device %i: %s [%s]/n"),

card, snd_ctl_card_info_get_id(info), snd_ctl_card_info_get_name(info),

dev,

snd_pcm_info_get_id(pcminfo),

snd_pcm_info_get_name(pcminfo));

count = snd_pcm_info_get_subdevices_count(pcminfo);

printf( _(" Subdevices: %i/%i/n"),snd_pcm_info_get_subdevices_avail(pcminfo), count);

for(idx = 0; idx < (int)count; idx++)

snd_pcm_info_set_subdevice(pcminfo, idx);

if ((err = snd_ctl_pcm_info(handle, pcminfo)) < 0)

error("control digital audio playback info (%i): %s", card, snd_strerror(err));

else

printf(_(" Subdevice #%i: %s/n"),idx, snd_pcm_info_get_subdevice_name(pcminfo));

snd_ctl_close(handle);

next_card:

if(snd_card_next(&card)<0)

error("snd_card_next");

break;


int main(int argc,char 以上是关于#导入Word文档图片# Linux下音频编程的主要内容,如果未能解决你的问题,请参考以下文章

#导入Word文档图片# Linux下线程编程

#导入Word文档图片# Linux下网络编程(socket)

#导入Word文档图片# Linux下Shell脚本语言编程

#导入Word文档图片# Linux下信号处理

#导入Word文档图片# Linux下文件目录权限操作

#导入Word文档图片# Linux下FrameBuffe(LCD)驱动编写