linux alsa同时播放两个声音问题求解???
我的声音程序用的是alsa架构,当播放一个声音的过程中,另外一个声音也开始播放,这时候资源被前一个声音独占,只等到前一个声音播放完成后,后面播放的声音才开始播放。
我想让两个声音同时播放,需要怎么做?
或者当前一个声音在播放的过程中,后一个声音开始播放,将前面的声音覆盖掉也可以。
rc = snd_pcm_open(&handle,"default",SND_PCM_STREAM_PLAYBACK,SND_PCM_NONBLOCK);
if (rc < 0)
{
fprintf(stderr,"unable to open pcm device: %s ",snd_strerror(rc));
exit(1);
}
snd_pcm_hw_params_malloc(¶ms);
snd_pcm_hw_params_any(handle,params);
snd_pcm_hw_params_set_access(handle,params,SND_PCM_ACCESS_RW_INTERLEAVED);
snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_S16_LE);
snd_pcm_hw_params_set_channels(handle,params,1);
snd_pcm_hw_params_set_rate_near(handle,params,&val,0);
snd_pcm_hw_params_get_buffer_size_max(params,&frames) ;
frames = frames < ALSA_MAX_BUF_SIZE ? frames : ALSA_MAX_BUF_SIZE ;
rc = snd_pcm_hw_params_set_buffer_size_near(handle,params,&frames) ;
snd_pcm_hw_params_get_period_size_min(params,&periodsize,NULL) ;
rc = snd_pcm_hw_params_set_period_size_near(handle,params,&periodsize,NULL);
rc = snd_pcm_hw_params(handle,params);
while (1)
{
if (msgrcv(msg_id, (void *)&wav_msg,
sizeof(struct wav_msg_t) - sizeof(long int), 0, 0) == -1) //这里是收到要播放的声音信息
continue;
snd_id = wav_msg.snd_id;
if (snd_id == SND_ID_CLOSE)
break;
wave = find_chunk(snd_id);
channel = wav_msg.flag;
vol = wav_msg.vol;
ret = 0 ;
while (ret <= 0)
{
ret = snd_pcm_writei(handle,wave->buf,wave->len/2);
if (ret == -EPIPE)
{
/* EPIPE means underrun */
fprintf(stderr,"underrun occurred ");
snd_pcm_prepare(handle);
}
else if (ret < 0)
{
fprintf(stderr,"error from writei: %s ",snd_strerror(rc));
}
}
}
大致代码如上