- 浏览: 228255 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
wahahachuang8:
GoEasy 实时推送支持IE6-IE11及大多数主流浏览器的 ...
服务器推送技术 java -
mahuanjian:
[flash=200,200][/flash]
服务器推送技术 java -
wenjundiandian:
下面有网页编辑器的话还是会被隐藏.
ext中消息框、提示框、确认框显示在最前面的解决方法 -
天塔上的猫:
/**
* JAVA常见的权限控制算法的实现
*
* ...
JAVA常见的权限控制算法的实现
1、DSP编程
对OSS驱动声卡的编程使用Linux文件接口函数,如图17.5,DSP接口的操作一般包括如下几个步骤:
① 打开设备文件/dev/dsp。
采用何种模式对声卡进行操作也必须在打开设备时指定,对于不支持全双工的声卡来说,应该使用只读或者只写的方式打开,只有那些支持全双工的声卡,才能以读写的方式打开,这还依赖于驱动程序的具体实现。Linux允许应用程序多次打开或者关闭与声卡对应的设备文件,从而能够很方便地在放音状态和录音状态之间进行切换。
② 如果有需要,设置缓冲区大小。
运行在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控制命令可以设置采样频率。
⑤ 读写/dev/dsp实现播放或录音。
图17.5 OSS dsp接口用户空间操作流程
代码清单17.3的程序实现了利用/dev/dsp接口进行声音录制和播放的过程,它的功能是先录制几秒钟音频数据,将其存放在内存缓冲区中,然后再进行放音。
代码清单17.3 OSS DSP接口应用编程范例
1 #include <unistd.h>
2 #include <fcntl.h>
3 #include <sys/types.h>
4 #include <sys/ioctl.h>
5 #include <stdlib.h>
6 #include <stdio.h>
7 #include <linux/soundcard.h>
8 #define LENGTH 3 /* 存储秒数 */
9 #define RATE 8000 /* 采样频率 */
10 #define SIZE 8 /* 量化位数 */
11 #define CHANNELS 1 /* 声道数目 */
12 /* 用于保存数字音频数据的内存缓冲区 */
13 unsigned char buf[LENGTH *RATE * SIZE * CHANNELS / 8];
14 int main()
15 {
16 int fd; /* 声音设备的文件描述符 */
17 int arg; /* 用于ioctl调用的参数 */
18 int status; /* 系统调用的返回值 */
19 /* 打开声音设备 */
20 fd = open("/dev/dsp", O_RDWR);
21 if (fd < 0)
22 {
23 perror("open of /dev/dsp failed");
24 exit(1);
25 }
26 /* 设置采样时的量化位数 */
27 arg = SIZE;
28 status = ioctl(fd, SOUND_PCM_WRITE_BITS, &arg);
29 if (status == - 1)
30 perror("SOUND_PCM_WRITE_BITS ioctl failed");
31 if (arg != SIZE)
32 perror("unable to set sample size");
33 /* 设置采样时的通道数目 */
34 arg = CHANNELS;
35 status = ioctl(fd, SOUND_PCM_WRITE_CHANNELS, &arg);
36 if (status == - 1)
37 perror("SOUND_PCM_WRITE_CHANNELS ioctl failed");
38 if (arg != CHANNELS)
39 perror("unable to set number of channels");
40 /* 设置采样率 */
41 arg = RATE;
42 status = ioctl(fd, SOUND_PCM_WRITE_RATE, &arg);
43 if (status == - 1)
44 perror("SOUND_PCM_WRITE_WRITE ioctl failed");
45 /* 循环,直到按下Control-C */
46 while (1)
47 {
48 printf("Say something:\n");
49 status = read(fd, buf, sizeof(buf)); /* 录音 */
50 if (status != sizeof(buf))
51 perror("read wrong number of bytes");
52 printf("You said:\n");
53 status = write(fd, buf, sizeof(buf)); /* 放音 */
54 if (status != sizeof(buf))
55 perror("wrote wrong number of bytes");
56 /* 在继续录音前等待放音结束 */
57 status = ioctl(fd, SOUND_PCM_SYNC, 0);
58 if (status == - 1)
59 perror("SOUND_PCM_SYNC ioctl failed");
60 }
61 }
来源:http://blog.chinaunix.net/space.php?uid=20564848&do=blog&id=74026
发表评论
-
Linux下获取IP、MAC、网关、掩码的shell脚本
2012-07-05 13:45 1892Mask:ifconfig |grep inet| sed - ... -
输入法
2012-01-04 18:00 0http://civilnet.cn/syszux/syszu ... -
tar压缩解压
2012-01-01 11:04 1017tar -c: 建立压缩档案-x ... -
Linux GUI 技术网
2012-01-01 10:32 689http://www.linuxgraphics.cn/hom ... -
Linux常用命令大全
2012-01-01 10:27 605http://www.emlinix.com/linux-zh ... -
嵌入式Linux应用程序自动载入驱动模块方法
2012-01-01 10:22 1254英利公司推出的嵌入式L ... -
MP4音频解码信息
2011-12-31 11:48 0http://blog.chinaunix.net/space ... -
ffmpeg库音频解码示例
2011-12-31 11:45 0一个英文版的例子(有讲解)ffmpeg的一些使用例子mpeg ... -
基于Bootloader的可靠嵌入式软件远程更新机制
2011-12-31 11:42 0嵌入式软件的远程自动 ... -
Double转STRING
2011-12-31 11:40 0double x=1.23456789; ch ... -
linux下检测网卡与网线连通状态
2011-12-31 11:32 0Linux下检测网卡与网线连接状态,使用ioctl向socke ... -
去除10分钟左右自动关闭LCD显示
2012-01-04 09:50 526注释掉drivers\char\vt.c的blank_scre ... -
linux logo 左上角有黑块解决办法
2012-01-04 09:50 913http://www.unixresources.net/li ... -
linux下gprs ppp 拨号的注意事项
2011-12-31 11:21 0折腾了几天,终于在linux下拨号成功了! 注意事项: 1 ... -
GPRS模块在Linux平台上ppp拨号上网总结与心得
2011-12-31 11:09 0由于一个嵌入式平台 ... -
Linux下检测U盘是否插入
2011-12-31 11:07 0Linux下检测U盘是否插入Linux的文件系统是异步的,也就 ... -
Linux下应用程序如何取得U盘插拔消息
2011-12-31 11:06 0Linux 2.6内核版本以后,对于/dev目录的管理采用了新 ... -
在嵌入式Linux下GPRS上网方案
2011-12-31 11:02 0在嵌入式Linux下GPRS上网方案 硬/软件环境 ... -
FFMpeg框架代码阅读
2011-12-31 10:50 01. 简介FFmpeg是一个集录制、转换、音/视频编码解码 ... -
关于ffmpeg的安装及其编译
2011-12-31 10:48 0所需软件包:nasm-0.98.39-1.i386.r ...
相关推荐
TMS320C6000系列DSP编程工具与指南_中文版
TMS320C6000系列DSP编程工具与指南.pdf
实用的DSP编程手册,介绍的比较详细,PDF格式。
DSP编程一周通,对初学学习DSP的人应该有帮助
为DSP编程提供了极大的方便,内含源文件,库文件,以及头文件。。。
从最简单例子学习DSP,从最简单例子学习DSP,从最简单例子学习DSP
关于dsp编程的书籍,学习过,觉得还不错,给大家分享一下!
使用CCS进行DSP编程(一)——CCS编程入门.pdf
教你如何使用CCS进行DSP编程【最全】.
详细介绍了DSP编程所遇到的一些关键问题和解决方案
关于TIDSP的一些编程技巧,包括编译器的选项、代码的优化、库文件的使用、代码实现标准、实时运行环境等等
TMS320F2812 DSP编程之一,TMS320F2812处理器是TI 公司C2000系列处理器中的一款,主频可以达到150Mhz,我目前在项目中就是使用这款处理器。该处理器在电机控制等工业控制领域,有着大量的应用。TMS320C28x™ 控制器...
DSP编程指令集 DSP编程指令集 DSP编程指令集 DSP编程指令集
DSP 软件编程是不能形成明显呢,出门 查电费VCD司法所规范续保
DSP c2000 程序员 编程指南 高手进阶 主要针对C2000DSP编程的学习与提高!
CCS学习入门资料 ---CCS user guide ---使用CCS进行DSP编程(一) ---使用CCS进行DSP编程(二) ---使用CCS进行DSP编程(三) ---使用CCS进行DSP编程(四)
DSP编程的几个关键问题 DSP编程的几个关键问题 DSP编程的几个关键问题
CCS编程软件,专业DSP编程软件,简单实用。方便快界。
使用CCS信息DSP编程4-实现Host和DSP通信。在用CCS2.0进行TI的DSP的软件开发之时,用于实现主机和DSP的通信。