linux alsa同时播放两个声音问题求解???

scoredhigh 2016-04-15 05:05:35
我的声音程序用的是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));
}
}
}
大致代码如上
...全文
716 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
人生如叶 2017-04-14
  • 打赏
  • 举报
回复
多线程操作。
dustin_nan 2017-03-08
  • 打赏
  • 举报
回复
楼主这个问题解决了吗? 我也刚着手这个事情,一脸的懵比啊
scoredhigh 2016-04-20
  • 打赏
  • 举报
回复
竟无人应答 现在只知道mixer可以设置音量
liZZZAAA 2016-04-18
  • 打赏
  • 举报
回复
做混音处理 做混音处理,重要的事只说两遍
scoredhigh 2016-04-18
  • 打赏
  • 举报
回复
没人研究过alsa音频架构吗???
scoredhigh 2016-04-18
  • 打赏
  • 举报
回复
引用 2 楼 liZZZAAA 的回复:
做混音处理 做混音处理,重要的事只说两遍
怎么做?怎么做?怎么做?重要的问题问三遍!!! 怎么样设置混音呢 snd_mixer_open(&mixer, 0); snd_mixer_attach(mixer, "default"); snd_mixer_selem_register(mixer, NULL, NULL); snd_mixer_load(mixer); master_element = snd_mixer_first_elem(mixer); snd_mixer_selem_set_playback_volume_range(master_element, 0, 127); snd_mixer_selem_set_playback_volume_all(master_element,127) ; 我在网上查了这段代码,插入播放之前的代码里,好像没效果,还缺什么吗

23,127

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧