alsa snd_pcm_writei欠载错误

时间:2016-05-11 09:08:50

标签: c linux alsa

我在arm linux 3.10中使用alsa。有3个无线设备:两个使用snd_pcm_readisendmsg捕获和发送pcm,另一个作为接收器,播放使用snd_pcm_writei收到的内容。

这是程序: 程序工作正常,1个发送者和1个接收者。但是,当我停止第一个发送者并启动第二个发送者时,接收方出现了欠载错误。对于每个发送者,接收者具有唯一的pcm句柄来处理数据。并且所有方都使用相同的配置,但发件人句柄打开时名称为default[snd_pcm_open(pcm_handle, "default", stream,0)],而接收方处理正在使用plug:dmix[snd_pcm_open(pcm_handle, "plug:dmix", stream,0)]

while(1)
{
  recv_from();
  if sender one or two's first packet
     alsa init handle1 or handle2
  int err = snd_pcm_writei(handle1 or 2, buffer, 224);
  if(err == -EPIPE)
  {
    fprintf(stderr, "underrun occurred\n");
    snd_pcm_prepare(handle);
    continue;
  }
}

目的是使接收器能够为两个发送者播放混合声音。任何人都可以帮助我,我是alsa编程新手。提前谢谢!

1 个答案:

答案 0 :(得分:0)

我可能已经找到了这个问题。配置中的默认启动阈值为1.当我将其设置为写入帧的n倍(n = 4是我使用的)时,欠载问题会丢失它的出现次数。在几分钟内只会发生一次欠载。所以我假设问题是声卡会在缓冲区大小大于1(阈值)的情况下尝试获取帧。