ALSA(高级Linux声音架构):一 简单例子
来源:互联网 发布:制作头像软件 编辑:程序博客网 时间:2024/06/07 06:25
ALSA是Advanced Linux Sound Architecture,高级Linux声音架构的简称,它在Linux操作系统上提供了音频和MIDI(Musical Instrument Digital Interface,音乐设备数字化接口)的支持
更多内容可以参考这篇文章:
http://mysuperbaby.iteye.com/blog/932729
下面是两个简单例子,分别实现播放、录音的功能
/******************************************************************ALSA 简单的 playback 例子******************************************************************/#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. */ /* 打开 PCM playback 设备 */ rc = snd_pcm_open(&handle, "default", SND_PCM_STREAM_PLAYBACK, 0); if (rc < 0) { fprintf(stderr, "unable to open pcm device: %s\n", snd_strerror(rc)); exit(1); } /* 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 */ /* 数据格式为 16位 小端 */ snd_pcm_hw_params_set_format(handle, params, SND_PCM_FORMAT_S16_LE); /* Two channels (stereo) */ /* 两个声道 */ snd_pcm_hw_params_set_channels(handle, params, 2); /* 44100 bits/second sampling rate (CD quality) */ /* 采样率为 44100 */ val = 44100; snd_pcm_hw_params_set_rate_near(handle, params, &val, &dir); /* Set period size to 32 frames. */ /* 设置一个周期为 32 帧 */ frames = 32; snd_pcm_hw_params_set_period_size_near(handle, params, &frames, &dir); /* Write the parameters to the driver */ /* 把前面设置好的参数写入到playback设备 */ rc = snd_pcm_hw_params(handle, params); if (rc < 0) { fprintf(stderr, "unable to set hw parameters: %s\n", snd_strerror(rc)); exit(1); } /* Use a buffer large enough to hold one period */ /* 得到一个周期的数据长度 */ snd_pcm_hw_params_get_period_size(params, &frames, &dir); /* 因为我们是16位 两个通道,所以要 *2*2 也就是 *4 */ size = frames * 4; /* 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 = 5000000 / val; while (loops > 0) { loops--; /* 从标准输入中获取数据 */ rc = read(0, buffer, size); if (rc == 0) { 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 < 0) { 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 0;}
/*********************************************************************ALSA 简单的录音功能 capture 捕获*********************************************************************//* 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). */ /* 打开 PCM capture 捕获设备 */ rc = snd_pcm_open(&handle, "default", SND_PCM_STREAM_CAPTURE, 0); if (rc < 0) { fprintf(stderr, "unable to open pcm device: %s\n", snd_strerror(rc)); exit(1); } /* 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 */ /* 16位 小端 */ snd_pcm_hw_params_set_format(handle, params, SND_PCM_FORMAT_S16_LE); /* Two channels (stereo) */ /* 双通道 */ snd_pcm_hw_params_set_channels(handle, params, 2); /* 44100 bits/second sampling rate (CD quality) */ /* 采样率 */ val = 44100; snd_pcm_hw_params_set_rate_near(handle, params, &val, &dir); /* Set period size to 32 frames. */ /* 一个周期有 32 帧 */ frames = 32; 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 < 0) { fprintf(stderr, "unable to set hw parameters: %s\n", snd_strerror(rc)); exit(1); } /* Use a buffer large enough to hold one period */ /* 得到一个周期的数据大小 */ snd_pcm_hw_params_get_period_size(params, &frames, &dir); /* 16位 双通道,所以要 *4 */ size = frames * 4; /* 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 = 5000000 / val; while (loops > 0) { 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 < 0) { 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(1, 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 0;}
可以尝试运行capture程序并把输出定向到某个文件,然后运行playback播放该文件里的声音数据:
./capture > sound.raw./playback < sound.raw
0 0
- ALSA(高级Linux声音架构):一 简单例子
- ALSA(高级Linux声音架构):一 简单例子
- ALSA(高级Linux声音架构):一 简单例子
- Ubuntu环境下安装alsa库(高级LINUX声音库)
- linux alsa pcm 播放声音
- Linux声音系统 ALSA OSS
- linux alsa pcm 播放声音
- linux alsa 声音录播详解
- linux alsa pcm 播放声音
- ddraw简单例子,(设置系统声音)
- Linux ALSA 系统架构
- Linux ALSA 系统架构
- Linux ALSA 系统架构
- Linux ALSA 系统架构
- Linux ALSA 系统架构
- Linux ALSA 系统架构
- Linux ALSA 系统架构
- ALSA声音编程(英译)
- jquery插件之DataTables
- Python简介
- HttpClient/ HttpUrlConnection/UrlConnection
- hdu 1003 Max Sum
- EasyUI学习笔记7:MIS开发利器_ datagrid插件(中)
- ALSA(高级Linux声音架构):一 简单例子
- C++之:对象的静态类型和动态类型
- Context那些事儿
- ubuntu安装flash插件
- JQuery datatable
- setsockopt结构体分析
- js中数组的去重
- EasyUI学习笔记8:MIS开发利器_ datagrid插件(下)(终结篇)
- leetcode_Roman to Integer