MSDN上WASAPI捕获的示例代码循环,直到GetNextPacketSize返回0。我只想知道这会在什么时候发生:
发布于 2016-11-17 07:14:18
API帮助确定要捕获的数据缓冲区的大小,这样API客户端就不需要猜测或分配多馀的缓冲区等等。当还没有要捕获的数据时,API将返回零(不是单个帧)。这可能发生在正在进行的音频捕获会话中,当/如果您过早调用API时,并且由于仍然可以生成新的数据,调用方基本上希望稍后再试一次。
在某些情况下,零返回可能表示流的结束。具体来说,如果您从回送设备捕获,并且没有活动的回放会话可以生成用于回送的数据,捕获API可能会一直不传递数据,直到新的回放会话出现。
示例代码循环与Sleep调用一起检查零数据包大小。这样,循环期望至少在睡眠期间生成一些数据,并且在连续生成音频数据的正常条件下,外部循环中的每个第一调用都不返回零长度。内部循环试图读取尽可能多的非空缓冲区,直到零表示所有准备好交付的数据都已返回给客户端。
外部循环一直运行,直到接收器通过bDone变量通过捕获结束事件.这里有一个陷阱,根据示例代码,内循环可能会滚动而不进入外部循环,并且捕获没有正确停止。该示例假设接收器处理数据的速度足够快,以便内部循环可以处理所有当前可用的数据,并释放出来以到达Sleep调用。也就是说,WASAPI调用都是非阻塞的,假设这些循环运行得相当快,其思想是音频数据的处理速度比捕获的要快,并且循环将大部分线程时间用于Sleep调用。也许不是初学者最好的示例代码。您也可以通过检查内部循环中的bDone来改进这一点,以使其更可靠。
https://stackoverflow.com/questions/40586895
复制相似问题