【问题标题】:Alsa full duplex communicationAlsa 全双工通信
【发布时间】:2013-12-01 02:50:30
【问题描述】:

我想使用 alsa 实现全双工通信。我首先编写了捕获和回放程序,我正在使用 UDP 通信将数据从捕获的进程传输到回放进程。当我运行两个进程时它工作正常,一个正在捕获另一个正在播放(将其视为从 A 到 B 的半双工),当我试图实现另一个半双工(从 B 到 A 的半双工)时,问题就出现了然后我收到 Broken Pipe 错误 从 Mic 读取数据时。如何解决这个问题?任何帮助,在此先感谢。

注意:我在不同的系统上运行两个进程

【问题讨论】:

  • 您的程序如何决定何时读取 PCM 设备?
  • 我正在从设备连续读取数据,并且正在使用异步回调(通过设置avail-min)写入设备..
  • Don't use async。 “Broken pipe”是EPIPE,意思是你读的不够快。缓冲区有多大?
  • 我正在使用大小为 1880 的缓冲区。我对读写有一些疑问。我一次可以从/向设备写入或读取的最佳大小是多少(一个周期或两个周期)以及在读取/写入后我必须等待下一次读取/写入的时间。

标签: alsa


【解决方案1】:

当应用程序必须等待 PCM 设备时,它会进入睡眠状态并在下一个周期边界被唤醒。因此,读/写的最佳大小是一个周期(或周期的倍数)。

您应该在某些帧可用时立即读取/写入示例数据。

要减少溢出/欠载的可能性,请增加缓冲区大小。 (在捕获设备上,增加缓冲区大小不会增加延迟。)

【讨论】:

  • “一旦某些帧可用,您就应该读取/写入示例数据”这意味着我必须阅读的确切时间..我必须使用 poll 或其他东西
  • snd_pcm_read* 将等待一些帧可用(在阻塞模式下)。
猜你喜欢
  • 1970-01-01
  • 2017-11-24
  • 2015-07-15
  • 1970-01-01
  • 2011-03-23
  • 1970-01-01
  • 2012-03-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多