??xml version="1.0" encoding="utf-8" standalone="yes"?>
最q刚好也在做androidUL工作Q顺便把G1的spec贴出来,有兴的看看
Product Features & Specifications Technical Specifications
Media Support
Bill of Materials
]]>
作者: 肖文?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要用到的技术指标:
![]() ![]() |
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>
ALSA 和OSS最大的不同之处在于ALSA是由志愿者维护的自由目Q而OSS则是由公司提供的商业产品Q因此在对硬件的适应E度上OSS要优于ALSAQ它能够支持的声卡种cL多。ALSA虽然不及OSSq用得广泛,但却h更加友好的编E接口,q且完全兼容于OSSQ对应用E序员来讲无疑是一个更佳的选择?/p>
![]() ![]() |
如何对各U音频设备进行操作是在Linux上进行音频编E的关键Q通过内核提供的一l系l调用,应用E序能够讉K声卡驱动E序提供的各U音频设备接口,q是在Linux下进行音频编E最单也是最直接的方法?/p>
无论是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>
int open(const char *pathname, int flags, int mode); |
int read(int fd, char *buf, size_t count); |
size_t write(int fd, const char *buf, size_t count); |
int ioctl(int fd, int request, ...); |
int close(int fd); |
对于Linux应用E序员来Ԍ音频~程接口实际上就是一l音频设备文Ӟ通过它们可以从声卡读取数据,或者向声卡写入数据Qƈ且能够对声卡q行控制Q设|采样频率和声道数目{等?/p>
声卡驱动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>
[xiaowp@linuxgam sound]$ cat audio.au > /dev/audio |
![]() ![]() |
![]() |
在Linux下进行音频编E时Q重点在于如何正地操作声卡驱动E序所提供的各U设备文Ӟ׃涉及到的概念和因素比较多Q所以遵循一个通用的框架无疑将有助于简化应用程序的设计?/p>
对声卡进行编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; } // 查设|值的正确? |
声卡上的混音器由多个混音通道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>
下面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"); } } |
下面再给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% |
![]() ![]() |
![]()
|
随着Linuxq_下多媒体应用的逐渐深入Q需要用到数字音频的场合必将来广泛。虽然数字音频牵涉到的概念非常多Q但在Linux下进行最基本的音频编E却q不十分复杂Q关键是掌握如何与OSS或者ALSAq类声卡驱动E序q行交互Q以及如何充分利用它们提供的各种功能Q熟悉一些最基本的音频编E框架和模式对初学者来讲大有裨益?/p>
2. Graphic
a. 整体布局中,用户兛_的数据越清晰好Q大Q多Q,UIWidget昄的越越好,只有必要的,配合Gesture完成?br> b. 画面的切换,转场动画
b1. 不要q于参考PC上的表现形式Q?Windows关闭点X, Mac OS也是X, Window CE6 关闭点XQ但Iphone是全部Home?br> b2. W合人感觉的潜意识:当快速drag画面Ӟ画面应该快速闪q,慢慢drag时画面应该慢慢闪q,q移速度静止->匀加速->匀减速->静止
c. 按键的特?br> c1. 亮,
c2. 囑Ş关系Force feedbackQ??8 Samsung Anycall Haptic
3. 与硬件结?br> 陀ZA
Gsense
热传?/p>
初中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.11标准
应用?/span>PC的无U网l由IEEEQ怎么中国没有这Ll织Q制定了标准Q?/span>802.11是是无线局域网的标准,它还有好多子标准Q?/span>
802.11bQ?/span>2.4GHz频段Q?/span>11MbpsQ?/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是Trolltech提供的一个用于跨q_囑Ş用户界面应用E序开发的C++工具包。Qt提供了可以跨Microsoft Windows、Mac OS X、Linux、所有Unix的主要商业变U以及嵌入式Linux多^台移植的单一源程序。在嵌入式Linux上,Qt应用E序~程接口是通过Qtopia Core实现的?/p>
Qt为应用程序开发者提供了构徏目前使用最新水q的囑Ş用户界面的应用程序所需要的全部功能。Qt是完全面向对象的、容易扩展的、ƈ且允许真正的lg~程。请阅读白皮书来得到一个全面的技术概q?/p>
自从1996q早期Qtq入商业领域Q它已经成ؓ了世界范围中数千个成功应用程序的基础。Qtq是大众化的KDE Linux桌面环境的基QKDE现在是所有主Linux发行版的一个标准组件。请参考我们的客户成功故事来得C些Qt的商业开发的实例?/p>
Qt被下面这些^台支持:
Microsoft Windows -- 98、NT 4.0、ME?000和XP
Unix/X11 -- Linux、Sun Solaris、HP-UX、HP Tru64 UNIX、IBM AIX、SGI IRIX和很多其它Unix变种
Mac OS X -- Mac OS X 10.2+
嵌入式Linux -- 支持帧缓ԌframebufferQ的Linuxq_
请参考Trolltech的网站获得支持的q_和编译器的完整列表?/p>
Qt被按不同的版本发布:
Qt商业版被用于商业软g开发。它们提供传l商业Y件发行版q且提供免费升和技术支持服务。如果要获得最新报Ph览在U的h信息面或者与sales@trolltech.com联系?
Qt开源版仅被用于开发自由和开源Y件。基于Q公共许可协议和GNU通用公共许可协议的条ƾ下Q它是被免费提供的?/p>
Trolltechq提供了Qt解决ҎQ它是一套正在增多的用于完善Qt的适用于工业领域和q_特定范围的组件。它们中的一些组件仅提供l商业客P其它的对于所有Qt用户都是可用的?
国内相关|站不多Q在q里我推荐一个QT的网站:http://www.qtcn.org/bbs/
相关资源下蝲Qftp://ftp.trolltech.com/qt/source