Linux ALSA音频PCM播放编程
使用ALSA播放两个频率的单音,并使用GNU Radio中的Audio Source和FFT来观测声音的频谱。
- #include <alsa/asoundlib.h>
- #include <math.h>
- #include <inttypes.h>
- int main(int argc, char **argv)
- {
- long loops;
- snd_pcm_t *handle;
- snd_pcm_hw_params_t *params;
- snd_pcm_uframes_t frames;
- unsigned int val;
- int rc;
- int size;
- int dir;
- 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);
- /* Interleaved mode */
- snd_pcm_hw_params_set_access(handle, params, SND_PCM_ACCESS_RW_INTERLEAVED);
- /* Signed 16-bit format */
- snd_pcm_hw_params_set_format(handle, params, SND_PCM_FORMAT_S16);
- /* Two channels (stereo) */
- snd_pcm_hw_params_set_channels(handle, params, );
- /* 16000 samples/second sampling rate */
- 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);
- if(buffer == NULL) {
- fprintf(stderr, "Not enough Memory!\n");
- exit();
- }
- /* We want to loop for 15 seconds */
- snd_pcm_hw_params_get_period_time(params, &val, &dir);
- /* 15 seconds in microseconds divided by period time */
- loops = / val;
- for (size_t i = ; i < size; i += ) {
- // Generate a 500Hz tone
- *((int16_t *)(buffer + i)) = (uint16_t)(16384.0*sin(i*2.0*M_PI/size));
- *((int16_t *)(buffer + i + )) = (uint16_t)(16384.0*sin(i*2.0*M_PI/size));
- // Generate a 2kHz tone
- *((int16_t *)(buffer + i)) += (uint16_t)(16384.0*sin(i*8.0*M_PI/size));
- *((int16_t *)(buffer + i + )) += (uint16_t)(16384.0*sin(i*8.0*M_PI/size));
- }
- while (loops > ) {
- 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 < ) {
- 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_drop(handle);
- snd_pcm_drain(handle);
- snd_pcm_close(handle);
- free(buffer);
- return ;
- }
Linux ALSA音频PCM播放编程的更多相关文章
- 基于Linux ALSA音频驱动的wav文件解析及播放程序 2012
本设计思路:先打开一个普通wav音频文件,从定义的文件头前面的44个字节中,取出文件头的定义消息,置于一个文件头的结构体中.然后打开alsa音频驱动,从文件头结构体取出采样精度,声道数,采样频率三个重 ...
- 嵌入式驱动开发之---Linux ALSA音频驱动(一)
本文的部分内容参考来自DroidPhone的博客(http://blog.csdn.net/droidphone/article/details/6271122),关于ALSA写得很不错的文章,只是少 ...
- Linux ALSA 音频库 配置和使用
ALSA应用库是核心功能,而alsa-utils是一些工具功能集合库.单纯地播放一个wav文件,使用alsa-utils即可,如果还需要合成音频.调试音频质量,那么就需要ALSA应用库. 欲安装使用A ...
- Linux ALSA音频库(二) 环境测试+音频合成+语音切换 项目代码分享
1. 环境测试 alsa_test.c #include <alsa/asoundlib.h> #include <stdio.h> // 官方测试代码, 运行后只要有一堆信息 ...
- 嵌入式开发之davinci--- 8148/8168/8127 中的alsa音频pcm g711 和aac 音频格式
(1)alsa pcm (2)g711 (3)aac (4) --------------author:pkf -------------------time:2-4 ---------------- ...
- linux alsa音频中采样率fs、比特率BCLK 、主时钟MCLK关系
转:https://blog.csdn.net/lugandong/article/details/72468831 一.拿512fs说话: 看图知道采样的位深是32bit(位),左右声道各占了8*3 ...
- 基于Orangpi Zero和Linux ALSA实现WIFI无线音箱(三)
作品已经完成,先上源码: https://files.cnblogs.com/files/qzrzq1/WIFISpeaker.zip 全文包含三篇,这是第三篇,主要讲述接收端程序的原理和过程. 第一 ...
- 内核Alsa之pcm
pcm用来描述alsa中数字音频流.Alsa音频的播放/录制就是通过pcm来实现 的. 名词解释 声音是连续模拟量,计算机将它离散化之后用数字表示,就有了以下几个名词术语. Frame. 帧是音频流中 ...
- 【转】Alsa音频编程【精华】
一.前序 这里了解一下各个参数的含义以及一些基本概念. 声音是连续模拟量,计算机将它离散化之后用数字表示,就有了以下几个名词术语. 样本长度(sample):样本是记录音频数据最基本的单位,计算机对每 ...
随机推荐
- day1作业一:编写登陆接口
作业一:编写登陆接口 1.输入用户名和密码 2.认证成功后显示欢迎信息 3.输错三次后锁定 Readme: (1)提示用户输入用户名: (2)用户名验证,验证是否已经锁定: (3)是否锁定:已锁定告诉 ...
- loadrunner参数取值方法总结
在参数设置位置有两个地方:Select next row –下一行的取值方式(针对用户)Sequential 顺序的,即所有用户都是按照同一种方式取值(都是按照Update value on方式取值, ...
- Java经典设计模式之十一种行为型模式
转载: Java经典设计模式之十一种行为型模式 Java经典设计模式共有21中,分为三大类:创建型模式(5种).结构型模式(7种)和行为型模式(11种). 本文主要讲行为型模式,创建型模式和结构型模式 ...
- ref:一种新的攻击方法——Java Web表达式注入
ref:https://blog.csdn.net/kk_gods/article/details/51840683 一种新的攻击方法——Java Web表达式注入 2016年07月06日 17:01 ...
- 哈尔滨理工大学第七届程序设计竞赛初赛(高年级组)I - B-旅行
题目描述 小z放假了,准备到RRR城市旅行,其中这个城市有N个旅游景点.小z时间有限,只能在三个旅行景点进行游玩.小明租了辆车,司机很善良,说咱不计路程,只要你一次性缴费足够,我就带你走遍RRR城. ...
- 爱奇艺全国高校算法大赛初赛C
区间$dp$. 倒着考虑这件事件,肯定有最后一个取走的数字,假设是$a[k]$,那么最后一次取走的价值肯定是$a[0]*a[k]*a[n+1]$,之前取走的价值和为$[1,k-1]$的价值加上$[k+ ...
- EOJ 3262 黑心啤酒厂
最大公约数. 计算$x$与$i$的最小公倍数,就是这些人至少需要喝几杯,最小公倍数除以$x$就是要买几瓶. #include <cstdio> #include <cmath> ...
- hihocoder 1490 Tree Restoration
构造. 从最后一层开始往上构造.最后一层肯定都是叶子结点,距离为2的肯定是同一个父亲,确定好了父亲之后,可以确定上一层每个节点之间的距离,以及上一层每个节点到还未确定的叶子节点之间的距离. #incl ...
- BZOJ1102 [POI2007]GRZ山峰和山谷 [BFS]
题目传送门 GRZ山峰和山谷 Description FGD小朋友特别喜欢爬山,在爬山的时候他就在研究山峰和山谷.为了能够让他对他的旅程有一个安排,他想知道山峰和山谷的数量.给定一个地图,为FGD想要 ...
- android studio 目录 文件 解读