② 如不雅有须要,设置缓冲区大年夜小
运行在Linux 内核中的声卡驱动法度榜样专门保护了一个缓冲区,其大年夜小会影响到放音和灌音时的效不雅,应用ioctl()体系调用可以对它的尺寸进行恰当的设置。调节驱动法度榜样中缓冲区大年夜小的操作不是必须的,如不雅没有特别的请求,一般采取默认的缓冲区大年夜小也就可以了。如不雅想设置缓冲区的大年夜小,则平日应紧跟在设备
文件打开之后,这是因为对声卡的其它操作有可能会导致驱动法度榜样无法再修改其缓冲区的大年夜小。
③ 设置声道(channel)数量
根据硬件设备和驱动法度榜样的具体情况,可以设置为单声道或者立体声。
④ 设置采样格局和采样频率
采样格局包含AFMT_U8(无符号8 位)、AFMT_S8(有符号8 位)、AFMT_U16_LE(小端模式,无符号16 位)、AFMT_U16_BE(大年夜端模式,无符号16 位)、AFMT_MPEG、AFMT_AC3 等。应用SNDCTL_DSP_SETFMT IO 控制敕令可以设置采样格局。对于大年夜多半声卡来说,其支撑的采样频率范围一般为5kHz 到44.1kHz 或者48kHz,但并不料味着该范围内的所有持续频率都邑被硬件支撑,在Linux 下进行音频编程时最常用到的几种采样频率是11025Hz、16000Hz、22050Hz、32000Hz 和44100Hz。应用SNDCTL_DSP_SPEED IO 控制敕令可以设置采样频率。
2. 音频设备硬件接口
⑤ 读写/dev/dsp 实现播放或灌音
下面代码实现了应用/dev/dsp 接口进行声音录制和播放的过程,它的功能是先录制几秒钟音频数据,将其存放在内存缓冲区中,然后再进行放音。
[cpp] view plain copy
- #include <unistd.h>
- #include <fcntl.h>
- #include <sys/types.h>
- #include <sys/ioctl.h>
- #include <stdlib.h>
- #include <stdio.h>
- #include <linux/soundcard.h>
- #define LENGTH 3 /* 存储秒数 */
- #define RATE 8000 /* 采样频率 */
- #define SIZE 8 /* 量化位数 */
- #define CHANNELS 1 /* 声道数量 */
- /* 用于保存数字音频数据的内存缓冲区 */
- unsigned char buf[LENGTH *RATE * SIZE * CHANNELS / 8];
- int main()
- {
- int fd; /* 声音设备的文件描述符 */
- int arg; /* 用于ioctl 调用的参数 */
- int status; /* 体系调用的返回值 */
- /* 打开声音设备 */
- fd = open("/dev/dsp", O_RDWR);
- if (fd < 0)
- {
- perror("open of /dev/dsp failed");
- exit(1);
- }
- /* 设置采样时的量化位数 */
- arg = SIZE;
- status = ioctl(fd, SOUND_PCM_WRITE_BITS, &arg);
- if (status == - 1)
- perror("SOUND_PCM_WRITE_BITS ioctl failed"
推荐阅读
视野。但不知为何,法度榜样员在很多人中的印象并不是特别好,蓬头垢面、满脸油光、格子衫、小短裤似乎成了法度榜样员的代名词。 反不雅同一公司里的其它岗亭,产品、运营、>>>详细阅读
本文标题:Linux音频设备驱动架构及应用编程
地址:http://www.17bianji.com/lsqh/38578.html
1/2 1

网友点评
精彩导读
科技快报
品牌展示