IAudioClient - 播放结束时收到通知?

时间:2016-08-02 22:02:48

标签: winapi audio notifications wasapi

我不断向IAudioClientGetBufferSize / GetCurrentPadding / GetBuffer / ReleaseBuffer)发送数据,但我想知道音频设备何时播放我发送的最后一个数据。我不想假设播放器因为我将最后一块数据发送到设备而停止:它可能仍在播放缓冲数据。

我尝试使用IAudioClock / IAudioClock2检查硬件缓冲区位置,但是从发送最后一个块的那一刻起它保持不变。

我也没有在IMMNotificationClientIAudioSessionNotification界面中看到任何相关内容......

我错过了什么?

谢谢!

1 个答案:

答案 0 :(得分:1)

IMMNotificationClient和IAudioSessionNotification不会帮助您,它们分别用于检测新设备/新应用程序会话。据我所知,WASAPI中没有任何内容在设备(独占模式)或音频引擎(共享模式)消耗最后一个样本时明确发出事件。我过去使用的一个技巧(尽管使用DirectSound,但同样适用于WASAPI)是不断检查音频缓冲区中的可用空间(对于WASAPI,使用GetCurrentPadding)。发送最后一个样本后,立即记录当前填充,让它说是N帧。然后继续向AudioClient写入零,直到处理完N帧(如IAudioClock(2)所报告,或者只是使用计时器猜测),然后停止流。这是否适用于独有的事件驱动模式流是驱动程序质量问题;司机可以选择报告"真实"播放位置或只处理完整缓冲区大小的块。