#导入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
图2-1
图2-2
图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下网络编程(socket)