惠东网站建设,网站排名在哪里优化,表格制作方法,农村电子商务专业就业方向基于 oss 框架完成系统平台音频驱动的适配。 oss 框架可被多个平台应用#xff0c;因此 oss 提供 OS 目录来存放平台文件#xff08;比如#xff1a;linux.c#xff09;#xff0c;该文件主要提供平台对 oss 框架封装后的相关接口。
以 Linux 为例#xff0c;入口接口为…基于 oss 框架完成系统平台音频驱动的适配。 oss 框架可被多个平台应用因此 oss 提供 OS 目录来存放平台文件比如linux.c该文件主要提供平台对 oss 框架封装后的相关接口。
以 Linux 为例入口接口为
调用 oss 框架通用初始接口 oss_commit_init 。 初始工作完成后便可注册音频驱动oss 框架中提供 drv 目录来存放驱动文件。
oss 框架中驱动涉及
mixer混频器提供的接口为 oss_install_mixer创建设备文件并提供文件操作集合 mixer_cdev_drv。audio dev 音频设备提供的接口为 oss_install_audio创建设备文件并提供文件操作集合 audio_cdev_drv。创建虚拟混频器 vmix_mixer实现混音功能。
驱动主要对上述中 mixeraudio dev 的操作进行实现对应的操作结构为 _mixer_driver_t 和 audiodrv_t。
oss 框架提供了命令模式来操作音频设备比如
录音操作, oss_record 命令该命令接口为 ossrecord_main() 解析命令参数oss 框架提供 dspdev_t 结构体与全局变量这两种形式对命令参数进行记录。 比如 参数结构体/全局变量-v-d设备文件名 dsp-name-s速率 force_speed-c通道 force_channels-t时间 datalimit 录音操作置只读标记dsp-flags调用 open_device 接口传参为 dspdev_t 结构。打开设备以文件形式来执行入口为 Linux.c 提供的 open 接口。 Linux 提供了统一的创建字符设备接口该接口为所有设备绑定统一的文件操作集合。
注意音频设备又包含 mixeraudio dev 等不同的硬件组件因此 oss 框架为不同的硬件组件提供了对应的操作。因此文件操作实际是对这些操作的封装。比如Linux 的 open 实际执行的操作是 oss_audio_open_devfile 接口。 oss_audio_open_devfile 接口根据设备编号在全局数组 audio_devfiles 中获取 adev_t 结构audio_devfiles 为全局数组创建 audio dev 过程中会被应用。若 adev_t 结构不为空则调用 oss_audio_open_engine 接口。 oss_audio_open_engine 接口根据设备编号在全局数组 audio_engine 获取 adev_t 结构audio_engine 数组与 audi_devfiles 数组作用相同。随后调用驱动自定义 open 接口。以 usb audio 为例此时会对 usb 进行初始化比如缓存urb 等。同时oss 框架会对 adev_t 结构进行初始化。
此时设备已打开且完成必要的初始化操作。
调用 encode_sound 接口开始录音及编码编码工作由 oss 框架自行完成。上述过程中并未对音频设备的格式通道采样率等进行配置因此调用 setup_device() 接口判断格式速率通道匹配是否与命令参数一致若不一致则关闭设备并重新打开。随后通过 ioctl 接口重新设置设备的通道等信息。
若需要对录音进行保存则 oss 框架会创建录音文件并写入文件头部信息以及录音数据文件头部信息主要说明音频文件的格式采样频率等信息。
record 接口完成录音操作在 while(1) 循环中完成录音工作申请一段内存空间将读取的数据保存到该空间 文件操作接口为 read。 read 接口的操作流程与 open 类似linux.c 自定义 read 接口。
随后依次执行 oss_audio_read -- prepare_input -- launch_input | | | | adrv_prepare_for_input adrv_start_input -- adrv_trigger 注操作由驱动来完成具体的实现
完成录音文件。
oss 框架提供 ossplay_main() 接口进行播放操作过程简析大致与录音过程类似
解析播放命令参数。-d将设备名赋值给 dsp-name。标记只写标志dsp-flag O_WRONLY;open_device() 打开设备。调用顺序与录音相同依次为 lib_open -- oss_open -- oss_audio_open_devfile -- oss_aduio_open_engine -- usbaudio_openplay_file() 读取音频文件并解析文件头根据文件头类型选择对应的操作。play_iff() -- decode_sound() 播放音频文件。申请内存空间读取音频文件将数据写入该空间中调用 write 接口开始将数据写入设备。与录音相同创建 uio 结构调用 oss_audio_write()。获取音频设备 audio_dev查找其拥有 dmap_out 地址空间将数据写入该控件随后调用 launch_output()。触发输出标记开始将 dmap 空间中的数据进行输出。
调用 open 打开设备阶段oss 框架为每一个音频设备创建内存空间由 dmap_p 结构进行相关的描述实际类型为 _dmap_t。
因此oss 框架中核心结构体为 _adev_t 结构用于对设备进行描述后期的初始读写等操作都是通过 _adev_t 结构来完成。 驱动主要对 _adev_t 结构进行填充主要为驱动操作集合使用的端口。
驱动集合结构为 audiodrv_t 和 _mixer_driver_t。端口由驱动根据硬件设备构建同时由 _adev_t 指向。
设备打开时驱动主要自行对端口进行设置。以 USB 为例驱动主要为设备关联 usb 设备端点同时创建通信管道即 urb。触发设备时查看当前端口触发条件随后通过端口的 usb 端点设备进行数据的发送或接收。