2016-08-02 10 views
2

Я непрерывно отправляю данные в IAudioClient (GetBufferSize/GetCurrentPadding/GetBuffer/ReleaseBuffer), но я хочу знать, когда аудиоустройство заканчивает воспроизведение последних данных, которые я отправил. Я не хочу предполагать, что плеер остановлен только потому, что я отправил последний кусок данных на устройство: он все равно может воспроизводить буферизованные данные.IAudioClient - получать уведомления о завершении воспроизведения?

Я попытался использовать IAudioClock/IAudioClock2, чтобы проверить положение аппаратного буфера, но он остается неизменным с момента отправки последнего фрагмента.

Я также не вижу ничего соответствующего в интерфейсах IMMNotificationClient и IAudioSessionNotification ...

Что мне не хватает?

Спасибо!

ответ

1

IMMNotificationClient и IAudioSessionNotification не помогут вам, они предназначены для обнаружения новых устройств/новых сеансов приложений соответственно. Насколько я знаю, в WASAPI нет ничего, что явно отправляет событие, когда последний образец потребляется устройством (эксклюзивным режимом) или звуковым движком (общий режим). Трюк, который я использовал в прошлом (хотя и с DirectSound, но должен хорошо работать с WASAPI) - постоянно проверять доступное пространство в звуковом буфере (для WASAPI, используя GetCurrentPadding). После того, как вы отправите последний образец, немедленно запишите текущее дополнение, скажем, это N кадров. Затем продолжайте записывать нули в AudioClient до тех пор, пока не будут обработаны N кадров (как сообщает IAudioClock (2) или просто гостевой, используя таймер), затем остановите поток. Независимо от того, работает ли это в эксклюзивном потоке режима, управляемом событиями, проблема с качеством драйвера; драйвер может выбрать сообщение «реальной» позиции воспроизведения или просто обработать его в кусках полного размера буфера.

+0

IAudioClock :: GetPosition/и т. Д. Всегда возвращает одинаковое значение независимо от того, играет ли звук или нет. Я могу использовать IAudioMeterInformation.GetPeakValue и проверить, возвращено ли значение == 0. Это, похоже, работает в моем случае (звук - это запись микрофона с по крайней мере некоторым окружающим шумом), но мне не очень нравится это как общий решение - в аудиопотоке наверняка есть периоды молчания. –

+0

AudioClock должен возвращать непрерывно увеличивающиеся позиции до тех пор, пока вы не остановите поток. Есть ли какой-нибудь пример кода, который воспроизводит проблему? –

+0

Ничего не могу опубликовать - у меня есть приложение Delphi, которое передает данные (отлично работает), а во время потоковой передачи у меня есть огонь по таймеру каждые 50 мс (просто тест) и вызов AudioClock :: GetPosition. Оба возвращаемых значения регистрируются. Они остаются неизменными в любое время и отличаются только при повторной инициализации устройства. –

 Смежные вопросы

  • Нет связанных вопросов^_^