Chinaunix首页 | 论坛 | 博客
  • 博客访问: 195194
  • 博文数量: 30
  • 博客积分: 1571
  • 博客等级: 上尉
  • 技术积分: 363
  • 用 户 组: 普通用户
  • 注册时间: 2010-01-28 11:42
文章分类

全部博文(30)

文章存档

2012年(6)

2011年(11)

2010年(13)

我的朋友

分类: LINUX

2010-05-08 16:47:03

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设备。
阅读(10315) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-06-21 11:17:14

想请你出山相助,正要联系你(请你作我公司技术顾问www.seikaku.hk),请回我一封邮件,OK? bellchen@sekaku.com、 QQ:174646172