+ -
当前位置:首页 → 问答吧 → [tip] 使OSS程序不独占声卡

[tip] 使OSS程序不独占声卡

时间:2008-10-17

来源:互联网

适用范围:
1、使用ALSA声卡驱动(新近驱动)
2、声卡不支持硬件混音(这种情况,ALSA新进驱动,默认支持 dmix 软件混音)
3、启用OSS兼容模式(加载snd_pcm_oss、snd_mixer_oss内核模块,或编译到内核)
4、安装有alsa-oss软件包(需要使用其中的 aoss)

OSS程序默认以独占方式使用声卡,这可能与系统里其它软件包冲突。

一个例子如下:

某日,正播放背景音乐(mplayer -ao alsa xxx.flac),同时运行程序 kvm(kvm -m 384 -localtime -soundhw all -net nic,model=e1000 -net user -redir tcp:2222::22 -hda hd.img),发现 kvm 无法使用声卡。

关闭背景音乐后,重新运行 kvm,kvm 可以使用声卡,但别的程序均无法使用声卡。

此时,用 fuser 查看与声卡有关的设备(fuser /dev/snd/* /dev/dsp*),发现 kvm 进程正占用 /dev/dsp。
至此,确认问题是由于 kvm 只能以独占方式使用声卡引起。

kvm 这么新近的软件难道只能以 OSS 方式使用声卡?
查,从源码查,发现 kvm 是支持 ALSA 的。
原来问题出在配置编译 kvm 时,没有使能 ALSA (--enable-alsa)。
重新配置、编译、安装 kvm 很简单,不过还是下次升级时再做修改好些,最好在不重编译的情况下解决问题。

google,得到
http://alsa.opensrc.org/index.php/Dmix
其中 1.4 1.5 1.6 正好可以解决问题。

简单的说,建立配置文件 ~/.asoundrc
代码:
cat > ~/.asoundrc << eof
pcm.dsp0 {
 type plug
 slave.pcm "dmix"
}
# mixer0 can stay unchanged, because
# it isn't used anyway, I guess ;)
ctl.mixer0 {
 type hw
 card 0
}
eof
然后以 aoss 包装 kvm 执行
代码:
aoss kvm -m 384 -localtime -soundhw all -net nic,model=e1000 -net user -redir tcp:2222::22 -hda hd.img
此时,可继续播放背景音乐,问题解决。


OSS程序均可如上解决混音问题。

作者: 聚焦深空   发布时间: 2008-10-17

今天翻看 audacity 文档,隐隐感觉只需 aoss 包装即可,实测通过。

修正:不需要~/.asoundrc

作者: 聚焦深空   发布时间: 2008-10-17

alsa在内核的某个版本后,dmix 是默认打开了的,我也是无意中忘记在哪里看到过。~~。。

作者: 晨想   发布时间: 2008-10-17

用aoss跑mplayer没问题,用aoss跑vmware还是提示音频设备被占用..

无奈了...

作者: maitr   发布时间: 2008-10-17

引用:
作者: 晨想
alsa在内核的某个版本后,dmix 是默认打开了的,我也是无意中忘记在哪里看到过。~~。。
http://alsa.opensrc.org/index.php/Dmix
中原文
NOTE: For ALSA 1.0.9rc2 and higher you don't need to setup dmix. Dmix is enabled as default for soundcards which don't support hw mixing.

作者: 聚焦深空   发布时间: 2008-10-17

ok.. thanks...

作者: 晨想   发布时间: 2008-10-17

引用:
作者: maitr
用aoss跑mplayer没问题,用aoss跑vmware还是提示音频设备被占用..

无奈了...
您的声卡是否满足首贴中的4个要求?

用aoss跑mplayer要确保mplayer使用oss方式
aoss mplayer -ao oss axxx &
aoss mplayer -ao oss bxxx &
至少要同时有两个播放进程,并且能听到混音效果才行的。

您什么声卡?内置、独立?有否硬件混音功能?

vmware 多年前已不用,其以什么方式使用声卡,不清楚。
既然 kvm 能以此方式运行,vmware应当也可以,请首先定位问题。

作者: 聚焦深空   发布时间: 2008-10-17

- - 经您一说确实发现问题了,忽然想起我的内核没开oss兼容模式...

声卡是USB的,Burr-Brown Japan PCM2702
其他应用程序都没遇见问题,唯有vmware一定要独占/dev/dsp...

我去重新编下内核再试试。

谢谢哈~~

-----------------------

还是不行.. aoss mplayer -ao oss xxx正常播放了,也看到是在使用oss驱动,
只是vmware依然不卖帐.. aoss vmware,还是找不到声卡,如果手动指定为/dev/dsp,vmware就会独占声卡..
以前也在网上找了好久,貌似是vmware的问题

算了,就那样吧,要不是看见您这个帖子,我都没想再试呢=.=

作者: maitr   发布时间: 2008-10-17

引用:
作者: maitr
- - 经您一说确实发现问题了,忽然想起我的内核没开oss兼容模式...

声卡是USB的,Burr-Brown Japan PCM2702
其他应用程序都没遇见问题,唯有vmware一定要独占/dev/dsp...

我去重新编下内核再试试。

谢谢哈~~

-----------------------

还是不行.. aoss mplayer -ao oss xxx正常播放了,也看到是在使用oss驱动,
只是vmware依然不卖帐.. aoss vmware,还是找不到声卡,如果手动指定为/dev/dsp,vmware就会独占声卡..
以前也在网上找了好久,貌似是vmware的问题

算了,就那样吧,要不是看见您这个帖子,我都没想再试呢=.=
这个可能与您的USB声卡硬件有关,要确认一下是不是支持硬件混音,如支持,首贴方法是不灵的。您需要自己实现 dmix,使用软件混音。
或者您可以拔掉USB声卡再试试,您机子上应该还有别的声卡吧,新近的机子想找块不带集成声卡的都难,您的问题也许是多块声卡引起的。
最不济,如您只有这么一块USB声卡,可能没几个人能帮不上什么忙。 您如能提供声卡硬件,也许能帮您解决问题。
最后一种可能,记得 vmware 是需要 内核模块 和 初始化脚本 支持的,如果其对声卡的使用是通过后台进程实现的,那就要想法用 aoss 包装。 请用 fuser /dev/dsp* 确定具体占用声卡的进程。

作者: 聚焦深空   发布时间: 2008-10-17