昨天郁闷了一天,音量调节一直无效,在自己的程序,xmms,lib库之间费了好些时间,才将问题定位到liboss插件上,看了看代码没看明白,
里面的:
void oss_set_volume(int l, int r)
{
int fd, v/*, cmd, devs*/;
gchar *devname;
devname = get_mixer_device();
fd = open(devname, O_RDONLY);
if (fd != -1)
{
/* g_warning("oss_set_volume(): left = %d", l);
g_warning("oss_set_volume(): right = %d", r); */
#ifndef EZX
v = (r << 8) | l;
ioctl(fd, SOUND_MIXER_WRITE_VOLUME, &v);
#else
v = (r & 0x00FF) | (l & 0x00FF); // 0 - 100, ezx not support independent channel gain?
// no left/right balance possibility?
if (v == 45 || v == 55 || v == 65 || v == 75) v = v + 1;
ioctl(fd, SOUND_MIXER_WRITE_VOLUME, &v);
#endif
close(fd);
}
else
g_warning("oss_set_volume(): Failed to open mixer device (%s): %s",
devname, strerror(errno));
g_free(devname);
}
中的红字部分不明白什么意思,但我感觉问题就出在这个上,因为音量在调到76时就不能减小了,
一定是这个造成的!
实在想不通,就问问大侠们,他看了这个代码说是因为播放器为了在来电话时自动停止播放,是通过音量监视的,45,55,65,75是系统的音量,可能只要看到这个音量或是发现音量被其它程序改变了就认为来电话了。所以自己的程序就最好不要用这几个音量,那问题还是出在自己的程序上,其实是它的这个方法有点怪,不管他了,只要就把音量定义成为32,37,42...这样就不会与它冲突了。马上改了程序,编译后试了试,果然可以调音量了,呵呵!兴奋ing!
还有昨天搞了一天,把歌词显示做的比较完善了,在上一曲,下一曲,停止,暂停时,歌词也会相应地动作!
但是还有问题要改,在xmms后台不经过我的程序,自己播放下一曲的时候,我的主界面程序跟xmms后台之间是没有通信的,也就是说,xmms已经播放下一曲了,我的程序上面显示的还是以前播放的那首歌,这个倒不怎么影响听歌,但也是个不小的bug。
还要完善的功能还要有均衡器,和播放列表的管理,还有就是启动时的问题,主界面得等xmms初始化完成后,才能读取播放列表,如果xmms 启动慢了,主界面就会读到一个空的列表,我已经有办法了,但就是线程等待不太熟,等有空了就完善一下这几个问题。