LinuxSir.Org  
| 网站首页 | 注册账号 | 论坛帮助 |

欢迎来到LinuxSir.Org!
您还未登录,请登录后查看论坛,或者点击论坛上方的注册链接注册新账号。


发表新主题 回复
 
主题工具
旧 05-11-12, 12:35 第 1 帖
leros_H 帅哥
 
leros_H 的头像
 
 
注册会员  
  注册日期: Sep 2004
  我的住址: 广东
  帖子: 414
  精华: 0
 

标题: 使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 编辑.
  leros_H 当前离线   回复时引用此帖
旧 05-11-12, 13:02 第 2 帖
zhllg
 
zhllg 的头像
 
 
版主  
  注册日期: Nov 2002
  帖子: 8,459
  精华: 22
 

: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 编辑.
  zhllg 当前离线   回复时引用此帖
旧 05-11-12, 13:48 第 3 帖
leros_H 帅哥
 
leros_H 的头像
 
 
注册会员  
  注册日期: Sep 2004
  我的住址: 广东
  帖子: 414
  精华: 0
 

晕!多谢兄弟指出编辑的错误,关于文本替换那一行大家看着办了,在帖子变成了笑脸了。
  leros_H 当前离线   回复时引用此帖
旧 05-11-12, 13:56 第 4 帖
x11 帅哥
 
x11 的头像
 
 
注册会员  
  注册日期: Nov 2002
  我的住址: 上海
  帖子: 2,793
  精华: 2
 

用code包起来,或者用php包起来







__________________
-..- .---- .----
  x11 当前离线   回复时引用此帖
旧 05-11-12, 16:26 第 5 帖
zhllg
 
zhllg 的头像
 
 
版主  
  注册日期: Nov 2002
  帖子: 8,459
  精华: 22
 

有一个问题
短时间内会产生很多僵尸
虽然最后会被init回收
不过看着不爽
我做了个补丁
  zhllg 当前离线   回复时引用此帖
旧 05-11-12, 16:34 第 6 帖
zhllg
 
zhllg 的头像
 
 
版主  
  注册日期: Nov 2002
  帖子: 8,459
  精华: 22
 

主要就是注册了一个SIGCHLD的handler
在里面waitpid

此帖于 05-11-12 17:22 被 zhllg 编辑.
  zhllg 当前离线   回复时引用此帖
旧 05-11-12, 17:22 第 7 帖
zhllg
 
zhllg 的头像
 
 
版主  
  注册日期: Nov 2002
  帖子: 8,459
  精华: 22
 

刚才那个还是有点问题
如果在输入单词的提示框里输入一个可以发声的单词,并且按住回车不松手的话,还是会产生少量的僵尸
用一个循环就好了
while( waitpid(-1, NULL, WNOHANG) > 0 );
上传的附件
文件类型: txt stardict-2.4.4.alsa.patch.txt (6.9 KB, 53 次查看)
  zhllg 当前离线   回复时引用此帖
旧 05-11-12, 17:28 第 8 帖
leros_H 帅哥
 
leros_H 的头像
 
 
注册会员  
  注册日期: Sep 2004
  我的住址: 广东
  帖子: 414
  精华: 0
 

的确是这样!我当时太急了,加上经验也不多!因此一时没想到处理这个僵死进程的问题!
多谢zhllg兄!
看过zhllg兄的补丁了,很好,测试过偶尔会有几个僵死进程出现!我在那个信号处理
函数里加入个循环,以使它等待所有子进程! 这样更保险一点!:)

void asound::sigchld_handler(int s){
while(waitpid(-1, NULL, WNOHANG)>0)
NULL;
}


另多谢zhllg兄的指点!
  leros_H 当前离线   回复时引用此帖
旧 05-11-12, 17:40 第 9 帖
zhllg
 
zhllg 的头像
 
 
版主  
  注册日期: Nov 2002
  帖子: 8,459
  精华: 22
 

不客气,互相学习,呵呵
  zhllg 当前离线   回复时引用此帖
旧 05-11-13, 12:18 第 10 帖
nait
 
nait 的头像
 
 
注册会员  
  注册日期: Dec 2004
  帖子: 952
  精华: 2
 

唉,一群n银







__________________
Athlon XP 2500+
gentoo 2006.0
KDEBASE 3.5

BLOG: http://nait.cublog.cn/
  nait 当前离线   回复时引用此帖
旧 05-11-13, 14:17 第 11 帖
leros_H 帅哥
 
leros_H 的头像
 
 
注册会员  
  注册日期: Sep 2004
  我的住址: 广东
  帖子: 414
  精华: 0
 

引用:
作者: nait
唉,一群n银
n 银 是什么? :|
  leros_H 当前离线   回复时引用此帖
旧 05-11-13, 15:56 第 12 帖
nait
 
nait 的头像
 
 
注册会员  
  注册日期: Dec 2004
  帖子: 952
  精华: 2
 

牛人啊
哈哈
  nait 当前离线   回复时引用此帖
旧 05-11-15, 00:06 第 13 帖
jhuangjiahua
 
jhuangjiahua 的头像
 
 
★☆版★主☆★  
  注册日期: Apr 2004
  我的住址: 深空
  帖子: 9,502
  精华: 19
 

请问去掉 gnome 支持的 stardict 怎么样的







__________________
-
每日抽一刻钟解答 ML 中初学者的问题,
每周抽两小时整理新学知识,发表体验 Blog/Wiki/mail 分享出去,
每周至少抽四个小时来翻译自个儿喜欢的自由软件的文档,
每月至少抽八小时编程,推进自个儿的项目,
每年至少参加一次自由软件的活动,传播自由软件思想,发展一名自由人…………

只要我们每个人都坚持下去!
10年!就可以改变中国软件的整体风貌!
          ── woodpecker.org.cn

───────────────────
linux.hiweed.com  ubuntu.org.cn  sf.net/projects/pycds
  jhuangjiahua 当前离线   回复时引用此帖
旧 05-11-17, 00:33 第 14 帖
zhllg
 
zhllg 的头像
 
 
版主  
  注册日期: Nov 2002
  帖子: 8,459
  精华: 22
 

http://sdcv.sourceforge.net/
  zhllg 当前离线   回复时引用此帖
旧 05-11-17, 03:52 第 15 帖
晨想 帅哥
 
晨想 的头像
 
 
资深版主  
  注册日期: Feb 2003
  我的住址: P.R.China
  帖子: 9,637
  精华: 9
 

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 被 晨想 编辑.
  晨想 当前离线   回复时引用此帖
发表新主题 回复


主题工具

发帖规则
您 [不可以] 发表新主题
您 [不可以] 回复主题
您 [不可以] 上传附件
您 [不可以] 编辑您的帖子

已 [启用] BB 代码
已 [启用] 表情符号
已 [启用] IMG 代码
已 [禁用] HTML 代码
[论坛跳转…]


所有时间均为[北京时间]。现在的时间是 13:13


Powered by vBulletin 版本 3.6.8
版权所有 ©2000 - 2010, Jelsoft Enterprises Ltd.
官方中文技术支持: vBulletin 中文
版权所有 ©2002 - 2009, LinuxSir.Org