2016-08-02 136 views
2

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

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

我还没有看到在IMMNotificationClientIAudioSessionNotification接口相关的任何东西......

我缺少什么?

谢谢!

回答

1

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

+0

无论音频播放与否,IAudioClock :: GetPosition /等总是返回相同的值。 我可以使用IAudioMeterInformation.GetPeakValue并检查返回的值是否为0。这似乎适用于我的情况(音频是带有至少一些环境噪声的麦克风录音),但我不太喜欢它作为通用解决方案 - 人们可以在音频流中静音。 –

+0

只要不停止流,AudioClock应该返回不断增加的位置。有任何代码重现问题? –

+0

什么我可以发布 - 我有一个德尔福应用程序流数据(工作正常),而流,我有一个计时器每隔50ms触发(只是一个测试),并调用AudioClock :: GetPosition。两个返回值都被记录下来。它们始终保持不变,只有在重新初始化设备时才有所不同。 –

相关问题