假设我想编写一个最小的捕获回放应用程序。我用以下参数初始化了设备。 Sample Rate: 8000 Sample Format: SND_PCM_FORMAT_S16_LE Channels:1
用于捕获和回放,然后我开始从设备中同时读取128帧的块。我一次要读多少钱?这有什么问题吗?
答案 0 :(得分:1)
首先,您可以查看asoundrc文件。它包含有关缓冲区大小的信息。所以最好不要克服它,否则你可能会被超限(写入的数据太多,旧数据丢失,部分声音被遗漏)。但是在asoundrc中可以增加缓冲区的大小。
还必须避免用太小的部分书写。否则你可能会出现欠载(没有足够的数据可用,缓冲区变空)。例如,用一个样本的一部分书写可能会导致很多欠载。
因此,最好的方法是根据系统性能,负载,缓冲区大小和参考声源来选择写入大小。 在您的情况下: 8k, 16 bit sample -->> 8k*2B/sec --> 16kB/sec
。因此,如果您使用16k的部分进行编写,那么您的应用程序需要唤醒并每秒向alsa提供新数据。对大多数情况来说一定没问题。
相反,单独编写每个样本(16b)会得到以下结果:应用程序需要每隔125 us (1/8k sec)
写一次alsa。例如,Linux中的HZ(它在线程之间切换的频率)通常为100-1000。因此,不可能单独编写每个样本而不会损害声音。
答案 1 :(得分:0)
每个PCM设备都有一个环形缓冲区。 它的大小与其他硬件参数一起配置。
对于播放设备,应用程序将数据写入缓冲区,设备将其读出。 如果应用程序想要写但缓冲区已满,则等待。 如果设备想要读取但缓冲区为空,则会出现欠载。
对于捕获设备,设备将数据写入缓冲区,应用程序从中读取数据。 如果应用程序想要读取但缓冲区为空,则等待。 如果设备想要写入但缓冲区已满,则会出现溢出。