??xml version="1.0" encoding="utf-8" standalone="yes"?>久久66热人妻偷产精品9,99久久人妻无码精品系列,精品亚洲综合久久中文字幕http://www.shnenglu.com/iuranus/archive/2009/07/19/90549.html攀?/dc:creator>攀?/author>Sun, 19 Jul 2009 14:27:00 GMThttp://www.shnenglu.com/iuranus/archive/2009/07/19/90549.htmlhttp://www.shnenglu.com/iuranus/comments/90549.htmlhttp://www.shnenglu.com/iuranus/archive/2009/07/19/90549.html#Feedback2http://www.shnenglu.com/iuranus/comments/commentRss/90549.htmlhttp://www.shnenglu.com/iuranus/services/trackbacks/90549.htmlWilliam, Windy, Steven都买了G1Q对于数码狂人的我当然也想一个了Q但怪就怪在Iphone没坏呀(上次在三楼掉下来也没问题)Q唉QCC不会让我买的Q所以还是等把,我这个坏了再乎ͼ赫赫赫赫.
 
最q刚好也在做androidUL工作Q顺便把G1的spec贴出来,有兴的看看

Product Features & Specifications Technical Specifications
Operating System Google Android 1.0  Q最新的?.0 donutQ?/td>
Network Support GSM/GPRS/EDGE/HSDPA, UMTS: 1700/2100MHz, GSM: 850/900/1800/1900MHz  中国也可以用3G?/td>
Screen 3.2" HVGA (320 x 480px), 65k Color TFT
Input Method Glass Capacitive Touchscreen, Slide-out 5-row QWERTY Keyboard, Trackball navigation
Wi-Fi 802.11b/g
GPS GPS navigation capabilities with Google Maps
Bluetooth Bluetooth v2.0+edr
Camera 3.2MP Camera with auto focus
Storage Internal 256MB Storage, External MicroSDHC Slot
Connection Ports ExtUSB 2.0 Hi-Speed (Mini-USB compatible for data-transfer, charger, and audio port)
Physical Attributes Dimensions: 117.7mm x 55.7mm x 17.1mm, Weight: 158g with battery

Media Support
Audio Support Codecs: MP3/WMA/AAC+/MPEG4/WAV/MIDI/Real Audio/Ogg
Video Support Codecs: H.264/3GPP/MPEG4
Browser Google WebKit-based Browser, streaming video


Bill of Materials
Processor Qualcomm MSM7201A @ 528MHz
Screen Sharp 3.2" HVGA LCD, 65k Color TFT
Capacitive Sensor IC Synaptics 1007A
Storage Samsung MCP - 256MB NAND Flash + 128MB DDR SDRAM
USB PHY SMSC USB3316
Wi-Fi Texas Instruments WL1251B
Bluetooth Texas Instruments BRF6300
GPS Integrated into Baseband Processor
Audio Integrated into Baseband Processor
Accelerometer Unknown
RF Transceiver Qualcomm RTR6285 Quad-band GSM/Dual-band UMTS
Power Management PMIC: Qualcomm PM7540
Power Amp (Quad-band GSM): TriQuint Semiconductor TQS-7M5008
Power Amp (UMTS-2100MHz): Avago ACPM-7381; (UMTS-1700MHz): Avago ACPM-7391



]]>
(?Linux音频~程指南http://www.shnenglu.com/iuranus/archive/2009/05/12/82689.html攀?/dc:creator>攀?/author>Tue, 12 May 2009 07:27:00 GMThttp://www.shnenglu.com/iuranus/archive/2009/05/12/82689.html            源地址Q?a >http://www.ibm.com/developerworks/cn/linux/l-audio/index.html
            作者:   肖文?br>            虽然目前Linux的优势主要体现在|络服务斚wQ但事实上同样也有着非常丰富的媒体功能,本文是以多媒体应用中最基本的声音ؓ对象Q介l如何在Linuxq_下开发实际的音频应用E序Q同时还l出了一些常用的音频~程框架

一、数字音?/span>

音频信号是一U连l变化的模拟信号Q但计算机只能处理和记录二进制的数字信号Q由自然x得到的音频信号必ȝq一定的变换Q成为数字音频信号之后,才能送到计算Z作进一步的处理?/p>

数字音频pȝ通过声波的波型转换成一pd二进制数据,来实现对原始声音的重玎ͼ实现q一步骤的设备常被称为模/数{换器QA/DQ。A/D转换器以每秒钟上万次的速率对声波进行采P每个采样炚w记录下了原始模拟声L在某一时刻的状态,通常UC为样本(sampleQ,而每一U钟所采样的数目则UCؓ采样频率Q通过一串连l的hq接hQ就可以在计机中描qCD声音了。对于采栯E中的每一个样本来_数字音频pȝ会分配一定存储位来记录声波的振幅Q一般称之ؓ采样分辩率或者采L度,采样_ֺ高Q声韌原时׃细腅R?/p>

数字音频涉及到的概念非常多,对于在Linux 下进行音频编E的E序员来_最重要的是理解声音数字化的两个关键步骤Q采样和量化。采样就是每隔一定时间就Mơ声音信Lq度Q而量化则是将采样得到的声音信号幅度{换ؓ数字|从本质上Ԍ采样是时间上的数字化Q而量化则是幅度上的数字化。下面介l几个在q行音频~程时经帔R要用到的技术指标:

  1. 采样频率
    采样频率是指模拟声xL形进行数字化Ӟ每秒钟抽取声波幅度样本的ơ数。采样频率的选择应该遵@奈奎斯特QHarry NyquistQ采L论:如果Ҏ一模拟信号q行采样Q则采样后可q原的最高信号频率只有采样频率的一半,或者说只要采样频率高于输入信号最高频率的两倍,p从采样信L列重构原始信受正思h听觉的频率范围大U在20Hz~20kHz之间Q根据奈奎斯牚wL论,Z保证声音不失真,采样频率应该?40kHz左右。常用的音频采样频率?kHz?1.025kHz?2.05kHz?6kHz?7.8kHz?4.1kHz?8kHz{,如果采用更高的采样频率,q可以达到DVD的音质?
  2. 量化位数
    量化位数是对模拟音频信号的幅度进行数字化Q它军_了模拟信h字化以后的动态范_常用的有8位?2位和16位。量化位高Q信L动态范围越大,数字化后的音频信号就可能接q原始信P但所需要的存贮I间也越大?
  3. 声道?/strong>
    声道数是反映音频数字化质量的另一个重要因素,它有单声道和双声道之分。双声道又称为立体声Q在g中有两条U\Q音质和韌都要优于单声道,但数字化后占据的存储I间的大要比单声道多一倍?




二、声卡驱?/span>

Z对安全性方面的考虑QLinux下的应用E序无法直接对声卡这cȝ件设备进行操作,而是必须通过内核提供的驱动程序才能完成。在Linux上进行音频编E的本质是要借助于驱动程序,来完成对声卡的各U操作?/p>

对硬件的控制涉及到寄存器中各个比特位的操作,通常q是与设备直接相兛_ƈ且对时序的要求非怸|如果q些工作都交由应用程序员来负责,那么对声卡的~程变得异常复杂而困难v来,驱动E序的作用正是要屏蔽g的这些底层细节,从而简化应用程序的~写。目前Linux下常用的声卡驱动E序主要有两U:OSS 和ALSA?/p>

最早出现在Linux上的音频~程接口是OSSQOpen Sound SystemQ,它由一套完整的内核驱动E序模块l成Q可以ؓl大多数声卡提供l一的编E接口。OSS出现的历史相对较长,q些内核模块中的一部分QOSS/FreeQ是与Linux内核源码共同免费发布的,另外一些则以二q制的Ş式由4Front Technologies公司提供。由于得C商业公司的鼎力支持,OSS已经成ؓ在Linux下进行音频编E的事实标准Q支持OSS的应用程序能够在l大多数声卡上工作良好?/p>

虽然OSS已经非常成熟Q但它毕竟是一个没有完全开放源代码的商业品,ALSAQAdvanced Linux Sound ArchitectureQ恰好I补了q一I白Q它是在Linux下进行音频编E时另一个可供选择的声卡驱动程序。ALSA除了像OSS那样提供了一l内栔R动程序模块之外,q专门ؓ化应用程序的~写提供了相应的函数库,与OSS提供的基于ioctl的原始编E接口相比,ALSA函数库用v来要更加方便一些。ALSA的主要特ҎQ?/p>

  • 支持多种声卡讑֤
  • 模块化的内核驱动E序
  • 支持SMP和多U程
  • 提供应用开发函数库
  • 兼容OSS应用E序

ALSA 和OSS最大的不同之处在于ALSA是由志愿者维护的自由目Q而OSS则是由公司提供的商业产品Q因此在对硬件的适应E度上OSS要优于ALSAQ它能够支持的声卡种cL多。ALSA虽然不及OSSq用得广泛,但却h更加友好的编E接口,q且完全兼容于OSSQ对应用E序员来讲无疑是一个更佳的选择?/p>



三、编E接?/span>

如何对各U音频设备进行操作是在Linux上进行音频编E的关键Q通过内核提供的一l系l调用,应用E序能够讉K声卡驱动E序提供的各U音频设备接口,q是在Linux下进行音频编E最单也是最直接的方法?/p>

3.1 讉K音频讑֤

无论是OSSq是ALSAQ都是以内核驱动E序的Ş式运行在Linux内核I间中的Q应用程序要惌问声卡这一g讑֤Q必d助于Linux内核所提供的系l调用(system callQ。从E序员的角度来说Q对声卡的操作在很大E度上等同于对磁盘文件的操作Q首先用openpȝ调用建立起与g间的联系Q此时返回的文g描述W将作ؓ随后操作的标识;接着使用readpȝ调用从设备接收数据,或者用writepȝ调用向设备写入数据,而其它所有不W合?写这一基本模式的操作都可以由ioctlpȝ调用来完成;最后,使用closepȝ调用告诉Linux内核不会再对该设备做q一步的处理?/p>

  • openpȝ调用
    pȝ调用open可以获得对声卡的讉K权,同时q能为随后的pȝ调用做好准备Q其函数原型如下所C:
    int open(const char *pathname, int flags, int mode);
                    

    参数pathname是将要被打开的设备文件的名称Q对于声卡来讲一般是/dev/dsp。参数flags用来指明应该以什么方式打开讑֤文gQ它可以?O_RDONLY、O_WRONLY或者O_RDWRQ分别表CZ只读、只写或者读写的方式打开讑֤文gQ参数mode通常是可选的Q它只有在指定的讑֤文g不存在时才会用到Q指明新创徏的文件应该具有怎样的权限?
    如果openpȝ调用能够成功完成Q它返回一个正整数作ؓ文g标识W,在随后的pȝ调用中需要用到该标识W。如果openpȝ调用p|Q它返?1Q同时还会设|全局变量errnoQ指明是什么原因导致了错误的发生?
  • readpȝ调用
    pȝ调用read用来从声卡读取数据,其函数原型如下所C:
    int read(int fd, char *buf, size_t count);
                    

    参数fd是设备文件的标识W,它是通过之前的openpȝ调用获得的;参数buf是指向缓冲区的字W指针,它用来保存从声卡获得的数据;参数count则用来限定从声卡获得的最大字节数。如果readpȝ调用成功完成Q它返回从声卡实际d的字节数Q通常情况会比count的D一些;如果readpȝ调用p|Q它返?1Q同时还会设|全局变量errnoQ来指明是什么原因导致了错误的发生?
  • writepȝ调用
    pȝ调用write用来向声卡写入数据,其函数原型如下所C:
    size_t write(int fd, const char *buf, size_t count);
                    

    pȝ调用write和系l调用read在很大程度是cM的,差别只在于write是向声卡写入数据Q而read则是从声卡读入数据。参数fd同样是设备文件的标识W,它也是通过之前的openpȝ调用获得的;参数buf是指向缓冲区的字W指针,它保存着卛_向声卡写入的数据Q参数count则用来限定向声卡写入的最大字节数?
    如果writepȝ调用成功完成Q它返回向声卡实际写入的字节数Q如果readpȝ调用p|Q它返?1Q同时还会设|全局变量errnoQ来指明是什么原因导致了错误的发生。无论是readq是writeQ一旦调用之后Linux内核׃d当前应用E序Q直到数据成功地从声卡读出或者写入ؓ止?
  • ioctlpȝ调用
    pȝ调用ioctl可以对声卡进行控Ӟ凡是对设备文件的操作不符合读/写基本模式的Q都是通过ioctl来完成的Q它可以影响讑֤的行为,或者返回设备的状态,其函数原型如下所C:
    int ioctl(int fd, int request, ...);
                    

    参数fd是设备文件的标识W,它是在设备打开时获得的Q如果设备比较复杂,那么对它的控制请求相应地也会有很多种Q参数request的目的就是用来区分不同的控制hQ通常说来Q在对设备进行控制时q需要有其它参数Q这要根据不同的控制h才能定Qƈ且可能是与硬件设备直接相关的?
  • closepȝ调用
    当应用程序用完声卡之后Q需要用closepȝ调用其关闭Q以便及旉攑֍用的g资源Q其函数原型如下所C:
    int close(int fd);
                    

    参数fd是设备文件的标识W,它是在设备打开时获得的。一旦应用程序调用了closepȝ调用QLinux内核׃释放与之相关的各U资源,因此在不需要的时候尽量及时关闭已l打开的设备?

3.2 音频讑֤文g

对于Linux应用E序员来Ԍ音频~程接口实际上就是一l音频设备文Ӟ通过它们可以从声卡读取数据,或者向声卡写入数据Qƈ且能够对声卡q行控制Q设|采样频率和声道数目{等?/p>

  • /dev/sndstat
    讑֤文g/dev/sndstat是声卡驱动程序提供的最单的接口Q通常它是一个只LӞ作用也仅仅只限于汇报声卡的当前状态。一般说来,/dev/sndstat是提供给最l用h声卡的Q不宜用于程序当中,因ؓ所有的信息都可以通过ioctlpȝ调用来获得?Linux提供的cat命o可以很方便地?dev/sndstat获得声卡的当前状态: [xiaowp@linuxgam sound]$ cat /dev/sndstat
  • /dev/dsp

    声卡驱动E序提供?dev/dsp是用于数字采PsamplingQ和数字录音QrecordingQ的讑֤文gQ它对于Linux下的音频~程来讲非常重要Q向该设备写数据x味着Ȁzd卡上的D/A转换器进行放韻I而向该设备读数据则意味着Ȁzd卡上的A/D转换器进行录韟뀂目前许多声卡都提供有多个数字采栯备,它们在Linux下可以通过/dev/dsp1{设备文件进行访问?/p>

    DSP是数字信号处理器QDigital Signal ProcessorQ的Uͼ它是用来q行数字信号处理的特D芯片,声卡使用它来实现模拟信号和数字信L转换。声卡中的DSP讑֤实际上包含两个组成部分:在以只读方式打开Ӟ能够使用A/D转换器进行声音的输入Q而在以只写方式打开Ӟ则能够用D/A转换器进行声音的输出。严D来,Linux下的应用E序要么以只L式打开/dev/dsp输入声音Q要么以只写方式打开/dev/dsp输出声音Q但事实上某些声卡驱动程序仍允许以读写的方式打开 /dev/dspQ以便同时进行声音的输入和输出,q对于某些应用场合(如IP电话Q来讲是非常关键的?/p>

    在从 DSP讑֤d数据Ӟ从声卡输入的模拟信号l过A/D转换器变成数字采样后的样本(sampleQ,保存在声卡驱动程序的内核~冲ZQ当应用E序通过 readpȝ调用从声卡读取数据时Q保存在内核~冲Z的数字采L果将被复制到应用E序所指定的用L冲区中。需要指出的是,声卡采样频率是由内核中的驱动E序所军_的,而不取决于应用程序从声卡d数据的速度。如果应用程序读取数据的速度q慢Q以致低于声卡的采样频率Q那么多余的数据会被丢弃;如果d数据的速度q快Q以致高于声卡的采样频率Q那么声卡驱动程序将会阻塞那些请求数据的应用E序Q直到新的数据到来ؓ止?/p>

    在向DSP讑֤写入数据Ӟ数字信号会经qD/A转换器变成模拟信P然后产生出声韟뀂应用程序写入数据的速度同样应该与声卡的采样频率相匹配,否则q慢的话会生声x停或者停的现象Q过快的话又会被内核中的声卡驱动E序dQ直到硬件有能力处理新的数据为止。与其它讑֤有所不同Q声卡通常不会支持非阻塞(non-blockingQ的I/O操作?/p>

    无论是从声卡d数据Q或是向声卡写入数据Q事实上都具有特定的格式QformatQ,默认?位无W号数据、单声道?KHz采样率,如果默认值无法达到要求,可以通过ioctlpȝ调用来改变它们。通常说来Q在应用E序中打开讑֤文g/dev/dsp之后Q接下去应该ؓ其设|恰当的格式Q然后才能从声卡d或者写入数据?/p>

  • /dev/audio
    /dev/audiocM?dev/dspQ它兼容于Sun工作站上的音频设备,使用的是mu-law~码方式。如果声卡驱动程序提供了?dev /audio的支持,那么在Linux上就可以通过cat命oQ来播放在Sun工作站上用mu-lawq行~码的音频文Ӟ
    [xiaowp@linuxgam sound]$ cat audio.au > /dev/audio
                    

    ׃讑֤文g/dev/audio主要Z对兼Ҏ的考虑Q所以在新开发的应用E序中最好不要尝试用它,而应该以/dev/dspq行替代。对于应用程序来_同一时刻只能使用/dev/audio或?dev/dsp其中之一Q因为它们是相同g的不同Y件接口?
  • /dev/mixer
    在声卡的g电\中,混音器(mixerQ是一个很重要的组成部分,它的作用是将多个信号l合或者叠加在一P对于不同的声卡来_其؜韛_的作用可能各不相同。运行在Linux内核中的声卡驱动E序一般都会提?dev/mixerq一讑֤文gQ它是应用程序对混音器进行操作的软g接口。؜韛_电\通常׃个部分组成:输入混音器(input mixerQ和输出混音器(output mixerQ?
    输入混音器负责从多个不同的信h接收模拟信号Q这些信h有时也被UCؓ混音通道或者؜韌备。模拟信号通过增益控制器和pY件控制的音量调节器后Q在不同的؜音通道中进行别(levelQ调Ӟ然后被送到输入混音器中q行声音的合成。؜韛_上的电子开兛_以控制哪些通道中有信号与؜韛_相连Q有些声卡只允许q接一个؜音通道作ؓ录音的音源,而有些声卡则允许Ҏ؜音通道做Q意的q接。经q输入؜韛_处理后的信号仍然为模拟信P它们被送到A/D转换器进行数字化处理?
    输出混音器的工作原理与输入؜韛_cMQ同样也有多个信h与؜韛_相连Qƈ且事先都l过了增益调节。当输出混音器对所有的模拟信号q行了؜合之后,通常q会有一个L增益调节器来控制输出声音的大,此外q有一些音调控制器来调节输出声音的韌。经q输出؜韛_处理后的信号也是模拟信号Q它们最l会被送给喇叭或者其它的模拟输出讑֤。对混音器的~程包括如何讄增益控制器的U别Q以及怎样在不同的x间进行切换,q些操作通常来讲是不q箋的,而且不会像录x者放音那样需要占用大量的计算源。由于؜韛_的操作不W合典型的读/写操作模式,因此除了open和close两个pȝ调用之外Q大部分的操作都是通过ioctlpȝ调用来完成的。与/dev/dsp不同Q?dev/mixer允许多个应用E序同时讉KQƈ且؜韛_的设|g一直保持到对应的设备文件被关闭为止?
    Z化应用程序的设计QLinux上的声卡驱动E序大多都支持将混音器的ioctl操作直接应用到声韌备上Q也是说如果已l打开?dev /dspQ那么就不用再打开/dev/mixer来对混音器进行操作,而是可以直接用打开/dev/dsp时得到的文g标识W来讄混音器?
  • /dev/sequencer
    目前大多数声卡驱动程序还会提?dev/sequencerq一讑֤文gQ用来对声卡内徏的L表合成器q行操作Q或者对MIDIȝ上的乐器q行控制Q一般只用于计算机音乐Y件中?





四、应用框?/span>

在Linux下进行音频编E时Q重点在于如何正地操作声卡驱动E序所提供的各U设备文Ӟ׃涉及到的概念和因素比较多Q所以遵循一个通用的框架无疑将有助于简化应用程序的设计?/p>

4.1 DSP~程

对声卡进行编E时首先要做的是打开与之对应的硬件设备,q是借助于openpȝ调用来完成的Qƈ且一般情况下使用的是/dev/dsp文g。采用何U模式对声卡q行操作也必d打开讑֤时指定,对于不支持全双工的声卡来_应该使用只读或者只写的方式打开Q只有那些支持全双工的声卡,才能以读写的方式打开Qƈ且还要依赖于驱动E序的具体实现。Linux允许应用E序多次打开或者关闭与声卡对应的设备文Ӟ从而能够很方便地在N状态和录音状态之间进行切换,在进行音频编E时只要有可能就量使用只读或者只写的方式打开讑֤文gQ因样不仅能够充分利用声卡的g资源Q而且q有利于驱动E序的优化。下面的代码C了如何以只写方式打开声卡q行NQplaybackQ操作:

int handle = open("/dev/dsp", O_WRONLY);
            if (handle == -1) {
            perror("open /dev/dsp");
            return -1;
            }
            

q行在Linux内核中的声卡驱动E序专门l护了一个缓冲区Q其大小会媄响到N和录x的效果,使用ioctlpȝ调用可以对它的尺寸进行恰当的讄。调节驱动程序中~冲区大的操作不是必须的,如果没有Ҏ的要求,一般采用默认的~冲区大也可以了。但需要注意的是,~冲区大的讄通常应紧跟在讑֤文g打开之后Q这是因为对声卡的其它操作有可能会导致驱动程序无法再修改其缓冲区的大。下面的代码C了怎样讄声卡驱动E序中的内核~冲区的大小Q?/p>
int setting = 0xnnnnssss;
            int result = ioctl(handle, SNDCTL_DSP_SETFRAGMENT, &setting);
            if (result == -1) {
            perror("ioctl buffer size");
            return -1;
            }
            // 查设|值的正确?
            

在设|缓冲区大小Ӟ参数setting实际上由两部分组成,其低16位标明缓冲区的尺寸,相应的计公式ؓbuffer_size = 2^ssssQ即若参数setting?6位的gؓ16Q那么相应的~冲区的大小会被讄?5536字节。参数setting的高16位则用来标明分片QfragmentQ的最大序P它的取D围从2一直到0x7FFFQ其?x7FFF表示没有M限制?/p>

接下来要做的是设|声卡工作时的声道(channelQ数目,Ҏg讑֤和驱动程序的具体情况Q可以将其设|ؓ0Q单声道QmonoQ或?Q立体声QstereoQ。下面的代码C了应该怎样讄声道数目Q?/p>
int channels = 0; // 0=mono 1=stereo
            int result = ioctl(handle, SNDCTL_DSP_STEREO, &channels);
            if ( result == -1 ) {
            perror("ioctl channel number");
            return -1;
            }
            if (channels != 0) {
            // 只支持立体声
            }
            

采样格式和采样频率是在进行音频编E时需要考虑的另一个问题,声卡支持的所有采h式可以在头文件soundcard.h中找刎ͼ而通过ioctlpȝ调用则可以很方便地更改当前所使用的采h式。下面的代码C了如何设|声卡的采样格式Q?/p>
int format = AFMT_U8;
            int result = ioctl(handle, SNDCTL_DSP_SETFMT, &format);
            if ( result == -1 ) {
            perror("ioctl sample format");
            return -1;
            }
            // 查设|值的正确?
            

声卡采样频率的设|也非常ҎQ只需在调?ioctl时将W二个参数的D|ؓSNDCTL_DSP_SPEEDQ同时在W三个参C指定采样频率的数值就行了。对于大多数声卡来说Q其支持的采样频率范围一般ؓ5kHz?4.1kHz或?8kHzQ但q不意味着该范围内的所有频率都会被g支持Q在Linux下进行音频编E时最常用到的几种采样频率?1025Hz?6000Hz?2050Hz?2000Hz?4100Hz。下面的代码C了如何设|声卡的采样频率Q?/p>
int rate = 22050;
            int result = ioctl(handle, SNDCTL_DSP_SPEED, &rate);
            if ( result == -1 ) {
            perror("ioctl sample format");
            return -1;
            }
            // 查设|值的正确?
            

4.2 Mixer~程

声卡上的混音器由多个混音通道l成Q它们可以通过驱动E序提供的设备文?dev/mixerq行~程。对混音器的操作是通过ioctlpȝ调用来完成的Qƈ且所有控制命令都由SOUND_MIXER或者MIXER开_?列出了常用的几个混音器控制命令:

?U?/td> ??/td>
SOUND_MIXER_VOLUME 主音量调?/td>
SOUND_MIXER_BASS 低音控制
SOUND_MIXER_TREBLE 高音控制
SOUND_MIXER_SYNTH FM合成?/td>
SOUND_MIXER_PCM 主D/A转换?/td>
SOUND_MIXER_SPEAKER PC喇叭
SOUND_MIXER_LINE 音频U输?/td>
SOUND_MIXER_MIC 麦克风输?/td>
SOUND_MIXER_CD CD输入
SOUND_MIXER_IMIX 回放音量
SOUND_MIXER_ALTPCM 从D/A 转换?/td>
SOUND_MIXER_RECLEV 录音音量
SOUND_MIXER_IGAIN 输入增益
SOUND_MIXER_OGAIN 输出增益
SOUND_MIXER_LINE1 声卡的第1输入
SOUND_MIXER_LINE2 声卡的第2输入
SOUND_MIXER_LINE3 声卡的第3输入

? 混音器命?

对声卡的输入增益和输出增益进行调节是混音器的一个主要作用,目前大部分声卡采用的?位或?6位的增益控制器,但作为程序员来讲q不需要关心这些,因ؓ声卡驱动E序会负责将它们变换成百分比的Ş式,也就是说无论是输入增益还是输出增益,其取D围都是从0?00。在q行混音器编E时Q可以?SOUND_MIXER_READ宏来d混音通道的增益大,例如在获取麦克风的输入增益时Q可以用如下的代码Q?/p>
int vol;
            ioctl(fd, SOUND_MIXER_READ(SOUND_MIXER_MIC), &vol);
            printf("Mic gain is at %d %%\n", vol);
            

对于只有一个؜音通道的单声道讑֤来说Q返回的增益大小保存在低位字节中。而对于支持多个؜音通道的双声道讑֤来说Q返回的增益大小实际上包括两个部分,分别代表左、右两个声道的|其中低位字节保存左声道的音量Q而高位字节则保存叛_道的音量。下面的代码可以从返回g依次提取左右声道的增益大:

int left, right;
            left = vol & 0xff;
            right = (vol & 0xff00) >> 8;
            printf("Left gain is %d %%, Right gain is %d %%\n", left, right);
            

cM圎ͼ如果惌|؜音通道的增益大,则可以通过SOUND_MIXER_WRITE宏来实现Q此旉循的原则与获取增益值时的原则基本相同,例如下面的语句可以用来设|麦克风的输入增益:

vol = (right << 8) + left;
            ioctl(fd, SOUND_MIXER_WRITE(SOUND_MIXER_MIC), &vol);
            

在编写实用的音频E序Ӟ混音器是在涉及到兼容性时需要重点考虑的一个对象,q是因ؓ不同的声卡所提供的؜韛_资源是有所区别的。声卡驱动程序提供了多个ioctlpȝ调用来获得؜韛_的信息,它们通常q回一个整型的位掩码(bitmaskQ,其中每一位分别代表一个特定的混音通道Q如果相应的位ؓ1Q则说明与之对应的؜音通道是可用的。例如通过 SOUND_MIXER_READ_DEVMASKq回的位掩码Q可以查询出能够被声卡支持的每一个؜音通道Q而通过 SOUND_MIXER_READ_RECMASq回的位掩码Q则可以查询够被当作录音源的每一个通道。下面的代码可以用来查CD输入是否是一个有效的混音通道Q?/p>
  ioctl(fd, SOUND_MIXER_READ_DEVMASK, &devmask);
            if (devmask & SOUND_MIXER_CD)
            printf("The CD input is supported");
            

如果q一步还想知道其是否是一个有效的录音源,则可以用如下语句:

ioctl(fd, SOUND_MIXER_READ_RECMASK, &recmask);
            if (recmask & SOUND_MIXER_CD)
            printf("The CD input can be a recording source");
            

目前大多数声卡提供多个录xQ通过 SOUND_MIXER_READ_RECSRC可以查询出当前正在用的录音源,同一时刻能够使用几个录音源是由声卡硬件决定的。类似地Q?SOUND_MIXER_WRITE_RECSRC可以讄声卡当前使用的录xQ例如下面的代码可以CD输入作ؓ声卡的录x使用Q?/p>
devmask = SOUND_MIXER_CD;
            ioctl(fd, SOUND_MIXER_WRITE_DEVMASK, &devmask);
            

此外Q所有的混音通道都有单声道和双声道的区别Q如果需要知道哪些؜音通道提供了对立体声的支持Q可以通过SOUND_MIXER_READ_STEREODEVS来获得?/p>

4.3 音频录放框架

下面l出一个利用声卡上的DSP讑֤q行声音录制和回攄基本框架Q它的功能是先录制几U种音频数据Q将其存攑֜内存~冲ZQ然后再q行回放Q其所有的功能都是通过d/dev/dsp讑֤文g来完成的Q?/p>
/*
            * sound.c
            */
            #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    /* 存储U数 */
            #define RATE 8000   /* 采样频率 */
            #define SIZE 8      /* 量化位数 */
            #define CHANNELS 1  /* 声道数目 */
            /* 用于保存数字音频数据的内存缓冲区 */
            unsigned char buf[LENGTH*RATE*SIZE*CHANNELS/8];
            int main()
            {
            int fd;	/* 声音讑֤的文件描q符 */
            int arg;	/* 用于ioctl调用的参?*/
            int status;   /* pȝ调用的返回?*/
            /* 打开声音讑֤ */
            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");
            if (arg != SIZE)
            perror("unable to set sample size");
            /* 讄采样时的声道数目 */
            arg = CHANNELS;
            status = ioctl(fd, SOUND_PCM_WRITE_CHANNELS, &arg);
            if (status == -1)
            perror("SOUND_PCM_WRITE_CHANNELS ioctl failed");
            if (arg != CHANNELS)
            perror("unable to set number of channels");
            /* 讄采样时的采样频率 */
            arg = RATE;
            status = ioctl(fd, SOUND_PCM_WRITE_RATE, &arg);
            if (status == -1)
            perror("SOUND_PCM_WRITE_WRITE ioctl failed");
            /* 循环Q直到按下Control-C */
            while (1) {
            printf("Say something:\n");
            status = read(fd, buf, sizeof(buf)); /* 录音 */
            if (status != sizeof(buf))
            perror("read wrong number of bytes");
            printf("You said:\n");
            status = write(fd, buf, sizeof(buf)); /* 回放 */
            if (status != sizeof(buf))
            perror("wrote wrong number of bytes");
            /* 在l录韛_{待回放l束 */
            status = ioctl(fd, SOUND_PCM_SYNC, 0);
            if (status == -1)
            perror("SOUND_PCM_SYNC ioctl failed");
            }
            }
            

4.4 混音器框?/span>

下面再给Z个对混音器进行编E的基本框架Q利用它可以对各U؜音通道的增益进行调节,其所有的功能都是通过d/dev/mixer讑֤文g来完成的Q?/p>
/*
            * mixer.c
            */
            #include <unistd.h>
            #include <stdlib.h>
            #include <stdio.h>
            #include <sys/ioctl.h>
            #include <fcntl.h>
            #include <linux/soundcard.h>
            /* 用来存储所有可用؜韌备的名称 */
            const char *sound_device_names[] = SOUND_DEVICE_NAMES;
            int fd;                  /* 混音讑֤所对应的文件描q符 */
            int devmask, stereodevs; /* 混音器信息对应的位图掩码 */
            char *name;
            /* 昄命o的用方法及所有可用的混音讑֤ */
            void usage()
            {
            int i;
            fprintf(stderr, "usage: %s <device> <left-gain%%> <right-gain%%>\n"
            "       %s <device> <gain%%>\n\n"
            "Where <device> is one of:\n", name, name);
            for (i = 0 ; i < SOUND_MIXER_NRDEVICES ; i++)
            if ((1 << i) & devmask) /* 只显C有效的混音讑֤ */
            fprintf(stderr, "%s ", sound_device_names[i]);
            fprintf(stderr, "\n");
            exit(1);
            }
            int main(int argc, char *argv[])
            {
            int left, right, level;  /* 增益讄 */
            int status;              /* pȝ调用的返回?*/
            int device;              /* 选用的؜韌?*/
            char *dev;               /* 混音讑֤的名U?*/
            int i;
            name = argv[0];
            /* 以只L式打开混音讑֤ */
            fd = open("/dev/mixer", O_RDONLY);
            if (fd == -1) {
            perror("unable to open /dev/mixer");
            exit(1);
            }
            /* 获得所需要的信息 */
            status = ioctl(fd, SOUND_MIXER_READ_DEVMASK, &devmask);
            if (status == -1)
            perror("SOUND_MIXER_READ_DEVMASK ioctl failed");
            status = ioctl(fd, SOUND_MIXER_READ_STEREODEVS, &stereodevs);
            if (status == -1)
            perror("SOUND_MIXER_READ_STEREODEVS ioctl failed");
            /* 查用戯?*/
            if (argc != 3 && argc != 4)
            usage();
            /* 保存用户输入的؜韛_名称 */
            dev = argv[1];
            /* 定卛_用到的؜韌?*/
            for (i = 0 ; i < SOUND_MIXER_NRDEVICES ; i++)
            if (((1 << i) & devmask) && !strcmp(dev, sound_device_names[i]))
            break;
            if (i == SOUND_MIXER_NRDEVICES) { /* 没有扑ֈ匚w?*/
            fprintf(stderr, "%s is not a valid mixer device\n", dev);
            usage();
            }
            /* 查找到有效的混音讑֤ */
            device = i;
            /* 获取增益?*/
            if (argc == 4) {
            /* 左、右声道均给?*/
            left  = atoi(argv[2]);
            right = atoi(argv[3]);
            } else {
            /* 左、右声道设ؓ相等 */
            left  = atoi(argv[2]);
            right = atoi(argv[2]);
            }
            /* 寚w立体声设备给告信?*/
            if ((left != right) && !((1 << i) & stereodevs)) {
            fprintf(stderr, "warning: %s is not a stereo device\n", dev);
            }
            /* 两个声道的值合到同一变量?*/
            level = (right << 8) + left;
            /* 讄增益 */
            status = ioctl(fd, MIXER_WRITE(device), &level);
            if (status == -1) {
            perror("MIXER_WRITE ioctl failed");
            exit(1);
            }
            /* 获得从驱动返回的左右声道的增?*/
            left  = level & 0xff;
            right = (level & 0xff00) >> 8;
            /* 昄实际讄的增?*/
            fprintf(stderr, "%s gain set to %d%% / %d%%\n", dev, left, right);
            /* 关闭混音讑֤ */
            close(fd);
            return 0;
            }
            

~译好上面的E序之后Q先不带M参数执行一遍,此时会列出声卡上所有可用的混音通道Q?/p>
[xiaowp@linuxgam sound]$ ./mixer
            usage: ./mixer <device> <left-gain%> <right-gain%>
            ./mixer <device> <gain%>
            Where <device> is one of:
            vol pcm speaker line mic cd igain line1 phin video
            

之后可以很方便地设|各个؜音通道的增益大了Q例如下面的命op够将CD输入的左、右声道的增益分别设|ؓ80%?0%Q?/p>
[xiaowp@linuxgam sound]$ ./mixer cd 80 90
            cd gain set to 80% / 90%
            





回页?/font>


五、小l?/span>

随着Linuxq_下多媒体应用的逐渐深入Q需要用到数字音频的场合必将来广泛。虽然数字音频牵涉到的概念非常多Q但在Linux下进行最基本的音频编E却q不十分复杂Q关键是掌握如何与OSS或者ALSAq类声卡驱动E序q行交互Q以及如何充分利用它们提供的各种功能Q熟悉一些最基本的音频编E框架和模式对初学者来讲大有裨益?/p>

]]>
关于嵌入式设备用户体验的一些认?/title><link>http://www.shnenglu.com/iuranus/archive/2009/04/22/80718.html</link><dc:creator>攀?/dc:creator><author>攀?/author><pubDate>Wed, 22 Apr 2009 06:01:00 GMT</pubDate><guid>http://www.shnenglu.com/iuranus/archive/2009/04/22/80718.html</guid><wfw:comment>http://www.shnenglu.com/iuranus/comments/80718.html</wfw:comment><comments>http://www.shnenglu.com/iuranus/archive/2009/04/22/80718.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.shnenglu.com/iuranus/comments/commentRss/80718.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/iuranus/services/trackbacks/80718.html</trackback:ping><description><![CDATA[<p>1. Gesture, <br><br> a. 与具体应用配合用QIphone上面看图<br> b. 与共通的独立应用Q比如问号叫帮助QCopy&Paste</p> <p>2. Graphic<br>       a. 整体布局中,用户兛_的数据越清晰好Q大Q多Q,UIWidget昄的越越好,只有必要的,配合Gesture完成?br>       b. 画面的切换,转场动画<br>              b1. 不要q于参考PC上的表现形式Q?Windows关闭点X, Mac OS也是X, Window CE6 关闭点XQ但Iphone是全部Home?br>              b2. W合人感觉的潜意识:当快速drag画面Ӟ画面应该快速闪q,慢慢drag时画面应该慢慢闪q,q移速度静止->匀加速->匀减速->静止<br>       c. 按键的特?br>              c1. 亮,<br>              c2. 囑Ş关系Force feedbackQ??8 Samsung Anycall Haptic<br><br>3. 与硬件结?br>   陀ZA<br>   Gsense<br>   热传?/p> <img src ="http://www.shnenglu.com/iuranus/aggbug/80718.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/iuranus/" target="_blank">攀?/a> 2009-04-22 14:01 <a href="http://www.shnenglu.com/iuranus/archive/2009/04/22/80718.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>iphone SDK & gPhone SDK Androidhttp://www.shnenglu.com/iuranus/archive/2008/09/25/62742.html攀?/dc:creator>攀?/author>Thu, 25 Sep 2008 02:07:00 GMThttp://www.shnenglu.com/iuranus/archive/2008/09/25/62742.htmlhttp://www.shnenglu.com/iuranus/comments/62742.htmlhttp://www.shnenglu.com/iuranus/archive/2008/09/25/62742.html#Feedback3http://www.shnenglu.com/iuranus/comments/commentRss/62742.htmlhttp://www.shnenglu.com/iuranus/services/trackbacks/62742.html 最q几个博友bobQ小舟,Yang JungangQjawfneo都提了一些关于iphone开发的问题。但׃我最q一直都在忙工作的事Q一直都没有回,也没有更新blogQ请见谅。那么我再来说说关于SDK的事吧?nbsp; 阅读全文

]]>
Iphone开?让我开心让我烦http://www.shnenglu.com/iuranus/archive/2008/04/01/45949.html攀?/dc:creator>攀?/author>Tue, 01 Apr 2008 12:55:00 GMThttp://www.shnenglu.com/iuranus/archive/2008/04/01/45949.htmlhttp://www.shnenglu.com/iuranus/comments/45949.htmlhttp://www.shnenglu.com/iuranus/archive/2008/04/01/45949.html#Feedback12http://www.shnenglu.com/iuranus/comments/commentRss/45949.htmlhttp://www.shnenglu.com/iuranus/services/trackbacks/45949.html            代码昨天releasel客Pl于一个阶D늻束了Q将q三个月没写blog了,真的太忙了,除了忙于工作Q生zM外,其实我还在研IIphone的开发?br>            iphone入手已经两三个月了,从中我看Ciphone OS的很多优点,实觉得q个手机不管从外形上q是内部application都是那么的完,所以衍生了惛_iphone os上开发的念头?br>           研习的cocoa的基本开发框Ӟ学习了objective c的基本语法,在Iphone sdk发布的那天莫名的开心和Ȁ动,但是最后还是不能如愿以偿,只有一个破解的sdk toolchain~译q的hello world在Iphone上恶心得q行着?br>           iphone sdk要运行在Zintel L2Q操作系l是Mac OS leopard 10.5.2以上的Mac上,试安装leopard在家的电脑和本子上都因各U原因而失败,那就我有mac了,其实也不行,因ؓsdk写的代码只能在iphone Zg 2.0上运行, 2.0估计会在今年6月发布,所以一切都是那么的不确定,q也不断的打断我l束开发Iphone app的念_但今天看C个往日同H的blog让我又重新燃起了奋斗之火?br>            
            现在我已l是某iphone开发群的群主,某网站也曄让我加入他们要成立的iphone专栏Q认识了很多对Iphone开发狂热的技术h员, 其实我已l有一些结果了Q我真的该把qg事做好!



]]>
Wimax结http://www.shnenglu.com/iuranus/archive/2007/12/18/38936.html攀?/dc:creator>攀?/author>Tue, 18 Dec 2007 12:44:00 GMThttp://www.shnenglu.com/iuranus/archive/2007/12/18/38936.htmlhttp://www.shnenglu.com/iuranus/comments/38936.htmlhttp://www.shnenglu.com/iuranus/archive/2007/12/18/38936.html#Feedback3http://www.shnenglu.com/iuranus/comments/commentRss/38936.htmlhttp://www.shnenglu.com/iuranus/services/trackbacks/38936.html
WiMax介:

WiMAX 的全名是微L存取全球互?Worldwide Interoperability for Microwave Access)Q一U基于IEEE 802.16标准的宽带无U接入城域网技术?

目前所说的IEEE 802.16标准主要包括IEEE 802.16a、IEEE 802.16d和IEEE 802.16e三个标准。其中IEEE 802.16a和IEEE 802.16d是固定无U接入标?也就是定点的用户端。而IEEE 802.16e的目标是在IEEE 802.16d固定无线接入标准的基上加入了新的Ҏ,主要是加入移动性还有如切换、安全等Q该标准?005q?2月正式批准?

WiMAX分三个阶段q行部v。第一阶段是通过室内天线来部|采用IEEE802.16d规范的WiMAX技术,目标用户是固定地点的已知订户。第二阶D会大量部v室内天线Q将WiMAX技术的吸引力拓宽到L化用L  阅读全文

]]>
争做优秀的嵌入式人(一Q?Wireless networking(?http://www.shnenglu.com/iuranus/archive/2007/05/16/24188.html攀?/dc:creator>攀?/author>Wed, 16 May 2007 02:39:00 GMThttp://www.shnenglu.com/iuranus/archive/2007/05/16/24188.htmlhttp://www.shnenglu.com/iuranus/comments/24188.htmlhttp://www.shnenglu.com/iuranus/archive/2007/05/16/24188.html#Feedback1http://www.shnenglu.com/iuranus/comments/commentRss/24188.htmlhttp://www.shnenglu.com/iuranus/services/trackbacks/24188.html阅读全文

]]>
争做优秀的嵌入式人(一Q?Wireless networking(?http://www.shnenglu.com/iuranus/archive/2007/04/27/23069.html攀?/dc:creator>攀?/author>Fri, 27 Apr 2007 14:27:00 GMThttp://www.shnenglu.com/iuranus/archive/2007/04/27/23069.htmlhttp://www.shnenglu.com/iuranus/comments/23069.htmlhttp://www.shnenglu.com/iuranus/archive/2007/04/27/23069.html#Feedback9http://www.shnenglu.com/iuranus/comments/commentRss/23069.htmlhttp://www.shnenglu.com/iuranus/services/trackbacks/23069.html    拿到入职甌书的时候发现自q职位是嵌入式软g工程师,呵呵Q这个时候我脑子里回想了下从到大的学计机的理惟?/span>

    初中C电脑Ӟ惛_的就是打游戏Q希望以后能做游戏开发工E师Q当时还在想有没有这个职位)Q自׃ؕ?/span>3D MAX的书看;上了高中的时候,我惛_|络安全专家Q也可以是黑客,然后qI盗QQL工具Q呵呵;上了大学Q才定了做E序员,做的最多的?/span>JAVAQ?/span>JSPQ现在到了公司开始又做嵌入式的东西,计算机的东西可真多!每一个技术要学深入都要花很长旉Q但很有意思。我也就沉静在计机的乐中?/span>

    在我的脑中Q硬件的东西我是不屑一儡Q因为我觉的那些东西的制作和生没有我的参加Q我只想写YӞ像找了一张纸让我ȝ一P但现在看来是不行了,嵌入式的东西与底层相x比较大Q所以一些基本的g知识和一些设备都得了解。所以我今天xȝ下我q两天用到的无线|络Q这也是我现在项目中用到的,WiFi?/span>

    W记本带回家搜烦了下Q周围竟然有十几?/span>APQ所以现在看来无U技术已l是很常见的了。无U网l也解决了以前布U,插Q接_集线器等施工和成本问题。有无线|络技术能发展Q有些原因要归功于笔记本的畅销Q现在几乎每个无UK集成?/span>802.11b?/span>802.11gQ再加上BlueTooth USBQ每个电脑都能轻而易丄使用无线?/span>

802.11标准

    应用?/span>PC的无U网l由IEEEQ怎么中国没有这Ll织Q制定了标准Q?/span>802.11是是无线局域网的标准,它还有好多子标准Q?/span>

802.11aQ?/span>5GHz频段Q?/span> 54MbpsQ距ȝQ成本高Q非L?/span>

802.11bQ?/span>2.4GHz频段Q?/span>11MbpsQ?/span>500mQ可以接受?/span>

802.11gQ?/span>2.4GHz频段Q?/span>54MbpsQ引q?/span>WPAQ?/span>WEP提高安全性。目前都在用这个?/span>

802.11iQ?/span> 研究阶段Q主要解军_全问题?/span>

802.11nQ?/span>2.4GHz频段Q?/span>100MbpsQ研ID,不过已有产品Q但不够完善?/span>

802.11有多U网l拓扑模式,但最基础的还?/span>infrastructure mode?/span>ad-hoc mode?/span>

    infrastructure modeQ也可以说是一个集中星型无U网l,有一个所谓的无线接入点(Access PointQ?/span>APQ来q接各节点之间的计算机通讯Q其传输速度接近有线|络Q很适合配置在家里,或者办公室?/span>

    Ad-hoc modeQ属于对{型无线|络Q各个设备可以直接连接不通过其他讑֤Q组成点对点|络。像PC之间传输数据Q?/span>PSP之间玩游戏等{?/span>

    现在比较头疼的就是安全问题了Q呵呵,q也是我比较头疼的,我的E序有时?/span>WEP KEY错也能连上)Q无U的传输媒介是电波,只要在电波涵盖范围内的就可以接收到网l信P所有不防有一些h接到你的AP下面做一些非法的事情Q因?/span>WEP加密已经宣布可以被破解了Q所以现在新的标准也在这一斚w下功夫呢Q?/span>



]]>
扑ֈqt的相兌?/title><link>http://www.shnenglu.com/iuranus/archive/2006/11/13/17079.html</link><dc:creator>攀?/dc:creator><author>攀?/author><pubDate>Mon, 13 Nov 2006 02:27:00 GMT</pubDate><guid>http://www.shnenglu.com/iuranus/archive/2006/11/13/17079.html</guid><wfw:comment>http://www.shnenglu.com/iuranus/comments/17079.html</wfw:comment><comments>http://www.shnenglu.com/iuranus/archive/2006/11/13/17079.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/iuranus/comments/commentRss/17079.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/iuranus/services/trackbacks/17079.html</trackback:ping><description><![CDATA[<table width="100%"> <tbody> <tr> <td> <p>qt是Trolltech提供的一个用于跨q_囑Ş用户界面应用E序开发的C++工具包。Qt提供了可以跨Microsoft Windows、Mac OS X、Linux、所有Unix的主要商业变U以及嵌入式Linux多^台移植的单一源程序。在嵌入式Linux上,Qt应用E序~程接口是通过Qtopia Core实现的?/p> <p>Qt为应用程序开发者提供了构徏目前使用最新水q的囑Ş用户界面的应用程序所需要的全部功能。Qt是完全面向对象的、容易扩展的、ƈ且允许真正的lg~程。请阅读白皮书来得到一个全面的技术概q?/p> <p>自从1996q早期Qtq入商业领域Q它已经成ؓ了世界范围中数千个成功应用程序的基础。Qtq是大众化的KDE Linux桌面环境的基QKDE现在是所有主Linux发行版的一个标准组件。请参考我们的客户成功故事来得C些Qt的商业开发的实例?/p> <p>Qt被下面这些^台支持: <br>Microsoft Windows -- 98、NT 4.0、ME?000和XP <br>Unix/X11 -- Linux、Sun Solaris、HP-UX、HP Tru64 UNIX、IBM AIX、SGI IRIX和很多其它Unix变种 <br>Mac OS X -- Mac OS X 10.2+ <br>嵌入式Linux -- 支持帧缓ԌframebufferQ的Linuxq_</p> <p>请参考Trolltech的网站获得支持的q_和编译器的完整列表?/p> <p>Qt被按不同的版本发布: <br>Qt商业版被用于商业软g开发。它们提供传l商业Y件发行版q且提供免费升和技术支持服务。如果要获得最新报Ph览在U的h信息面或者与sales@trolltech.com联系?<br>Qt开源版仅被用于开发自由和开源Y件。基于Q公共许可协议和GNU通用公共许可协议的条ƾ下Q它是被免费提供的?/p> <p>Trolltechq提供了Qt解决ҎQ它是一套正在增多的用于完善Qt的适用于工业领域和q_特定范围的组件。它们中的一些组件仅提供l商业客P其它的对于所有Qt用户都是可用的?<br>国内相关|站不多Q在q里我推荐一个QT的网站:http://www.qtcn.org/bbs/ <br>相关资源下蝲Qftp://ftp.trolltech.com/qt/source</p> </td> </tr> </tbody> </table> <br><br><a href="http://www.shnenglu.com/iuranus/admin/%20%20%20%0A%20%20%20%20http://uranus.javaeye.com/blog/33976%0A%20%20%20%20"></a> <img src ="http://www.shnenglu.com/iuranus/aggbug/17079.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/iuranus/" target="_blank">攀?/a> 2006-11-13 10:27 <a href="http://www.shnenglu.com/iuranus/archive/2006/11/13/17079.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.shnenglu.com/" title="精品视频久久久久">精品视频久久久久</a> <div class="friend-links"> </div> </div> </footer> <a href="http://www.gmve.cn" target="_blank">ƷþþþӰԺɫ</a>| <a href="http://www.ekqt.cn" target="_blank">Ļձ޾þþ </a>| <a href="http://www.yingyu3g.cn" target="_blank">Ʒ18þþ⺾</a>| <a href="http://www.h21jc.cn" target="_blank">þþWWW</a>| <a href="http://www.lxgit.cn" target="_blank">þþžžþƷֱ</a>| <a href="http://www.zhouyimen.cn" target="_blank">þþþ99ƷƬţţӰ</a>| <a href="http://www.rezhei.cn" target="_blank">Ʒһþ</a>| <a href="http://www.uj60.cn" target="_blank">ٸ߳ҽоþþ</a>| <a href="http://www.gaohuirong.cn" target="_blank">ƷŮþþþ</a>| <a href="http://www.taoxh.cn" target="_blank">þ91˳ɵӰվ</a>| <a href="http://www.bwab.cn" target="_blank">ɫۺϺϾþۺӿ</a>| <a href="http://www.net901.cn" target="_blank">þþþۺþ</a>| <a href="http://www.jj123.com.cn" target="_blank">AëƬþþþƷëƬ</a>| <a href="http://www.zhibonet.cn" target="_blank">ƷþþþþҰ </a>| <a href="http://www.east110.com.cn" target="_blank">޾ƷƷþ99һ</a>| <a href="http://www.brill-sh.com.cn" target="_blank">ݺۺϾþۺ88</a>| <a href="http://www.96papa.cn" target="_blank">97þۺɫۺɫhd</a>| <a href="http://www.gmyz.net.cn" target="_blank">ձƷþ</a>| <a href="http://www.pareng.cn" target="_blank">þһ</a>| <a href="http://www.chaikuo.cn" target="_blank">޹˾ƷŮ˾þþ </a>| <a href="http://www.gpci.cn" target="_blank">޾Ʒһþþ </a>| <a href="http://www.clg8.cn" target="_blank">һþۺ³³ŷһ </a>| <a href="http://www.ezchem.cn" target="_blank">þþþAVƬ</a>| <a href="http://www.zixunlawyer.com.cn" target="_blank">þþƷƷëƬ </a>| <a href="http://www.108bto.cn" target="_blank">ŷ˾þۺ</a>| <a href="http://www.geishi.cn" target="_blank">޹˾Ʒ91þþ</a>| <a href="http://www.sxzt888.cn" target="_blank">޹þþþƷ </a>| <a href="http://www.hebhxjx.cn" target="_blank">һþۺ³³</a>| <a href="http://www.7111393.cn" target="_blank">AVþþƷ</a>| <a href="http://www.77ns.cn" target="_blank">aaþ</a>| <a href="http://www.qdog.com.cn" target="_blank">þù׽</a>| <a href="http://www.sspfn.cn" target="_blank">þþƷѿ</a>| <a href="http://www.94555.com.cn" target="_blank">þ¾ƷĻ</a>| <a href="http://www.adlai.cn" target="_blank">þù޸ۿ</a>| <a href="http://www.hwah.cn" target="_blank">ۿƷþ</a>| <a href="http://www.cqhxdj.com.cn" target="_blank">þþƷ99Ʒ </a>| <a href="http://www.05958.cn" target="_blank">þþƷ鶹</a>| <a href="http://www.animin.cn" target="_blank">þֻ⾫Ʒ99</a>| <a href="http://www.ogpx95.cn" target="_blank">þñۺϾþ</a>| <a href="http://www.qysf88.cn" target="_blank">þó97˰</a>| <a href="http://www.nxxdz.cn" target="_blank">ŷþþþþҹƷ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>