1. Display Some PCM Types and Formats

2. Opening PCM Device and Setting Parameters

/* 

This example opens the default PCM device, sets
some parameters, and then displays the value
of most of the hardware parameters. It does not
perform any sound playback or recording. */ /* Use the newer ALSA API */
#define ALSA_PCM_NEW_HW_PARAMS_API /* All of the ALSA library API is defined
* in this header */
#include <alsa/asoundlib.h> int main() {
int rc;
snd_pcm_t *handle;
snd_pcm_hw_params_t *params;
unsigned int val, val2;
int dir;
snd_pcm_uframes_t frames; /* Open PCM device for playback. */
rc = snd_pcm_open(&handle, "default",
SND_PCM_STREAM_PLAYBACK, );
if (rc < ) {
fprintf(stderr,
"unable to open pcm device: %s\n",
snd_strerror(rc));
exit();
} /* Allocate a hardware parameters object. */
snd_pcm_hw_params_alloca(¶ms); /* Fill it in with default values. */
snd_pcm_hw_params_any(handle, params); /* Set the desired hardware parameters. */ /* Interleaved mode */
snd_pcm_hw_params_set_access(handle, params,
SND_PCM_ACCESS_RW_INTERLEAVED); /* Signed 16-bit little-endian format */
snd_pcm_hw_params_set_format(handle, params,
SND_PCM_FORMAT_S16_LE); /* Two channels (stereo) */
snd_pcm_hw_params_set_channels(handle, params, ); /* 44100 bits/second sampling rate (CD quality) */
val = ;
snd_pcm_hw_params_set_rate_near(handle,
params, &val, &dir); /* Write the parameters to the driver */
rc = snd_pcm_hw_params(handle, params);
if (rc < ) {
fprintf(stderr,
"unable to set hw parameters: %s\n",
snd_strerror(rc));
exit();
} /* Display information about the PCM interface */ printf("PCM handle name = '%s'\n",
snd_pcm_name(handle)); printf("PCM state = %s\n",
snd_pcm_state_name(snd_pcm_state(handle))); snd_pcm_hw_params_get_access(params,
(snd_pcm_access_t *) &val);
printf("access type = %s\n",
snd_pcm_access_name((snd_pcm_access_t)val)); snd_pcm_hw_params_get_format(params, &val);
printf("format = '%s' (%s)\n",
snd_pcm_format_name((snd_pcm_format_t)val),
snd_pcm_format_description(
(snd_pcm_format_t)val)); snd_pcm_hw_params_get_subformat(params,
(snd_pcm_subformat_t *)&val);
printf("subformat = '%s' (%s)\n",
snd_pcm_subformat_name((snd_pcm_subformat_t)val),
snd_pcm_subformat_description(
(snd_pcm_subformat_t)val)); snd_pcm_hw_params_get_channels(params, &val);
printf("channels = %d\n", val); snd_pcm_hw_params_get_rate(params, &val, &dir);
printf("rate = %d bps\n", val); snd_pcm_hw_params_get_period_time(params,
&val, &dir);
printf("period time = %d us\n", val); snd_pcm_hw_params_get_period_size(params,
&frames, &dir);
printf("period size = %d frames\n", (int)frames); snd_pcm_hw_params_get_buffer_time(params,
&val, &dir);
printf("buffer time = %d us\n", val); snd_pcm_hw_params_get_buffer_size(params,
(snd_pcm_uframes_t *) &val);
printf("buffer size = %d frames\n", val); snd_pcm_hw_params_get_periods(params, &val, &dir);
printf("periods per buffer = %d frames\n", val); snd_pcm_hw_params_get_rate_numden(params,
&val, &val2);
printf("exact rate = %d/%d bps\n", val, val2); val = snd_pcm_hw_params_get_sbits(params);
printf("significant bits = %d\n", val); snd_pcm_hw_params_get_tick_time(params,
&val, &dir);
printf("tick time = %d us\n", val); val = snd_pcm_hw_params_is_batch(params);
printf("is batch = %d\n", val); val = snd_pcm_hw_params_is_block_transfer(params);
printf("is block transfer = %d\n", val); val = snd_pcm_hw_params_is_double(params);
printf("is double = %d\n", val); val = snd_pcm_hw_params_is_half_duplex(params);
printf("is half duplex = %d\n", val); val = snd_pcm_hw_params_is_joint_duplex(params);
printf("is joint duplex = %d\n", val); val = snd_pcm_hw_params_can_overrange(params);
printf("can overrange = %d\n", val); val = snd_pcm_hw_params_can_mmap_sample_resolution(params);
printf("can mmap = %d\n", val); val = snd_pcm_hw_params_can_pause(params);
printf("can pause = %d\n", val); val = snd_pcm_hw_params_can_resume(params);
printf("can resume = %d\n", val); val = snd_pcm_hw_params_can_sync_start(params);
printf("can sync start = %d\n", val); snd_pcm_close(handle); return ;
}

3. Simple Sound Playback

/* 

This example reads standard from input and writes
to the default PCM device for 5 seconds of data. */ /* Use the newer ALSA API */
#define ALSA_PCM_NEW_HW_PARAMS_API #include <alsa/asoundlib.h> int main() {
long loops;
int rc;
int size;
snd_pcm_t *handle;
snd_pcm_hw_params_t *params;
unsigned int val;
int dir;
snd_pcm_uframes_t frames;
char *buffer; /* Open PCM device for playback. */
rc = snd_pcm_open(&handle, "default",
SND_PCM_STREAM_PLAYBACK, );
if (rc < ) {
fprintf(stderr,
"unable to open pcm device: %s\n",
snd_strerror(rc));
exit();
} /* Allocate a hardware parameters object. */
snd_pcm_hw_params_alloca(¶ms); /* Fill it in with default values. */
snd_pcm_hw_params_any(handle, params); /* Set the desired hardware parameters. */ /* Interleaved mode */
snd_pcm_hw_params_set_access(handle, params,
SND_PCM_ACCESS_RW_INTERLEAVED); /* Signed 16-bit little-endian format */
snd_pcm_hw_params_set_format(handle, params,
SND_PCM_FORMAT_S16_LE); /* Two channels (stereo) */
snd_pcm_hw_params_set_channels(handle, params, ); /* 44100 bits/second sampling rate (CD quality) */
val = ;
snd_pcm_hw_params_set_rate_near(handle, params,
&val, &dir); /* Set period size to 32 frames. */
frames = ;
snd_pcm_hw_params_set_period_size_near(handle,
params, &frames, &dir); /* Write the parameters to the driver */
rc = snd_pcm_hw_params(handle, params);
if (rc < ) {
fprintf(stderr,
"unable to set hw parameters: %s\n",
snd_strerror(rc));
exit();
} /* Use a buffer large enough to hold one period */
snd_pcm_hw_params_get_period_size(params, &frames,
&dir);
size = frames * ; /* 2 bytes/sample, 2 channels */
buffer = (char *) malloc(size); /* We want to loop for 5 seconds */
snd_pcm_hw_params_get_period_time(params,
&val, &dir);
/* 5 seconds in microseconds divided by
* period time */
loops = / val; while (loops > ) {
loops--;
rc = read(, buffer, size);
if (rc == ) {
fprintf(stderr, "end of file on input\n");
break;
} else if (rc != size) {
fprintf(stderr,
"short read: read %d bytes\n", rc);
}
rc = snd_pcm_writei(handle, buffer, frames);
if (rc == -EPIPE) {
/* EPIPE means underrun */
fprintf(stderr, "underrun occurred\n");
snd_pcm_prepare(handle);
} else if (rc < ) {
fprintf(stderr,
"error from writei: %s\n",
snd_strerror(rc));
} else if (rc != (int)frames) {
fprintf(stderr,
"short write, write %d frames\n", rc);
}
} snd_pcm_drain(handle);
snd_pcm_close(handle);
free(buffer); return ;
}

编译之后,可以用下面的命令来测试:
./example3 < /dev/urandom

4. Simple Sound Recording

/* 

This example reads from the default PCM device
and writes to standard output for 5 seconds of data. */ /* Use the newer ALSA API */
#define ALSA_PCM_NEW_HW_PARAMS_API #include <alsa/asoundlib.h> int main() {
long loops;
int rc;
int size;
snd_pcm_t *handle;
snd_pcm_hw_params_t *params;
unsigned int val;
int dir;
snd_pcm_uframes_t frames;
char *buffer; /* Open PCM device for recording (capture). */
rc = snd_pcm_open(&handle, "default",
SND_PCM_STREAM_CAPTURE, );
if (rc < ) {
fprintf(stderr,
"unable to open pcm device: %s\n",
snd_strerror(rc));
exit();
} /* Allocate a hardware parameters object. */
snd_pcm_hw_params_alloca(¶ms); /* Fill it in with default values. */
snd_pcm_hw_params_any(handle, params); /* Set the desired hardware parameters. */ /* Interleaved mode */
snd_pcm_hw_params_set_access(handle, params,
SND_PCM_ACCESS_RW_INTERLEAVED); /* Signed 16-bit little-endian format */
snd_pcm_hw_params_set_format(handle, params,
SND_PCM_FORMAT_S16_LE); /* Two channels (stereo) */
snd_pcm_hw_params_set_channels(handle, params, ); /* 44100 bits/second sampling rate (CD quality) */
val = ;
snd_pcm_hw_params_set_rate_near(handle, params,
&val, &dir); /* Set period size to 32 frames. */
frames = ;
snd_pcm_hw_params_set_period_size_near(handle,
params, &frames, &dir); /* Write the parameters to the driver */
rc = snd_pcm_hw_params(handle, params);
if (rc < ) {
fprintf(stderr,
"unable to set hw parameters: %s\n",
snd_strerror(rc));
exit();
} /* Use a buffer large enough to hold one period */
snd_pcm_hw_params_get_period_size(params,
&frames, &dir);
size = frames * ; /* 2 bytes/sample, 2 channels */
buffer = (char *) malloc(size); /* We want to loop for 5 seconds */
snd_pcm_hw_params_get_period_time(params,
&val, &dir);
loops = / val; while (loops > ) {
loops--;
rc = snd_pcm_readi(handle, buffer, frames);
if (rc == -EPIPE) {
/* EPIPE means overrun */
fprintf(stderr, "overrun occurred\n");
snd_pcm_prepare(handle);
} else if (rc < ) {
fprintf(stderr,
"error from read: %s\n",
snd_strerror(rc));
} else if (rc != (int)frames) {
fprintf(stderr, "short read, read %d frames\n", rc);
}
rc = write(, buffer, size);
if (rc != size)
fprintf(stderr,
"short write: wrote %d bytes\n", rc);
} snd_pcm_drain(handle);
snd_pcm_close(handle);
free(buffer); return ;
}

录音使用下面的命令测试:
./listing4 > sound.raw
./listing3 < sound.raw

5. wav格式文件播放测试
这个例子是我根据例子3修改而来的,用来播放wav格式音频文件,注意wav文件格式必须是44100、16bit, 2通道。

#include <alsa/asoundlib.h>  

int main(int argc, char *argv[])
{
int rc;
int size;
snd_pcm_t *handle;
snd_pcm_hw_params_t *params;
unsigned int val;
int dir;
snd_pcm_uframes_t frames;
char *buffer;
FILE *fp; fp = fopen(argv[], "rb");
if (!fp) {
fprintf(stderr,
"can't open sound file\n");
exit();
} /* Open PCM device for playback. */
rc = snd_pcm_open(&handle, "default",
SND_PCM_STREAM_PLAYBACK, );
if (rc < ) {
fprintf(stderr,
"unable to open pcm device: %s\n",
snd_strerror(rc));
exit();
} /* Allocate a hardware parameters object. */
snd_pcm_hw_params_alloca(¶ms); /* Fill it in with default values. */
snd_pcm_hw_params_any(handle, params); /* Set the desired hardware parameters. */ /* Interleaved mode */
snd_pcm_hw_params_set_access(handle, params,
SND_PCM_ACCESS_RW_INTERLEAVED); /* Signed 16-bit little-endian format */
snd_pcm_hw_params_set_format(handle, params,
SND_PCM_FORMAT_S16_LE); /* Two channels (stereo) */
snd_pcm_hw_params_set_channels(handle, params, ); /* 44100 bits/second sampling rate (CD quality) */
val = ;
snd_pcm_hw_params_set_rate_near(handle, params,
&val, &dir); /* Set period size to 32 frames. */
frames = ;
snd_pcm_hw_params_set_period_size_near(handle,
params, &frames, &dir); /* Write the parameters to the driver */
rc = snd_pcm_hw_params(handle, params);
if (rc < ) {
fprintf(stderr,
"unable to set hw parameters: %s\n",
snd_strerror(rc));
exit();
} /* Use a buffer large enough to hold one period */
snd_pcm_hw_params_get_period_size(params,
&frames, &dir);
size = frames * ; /* 2 bytes/sample, 2 channels */
buffer = (char *)malloc(size); fseek(fp, , SEEK_SET);
while () {
rc = fread(buffer, , size, fp);
if (rc == ) {
fprintf(stderr, "end of file on input\n");
break;
} else if (rc != size) {
fprintf(stderr,
"short read: read %d bytes\n", rc);
}
rc = snd_pcm_writei(handle, buffer, frames);
if (rc == -EPIPE) {
/* EPIPE means underrun */
fprintf(stderr, "underrun occurred\n");
snd_pcm_prepare(handle);
} else if (rc < ) {
fprintf(stderr,
"error from writei: %s\n",
snd_strerror(rc));
} else if (rc != (int)frames) {
fprintf(stderr,
"short write, write %d frames\n", rc);
}
} snd_pcm_drain(handle);
snd_pcm_close(handle);
fclose(fp);
free(buffer); return ;
}

参考:http://www.linuxjournal.com/article/6735

ALSA lib调用实例的更多相关文章

  1. ALSA driver --PCM 实例创建过程

    前面已经写过PCM 实例的创建框架,我们现在来看看PCM 实例是如何创建的. 在调用snd_pcm_new时就会创建一个snd_pcm类型的PCM 实例. struct snd_pcm { struc ...

  2. channelartlist标签调用实例

    channelartlist标签,大家都知道在DedeCMS的系统中,我们可以用这个标签进行循环子栏目及其栏目的文档数据,这也是DedeCMS系统中,唯一一个支持标签嵌套的调用标签,以DedeV5.6 ...

  3. ALSA lib基本概念

    1.channel 通道,即我们熟知的声道数.左/右声道,5.1channel等等 2.sample A sample is a single value that describes the amp ...

  4. c++简单的ATL COM开发和调用实例(转)

    c++简单的ATL COM开发和调用实例 1.打开VS2010,新建ATL COM 项目,步骤:“文件” -->“新建” -->“项目”,选择“Visual C++” -->“ATL ...

  5. 百度地图API调用实例之地址标注与位置显示

    之前弄了个谷歌地图API标注的调用实例,后来要求改成百度地图. 感谢主,通过网上资料(百度地图API,百度地图API详解之地图标注)收集及研究, 终于把百度地图标注和显示功能实现出来了,具体实现方法如 ...

  6. 腾讯QQAndroid API调用实例(QQ分享无需登录)

    腾讯QQAndroid API调用实例(QQ分享无需登录)   主要分为两个步骤: 配置Androidmanifest.xml 修改activity里边代码 具体修改如下:   1.Activity代 ...

  7. Asp.Net Core 2.0 项目实战(9) 日志记录,基于Nlog或Microsoft.Extensions.Logging的实现及调用实例

    本文目录 1. Net下日志记录 2. NLog的使用     2.1 添加nuget引用NLog.Web.AspNetCore     2.2 配置文件设置     2.3 依赖配置及调用     ...

  8. 梯度迭代树(GBDT)算法原理及Spark MLlib调用实例(Scala/Java/python)

    梯度迭代树(GBDT)算法原理及Spark MLlib调用实例(Scala/Java/python) http://blog.csdn.net/liulingyuan6/article/details ...

  9. 免费淘宝IP地址库简介及PHP/C#调用实例

    https://yq.aliyun.com/ziliao/25800?spm=a2c4e.11155472.0.0.68027abfcpFb7O 摘要: 本文讲的是免费淘宝IP地址库简介及PHP/C# ...

随机推荐

  1. Codeforces Gym101502 I.Move Between Numbers-最短路(Dijkstra优先队列版和数组版)

    I. Move Between Numbers   time limit per test 2.0 s memory limit per test 256 MB input standard inpu ...

  2. Codeforces 895E Eyes Closed(线段树)

    题目链接  Eyes Closed 题意  两个人玩一个游戏,现在有两种操作: 1.两个人格子挑选一个区间,保证两个的区间不相交.在这两个区间里面各选出一个数,交换这两个数. 2.挑选一个区间,求这个 ...

  3. IP分段小记

    192.168.0.1 个人电脑:0.2-0.50 硬件开发板:0.51-0.100 机器人工控机:0.101-0.200 激光雷达:192.168.254.51~100 编码器板子:192.168. ...

  4. CSS 发明者 Håkon Wium Lie 访谈--csdn zhangxin09

    原文地址:https://dev.opera.com/articles/css-twenty-years-hakon/ ---------------------------------------- ...

  5. Python基础语法02-运算符

    Python 运算符 算术运算符 比较(关系)运算符 赋值运算符 逻辑运算符 位运算符 成员运算符 身份运算符 运算符优先级 Python运算符优先级 以下表格列出了从最高到最低优先级的所有运算符: ...

  6. 《从0到1》读书笔记第一章&quot;未来的挑战&quot;第2记:做老子还是做孙子

    从1到N VS 从0到1 - 别让自己的小鸡鸡抓在别人的手上 近几年国内互联网创业上非常流行一种C2C(也就是Copy to China - 复制到中国)的创业模式,打的就是一个时间差和地域差.将在国 ...

  7. Android--------------几个ADB经常使用命令

    1. 显示当前执行的所有模拟器:     adb devices 2. 安装应用程序:     adb install -r 123.apk 3. 获取模拟器中的文件:     adb pull &l ...

  8. PS 如何用制作键盘图标

    1 键盘可以大致分为笔记本键盘和台式机键盘,颜色一般是黑色或白色.不同的键盘,拍摄角度不同(俯视或者平视)得到的效果也不一样.一般我们根据自己需要得到需要的键盘形式.比如下面别人制作的一套立体键盘,立 ...

  9. 如何使用Medieval CUE Splitter分割ape,合并ape,制作cue

    1 下载并运行这个软件,点击打开CUE文件,然后找到需要打开的CUE文件.   2 软件会立即弹出一个再次要求打开APE文件的对话框.打开之后会发现APE音乐已经被分割成了一小段一小段.   3 点击 ...

  10. java要在命令行执行eclipse的项目的方法

    在命令行运行eclipse的项目时须要把该项目生成一个能够运行的jar包,才干够在命令行下运行:分为两种情况,一种是项目中没有调用第三方的jar包,这样的比較简单.网上的资源也非常多,本文主要讲述第二 ...