使用ALSA播放两个频率的单音,并使用GNU Radio中的Audio Source和FFT来观测声音的频谱。

  1. #include <alsa/asoundlib.h>
  2. #include <math.h>
  3. #include <inttypes.h>
  4.  
  5. int main(int argc, char **argv)
  6. {
  7. long loops;
  8. snd_pcm_t *handle;
  9. snd_pcm_hw_params_t *params;
  10. snd_pcm_uframes_t frames;
  11. unsigned int val;
  12. int rc;
  13. int size;
  14. int dir;
  15. char *buffer;
  16.  
  17. /* Open PCM device for playback. */
  18. rc = snd_pcm_open(&handle, "default", SND_PCM_STREAM_PLAYBACK, );
  19. if (rc < ) {
  20. fprintf(stderr, "unable to open pcm device: %s\n", snd_strerror(rc));
  21. exit();
  22. }
  23.  
  24. /* Allocate a hardware parameters object. */
  25. snd_pcm_hw_params_alloca(&params);
  26.  
  27. /* Fill it in with default values. */
  28. snd_pcm_hw_params_any(handle, params);
  29.  
  30. /* Interleaved mode */
  31. snd_pcm_hw_params_set_access(handle, params, SND_PCM_ACCESS_RW_INTERLEAVED);
  32. /* Signed 16-bit format */
  33. snd_pcm_hw_params_set_format(handle, params, SND_PCM_FORMAT_S16);
  34. /* Two channels (stereo) */
  35. snd_pcm_hw_params_set_channels(handle, params, );
  36. /* 16000 samples/second sampling rate */
  37. val = ;
  38. snd_pcm_hw_params_set_rate_near(handle, params, &val, &dir);
  39. /* Set period size to 32 frames. */
  40. frames = ;
  41. snd_pcm_hw_params_set_period_size_near(handle, params, &frames, &dir);
  42.  
  43. /* Write the parameters to the driver */
  44. rc = snd_pcm_hw_params(handle, params);
  45. if (rc < ) {
  46. fprintf(stderr, "unable to set hw parameters: %s\n", snd_strerror(rc));
  47. exit();
  48. }
  49.  
  50. /* Use a buffer large enough to hold one period */
  51. snd_pcm_hw_params_get_period_size(params, &frames, &dir);
  52.  
  53. size = frames * * ; /* 2 bytes/sample, 2 channels */
  54.  
  55. buffer = (char *) malloc(size);
  56. if(buffer == NULL) {
  57. fprintf(stderr, "Not enough Memory!\n");
  58. exit();
  59. }
  60.  
  61. /* We want to loop for 15 seconds */
  62. snd_pcm_hw_params_get_period_time(params, &val, &dir);
  63.  
  64. /* 15 seconds in microseconds divided by period time */
  65. loops = / val;
  66.  
  67. for (size_t i = ; i < size; i += ) {
  68. // Generate a 500Hz tone
  69. *((int16_t *)(buffer + i)) = (uint16_t)(16384.0*sin(i*2.0*M_PI/size));
  70. *((int16_t *)(buffer + i + )) = (uint16_t)(16384.0*sin(i*2.0*M_PI/size));
  71. // Generate a 2kHz tone
  72. *((int16_t *)(buffer + i)) += (uint16_t)(16384.0*sin(i*8.0*M_PI/size));
  73. *((int16_t *)(buffer + i + )) += (uint16_t)(16384.0*sin(i*8.0*M_PI/size));
  74. }
  75.  
  76. while (loops > ) {
  77. loops--;
  78. //rc = read(0, buffer, size);
  79. //if (rc == 0) {
  80. // fprintf(stderr, "end of file on input\n");
  81. // break;
  82. //} else if (rc != size) {
  83. // fprintf(stderr, "short read: read %d bytes\n", rc);
  84. //}
  85.  
  86. rc = snd_pcm_writei(handle, buffer, frames);
  87. if (rc == -EPIPE) {
  88. /* EPIPE means underrun */
  89. fprintf(stderr, "underrun occurred\n");
  90. snd_pcm_prepare(handle);
  91. } else if (rc < ) {
  92. fprintf(stderr,"error from writei: %s\n", snd_strerror(rc));
  93. } else if (rc != (int)frames) {
  94. fprintf(stderr,"short write, write %d frames\n", rc);
  95. }
  96. }
  97. snd_pcm_drop(handle);
  98. snd_pcm_drain(handle);
  99. snd_pcm_close(handle);
  100. free(buffer);
  101. return ;
  102. }

Linux ALSA音频PCM播放编程的更多相关文章

  1. 基于Linux ALSA音频驱动的wav文件解析及播放程序 2012

    本设计思路:先打开一个普通wav音频文件,从定义的文件头前面的44个字节中,取出文件头的定义消息,置于一个文件头的结构体中.然后打开alsa音频驱动,从文件头结构体取出采样精度,声道数,采样频率三个重 ...

  2. 嵌入式驱动开发之---Linux ALSA音频驱动(一)

    本文的部分内容参考来自DroidPhone的博客(http://blog.csdn.net/droidphone/article/details/6271122),关于ALSA写得很不错的文章,只是少 ...

  3. Linux ALSA 音频库 配置和使用

    ALSA应用库是核心功能,而alsa-utils是一些工具功能集合库.单纯地播放一个wav文件,使用alsa-utils即可,如果还需要合成音频.调试音频质量,那么就需要ALSA应用库. 欲安装使用A ...

  4. Linux ALSA音频库(二) 环境测试+音频合成+语音切换 项目代码分享

    1. 环境测试 alsa_test.c #include <alsa/asoundlib.h> #include <stdio.h> // 官方测试代码, 运行后只要有一堆信息 ...

  5. 嵌入式开发之davinci--- 8148/8168/8127 中的alsa音频pcm g711 和aac 音频格式

    (1)alsa pcm (2)g711 (3)aac (4) --------------author:pkf -------------------time:2-4 ---------------- ...

  6. linux alsa音频中采样率fs、比特率BCLK 、主时钟MCLK关系

    转:https://blog.csdn.net/lugandong/article/details/72468831 一.拿512fs说话: 看图知道采样的位深是32bit(位),左右声道各占了8*3 ...

  7. 基于Orangpi Zero和Linux ALSA实现WIFI无线音箱(三)

    作品已经完成,先上源码: https://files.cnblogs.com/files/qzrzq1/WIFISpeaker.zip 全文包含三篇,这是第三篇,主要讲述接收端程序的原理和过程. 第一 ...

  8. 内核Alsa之pcm

    pcm用来描述alsa中数字音频流.Alsa音频的播放/录制就是通过pcm来实现 的. 名词解释 声音是连续模拟量,计算机将它离散化之后用数字表示,就有了以下几个名词术语. Frame. 帧是音频流中 ...

  9. 【转】Alsa音频编程【精华】

    一.前序 这里了解一下各个参数的含义以及一些基本概念. 声音是连续模拟量,计算机将它离散化之后用数字表示,就有了以下几个名词术语. 样本长度(sample):样本是记录音频数据最基本的单位,计算机对每 ...

随机推荐

  1. day1作业一:编写登陆接口

    作业一:编写登陆接口 1.输入用户名和密码 2.认证成功后显示欢迎信息 3.输错三次后锁定 Readme: (1)提示用户输入用户名: (2)用户名验证,验证是否已经锁定: (3)是否锁定:已锁定告诉 ...

  2. loadrunner参数取值方法总结

    在参数设置位置有两个地方:Select next row –下一行的取值方式(针对用户)Sequential 顺序的,即所有用户都是按照同一种方式取值(都是按照Update value on方式取值, ...

  3. Java经典设计模式之十一种行为型模式

    转载: Java经典设计模式之十一种行为型模式 Java经典设计模式共有21中,分为三大类:创建型模式(5种).结构型模式(7种)和行为型模式(11种). 本文主要讲行为型模式,创建型模式和结构型模式 ...

  4. ref:一种新的攻击方法——Java Web表达式注入

    ref:https://blog.csdn.net/kk_gods/article/details/51840683 一种新的攻击方法——Java Web表达式注入 2016年07月06日 17:01 ...

  5. 哈尔滨理工大学第七届程序设计竞赛初赛(高年级组)I - B-旅行

    题目描述 小z放假了,准备到RRR城市旅行,其中这个城市有N个旅游景点.小z时间有限,只能在三个旅行景点进行游玩.小明租了辆车,司机很善良,说咱不计路程,只要你一次性缴费足够,我就带你走遍RRR城. ...

  6. 爱奇艺全国高校算法大赛初赛C

    区间$dp$. 倒着考虑这件事件,肯定有最后一个取走的数字,假设是$a[k]$,那么最后一次取走的价值肯定是$a[0]*a[k]*a[n+1]$,之前取走的价值和为$[1,k-1]$的价值加上$[k+ ...

  7. EOJ 3262 黑心啤酒厂

    最大公约数. 计算$x$与$i$的最小公倍数,就是这些人至少需要喝几杯,最小公倍数除以$x$就是要买几瓶. #include <cstdio> #include <cmath> ...

  8. hihocoder 1490 Tree Restoration

    构造. 从最后一层开始往上构造.最后一层肯定都是叶子结点,距离为2的肯定是同一个父亲,确定好了父亲之后,可以确定上一层每个节点之间的距离,以及上一层每个节点到还未确定的叶子节点之间的距离. #incl ...

  9. BZOJ1102 [POI2007]GRZ山峰和山谷 [BFS]

    题目传送门 GRZ山峰和山谷 Description FGD小朋友特别喜欢爬山,在爬山的时候他就在研究山峰和山谷.为了能够让他对他的旅程有一个安排,他想知道山峰和山谷的数量.给定一个地图,为FGD想要 ...

  10. android studio 目录 文件 解读