|
|
第 1 帖 | |
|
|
标题: 使stardict 使用alsa 发音 使stardict 使用alsa 发音
相信大家都有用星际译王这款软件包吧! 说真的,是真的好用!不过对我来说有一点不爽! 那是发声部分,我用的是alsa,但stardict用的是esd,因此 我每次想让她发声都不得不启动esd这个守护进程。而在我的系统中 几乎只有这一个程序是用esd发声。单单为了它而启动esd我觉得不值 的,于是我就想让她用alsa发音。但星际译王没有这个选择项!所以我只有 改它的源程序来实现了! 如果你也想这样的话就可以往下看了! 道理很简单,星际译王用的是gnome系统的API来发音的,就是gnome_sound_play 来发音的,而它使用的就esd,起码在我的系统上是。(是不是gnome有方法把esd 换成alsa的呢?如果有就不用这么麻烦了!)我们所做的就是自己写个用alsa的发 音函数替换它就行了!就这样而已! 进入源码目录 stardict/src 下, 编辑 readword.h 加入以下我们发音函数的声明 namespace asound { void ao_sound_play(const char * filename); } 在声明一个名字空间asound,里面有一函数。 然后保存。再编辑readword.cpp , 添加以下内容: #include <unistd.h> #include <errno.h> asound::ao_sound_play (const char *filename) { pid_t pid; pid = fork (); if (-1 == pid) { perror ("Fork falid to creat a process"); } else if (0 == pid) { close (0); close (1); close (2); if (execlp ("/usr/bin/aplay","aplay",filename, NULL) < 0) { perror ("Execl failed"); exit (1); } } } 请注意你系统上aplay命令的路径,如果是其它路径则自行更改execlp 的第一个参数了! 修改完后可以进行下一步了,在readword.cpp文件中找到下面一行:(在文件的结尾处) gnome_sound_play(filename); 将它注释掉并添加代码,结果如下: //gnome_sound_play(filename); asound::ao_sound_play (filename); 保存readword.cpp文件。 依照上面替换代码的方法,把floatwin.cpp, mainwin.cpp, stardict,cpp中的 gnome_sound_play(filename)全替换成asound::ao_sound_play(filename) 然后保存文件退出。(相信替换字符大家都有高效的方法了,为防还是有某些人要 一行行换的话,这里就说说我不成熟的做法,用Vim打开上面据说要改的文件。在 命令模式下执行 s/gnome_sound_play/asound::ao_sound_play/g保存退出) 好,现在可以编译stardict, ./configure &&make &&make install 这时启动stardict就可以听到声音而不用启动esd了!:) 这里做一些说明,以上是在debain 3.1 kernel 2.6.10 gcc 4.0 gnome2.10 stardict2.4.4 环境下测试成功。因为stardict依赖许多gnome的API,因此要编译它要装好些gnome 的库。因此你首先要保证你可以正常编译stardict,如果缺少什么库的话用apt装上 吧! 以上只是提供给一些有这种需要的人一种参考的方法,当然如果你有更好的方法的话 不访告诉我们大家。如果有什么可以放进的地方也可以提出来!欢迎大家讨论!
__________________
因为你认为没办法,所以你才没有去找办法! If you don't like it, you can change it ! That is GNU ! -------------Leros is my name!--------- -------------Linux is my love!--------- MyBlog: http://lerosua.at.3322.org ______________________________________________ 此PC信息过时了(Intel C4 1.7G + 512 RAM +40G harddisk + Ubuntu 6.06) 此帖于 05-11-12 13:29 被 leros_H 编辑. |
|
|
|
|
|
|
|
第 2 帖 | |
|
|
:s%/gnome_sound_play/asound::ao_sound_play/g
s/s%/%s/ anyway thank you for sharing
__________________
Zhang Le (r0bertz) http://zhangle.is-a-geek.org 此帖于 05-11-12 13:23 被 zhllg 编辑. |
|
|
|
|
|
|
|
第 3 帖 | |
|
|
晕!多谢兄弟指出编辑的错误,关于文本替换那一行大家看着办了,在帖子变成了笑脸了。
|
|
|
|
|
|
|
|
第 4 帖 | |
|
|
用code包起来,或者用php包起来
__________________
-..- .---- .---- |
|
|
|
|
|
|
|
第 5 帖 | |
|
|
有一个问题
短时间内会产生很多僵尸 虽然最后会被init回收 不过看着不爽 我做了个补丁 |
|
|
|
|
|
|
|
第 6 帖 | |
|
|
主要就是注册了一个SIGCHLD的handler
在里面waitpid 此帖于 05-11-12 17:22 被 zhllg 编辑. |
|
|
|
|
|
|
|
第 7 帖 | |
|
|
刚才那个还是有点问题
如果在输入单词的提示框里输入一个可以发声的单词,并且按住回车不松手的话,还是会产生少量的僵尸 用一个循环就好了 while( waitpid(-1, NULL, WNOHANG) > 0 ); |
|
|
|
|
|
|
|
第 8 帖 | |
|
|
的确是这样!我当时太急了,加上经验也不多!因此一时没想到处理这个僵死进程的问题!
多谢zhllg兄! 看过zhllg兄的补丁了,很好,测试过偶尔会有几个僵死进程出现!我在那个信号处理 函数里加入个循环,以使它等待所有子进程! 这样更保险一点!:) void asound::sigchld_handler(int s){ while(waitpid(-1, NULL, WNOHANG)>0) NULL; } 另多谢zhllg兄的指点! |
|
|
|
|
|
|
|
第 9 帖 | |
|
|
不客气,互相学习,呵呵
|
|
|
|
|
|
|
|
第 10 帖 | |
|
|
唉,一群n银
__________________
Athlon XP 2500+ gentoo 2006.0 KDEBASE 3.5 BLOG: http://nait.cublog.cn/ |
|
|
|
|
|
|
|
第 11 帖 | ||
|
|
引用:
|
||
|
|
|
||
|
|
第 12 帖 | |
|
|
牛人啊
哈哈 |
|
|
|
|
|
|
|
第 13 帖 | |
|
|
请问去掉 gnome 支持的 stardict 怎么样的
__________________
- 每日抽一刻钟解答 ML 中初学者的问题, 每周抽两小时整理新学知识,发表体验 Blog/Wiki/mail 分享出去, 每周至少抽四个小时来翻译自个儿喜欢的自由软件的文档, 每月至少抽八小时编程,推进自个儿的项目, 每年至少参加一次自由软件的活动,传播自由软件思想,发展一名自由人………… 只要我们每个人都坚持下去! 10年!就可以改变中国软件的整体风貌! ── woodpecker.org.cn ─────────────────── linux.hiweed.com ubuntu.org.cn sf.net/projects/pycds |
|
|
|
|
|
|
|
第 14 帖 | |
|
|
|
|
|
|
|
|
|
|
第 15 帖 | |
|
|
http://stardict.sourceforge.net/
不需要gnome的。编译中有选项。 sdcv 是 Command line version sdcv-0.4.tar.bz2 163K。
__________________
我的wiki: http://wiki.linuxgnu.org 马甲Show:终极幻想 黯然销魂 DawnFantasy FinalFantasy ArmageddonMa 此帖于 05-11-17 04:09 被 晨想 编辑. |
|
|
|
|
|