Как проверить, действительно ли IDirectSoundBuffer играет?(обнаружение опустошения буфера) - PullRequest
0 голосов
/ 26 декабря 2018

Я хочу обнаружить ситуацию опустошения буфера в среде прямого звука.

Я использую два звуковых буфера (основной и дополнительный).Иногда (когда сервер выдает данные) я вызываю lock метод интерфейса IDirectSoundBuffer для отправки данных во вторичный звуковой буфер.Если данные с сервера не успевают прийти, звуковой буфер начинает воспроизведение снова с начала буфера (и повторяю его, пока я не отправлю новые данные в буфер).Может быть, это флаг DSBPLAY_LOOPING, но, как я читаю (и проверяю), первичный буфер не может быть создан без этого флага (при методе Play произошла ошибка).

Я пытаюсь получить статус игры, но метод GetStatus всегда возвращает один и тот же статус, даже если нет новых данных и игрок повторяет старые данные.

Итак, как я могу определить буферситуация опустошения (когда нет новых данных для воспроизведения и все старые данные воспроизводятся)?

Заранее спасибо.

1 Ответ

0 голосов
/ 14 января 2019

IDirectSoundBuffer8::GetCurrentPosition - действительно единственный способ определить, откуда он воспроизводится, но он также надежен только в Windows Vista или более поздних системах, которые сообщают DSBCAPS_TRUEPLAYPOSITION.

A.Несколько вещей, на которые стоит обратить внимание:

  • DirectSound является «устаревшим», то есть он активно не разрабатывался, не продвигался и не тестировался напрямую целую вечность.Последние образцы были отправлены в уже выпущенном DirectX SDK в ноябре 2007 года. Версии DirectSound до 8 не поддерживаются для собственных приложений x64, а заголовки / библиотеки DirectSound 8 находятся в Windows SDK, как и в WindowsSDK 7. Он не поддерживается для Windows в ARM, приложениях Магазина Windows и универсальных приложениях Windows.Документацию по DirectSound можно найти только в автономном режиме в устаревшем DirectX SDK, но не в Microsoft Docs. Единственное содержимое DirectSound, все еще находящееся в сети, предназначено для разработчиков драйверов.

  • DirectSound также эмулируетсяв современных версиях Windows, так что на самом деле в этом нет ничего «прямого».Первичный буфер на самом деле не подключен напрямую к аудиооборудованию или вообще не используется для микширования, так что это просто еще один программный буфер, такой как вторичный буфер.Он эмулирует устаревшие ограничения первичных буферов, которые применялись еще в Windows 9x / ME, но в остальном он ничего не делает.

  • Начиная с Windows Vista, LOC_HARDWAREбуферы больше не поддерживаются вообще.В Windows Vista добавлена ​​поддержка многоканальных буферов LOC_SOFTWARE, которые в Windows XP были доступны только в виде буферов LOC_HARDWARE.

  • Начиная с Windows Vista, эффекты (ID3L, EAX,и т. д.) не поддерживаются через DirectSound.

TL; DR : не использовать DirectSound в новых приложениях.Он все еще поддерживается только для старого программного обеспечения и игр.

Итак, что разработчик должен использовать, если не DirectSound?

(1) Windows Core Audio (WASAPI) - это хорошовариант, если вы можете предоставить звуковые данные с известной скоростью и форматом данных.Если вам нужно микширование в режиме реального времени или преобразование исходной скорости, вы должны сделать это самостоятельно - или вы можете использовать одну из многих существующих сторонних аудио библиотек, чтобы сделать это, что также отправит окончательный результат в WASAPI.См. Документы Microsoft .

(2). XAudio версии 2 - хороший выбор, если вы хотите выполнять микширование в реальном времени, преобразование скорости источника и программные эффекты DSP.Он включен в операционную систему начиная с Windows 8, но для поддержки Windows 7 необходимо использовать некоторые устаревшие дистрибутивы и SDK.См. Документы Microoft и в этом блоге .

И WASPI, и XAudio используют модель «аудиопакета» вместо буфера циклического представления данных.Пока пакет ожидает обработки, у вас не будет недостаточного запуска.

...