2005年11月04日

.一些有用的文档
PIXIL/src/microwin/src/INSTLL PIXIL/src/microwin/docs PIXIL/src/microwin/src/config http://www.fltk.org http://www.microwindow.org

2.nano-X app/server 机制
可以参加omap/ddpv2/pixil_oe-1.00/src/nxapps/nxtest.sh,和在X11环境中不同,在microwindow环境中 server为nano-x和nanowm,在运行任何其他程序以前,要确保这两个程序已经起动. 要修改omap/ddpv2/pixil_oe-1.00/src/nxapps/TOP程序所在的路径

3.交叉编译hello.cxx所用的脚本
#!/bin/bash
arm-linux-g++ -o helloarm hello.cxx -O2 -Wall \
-DNANXFOLDER=’”/root/omap/ddpv2/pixil_oe-1.00/src/microwin/src”‘ \
-I$PIXIL/src/microwin/src/include -I$PIXIL/include \
-L$PIXIL/src/microwin/src/lib $PIXIL/src/flnx-pda/lib/libfltk.a -lnano-X

4.mmc上的动态库
cp libnano-X.so /mmc/wd ln -s /mmc/wd/libnano-X.so /lib/libnano-X.so

5.一些工具的使用
arm-linux-readelf 可以使用-d选项来查看二进制可执行文件所链接的动态库
arm-linux-strip 可以去掉可执行文件中的符号,使文件变小
arm-linux-nm可以查看可执行文件的符号(使用arm-linux-strip之前)

2005年03月09日

tcpdump采用命令行方式,它的命令格式为:
  tcpdump [ -adeflnNOpqStvx ] [ -c 数量 ] [ -F 文件名 ]
          [ -i 网络接口 ] [ -r 文件名] [ -s snaplen ]
          [ -T 类型 ] [ -w 文件名 ] [表达式 ]

  1. tcpdump的选项介绍
   -a    将网络地址和广播地址转变成名字;
   -d    将匹配信息包的代码以人们能够理解的汇编格式给出;
   -dd    将匹配信息包的代码以c语言程序段的格式给出;
   -ddd    将匹配信息包的代码以十进制的形式给出;
   -e    在输出行打印出数据链路层的头部信息;
   -f    将外部的Internet地址以数字的形式打印出来;
   -l    使标准输出变为缓冲行形式;
   -n    不把网络地址转换成名字;
   -t    在输出的每一行不打印时间戳;
   -v    输出一个稍微详细的信息,例如在ip包中可以包括ttl和服务类型的信息;
   -vv    输出详细的报文信息;
   -c    在收到指定的包的数目后,tcpdump就会停止;
   -F    从指定的文件中读取表达式,忽略其它的表达式;
   -i    指定监听的网络接口;
   -r    从指定的文件中读取包(这些包一般通过-w选项产生);
   -w    直接将包写入文件中,并不分析和打印出来;
   -T    将监听到的包直接解释为指定的类型的报文,常见的类型有rpc (远程过程
调用)和snmp(简单       网络管理协议;)

  2. tcpdump的表达式介绍
   表达式是一个正则表达式,tcpdump利用它作为过滤报文的条件,如果一个报文满足表
达式的条件,则这个报文将会被捕获。如果没有给出任何条件,则网络上所有的信息包将会
被截获。
   在表达式中一般如下几种类型的关键字,一种是关于类型的关键字,主要包括host,
net,port, 例如 host 210.27.48.2,指明 210.27.48.2是一台主机,net 202.0.0.0 指明
202.0.0.0是一个网络地址,port 23 指明端口号是23。如果没有指定类型,缺省的类型是
host.
   第二种是确定传输方向的关键字,主要包括src , dst ,dst or src, dst and src ,
这些关键字指明了传输的方向。举例说明,src 210.27.48.2 ,指明ip包中源地址是210.27.
48.2 , dst net 202.0.0.0 指明目的网络地址是202.0.0.0 。如果没有指明方向关键字,则
缺省是src or dst关键字。
   第三种是协议的关键字,主要包括fddi,ip ,arp,rarp,tcp,udp等类型。Fddi指明是在
FDDI(分布式光纤数据接口网络)上的特定的网络协议,实际上它是”ether”的别名,fddi和e
ther具有类似的源地址和目的地址,所以可以将fddi协议包当作ether的包进行处理和分析。
其他的几个关键字就是指明了监听的包的协议内容。如果没有指定任何协议,则tcpdump将会
监听所有协议的信息包。
   除了这三种类型的关键字之外,其他重要的关键字如下:gateway, broadcast,less,
greater,还有三种逻辑运算,取非运算是 ‘not ‘ ‘! ‘, 与运算是’and’,'&&’;或运算 是’o
r’ ,’||’;
   这些关键字可以组合起来构成强大的组合条件来满足人们的需要,下面举几个例子来
说明。
   (1)想要截获所有210.27.48.1 的主机收到的和发出的所有的数据包:
    #tcpdump host 210.27.48.1
   (2) 想要截获主机210.27.48.1 和主机210.27.48.2 或210.27.48.3的通信,使用命令
:(在命令行中适用   括号时,一定要
    #tcpdump host 210.27.48.1 and \ (210.27.48.2 or 210.27.48.3 \)
   (3) 如果想要获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包
,使用命令:
    #tcpdump ip host 210.27.48.1 and ! 210.27.48.2
   (4)如果想要获取主机210.27.48.1接收或发出的telnet包,使用如下命令:
    #tcpdump tcp port 23 host 210.27.48.1

  3. tcpdump 的输出结果介绍
   下面我们介绍几种典型的tcpdump命令的输出信息
   (1) 数据链路层头信息
   使用命令#tcpdump –e host ice
   ice 是一台装有linux的主机,她的MAC地址是0:90:27:58:AF:1A
   H219是一台装有SOLARIC的SUN工作站,它的MAC地址是8:0:20:79:5B:46;上一条
命令的输出结果如下所示:
21:50:12.847509 eth0 < 8:0:20:79:5b:46 0:90:27:58:af:1a ip 60: h219.33357 > ice.
telne
t 0:0(0) ack 22535 win 8760 (DF)
  分析:21:50:12是显示的时间, 847509是ID号,eth0 <表示从网络接口eth0 接受该
数据包,eth0 >表示从网络接口设备发送数据包, 8:0:20:79:5b:46是主机H219的MAC地址,它
表明是从源地址H219发来的数据包. 0:90:27:58:af:1a是主机ICE的MAC地址,表示该数据包的
目的地址是ICE . ip 是表明该数据包是IP数据包,60 是数据包的长度, h219.33357 > ice.
telnet 表明该数据包是从主机H219的33357端口发往主机ICE的TELNET(23)端口. ack 22535
表明对序列号是222535的包进行响应. win 8760表明发送窗口的大小是8760.

  (2) ARP包的TCPDUMP输出信息
   使用命令#tcpdump arp
   得到的输出结果是:
  22:32:42.802509 eth0 > arp who-has route tell ice (0:90:27:58:af:1a)
  22:32:42.802902 eth0 < arp reply route is-at 0:90:27:12:10:66 (0:90:27:58:af
:1a)
  分析: 22:32:42是时间戳, 802509是ID号, eth0 >表明从主机发出该数据包, arp表明是
ARP请求包, who-has route tell ice表明是主机ICE请求主机ROUTE的MAC地址。 0:90:27:5
8:af:1a是主机ICE的MAC地址。

  (3) TCP包的输出信息
   用TCPDUMP捕获的TCP包的一般输出信息是:
  src > dst: flags data-seqno ack window urgent options
  src > dst:表明从源地址到目的地址, flags是TCP包中的标志信息,S 是SYN标志, F (F
IN), P (PUSH) , R (RST) “.” (没有标记); data-seqno是数据包中的数据的顺序号, ack是
下次期望的顺序号, window是接收缓存的窗口大小, urgent表明数据包中是否有紧急指针.
Options是选项.

  (4) UDP包的输出信息
   用TCPDUMP捕获的UDP包的一般输出信息是:
  route.port1 > ice.port2: udp lenth
  UDP十分简单,上面的输出行表明从主机ROUTE的port1端口发出的一个UDP数据包到主机
ICE的port2端口,类型是UDP, 包的长度是lenth

2005年02月28日

#define EPFNOSUPPORT 96 /* Protocol family not supported */
#define ECONNRESET 104 /* Connection reset by peer */
#define ENOBUFS 105 /* No buffer space available */
-#define EAFNOSUPPORT 106
-#define EPROTOTYPE 107
-#define ENOTSOCK 108
-#define ENOPROTOOPT 109
-#define ESHUTDOWN 110
+#define EAFNOSUPPORT 106 /* Address family not supported by protocol family */
+#define EPROTOTYPE 107 /* Protocol wrong type for socket */
+#define ENOTSOCK 108 /* Socket operation on non-socket */
+#define ENOPROTOOPT 109 /* Protocol not available */
+#define ESHUTDOWN 110 /* Can’t send after socket shutdown */
#define ECONNREFUSED 111 /* Connection refused */
#define EADDRINUSE 112 /* Address already in use */
#define ECONNABORTED 113 /* Connection aborted */
-#define ENETUNREACH 114
-#define ENETDOWN 115
-#define ETIMEDOUT 116
-#define EHOSTDOWN 117
-#define EHOSTUNREACH 118
-#define EINPROGRESS 119
-#define EALREADY 120
-#define EDESTADDRREQ 121
-#define EMSGSIZE 122
-#define EPROTONOSUPPORT 123
-#define ESOCKTNOSUPPORT 124
-#define EADDRNOTAVAIL 125
+#define ENETUNREACH 114 /* Network is unreachable */
+#define ENETDOWN 115 /* Network interface is not configured */
+#define ETIMEDOUT 116 /* Connection timed out */
+#define EHOSTDOWN 117 /* Host is down */
+#define EHOSTUNREACH 118 /* Host is unreachable */
+#define EINPROGRESS 119 /* Connection already in progress */
+#define EALREADY 120 /* Socket already connected */
+#define EDESTADDRREQ 121 /* Destination address required */
+#define EMSGSIZE 122 /* Message too long */
+#define EPROTONOSUPPORT 123 /* Unknown protocol */
+#define ESOCKTNOSUPPORT 124 /* Socket type not supported */
+#define EADDRNOTAVAIL 125 /* Address not available */
#define ENETRESET 126
-#define EISCONN 127
-#define ENOTCONN 128
+#define EISCONN 127 /* Socket is already connected */
+#define ENOTCONN 128 /* Socket is not connected */
#define ETOOMANYREFS 129
#define EPROCLIM 130
#define EUSERS 131
#define EDQUOT 132
#define ESTALE 133
-#define ENOTSUP 134
+#define ENOTSUP 134 /* Not supported */
#define ENOMEDIUM 135 /* No medium (in tape drive) */
#define ENOSHARE 136 /* No such host or network path */

2005年02月26日

source:forever.h forever.cpp(from qt/examples)
the Makefile:

CC= g++
INCL= -I$(QTDIR)/include
CFLAGS= -Wall -O
LFLAGS= -L$(QTDIR)/lib -L/usr/X11R6/lib
LIBS= -lqt -lX11

all: forever

forever: forever.o forever.moc.o
$(CC) $(LFLAGS) -o $@ $^ $(LIBS)

forever.o: forever.cpp forever.h

forever.moc.cpp: forever.h
$(QTDIR)/bin/moc forever.h -o $@

clean:
rm -f forever
rm -f *.o
rm -f .moc.cpp

.SUFFIXES: .cpp

.cpp.o:
$(CC) $(CFLAGS) $(INCL) -c $< -o $@

Let’s take a look at the contents of the user-provided input files that are relevant to this minimal project. Here is the `Makefile.am’:

bin_PROGRAMS = foonly
foonly_SOURCES = main.c foo.c foo.h nly.c scanner.l parser.y
foonly_LDADD = @LEXLIB@

This `Makefile.am’ specifies that we want a program called `foonly’ to be built and installed in the `bin’ directory when make install is run. The source files that are used to build `foonly’ are the C source files `main.c’, `foo.c’, `nly.c’ and `foo.h’, the lex program in `scanner.l’ and a yacc grammar in `parser.y’. This points out a particularly nice aspect about Automake: because lex and yacc both generate intermediate C programs from their input files, Automake knows how to build such intermediate files and link them into the final executable. Finally, we must remember to link a suitable lex library, if `configure’ concludes that one is needed.

And here is the `configure.in’:

dnl Process this file with autoconf to produce a configure script.
AC_INIT(main.c)
AM_INIT_AUTOMAKE(foonly, 1.0)
AC_PROG_CC
AM_PROG_LEX
AC_PROG_YACC
AC_OUTPUT(Makefile)

This `configure.in’ invokes some mandatory Autoconf and Automake initialization macros, and then calls on some Autoconf macros from the AC_PROG family to find suitable C compiler, lex, and yacc programs. Finally, the AC_OUTPUT macro is used to cause the generated `configure’ script to output a `Makefile’—but from what? It is processed from `Makefile.in’, which Automake produces for you based on your `Makefile.am’ (see section C. Generated File Dependencies).

2005年02月23日

者:hoyt

这一章我们学习Linux的时间表示和计算函数

1.时间的表示
2.时间的测量
3.计时器的使用
——————————————————————————–

1。时间表示 在程序当中,我们经常要输出系统当前的时间,比如我们使用date命令的输出结果.这个时候我们可以使用下面两个函数

#include

time_t time(time_t *tloc);
char *ctime(const time_t *clock);

time函数返回从1970年1月1日0点以来的秒数.存储在time_t结构之中.不过这个函数的返回值对于我们来说没有什么实际意义.这个时候我们使用第二个函数将秒数转化为字符串. 这个函数的返回类型是固定的:一个可能值为. Thu Dec 7 14:58:59 2000 这个字符串的长度是固定的为26.

2。时间的测量 有时候我们要计算程序执行的时间.比如我们要对算法进行时间分析.这个时候可以使用下面这个函数.

#include

int gettimeofday(struct timeval *tv,struct timezone *tz);

strut timeval {
long tv_sec; /* 秒数 */
long tv_usec; /* 微秒数 */
};

gettimeofday将时间保存在结构tv之中.tz一般我们使用NULL来代替.

#include #include #include
void function()
{
unsigned int i,j;
double y;
for(i=0;i<1000;i++)
for(j=0;j<1000;j++)
y=sin((double)i);
}

main()
{
struct timeval tpstart,tpend;
float timeuse;

gettimeofday(&tpstart,NULL);
function();
gettimeofday(&tpend,NULL);
timeuse=1000000*(tpend.tv_sec-tpstart.tv_sec)+
tpend.tv_usec-tpstart.tv_usec;
timeuse/=1000000;
printf(“Used Time:%f\n”,timeuse);
exit(0);
}

这个程序输出函数的执行时间,我们可以使用这个来进行系统性能的测试,或者是函数算法的效率分析.在我机器上的一个输出结果是: Used Time:0.556070

3。计时器的使用 Linux操作系统为每一个进程提供了3个内部间隔计时器.
ITIMER_REAL:减少实际时间.到时的时候发出SIGALRM信号.
ITIMER_VIRTUAL:减少有效时间(进程执行的时间).产生SIGVTALRM信号.
ITIMER_PROF:减少进程的有效时间和系统时间(为进程调度用的时间).这个经常和上面一个使用用来计算系统内核时间和用户时间.产生SIGPROF信号.
具体的操作函数是:

#include
int getitimer(int which,struct itimerval *value);
int setitimer(int which,struct itimerval *newval,
struct itimerval *oldval);

struct itimerval {
struct timeval it_interval;
struct timeval it_value;
}

getitimer函数得到间隔计时器的时间值.保存在value中 setitimer函数设置间隔计时器的时间值为newval.并将旧值保存在oldval中. which表示使用三个计时器中的哪一个. itimerval结构中的it_value是减少的时间,当这个值为0的时候就发出相应的信号了. 然后设置为it_interval值.

#include
#include
#include
#include
#include

#define PROMPT “时间已经过去了两秒钟\n\a”

char *prompt=PROMPT;
unsigned int len;

void prompt_info(int signo)
{
write(STDERR_FILENO,prompt,len);
}

void init_sigaction(void)
{
struct sigaction act;
act.sa_handler=prompt_info;
act.sa_flags=0;
sigemptyset(&act.sa_mask);
sigaction(SIGPROF,&act,NULL);
}

void init_time()
{
struct itimerval value;
value.it_value.tv_sec=2;
value.it_value.tv_usec=0;
value.it_interval=value.it_value;
setitimer(ITIMER_PROF,&value,NULL);
}

int main()
{
len=strlen(prompt);
init_sigaction();
init_time();
while(1);
exit(0);
}

这个程序每执行两秒中之后会输出一个提示.

来自: http://www.linuxfans.org/nuke/modul…ewtopic&t=25521

2005年02月02日

1、常吃宵夜.会得胃癌. 因为胃得不到休息
2、一个星期只能吃四颗蛋.吃太多.对身体不好
3、.鸡屁股含有致癌物, 不要吃较好
4、饭后吃水果是错误的观念. 应是饭前吃水果
5、女生月经来时.不要喝绿茶. 反正茶类不要喝就对了.多吃可以补血的东西
6、喝豆浆时不要加鸡蛋及糖. 也不要喝太多
7、空腹时不要吃蕃茄, 最好饭后吃
8、早上醒来.先喝一杯水. 预防结石
9、睡前三小时不要吃东西. 会胖
10、少喝奶茶. 因为高热量.高油.没有营养价值可言.长期饮用.易罹患高血压.糖尿病.等
疾病
11、刚出炉的面包 不宜马上食用
12、远离充电座. 人体应远离30公分以上.切忌放在床边
13、天天喝水 八大杯
14、每天十杯水. 膀胱癌不会来
15、白天多喝水. 晚上少喝水
16、一天不要喝两杯以上的咖啡. 喝太多易导致失眠,胃痛
17、多油脂的食物少吃.因 为得花5~7小时去消化,并使脑中血液集中到肠胃.易昏
昏欲睡
18、下午五点后.大餐少少吃, 因为五点后身体不需那么多能量
19、10种吃了会快乐的食物: 深海鱼,香蕉,葡萄柚,全麦面包,菠菜,大蒜,南瓜,低
脂牛奶,鸡肉,樱桃
20、睡眠不足会变笨, 一天须八小时睡眠,有午睡习惯较不会老
21、最佳睡眠时间是在 晚上10点~清晨6点
22、每天喝酒不要超过一杯, 因为酒精会抑制制造抗体的B细胞,增加细菌感染的机会
23、服用胶囊应以冷水吞服(可以第一个吃), 睡前30分先服药.忌立即躺下
24、酸梅具防止老化作用, 青春永驻;肝火有毛病者宜多食用
25、掉发因素: 熬夜,压力,烟酒,香鸡排.麻辣锅.油腻食物.调味过重的料理
26、帮助头发生长:多 食用包心菜,蛋.豆类;少吃甜食(尤其是果糖)
27、每天一杯柠檬汁,柳橙汁. 不但可以美白还可以淡化黑斑
28、苹果是机车族、瘾君子、家庭主妇的常备良药, 一天一颗,才能让自己有个
干干净净的肺
29、抽烟又吃维他命(B胡萝卜素-A维他命的一种), 会致癌,尽早戒烟.才是最健康
的做法
30、女性不宜喝茶的五个时期: 月经来时,孕妇,临产前.生产完后,更年期
31、抽烟,关系最大的是 肺癌,唇癌,舌癌,喉癌,食道癌,也与膀胱癌有关
32、饮酒导致肝硬化 .引发肝癌
33、吃槟榔会导致口腔纤维化, 口腔癌
34、食物过于精细,缺乏纤维; 含大量脂肪,尤其是胆固醇会引发胃癌
35、食物过于粗糙, 营养不足时导致食道癌,胃癌
36、食品中的黄曲毒素. 亚硝酸类物皆具有致癌性
37、不抽烟. 拒吸二手烟
38、适量饮酒, 不拚久.不醉酒
39、减少食用 盐腌.烟熏,烧烤的食物
40、每天摄取新鲜的 蔬菜与水果
41、每天摄取富含高纤维的 五谷类及豆类
42、每天摄取均衡的饮食, 不过量
43、维持理想体重. 不过胖
44、保持规律的 生活与运动
45、保持 轻松愉快的心情
46、正确饮食习惯: 早上吃的像皇帝,中午吃的像平民,晚上吃的像乞

2005年01月29日

关于布局
QVBoxLayout
QHBoxLayout
QGridLayout
Inherits QBoxLayout.
常用的函数:
QLayout ( QWidget * parent, int margin = 0, int spacing = -1, const char * name = 0 )
QLayout ( QLayout * parentLayout, int spacing = -1, const char * name = 0 )
void addChildLayout ( QLayout * l )
The margin is the number of pixels between the edge of the widget and its managed children. The spacing is the default number of pixels between neighboring children. If spacing is -1 the value of margin is used for spacing.

void QLayout::setMenuBar ( QMenuBar * w ) [virtual]
Makes the geometry manager take account of the menu bar w. All child widgets are placed below the bottom edge of the menu bar.
bool QLayout::activate ()
Redoes the layout for mainWidget(). You should generally not need to call this because it is automatically called at the most appropriate times.
However, if you set up a QLayout for a visible widget without resizing that widget, you will need to call this function in order to lay it out.

QBoxLayout ( QWidget * parent, Direction d, int margin = 0, int spacing = -1, const char * name = 0 )
QBoxLayout ( QLayout * parentLayout, Direction d, int spacing = -1, const char * name = 0 )
Inherits QLayout.
Inherited by QHBoxLayout and QVBoxLayout.
void addWidget ( QWidget * widget, int stretch = 0, int alignment = 0 )
void addLayout ( QLayout * layout, int stretch = 0 )

bool setStretchFactor ( QWidget * w, int stretch )
bool setStretchFactor ( QLayout * l, int stretch )

QHBoxLayout ( QWidget * parent, int margin = 0, int spacing = -1, const char * name = 0 )
QHBoxLayout ( QLayout * parentLayout, int spacing = -1, const char * name = 0 )

关于QLabel
setScaledContents( TRUE );//可以使Label内的图像随label大小而拉伸,一直填满label
setPaletteBackgroundPixmap( pix );//拉伸时自动填充label
setPixmap(pix);//拉伸时大小不变

main函数中若
mainWin = new MyWidget;
app.setMainWidget(mainWin);
return app.exec;
程序关闭时不会调MyWidget;的析构函数
除非在app.exec后加上
delete mainWin;
或者
MyWidget mainWin;
app.setMainWidget(&mainWin);
return app.exec;

2005年01月28日

看到身边好几个人用这个,很好奇
找到它的tutorial看了一下

http://home.worldonline.co.za/~jctrembath/mctutorial.html

Midnight Commander is a file manager and directory browser, apparently similar to Norton Commander. For those of us to whom it is new, there are many tips and tricks to make it a friendly system for certain tasks. The man page of the Commander runs to over 2000 lines, so this article will be quicker to read, but the man page would naturally be more character-building…!

Once in mc, you can switch back to the console quickly with ctl – o, and back to mc the same way, with ctl – o.
The top is the menu bar, which you can access by the F9 key. Move across with the sideways arrow keys and enter on the menu you want to view.

Copying files is accomplished using the F5 key. Deleting using F8.

If you wish to create a directory, use F7.
For text editing, hit key F4. This opens the file in mcedit. My favourite editor, because it is reasonably simple. When you are finished, F2 to save and F10 to quit. If it won’t save your file, that means you forgot to edit it as root and now you’re going to have to su and do it all over again! And how do I know…? hehe.

Even if you’re not in mc, you can invoke mcedit directly from the command line – mcedit – and it will open it in the editor.

SuSe 9.2自带的amarok版本是1.0.2,使用的是arts引擎,可以播放mp3,cd,ogg没试过,
修改源代码中的metahundle.cpp,
MetaBundle&
MetaBundle::readTags( bool audioProperties )
添加了
QTextCodec *gp_codec;
gp_codec = QTextCodec::codecForName(“GB2312″);
m_title = gp_codec->toUnicode(m_title.latin1());
m_artist = gp_codec->toUnicode(m_artist.latin1());//added by ryan
m_album = gp_codec->toUnicode(m_album.latin1());
m_comment = gp_codec->toUnicode(m_comment.latin1());
m_genre = gp_codec->toUnicode(m_genre.latin1());

可以正确显示中文的歌曲名
音效的配置窗口bug较多,容易崩溃

今天编译了amarok-1.2-Beta,音效还是不能用,
去amarok的论坛看了一下,
from http://amarok.kde.org/component/option,com_simpleboard/Itemid,/func,view/catid,8/id,1506/#1506
The aRts-effects were disabled for stability reasons mainly. We got many bug reports about broken effects that made amaroK crash, and we got fed up with reports on stuff we can’t influence. Adding to that, most of the effects are not very well done, so the whole feature appeared rather useless.

I think the number one effect people want to use is an Equalizer. In amaroK CVS we have implemented an internal Equalizer plugin for GStreamer, which will probably also be ported to xine-engine. Check it out, it works quite nicely.

aRts-engine is currently almost unmaintained; if we do not find a new maintainer for it we might disabled it entirely in 1.2.

看来要是想升级amarok只好放弃arts了,
Gstreamer也不错,有均衡器

Gstreamer 播放有一些歌曲时如Change the world 64kbps 22khz 音质很差
arts相比较而言音质好多了

2005年01月23日

示例代码
详细请见http://www.digitalfanatics.org/projects/qt_tutorial/chapter02.html
#ifndef PROPOBJECT_H
#define PROPOBJECT_H

#include
#include

class PropObject : public QObject
{
Q_OBJECT

Q_PROPERTY( TestProperty testProperty READ testProperty WRITE setTestProperty )
Q_ENUMS( TestProperty )

Q_PROPERTY( QString anotherProperty READ anotherProperty )

public:
PropObject( QObject *parent=0, char *name=0 );

enum TestProperty { InitialValue, AnotherValue };

void setTestProperty( TestProperty p );
TestProperty testProperty() const;

QString anotherProperty() const { return QString( “I’m read-only!” ); }

private:
TestProperty m_testProperty;
};

#endif

请注意Q_PROPERTY的参数之间没有逗号,语法为属性的类型,后面接名字,然后是READ或者WRITE,最后接相应的函数名字
读和写属性的函数的要求(偷懒不翻译了:):
There is nothing special about the read and write member functions. The only restriction is that the reader must be of the parameters type and take no arguments (i.e. it has to be of the type void) while the writer must accept only one argument and it has to be of the parameter type.
It is common practice to declare write functions as slots. This increases the easy of re-use since most write functions are natural slots. Some of these are also candidates for emitting signals.
例如:propobject.cpp.
#include “propobject.h”

PropObject::PropObject( QObject *parent, char *name ) : QObject( parent, name )
{
m_testProperty = InitialValue;
}

void PropObject::setTestProperty( TestProperty p ) { m_testProperty = p; }
PropObject::TestProperty PropObject::testProperty() const { return m_testProperty; }

#include
#include

#include “propobject.h”

int main( int argc, char **argv )
{
QApplication a( argc, argv );

QObject *o = new PropObject();

std::cout << o->property( “testProperty” ).toString() << std::endl;

o->setProperty( “testProperty”, “AnotherValue” );
std::cout << o->property( “testProperty” ).toString() << std::endl;

std::cout << o->property( “anotherProperty” ).toString() << std::endl;

return 0;
}

输出:
$ ./prop
0
1
I’m read-only!
$