|
|
使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装上
吧!
以上只是提供给一些有这种需要的人一种参考的方法,当然如果你有更好的方法的话
不访告诉我们大家。如果有什么可以放进的地方也可以提出来!欢迎大家讨论! |
|