LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 996|回复: 8

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

[复制链接]
发表于 2008-10-16 23:06:23 | 显示全部楼层 |阅读模式
适用范围:
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
  1. cat > ~/.asoundrc << eof
  2. pcm.dsp0 {
  3.     type plug
  4.     slave.pcm "dmix"
  5. }
  6. # mixer0 can stay unchanged, because
  7. # it isn't used anyway, I guess ;)
  8. ctl.mixer0 {
  9.     type hw
  10.     card 0
  11. }
  12. eof
复制代码

然后以 aoss 包装 kvm 执行
  1. aoss kvm -m 384 -localtime -soundhw all -net nic,model=e1000 -net user -redir tcp:2222::22 -hda hd.img
复制代码

此时,可继续播放背景音乐,问题解决。


OSS程序均可如上解决混音问题。
 楼主| 发表于 2008-10-17 12:15:34 | 显示全部楼层
今天翻看 audacity 文档,隐隐感觉只需 aoss 包装即可,实测通过。

[color="Red"]修正:不需要~/.asoundrc
回复 支持 反对

使用道具 举报

发表于 2008-10-17 12:40:51 | 显示全部楼层
alsa在内核的某个版本后,dmix 是默认打开了的,我也是无意中忘记在哪里看到过。~~。。
回复 支持 反对

使用道具 举报

发表于 2008-10-17 13:23:33 | 显示全部楼层
用aoss跑mplayer没问题,用aoss跑vmware还是提示音频设备被占用..

无奈了...
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-10-17 14:04:45 | 显示全部楼层
Post by 晨想;1895144
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 14:12:37 | 显示全部楼层
ok.. thanks...
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-10-17 14:14:18 | 显示全部楼层
Post by maitr;1895168
用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 15:33:38 | 显示全部楼层
- - 经您一说确实发现问题了,忽然想起我的内核没开oss兼容模式...

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

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

谢谢哈~~

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

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

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

使用道具 举报

 楼主| 发表于 2008-10-17 17:52:32 | 显示全部楼层
Post by maitr;1895227
- - 经您一说确实发现问题了,忽然想起我的内核没开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* 确定具体占用声卡的进程。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表