Я непрерывно отправляю данные в IAudioClient
(GetBufferSize/GetCurrentPadding/GetBuffer/ReleaseBuffer
), но я хочу знать, когда аудиоустройство заканчивает воспроизведение последних данных, которые я отправил. Я не хочу предполагать, что плеер остановлен только потому, что я отправил последний кусок данных на устройство: он все равно может воспроизводить буферизованные данные.IAudioClient - получать уведомления о завершении воспроизведения?
Я попытался использовать IAudioClock
/IAudioClock2
, чтобы проверить положение аппаратного буфера, но он остается неизменным с момента отправки последнего фрагмента.
Я также не вижу ничего соответствующего в интерфейсах IMMNotificationClient
и IAudioSessionNotification
...
Что мне не хватает?
Спасибо!
IAudioClock :: GetPosition/и т. Д. Всегда возвращает одинаковое значение независимо от того, играет ли звук или нет. Я могу использовать IAudioMeterInformation.GetPeakValue и проверить, возвращено ли значение == 0. Это, похоже, работает в моем случае (звук - это запись микрофона с по крайней мере некоторым окружающим шумом), но мне не очень нравится это как общий решение - в аудиопотоке наверняка есть периоды молчания. –
AudioClock должен возвращать непрерывно увеличивающиеся позиции до тех пор, пока вы не остановите поток. Есть ли какой-нибудь пример кода, который воспроизводит проблему? –
Ничего не могу опубликовать - у меня есть приложение Delphi, которое передает данные (отлично работает), а во время потоковой передачи у меня есть огонь по таймеру каждые 50 мс (просто тест) и вызов AudioClock :: GetPosition. Оба возвращаемых значения регистрируются. Они остаются неизменными в любое время и отличаются только при повторной инициализации устройства. –