我在arm linux 3.10中使用alsa
。有3个无线设备:两个使用snd_pcm_readi
和sendmsg
捕获和发送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
编程新手。提前谢谢!
答案 0 :(得分:0)
我可能已经找到了这个问题。配置中的默认启动阈值为1.当我将其设置为写入帧的n倍(n = 4是我使用的)时,欠载问题会丢失它的出现次数。在几分钟内只会发生一次欠载。所以我假设问题是声卡会在缓冲区大小大于1(阈值)的情况下尝试获取帧。