alsa的暂停功能有两种方法实现,一种是硬件支持pause的,直接使用 snd_pcm_pause()函数。如果硬件不支持就需要使用 snd_pcm_drop 和 snd_pcm_prepare 来暂停和继续了。
下面是mplayer里面的代码:
static void audio_pause(void)
{
int err;
if (alsa_can_pause) {
if ((err = snd_pcm_pause(alsa_handler, 1)) < 0)
{
mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_ALSA_PcmPauseError, snd_strerror(err));
return;
}
mp_msg(MSGT_AO,MSGL_V,"alsa-pause: pause supported by hardware\n");
} else {
if ((err = snd_pcm_drop(alsa_handler)) < 0)
{
mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_ALSA_PcmDropError, snd_strerror(err));
return;
}
}
}
static void audio_resume(void)
{
int err;
if (snd_pcm_state(alsa_handler) == SND_PCM_STATE_SUSPENDED) {
mp_msg(MSGT_AO,MSGL_INFO,MSGTR_AO_ALSA_PcmInSuspendModeTryingResume);
while ((err = snd_pcm_resume(alsa_handler)) == -EAGAIN) sleep(1);
}
if (alsa_can_pause) {
if ((err = snd_pcm_pause(alsa_handler, 0)) < 0)
{
mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_ALSA_PcmResumeError, snd_strerror(err));
return;
}
mp_msg(MSGT_AO,MSGL_V,"alsa-resume: resume supported by hardware\n");
} else {
if ((err = snd_pcm_prepare(alsa_handler)) < 0)
{
mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_ALSA_PcmPrepareError, snd_strerror(err));
return;
}
}
}
其中 alsa_can_pause 是在alsa全部配置完成以后,通过 snd_pcm_hw_params_can_pause函数获得的。具体看一下mplayer的代码吧。我的6410硬件不支持pause,不知道驱动部分要如何弄了。
声音的合成,也就是几个声音同时放。ac97默认是不支持硬件混音的,就需要使用alsa的dmixer插件。
相应的alsa配置文件 /etc/asound.conf 使用的 http://blog.csdn.net/baymoon/archive/2007/05/08/1600966.aspx 中的配置。
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
}
我使用一个线程播放一个声音。需要注意的是,每个声音打开的时候都要单独打开一次alsa的设备,
不要所有声音都使用同一个alsa设备。
阅读(10393) | 评论(1) | 转发(0) |