我不断向IAudioClient
(GetBufferSize / GetCurrentPadding / GetBuffer / ReleaseBuffer
)发送数据,但我想知道音频设备何时播放我发送的最后一个数据。我不想假设播放器因为我将最后一块数据发送到设备而停止:它可能仍在播放缓冲数据。
我尝试使用IAudioClock
/ IAudioClock2
检查硬件缓冲区位置,但是从发送最后一个块的那一刻起它保持不变。
我也没有在IMMNotificationClient
和IAudioSessionNotification
界面中看到任何相关内容......
我错过了什么?
谢谢!
答案 0 :(得分:1)
IMMNotificationClient和IAudioSessionNotification不会帮助您,它们分别用于检测新设备/新应用程序会话。据我所知,WASAPI中没有任何内容在设备(独占模式)或音频引擎(共享模式)消耗最后一个样本时明确发出事件。我过去使用的一个技巧(尽管使用DirectSound,但同样适用于WASAPI)是不断检查音频缓冲区中的可用空间(对于WASAPI,使用GetCurrentPadding)。发送最后一个样本后,立即记录当前填充,让它说是N帧。然后继续向AudioClient写入零,直到处理完N帧(如IAudioClock(2)所报告,或者只是使用计时器猜测),然后停止流。这是否适用于独有的事件驱动模式流是驱动程序质量问题;司机可以选择报告"真实"播放位置或只处理完整缓冲区大小的块。