在NeoLinux 3.0(本文中Neoshine linux 3.0的缩写)的默认情况下,你同时只能使用一个音乐播放器听歌曲,这是因为在你使用多个播放器时,其他的播放器都会因第一个音乐播放器占用音频设备资 源,不能正常发声,因而提示你无法播放;这个问题其实一直以来在困扰着linux下的用户,win下却从来没有这个问题,你可以边打游戏边听音乐,互不影 响,而这种基本需求在linux下却成为了一个奢望,不过,linux下已经有不少人开始准备解决这个问题;
AC’97的声卡实际上并不支持硬件混音,因此我们需要通过增加对dmixer的支持来间接支持混音;ALSA 1.0.9及其以上版本已经可以支持混音了,因此如果你的内核版本号是2.6.16,或以上,默认是都可以支持混音的,不过前提是你要使用除oss之外的 其他驱动,因为alsa对oss的模拟不支持多线程输出音频流,导致不能混音;
对于ALSA版本号在1.0.9以下的,我们可以通过增加一个配置文件来达到使得alsa具有混音功能的目的;配置文件名是 /etc/asound.conf,文件内容为:
pcm.!default {
type plug
slave.pcm "dmixer"
}
pcm.dsp0 {
type plug
slave.pcm "dmixer"
}
pcm.dmixer {
type dmix
ipc_key 1024
slave {
pcm "hw:0,0"
# period_time 0
# period_size 1024
# buffer_size 8192
rate 44100
}
bindings {
0 0
1 1
}
}
ctl.dmixer {
type hw
card 0
}
我们通过比较mplayer播放音乐的成功与否,来判断当前系统是否能支持混音了;
增加此配置文件之前,使用mplayer播放一首歌,命令和输出为:
# mplayer xiangxiang.wma
MPlayer dev-SVN-r23114-3.4.4 (C) 2000-2007 MPlayer Team
CPU: AMD Athlon(tm) 64 Processor 3000+ (Family: 15, Model: 47, Stepping: 2)
CPUflags: MMX: 1 MMX2: 1 3DNow: 1 3DNow2: 1 SSE: 1 SSE2: 1
Compiled for x86 CPU with extensions: MMX MMX2 3DNow 3DNowEx SSE SSE2
mplayer: could not connect to socket
mplayer: No such file or directory
Failed to open LIRC support. You will not be able to use your remote control.
Playing xiangxiang.wma.
Cache fill: 3.81% (319488 bytes)
ASF file format detected.
[asfheader] Audio stream found, -aid 1
Clip info:
name: 香香
author: 凤凰传奇
copyright:
comments:
==========================================================================
Opening audio decoder: [ffmpeg] FFmpeg/libavcodec audio decoders
AUDIO: 48000 Hz, 2 ch, s16le, 64.0 kbit/4.17% (ratio: 8001->192000)
Selected audio codec: [ffwmav2] afm: ffmpeg (DivX audio v2 (FFmpeg))
==========================================================================
AO: [alsa] 48000Hz 2ch s16le (2 bytes per sample)
Video: no video
Starting playback...
在使用另外一个mplayer播放另外一首歌曲,此时输出为:
mplayer ts.wma
MPlayer dev-SVN-r23114-3.4.4 (C) 2000-2007 MPlayer Team
CPU: AMD Athlon(tm) 64 Processor 3000+ (Family: 15, Model: 47, Stepping: 2)
CPUflags: MMX: 1 MMX2: 1 3DNow: 1 3DNow2: 1 SSE: 1 SSE2: 1
Compiled for x86 CPU with extensions: MMX MMX2 3DNow 3DNowEx SSE SSE2
mplayer: could not connect to socket
mplayer: No such file or directory
Failed to open LIRC support. You will not be able to use your remote control.
Playing ts.wma.
Cache fill: 11.72% (983261 bytes)
ASF file format detected.
[asfheader] Audio stream found, -aid 1
Clip info:
name: 替身 tt78.com
author: 杨坤 tt78.com
copyright: 试听更多歌曲到tt78.com
comments: 试听更多歌曲到tt78.com
==========================================================================
Opening audio decoder: [ffmpeg] FFmpeg/libavcodec audio decoders
AUDIO: 44100 Hz, 2 ch, s16le, 32.0 kbit/2.27% (ratio: 3998->176400)
Selected audio codec: [ffwmav2] afm: ffmpeg (DivX audio v2 (FFmpeg))
==========================================================================
上述mplayer的终端输出清晰的表明了mplayer声音输出被阻塞了,因而没有继续播放,此时你退出第一个mplayer播放程序,就会看到第二个mplayer开始播放歌曲了; 而此时我们可以查看声音设备文件占用情况:
# lsof /dev/snd/*
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
mixer_app 5653 root 35u CHR 116,0 5227 /dev/snd/controlC0
mplayer 5954 root mem CHR 116,16 5179 /dev/snd/pcmC0D0p
mplayer 5954 root 5u CHR 116,16 5179 /dev/snd/pcmC0D0p
mplayer 5959 root 4u CHR 116,0 5227 /dev/snd/controlC0
现在我们增加上述的配置文件,再打开两个mplayer同时播放音乐文件,此时两个mplayer都可以正常播放了; 再次查看声音设备文件占用情况:
# lsof /dev/snd/*
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
mixer_app 5653 root 35u CHR 116,0 5227 /dev/snd/controlC0
mplayer 5978 root mem CHR 116,16 5179 /dev/snd/pcmC0D0p
mplayer 5978 root 5u CHR 116,16 5179 /dev/snd/pcmC0D0p
mplayer 5978 root 6r CHR 116,33 5130 /dev/snd/timer
mplayer 5981 root mem CHR 116,16 5179 /dev/snd/pcmC0D0p
mplayer 5981 root 5u CHR 116,16 5179 /dev/snd/pcmC0D0p
mplayer 5982 root mem CHR 116,16 5179 /dev/snd/pcmC0D0p
mplayer 5982 root 4r CHR 116,33 5130 /dev/snd/timer
mplayer 5982 root 5u CHR 116,16 5179 /dev/snd/pcmC0D0p
通过上述资源文件的占用情况也可以表明,系统已经实现了混音播放了;
# mplayer xiang.wma -ao alsa
http://gentoo-wiki.com/HOWTO_ALSA_sound_mixer_aka_dmix#Intro_to_dmix
http://da.gentoo-wiki.com/HARDWARE_Asus_S5N