乳房太大必要时要缩小_美美生活馆

Linux音频编程指南

08月 31st, 2008 by Skylin

 
2004-10-28    肖文鹏    IBM DW  
 
虽然目前Linux的优势主要体现在网络服务方面,但事实上同样也有着非常丰富的媒体功能,本文就是以多媒体应用中最基本的声音为对象,介绍如何在Linux平台下开发实际的音频应用程序,同时还给出了一些常用的音频编程框架。 
 
一、数字音频 
 
音频信号是一种连续变化的模拟信号,但计算机只能处理和记录二进制的数字信号,由自然音源得到的音频信号必须经过一定的变换,成为数字音频信号之后,才能送到计算机中作进一步的处理。 
 
数字音频系统通过将声波的波型转换成一系列二进制数据,来实现对原始声音的重现,实现这一步骤的设备常被称为模/数转换器(A/D)。A/D转换器以每秒 钟上万次的速率对声波进行采样,每个采样点都记录下了原始模拟声波在某一时刻的状态,通常称之为样本(sample),而每一秒钟所采样的数目则称为采样 频率,通过将一串连续的样本连接起来,就可以在计算机中描述一段声音了。对于采样过程中的每一个样本来说,数字音频系统会分配一定存储位来记录声波的振 幅,一般称之为采样分辩率或者采样精度,采样精度越高,声音还原时就会越细腻。 
 
数字音频涉及到的概念非常多,对于在Linux下进行音频编程的程序员来说,最重要的是理解声音数字化的两个关键步骤:采样和量化。采样就是每隔一定时间 就读一次声音信号的幅度,而量化则是将采样得到的声音信号幅度转换为数字值,从本质上讲,采样是时间上的数字化,而量化则是幅度上的数字化。下面介绍几个 在进行音频编程时经常需要用到的技术指标: 
 
采样频率 
采样频率是指将模拟声音波形进行数字化时,每秒钟抽取声波幅度样本的次数。采样频率的选择应该遵循奈奎斯特(Harry Nyquist)采样理论:如果对某一模拟信号进行采样,则采样后可还原的最高信号频率只有采样频率的一半,或者说只要采样频率高于输入信号最高频率的两 倍,就能从采样信号系列重构原始信号。正常人听觉的频率范围大约在20Hz~20kHz之间,根据奈奎斯特采样理论,为了保证声音不失真,采样频率应该在 40kHz左右。常用的音频采样频率有8kHz、11.025kHz、22.05kHz、16kHz、37.8kHz、44.1kHz、48kHz等,如 果采用更高的采样频率,还可以达到DVD的音质。  
量化位数 
量化位数是对模拟音频信号的幅度进行数字化,它决定了模拟信号数字化以后的动态范围,常用的有8位、12位和16位。量化位越高,信号的动态范围越大,数字化后的音频信号就越可能接近原始信号,但所需要的存贮空间也越大。  
声道数 
声道数是反映音频数字化质量的另一个重要因素,它有单声道和双声道之分。双声道又称为立体声,在硬件中有两条线路,音质和音色都要优于单声道,但数字化后占据的存储空间的大小要比单声道多一倍。  
二、声卡驱动 
 
出于对安全性方面的考虑,Linux下的应用程序无法直接对声卡这类硬件设备进行操作,而是必须通过内核提供的驱动程序才能完成。在Linux上进行音频编程的本质就是要借助于驱动程序,来完成对声卡的各种操作。 
 
对硬件的控制涉及到寄存器中各个比特位的操作,通常这是与设备直接相关并且对时序的要求非常严格,如果这些工作都交由应用程序员来负责,那么对声卡的编程 将变得异常复杂而困难起来,驱动程序的作用正是要屏蔽硬件的这些底层细节,从而简化应用程序的编写。目前Linux下常用的声卡驱动程序主要有两种: OSS和ALSA。 
 
最早出现在Linux上的音频编程接口是OSS(Open Sound System),它由一套完整的内核驱动程序模块组成,可以为绝大多数声卡提供统一的编程接口。OSS出现的历史相对较长,这些内核模块中的一部分 (OSS/Free)是与Linux内核源码共同免费发布的,另外一些则以二进制的形式由4Front Technologies公司提供。由于得到了商业公司的鼎力支持,OSS已经成为在Linux下进行音频编程的事实标准,支持OSS的应用程序能够在绝 大多数声卡上工作良好。 
 
虽然OSS已经非常成熟,但它毕竟是一个没有完全开放源代码的商业产品,ALSA(Advanced Linux Sound Architecture)恰好弥补了这一空白,它是在Linux下进行音频编程时另一个可供选择的声卡驱动程序。ALSA除了像OSS那样提供了一组内 核驱动程序模块之外,还专门为简化应用程序的编写提供了相应的函数库,与OSS提供的基于ioctl的原始编程接口相比,ALSA函数库使用起来要更加方 便一些。ALSA的主要特点有: 
 
支持多种声卡设备  
模块化的内核驱动程序  
支持SMP和多线程  
提供应用开发函数库  
兼容OSS应用程序  
ALSA和OSS最大的不同之处在于ALSA是由志愿者维护的自由项目,而OSS则是由公司提供的商业产品,因此在对硬件的适应程度上OSS要优于 ALSA,它能够支持的声卡种类更多。ALSA虽然不及OSS运用得广泛,但却具有更加友好的编程接口,并且完全兼容于OSS,对应用程序员来讲无疑是一 [...]

Posted in C/C++ | No Comments »

linux 2.6内核epoll用法举例说明

08月 29th, 2008 by Skylin

epoll用到的所有函数都是在头文件sys/epoll.
h中声明的,下面简要说明所用到的数据结构和函数: 
所用到的数据结构

 

typedef union epoll_data {   
                void *ptr;   
                int fd;   
                __uint32_t u32;   
                __uint64_t u64;   
        } epoll_data_t;   
   
        struct epoll_event {   
                __uint32_t events;      /* Epoll events */   
                epoll_data_t data;      /* User data variable */   
        };   

typedef union epoll_data { void *ptr; int fd; [...]

Posted in C/C++ | No Comments »

linux内核裁减

08月 26th, 2008 by Skylin

在csdn论坛里看到的

内核配置
内核配置的方法很多,make config、make xconfig、make menuconfig、make oldconfig等等,它们的功能都是一样的,区别应该从名字上就能看出来,只有make oldconfig是指用系统当前的设置(./.config)作为缺省值。这里用的是make menuconfig。
需要牢记:不必要的驱动越多,内核就越大,不仅运行速度慢、占用内存多,在少数情况下、还会引发其他问题。具体步骤如下:
首先确定shell是bash。
然后
$make menuconfig
有一些默认的符号其含义如下:
y:加载
n:不加载
m:作为模块加载
可以配置的选项有以下一些:
1)code maturity level option 代码成熟度
prompt for development and/or incomplete code/drivers [N/y/?]
如果有兴趣测试一下内核中尚未最终完成的某些模块,就选y,否则选N,想知道更详细的信息选?会看到联机帮助(以下?的含义相同),N大写表示缺省值。
2)processor type and features 处理器类型及特性
Processor family(386,486/Cx486,586/K5/5×86/6×86,Pentium/K6/TSC, PPro/6×86MX)[PPro/6x86MX]
[]内的是缺省值,我们可以根据前面介绍的uname 命令执行的结果选择。此项如果高于386,那么生成的内核在386机器上将不能启动。
Math emulation(CONFIG_MATH_EMULATION)[N/y/?]
需要进行协处理器模拟吗?一般的机器都回n。如果机器已经有硬件的协处理器,那么内核仍将使用硬件,而忽略软件的math-emulation,这将使内核变大变慢。
MTRR(Memory Type Range Register)support(CONFIG_MTRR)[N/y/?]
在Pentium、Pro/Pentium II类的系统中可以提高图像写入速度。
Symmetric multi-processing support(CONFIG_SMP)[Y/n/?]
如果您的机器有多个处理器,就选y。此时要选中下面的Enhanced Real Time Clock Support
3)loadable model support 可加载模块支持
Enable loadable module [...]

Posted in linux | No Comments »

Linux内核裁减及根文件系统定制(二)

08月 26th, 2008 by Skylin

二、根文件系统定制
1、 创建一个全新的根文件系统
你可以用mkinitrd来创建,这里介绍另外一种方式,用dd命令:
# mkdir -p /mnt/initrd 创建一个设备点,用于临时挂载根文件系统。
# cd /tmp 在tmp下创建根文件系统
# dd if=/dev/zero of=/tmp/initrd bs=512 count=40960 创建一个名为initrd的根文件
系统,系统每个块的大小为
512字节,共40960块。
# mke2fs -F -m 0 initrd 格式化根文件系统,其中-F表示强制执行;
-m 0表示不为系统预留空间。
# mount -o loop /tmp/initrd /mnt/initrd 挂载根文件系统,记住这里要使用
-o loop选项,否则挂载会失败。
# cd /mnt/initrd
2、 创建基本的目录结构
# mkdir dev proc etc etc/rc.d [...]

Posted in linux | No Comments »

Linux内核裁减及根文件系统定制(一)

08月 26th, 2008 by Skylin

目录:
一、内核编译
二、根文件系统定制
三、内核选项说明

一、内核编译
1、 准备工作
(1) 整理出系统需要支持的硬件、文件系统类型以及网络协议等内容。
(2) 建议用命令uname –r 查看一下系统的版本号,如果你的系统版本与将要编译的内核版本一致,建议将/lib/modules下的内容备份,否则将来的make modules_install 步骤产生的文件会覆盖这个路径下的内容。
(3) 下载并解压linux内核,建议从http://www.kernel.org/pub/linux/kernel/ 下载内核,因为安装系统时所安装的源代码默认情况下支持很多设备,这样给内核裁减增加了难度。以下假设你已经下载了内核的为linux-x-y-z.tar.gz。一般都将linux内核源代码放在/usr/src下,这里仍然遵守这个习惯,如果你的这个路径下已经存在这个版本的内核,建议将已有的改个名称。
2、 开始编译
(1) make mrproper
确保源代码目录下没有不正确的.o文件和文件依赖关系,执行该命令后,内核选项会回到默认的状态下。如果你是下载的内核源码,而且是第一次编译,就没有必要执行这一步操作
(2) make menuconfig
以文本菜单方式选择内核选项(与它功能相同的命令还有make config;make xconfig;make oldconfig),不同版本的内核,选项可能会有一些差异。
这一步是内核编译的关键,根据需要支持的硬件、文件系统和协议等内容,选择不同的选项。配置选项时,有三种选择方式,它们代表的含义如下:
Y-将该功能编译进内核
N-不添加功能
M-将该功能编译成模块,在需要时动态加载到内核
选择的原则是与内核关心紧密而且经常使用的部分功能代码直接编译到内核中;将与内核系较远且不经常使用的部分功能代码编译成为可加载模块,有利于减小内核的长度,减小内核消耗的内存,简化该功能相应的环境改变时对内核的影响;不需要的功能就不要选。
我们使用空格键进行选取。根据选项的不同,按下空格键的结果也有所不同:选项后有”―――>”符号的,进入下一级菜单;选项前有中括号的,则在空和“*”之间切换;选项前有尖括号的,在空、“*”和“M”之间切换;选项前有圆括号的,需要在所提供的几个选项中选择一项,或者需要输入数值等符号。
咦,什么?要我详细介绍具体该怎么选择这些选项?大汗!这可是个大问题,需要根据不同的需求进行选择,比如需要支持USB键盘、鼠标或/和存储器,支持多CPU,支持网卡,串口,支持TCP协议,ext2文件系统,nfs文件系统等等。后面我将就内核选项做详细的介绍。
(3) make dep
根据上一步所选择的选项,建立文件的依赖关系。
(4) make clean
清理一些不必要的文件,如果你在上次编译的基础上,删去了一些选项,建议你执行这一步操作,否则,就没有必要了。
(5) make bzImage
生成内核压缩文件。如果你确认你的内核在640K以下,你可以用make zImage来代替 make bzImage。这一步相当费时,你可以在命令后加上&,让其在后台执行,或者重定向到/dev/null中,这样你就什么也看不见屏幕上闪过不停的字符啦。编译出的内核在 ./arch/i386/boot/ 下,文件名为bzImage
(6) copy “/usr/src/linux/arch/i386/boot/bzImage /boot/vmlinuz-x.y.z
(7) make modules
编译可加载模块(即内核选项中选择为M的选项),编译时间跟M选项的数量有关。
(8) make modules_inatall
将编译好的modules拷贝到/lib/modules下,这就是为什么在“准备工作”的第三步提醒你备份的原因了。
(9) cp /usr/src/linux/System.map /boot/ System-x.y.z.map
3、 修改启动配置文件
现在大多数使用的都是grub启动,需要修改/boot/grub/grub.conf,添加相应的启动信息,添加内容的最简单格式如下:
title 显示在启动菜单上的名称
root 根文件系统挂载分区
kernel [...]

Posted in linux | No Comments »

Linux内核配置选项

08月 26th, 2008 by Skylin

第一部分
01、Code maturity level options —> 代码成熟等级选项
01.01、 [ ] Prompt for development and/or incomplete code/drivers 默认情况下是选择的,这将会在设置界面中显示还在开发或者还没有完成的代码与驱动.你应该选择它,因为有许多设备可能必需选择这个选项才能进行配置,实际 上它是安全的。
01.02、[ ] Select only drivers expected to compile cleanly [...]

Posted in linux | No Comments »

linux 下 apache2.2.2+svn 1.3.1安装

08月 25th, 2008 by Skylin

apache的安装 httpd是web服务器,用来通过web访问subversion,我下载到httpd-2.2.2.tar.bz2。 解压该文件: #bunzip2 httpd-2.2.2.tar.bz2 #tar xvf httpd-2.2.2.tar //进入解压后的目录 # cd httpd-2.2.2 //配置apache安装,前两个参数是必须要加的,你还可以根据您的需要添加其他的参数。 //后面的参数制定你要把apache安装哪里 # ./configure –enable-dav –enable-so –prefix=/usr/local/apache2/ # make //安装 # make install # cd /usr/local/apache2/bin //启动apache服务 # ./apachectl start //打开浏览器http://localhost/如果有测试页”It works!”出现则证明已经安装成功。 //打开浏览器http://localhost/如果有测试页”It works!”出现则证明已经安装成功。 //如果配置文件/apache2/conf/httpd.conf中,下面两行没有注释掉的话,需要先注释,然后再启动apache,否则可能报错: “httpd: Syntax error on line 232 of /usr/local/apache2/conf/httpd.conf: API m…..”提示不能加载svn的.so文件 LoadModule dav_svn_module modules/mod_dav_svn.so [...]

Posted in 服务器配置 | No Comments »

linux+apache2+php5+mysql5+zend环境架设

08月 25th, 2008 by Skylin

我的安装环境是centos5,缺省不安装apache mysql等
安装顺序是mysql > apache > php > zend

一、准备工作

安装多线程下载工具
wget http://myget.sourceforge.net/release/myget-0.1.2.tar.gz
tar zxvf myget-0.1.2.tar.gz
cd myget-0.1.2
./configure
make
make install
测试一下是不是正常:
mytget -n 10 http://curl.haxx.se/download/curl-7.17.1.tar.gz

下载相关的软件包:
mytget -n 10 http://dev.mysql.com/get/Downloads/MySQL-5.0/mysql-5.0.45-linux-i686-icc-glib
c23.tar.gz/from/http://mysql.mirrors.pair.com/
wget http://apache.mirror.phpchina.com/httpd/httpd-2.2.6.tar.gz
wget http://cn2.php.net/get/php-5.2.5.tar.gz/from/this/mirror
wget http://www.hardened-php.net/suhosin/_media/suhosin-patch-5.2.5-0.9.6.2.patch.gz

wget http://www.zlib.net/zlib-1.2.3.tar.gz
wget http://downloads.sourceforge.net/libpng/libpng-1.2.23.tar.gz
wget http://downloads.sourceforge.net/freetype/freetype-2.3.5.tar.gz wget http://freshmeat.net/redir/libjpeg/5665/url_tgz/jpegsrc.v6b.tar.gz
wget http://www.boutell.com/gd/http/gd-2.0.33.tar.gz

wget http://curl.haxx.se/download/curl-7.17.1.tar.gz
mytget -n 10 http://ftp.acc.umu.se/pub/GNOME/sources/libxml2/2.6/libxml2-2.6.30.tar.gz
mytget -n 10 http://ftp.acc.umu.se/pub/GNOME/sources/libxslt/1.1/libxslt-1.1.22.tar.gz

说明:所有的包全部安装到/usr/local/src目录下。
以下的软件版本的相关性得到测试是相互符合的,如果是换新的版本安装,各位在编译安装的时候要注意是否提示软件相关性的问题!
主要软件:
mysql-5.0.45-linux-i686-icc-glibc23.tar.gz httpd-2.2.6.tar.gz [...]

Posted in PHP | No Comments »