作家
登录

Linux音频设备驱动架构及应用编程

作者: 来源: 2017-11-08 09:18:19 阅读 我要评论

与其它设备有所不合,声卡平日不须要支撑非浊宣(non-blocking)的I/O 操作。即便内核OSS 驱动供给了非浊宣的I/O 支撑,用户空间也不宜采取。无论是大年夜声卡攫取数据,或是向声卡写入数据,事实上都具有特定的格局(format),如无符号8 位、单声道、8KHz 采样率,如不雅默认值无法达到请求,可以经由过程ioctl()体系调用来改变它们。平日说来,在应用法度榜样中打开设备文件/dev/dsp 之后,接下去就应当为其设置恰当的格局,然后才能大年夜声卡攫取或者写入数据。

3.2 mixer 接口

int register_sound_mixer(struct file_operations *fops, int dev);

2.2 IIS 接口

上述函数用于注册1 个混音器,第1 个参数fops 等于文件操作接口,第2 个参数dev 是设备编号,如不雅填入-1,则体系主动分派1 个设备编号。mixer 是1 个典范的字符设备,是以编码的重要工作是实现file_operations 中的open()、ioctl()等函数。mixer 接口file_operations 中的最重要函数是ioctl(),它实现混音器的不合IO 控制敕令,下面的代码清单给出了1 个ioctl()典范例。

mixer()接口ioctl()函数典范:

[cpp] view plain copy

3.3 DSP 接口

上述函数与register_sound_mixer()类似,它用于注册1 个dsp 设备,第1 个参数fops 等于文件操作接口,第2 个参数dev 是设备编号,如不雅填入-1,则体系主动分派1 个设备编号。dsp 也是1 个典范的字符设备,是以编码的重要工作是实现file_operations 中的read()、write()、ioctl()等函数。dsp 接口file_operations 中的read()和write()函数异常重要,read()函数大年夜音频控制器中获取灌音数据到缓冲区并拷贝到用户空间,write()函数大年夜用户空间拷贝音频数据到内核空间缓冲区并最终发送到音频控制器。

dsp 接口file_operations 中的ioctl()函数处理对采样率、量化精度、DMA 缓冲区块大年夜小等参数设置IO控制敕令的处理。在数据大年夜缓冲区拷贝到音频控制器的过程中,平日会应用DMA,DMA对声卡而言异常重要。例如,在放音时,驱动设置完DMA 控制器的源数据地址(内存中DMA 缓冲区)、目标地址(音频控制器FIFO)和DMA 的数据长度,DMA 控制器会主动发送缓冲区的数据填充FIFO,直到发送完响应的数据长度后才中断一次。

在OSS 驱动中,建立存放音频数据的环形缓冲区(ring buffer)平日是值得推荐的办法。此外,在OSS 驱动中,一般会将1 个较大年夜的DMA 缓冲区分成若干个大年夜小雷同的块(这些块也被称为“段”,即fragment),驱动法度榜样应用DMA 每次在声音缓冲区和声卡之间搬移一个fragment。在用户空间,可以应用ioctl()体系调用来调剂块的大年夜小和个数。除了read()、write()和ioctl()外,dsp 接口的poll()函数平日也须要被实现,以向用户反馈今朝可否读写DMA 缓冲区。在OSS 驱动初始化过程中,会调用register_sound_dsp()和register_sound_mixer()注册dsp 和mixer 设备;在模块卸载的时刻,调用的代码如下:

OSS 驱动初始化注册dsp 和mixer设备:

[cpp] view plain copy

  1. static int myoss_init(void)   
  2. {   
  3.     struct oss_state *s = &myoss_state;   
  4.     ...   
  5.     //注册dsp 设备   
  6.     if ((audio_dev_dsp = register_sound_dsp(&xxx_audio_fops, - 1)) < 0)   
  7.          goto err_dev1;   
  8.     //注册mixer 设备   
  9.     if ((audio_dev_mixer = register_sound_mixer(&xxx_mixer_fops, - 1)) < 0)   
  10.          goto err_dev2;   
  11.     ...   
  12. }   
  13.    
  14. void __exit xxx_exit(void)   
  15. {   
  16.     //刊出dsp 和mixer 设备接口   
  17.     unregister_sound_dsp(audio_dev_dsp);   
  18.     unregister_sound_mixer(audio_dev_mixer);   
  19.     ...   
  20. }    

3.4 OSS 用户空间编程

1、DSP 编程

对OSS 驱动声卡的编程应用Linux 文件接口函数,DSP 接口的操作一般包含如下几个步调:

采取何种模式对声卡进行操作也必须在打开设备时指定,对于不支撑全双工的声卡来说,应当应用只读或者只写的方法打开,只有那些支撑全双工的声卡,才能以读写的方法打开,这还依附于驱动法度榜样的具体实现。Linux 许可应用法度榜样多次打开或者封闭与声卡对应的设备文件,大年夜而可以或许很便利地在放音状况和灌音状况之间进行切换。


  推荐阅读

  程序员的未来在哪里?扎心了

视野。但不知为何,法度榜样员在很多人中的印象并不是特别好,蓬头垢面、满脸油光、格子衫、小短裤似乎成了法度榜样员的代名词。 反不雅同一公司里的其它岗亭,产品、运营、>>>详细阅读


本文标题:Linux音频设备驱动架构及应用编程

地址:http://www.17bianji.com/lsqh/38578.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)