当前位置: 首页 > news >正文

学网站建设需要多久网站图片广告代码

学网站建设需要多久,网站图片广告代码,网站建设置顶,备案网站内容简介ALPHA I.MX6U 开发板支持音频#xff0c;板上搭载了音频编解码芯片 WM8960#xff0c;支持播放以及录音功能#xff01; 本章将会讨论如下主题内容。 ⚫ Linux 下 ALSA 框架概述#xff1b; ⚫ alsa-lib 库介绍#xff1b; ⚫ alsa-lib 库移植#xff1b; ⚫ alsa-l…ALPHA I.MX6U 开发板支持音频板上搭载了音频编解码芯片 WM8960支持播放以及录音功能 本章将会讨论如下主题内容。 ⚫ Linux 下 ALSA 框架概述 ⚫ alsa-lib 库介绍 ⚫ alsa-lib 库移植 ⚫ alsa-lib 库的使用 ⚫ 音频应用编程之播放 ⚫ 音频应用编程之录音 ALSA概述 ALSA 是 Advanced Linux Sound Architecture高级的 Linux 声音体系的缩写目前已经成为了 linux下的主流音频体系架构提供了音频和 MIDI 的支持替代了原先旧版本中的 OSS开发声音系统ALSA 是 Linux 系统下一套标准的、先进的音频驱动框架那么这套框架的设计本身是比较复杂的采用分离、分层思想设计而成。 在应用层ALSA 为我们提供了一套标准的 API应用程序只需要调用这些 API 就可完成对底层音频硬 件设备的控制譬如播放、录音等这一套 API 称为 alsa-lib 对于我们来说学习音频应用编程其实就是学习 alsa-lib 库函数的使用、如何基于 alsa-lib 库函数开发音频应用程序。 ALSA 提供了关于 alsa-lib 的使用说明文档其链接地址为ALSA project - the C library reference: Index, Preamble and License sound 设备节点 在 Linux 内核设备驱动层、基于 ALSA 音频驱动框架注册的 sound 设备会在/dev/snd 目录下生成相应的设备节点文件。 我们编写的应用程序虽然是调用 alsa-lib 库函数去控制底层音频硬件但最终也是落实到对 sound 设备节点的 I/O 操作只不过 alsa-lib 已经帮我们封装好了在 Linux 系统的/proc/asound 目录下有很多的文件这些文件记录了系统中声卡相关的信息。 编写一个简单地 alsa-lib 应用程序 对于 alsa-lib 库的使用ALSA 提供了一些参考资料来帮助应用程序开发人员快速上手 alsa-lib、基于 alsa-lib 进行应用编程以下笔者给出了链接 ALSA Programming HOWTO v.0.0.8 ALSA project - the C library reference: Examples 第一份文档向用户介绍了如何使用 alsa-lib 编写简单的音频应用程序包括 PCM 播放音频、PCM 录音 等笔者也是参考了这份文档来编写本章教程对应初学者建议大家看一看。 第二个链接地址是 ALSA 提供的一些示例代码如下所示 一些基本概念 样本长度Sample声道数channel帧frame采样率Sample rate交错模式interleaved周期period缓冲区buffer 音频设备底层驱动程序使用 DMA 来搬运数据这个 buffer 中有 4 个 period每当 DMA 搬运完一个period 的数据就会触发一次中断因此搬运整个 buffer 中的数据将产生 4 次中断。 数据之间的传输 Over and Under Run 2.编写一个音频应用程序 2.1打开 PCM 设备 需要包含头文件alsa/asoundlib.h int snd_pcm_open(snd_pcm_t **pcmp, const char *name, snd_pcm_stream_t stream, int mode) ⚫ pcmpsnd_pcm_t 用于描述一个 PCM 设备所以一个 snd_pcm_t 对象表示一个 PCM 设备 snd_pcm_open 函数会打开参数 name 所指定的设备实例化 snd_pcm_t 对象并将对象的指针也 就是 PCM 设备的句柄通过 pcmp 返回出来。 ⚫ name参数 name 指定 PCM 设备的名字。alsa-lib 库函数中使用逻辑设备名而不是设备文件名命名方式为hw:i,ji 表示声卡的卡号j 则表示这块声卡上的设备号譬如hw:0,0表示声卡 0 上的 PCM 设备 0在播放情况下这其实就对应/dev/snd/pcmC0D0p如果是录音则对应 /dev/snd/pcmC0D0c。除了使用hw:i,j这种方式命名之外还有其它两种常用的命名方式譬如 plughw:i,j、default等关于这些名字的不同本章最后再向大家进行简单地介绍这里暂时先 不去理会这个问题。 ⚫ stream参数 stream 指定流类型有两种不同类型SND_PCM_STREAM_PLAYBACK 和 SND_PCM_STREAM_CAPTURE SND_PCM_STREAM_PLAYBACK 表 示 播 放 SND_PCM_STREAM_CAPTURE 则表示采集。 ⚫ mode最后一个参数 mode 指定了 open 模式通常情况下我们会将其设置为 0表示默认打开 模式默认情况下使用阻塞方式打开设备当然也可将其设置为 SND_PCM_NONBLOCK表示 以非阻塞方式打开设备。 关闭PCM设备API int snd_pcm_close(snd_pcm_t *pcm); 2.2硬件参数设置 打开 PCM 设备之后接着我们需要对设备进行设置包括硬件配置和软件配置。软件配置就不再介绍 了使用默认配置即可我们主要是对硬件参数进行配置譬如采样率、声道数、格式、访问类型、period周期大小、buffer 大小等。 snd_pcm_hw_params_t 数据类型描述PCM设备 在配置之前需要实例化一个snd_pcm_hw_params_t对象。 snd_pcm_hw_params_t *hwparams NULL; //创建对象申请内存 //方法一 snd_pcm_hw_params_malloc(hwparams); //方法二 snd_pcm_hw_params_alloca(hwparams);//释放对象 void snd_pcm_hw_params_free(snd_pcm_hw_params_t *obj) 补充 malloc和alloca区别 malloc和alloca都是用于动态分配内存的函数但是它们有一些区别。 malloc是C标准库中的函数它的作用是在堆上分配一块指定大小的内存区域并返回该内存区域的地址。使用malloc分配的内存区域在程序运行期间一直存在直到显式调用free函数释放该内存区域或者程序结束时操作系统自动回收。 alloca是一个非标准的函数它通常由编译器提供支持。它的作用是在栈上分配一块指定大小的内存区域并返回该内存区域的地址。使用alloca分配的内存区域在函数返回时被自动释放因此不需要显式调用free函数来释放内存。但是由于alloca分配的内存区域在函数返回时被释放因此不能在函数外部使用该内存区域。 在使用malloc和alloca时需要注意以下几点 malloc可以分配任意大小的内存区域而alloca只能分配栈大小范围内的内存区域。malloc分配的内存区域需要手动释放而alloca分配的内存区域在函数返回时会自动释放。alloca分配的内存是存储在栈中的而栈的大小是有限的。如果分配的内存区域过大可能会导致栈溢出。alloca是一个非标准的函数不是所有的编译器都支持。如果需要在不同的编译器间移植代码最好不要使用alloca。 因此malloc和alloca适用于不同的场景。malloc适用于需要动态分配大量内存的场景而alloca适用于需要动态分配小量内存的场景并且内存区域的大小可以在编译期间确定。 初始化 snd_pcm_hw_params_t 对象 snd_pcm_hw_params_any(pcm_handle, hwparams); 对硬件参数进行设置 alsa-lib 提供了一系列的 snd_pcm_hw_params_set_xxx 函数用于设置 PCM 设备的硬件参数同样也提供了一系列的 snd_pcm_hw_params_get_xxx 函数用于获取硬件参数。 (1)设置 access 访问类型snd_pcm_hw_params_set_access() int snd_pcm_hw_params_set_access(snd_pcm_t *pcm, snd_pcm_hw_params_t * params, snd_pcm_access_t access ) (2)设置数据格式snd_pcm_hw_params_set_format() (3)设置声道数snd_pcm_hw_params_set_channels() (4)设置采样率大小snd_pcm_hw_params_set_rate() (5)设置周期大小snd_pcm_hw_params_set_period_size() (6)设置 buffer 大小snd_pcm_hw_params_set_buffer_size() (7)安装/加载硬件配置参数snd_pcm_hw_params() 2.3读/写数据 //播放 snd_pcm_sframes_t snd_pcm_writei(snd_pcm_t *pcm, const void *buffer, snd_pcm_uframes_t size ) //录音 snd_pcm_sframes_t snd_pcm_readi(snd_pcm_t *pcm, void *buffer, snd_pcm_uframes_t size ) //注意;参数 buffer 指的是应用程序的缓冲区,不要与驱动层的环形缓冲区搞混了 阻塞与非阻塞 调用 snd_pcm_open()打开设备时若指定为阻塞方式则调用 snd_pcm_readi/snd_pcm_writei 以阻塞方式进行读/写。对于 PCM 录音来说当 buffer 缓冲区中无数据可读时调用 snd_pcm_readi()函数将会阻塞直到音频设备向 buffer 中写入采集到的音频数据同理对于 PCM 播放来说当 buffer 缓冲区中的数据满时调用 snd_pcm_writei()函数将会阻塞直到音频设备从 buffer 中读走数据进行播放。 若调用 snd_pcm_open()打开设备时指定为非阻塞方式则调用 snd_pcm_readi/snd_pcm_writei 以非阻塞方式进行读/写。对于 PCM 录音来说当 buffer 缓冲区中无数据可读时调用 snd_pcm_readi()不会阻塞、而是立即以错误形式返回同理对于 PCM 播放来说当 buffer 缓冲区中的数据满时调用 snd_pcm_writei()函数也不会阻塞、而是立即以错误形式返回。 snd_pcm_readn 和 snd_pcm_writen snd_pcm_readi/snd_pcm_writei 适用于交错模式interleaved读/写数据如果用户设置的访问类型并不是交错模式而是非交错模式non interleaved此时便不可再使用 snd_pcm_readi/snd_pcm_writei 进行读写操作了而需要使用 snd_pcm_readn 和 snd_pcm_writen 进行读写。 3.编写播放器代码
http://www.zqtcl.cn/news/928709/

相关文章:

  • 黄石专业网站建设推广一起做网店 网站打不开
  • 网站session 验证江西星子网
  • 成都高校网站建设服务公司小树建站平台
  • 宁波网站建设 慕枫科技顺德网站设计制作
  • 企业网站如何宣传wordpress 链接修改插件
  • 站长工具官网查询视频网站建设工具
  • 建设彩票网站制作网站服务器
  • 购物网站建设网站怎么购买国外的域名
  • 在线网站排名工具跨境电商卖什么产品最赚钱
  • 电商网页设计网站什么是网络营销产生的现实基础
  • 网站开发需要注意的阿里云做网站可以免备案吗
  • 网站开发后端菜鸟教程本地安装wordpress nginx
  • 网站做端口映射域名怎么做网站
  • 港口建设征收 申报网站网站内容建设与管理
  • 长沙企业网站建设较好的公司个人社保缴费比例
  • 网站备案信息页面惠安网站建设报价
  • 东莞做微网站建设十大免费软件下载
  • 做的很好的黑白网站成都小程序开发
  • 发布做任务网站wordpress新建用户
  • 郑州市东区建设环保局官方网站工作简历模板免费下载
  • 虾皮跨境电商网站公司网站建设费计入什么费用
  • 东光有做网站的吗公司装修图片大全
  • 一个域名下多个网站项目网手游
  • 网站建设竞价托管服务wordpress搬站流程
  • 做视频网站视频文件都存放在哪室内设计网站平台
  • 外贸网站建设网合肥网站设计公
  • 网站建设设计制作 熊掌号一键生成小程序商城
  • 北滘做网站企业展厅 设计 公司 平安
  • 网站做seo外链常州营销型网站建设
  • 乐清门户网站建设网络推广关键词优化公司