WASAPI什么时候GetNextPacketSize return 0

When does WASAPI GetNextPacketSize return 0

sample code of WASAPI capture on MSDN,循环直到GetNextPacketSizereturn0。 我只想了解这什么时候会发生:

  1. 如果麦克风上注册了静音,会发生这种情况吗? (在这种情况下,如果我一直在麦克风上发出噪音,它会无限循环吗?)
  2. 这取决于我缺少的一些音频捕获基本概念(我对音频 API 还很陌生:))。

API 有助于确定要捕获的数据缓冲区的大小,以便 API 客户端不需要猜测或分配多余的缓冲区等。API当没有要捕获的数据(不是单帧)时,将 return 归零。这可能发生在正在进行的音频捕获会话中 when/if 您调用 API 太早了,并且基本上希望调用者稍后再试一次,因为仍然可以生成新数据。

在某些情况下,零 return 可能表示流结束。具体来说,如果您从环回设备捕获并且没有活动的回放会话可以生成环回传送数据,则捕获 API 可能会继续传送任何数据,直到出现新的回放会话。

示例代码循环检查零数据包大小并结合 Sleep 调用。这样,循环预计在睡眠期间至少会生成一些数据,并且在连续生成音频数据的正常情况下,外循环中的每个第一次调用都不会出现零长度 returned。内部循环尝试读取尽可能多的非空缓冲区,直到零表示所有已准备好交付的数据已经 returned 到客户端。

外循环保持运行,直到sink通过bDone变量传递捕获结束事件。这里有一个问题,即根据示例代码,内部循环可能会以某种方式滚动而不会中断外部循环——并且捕获没有正确停止。该示例假设 sink 处理数据的速度足够快,以便内部循环可以处理所有当前可用的数据并中断以达到 Sleep 调用。也就是说,WASAPI 调用都是非阻塞的,并且假设这些循环运行得非常快,这个想法是音频数据的处理速度比捕获的速度快,并且循环花费了大部分线程时间Sleep 电话。也许不是适合初学者的最佳示例代码。您也可以通过检查内部循环中的 bDone 来改进这一点,以使其更可靠。