ALSA音频编程分析

上传人:公**** 文档编号:486228938 上传时间:2023-09-10 格式:DOCX 页数:6 大小:15.56KB
返回 下载 相关 举报
ALSA音频编程分析_第1页
第1页 / 共6页
ALSA音频编程分析_第2页
第2页 / 共6页
ALSA音频编程分析_第3页
第3页 / 共6页
ALSA音频编程分析_第4页
第4页 / 共6页
ALSA音频编程分析_第5页
第5页 / 共6页
点击查看更多>>
资源描述

《ALSA音频编程分析》由会员分享,可在线阅读,更多相关《ALSA音频编程分析(6页珍藏版)》请在金锄头文库上搜索。

1、ALSA音频编程自我分析最近搞了一阵子的ALSA音频编程的东西,其实单是说其编程结构的确是比较简单的,相 信很多朋友和我一样都在网络上搜索到很多相关资料,从ALSA的驱动- ALSA的lib 库(提供了编程的API)- ALSA的utils,这三部分的确组成了 ALSA开发中不可或缺 的主要部分,同时ALSA项目的开放源码特性,使得开发者有更多的源码可以参考,其中 ALSA的utils中提供的源码就是很好的材料。不过有了这些只是提供了能够参阅的资料, 编程开发的事情,真的没有一定就能成,有些问题出来还是需要解决时间的。有些问题涉及 到开发者自身的具体操作环境,所以很多问题出了还是不能在网上找到

2、合适的答案,只有自 己慢慢摸索。我从做些录放音小程序到时先语音的传输过程中,也曾面临着许多问题,但是 要相信自己一定能解决并为之去查阅资料、去调试程序。所以出现问题是正常的,问题也是 我们能解决问题的。总结一下这么久的工作,细节很多,但是有个问题在ALSA中很重要, 很多问题就是由于这个问题导致的,那就是对音频文件的认识以及对该设备文件的参数设置。 这个设置又涉及到硬件参数设置和软件参数设置。这个参数设置没对的话,很多莫名其妙的 问题都会出来,让我们真的是摸不着头脑。同时也要说明的是同样的代码在不同的操作系统 上会有不同的反应,这也是正常的,这就需要我们实时的调整了。这里就最普遍的参数设置 问

3、题给大家提出警示。不管是编写复杂程序还是编写测试小程序,只要参数设置正确无误了, 问题就会少很多。因此,将aply.c文件中的设置参数的函数摘出来给分析一下,希望给继 续做这方面的朋友做个分享,少走点我走过的弯路,同时也希望大家能够将自己的所学贡献 出来,相互交流,共同进步!下面首先大体介绍一下,接着会以注解的形式来重点分析我认为比较容易忽视,但是有很重 要的参数设置。同时申明这些知识自己的浅薄一点认识,如果有不对的地方还请读者指正, 不胜感激!首先是硬件参数设置,如果设置好了硬件参数,做单方面的录音或放音是不会有大问题的, 但是如果要涉及到同时的录放音交替,就必须好好的设置下软参数了,这样才

4、能使得听起来 的语音流畅。cpp view plaincopyprint?1. static void set_params(void)2. 3. snd_pcm_hw_params_t *params;4. snd_pcm_sw_params_t *swparams;5. snd_pcm_uframes_t buffer_size;6. int err;7. size_t n;8. snd_pcm_uframes_t xfer_align;9. unsigned int rate;10. snd_pcm_uframes_t start_threshold, stop_threshold;/设

5、置软参数主要这两个参数要设置11. snd_pcm_hw_params_alloca(5ms);12. snd_pcm_sw_params_alloca(&swparams);13. err = snd_pcm_hw_params_any(handle, params);14. if (err 0) 15. error(_(Broken configuration for this PCM: no configurations available);16. exit(EXIT_FAILURE);17. 18. if (mmap_flag) 19. snd_pcm_access_mask_t *

6、mask = alloca(snd_pcm_access_mask_sizeof();20. snd_pcm_access_mask_none(mask);21. snd_pcm_access_mask_set(mask, SND_PCM_ACCESS_MMAP_INTERLEAVED);22. snd_pcm_access_mask_set(mask, SND_PCM_ACCESS_MMAP_NONINTERLEAVED);23. snd_pcm_access_mask_set(mask, SND_PCM_ACCESS_MMAP_COMPLEX);24. err = snd_pcm_hw_p

7、arams_set_access_mask(handle, params, mask);25. else if (interleaved)26. err = snd_pcm_hw_params_set_access(handle, params,27. SND_PCM_ACCESS_RW_INTERLEAVED);28. else29. err = snd_pcm_hw_params_set_access(handle, params,30. SND_PCM_ACCESS_RW_NONINTERLEAVED);31. if (err 0) 32. error(_(Access type not

8、 available);33. exit(EXIT_FAILURE);34. 35. err = snd_pcm_hw_params_set_format(handle, params, hwparams.format);36. if (err 0) 37. error(_(Sample format non available);38. exit(EXIT_FAILURE);39. 40. err = snd_pcm_hw_params_set_channels(handle, params, hwparams.channels);41. if (err = 0);48. #endif49.

9、 rate = hwparams.rate;50. err = snd_pcm_hw_params_set_rate_near(handle, params, &hwparams.rate, 0);51. assert(err = 0);52. if (float)rate * 1.05 hwparams.rate) 53. if (!quiet_mode) 54. char plugex64;55. const char *pcmname = snd_pcm_name(handle);56. fprintf(stderr, _(Warning: rate is not accurate (r

10、equested = %iHz, got=%iHz)n), rate, hwparams.rate);57. if (! pcmname | strchr(snd_pcm_name(handle), :)58. *plugex = 0;59. else60. snprintf(plugex, sizeof(plugex), (-Dplug:%s),61. snd_pcm_name(handle);62. fprintf(stderr, _( please, try the plug plugin %sn),63. plugex);64. 65. 66. rate = hwparams.rate

11、;67. if (buffer_time = 0 & buffer_frames = 0) 68. err = snd_pcm_hw_params_get_buffer_time_max(params,69. &buffer_time, 0);70. assert(err = 0);71. if (buffer_time 500000)/这是指具体的环形缓从区大小,自己认为是以字节为单位的72. buffer_time = 500000;73. 74. if (period_time = 0 & period_frames = 0) 75. if (buffer_time 0)76. peri

12、od_time = buffer_time / 4;77. else78. period_frames = buffer_frames / 4;79. 80. if (period_time 0)81. err = snd_pcm_hw_params_set_period_time_near(handle, params,82. &period_time, 0);83. else84. err = snd_pcm_hw_params_set_period_size_near(handle, params,85. &period_frames, 0);86. assert(err = 0);87

13、. if (buffer_time 0) 88. err = snd_pcm_hw_params_set_buffer_time_near(handle, params,89. &buffer_time, 0);90. else 91. err = snd_pcm_hw_params_set_buffer_size_near(handle, params,92. &buffer_frames);93. 94. assert(err = 0);95. err = snd_pcm_hw_params(handle, params);96. if (err 0) 97. error(_(Unable

14、 to install hw params:);98. snd_pcm_hw_params_dump(params, log);99. exit(EXIT_FAILURE);100. 101. snd_pcm_hw_params_get_period_size(params, &chunk_size, 0);102. snd_pcm_hw_params_get_buffer_size(params, &buffer_size);103. if (chunk_size = buffer_size) 104. error(_(Cant use period equal to buffer size (%lu = %lu),105. chunk_size, buffer_size);106. exit(EXIT_FAILURE);107. 108. snd_pcm_sw_params_current(handle, swparams);109. err = snd_pcm_sw_params_get_xfer_align(swparams, &xfer_align);110. if (err 0) 111. error(_(Unable to obtain xfer alignn);

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号