Воспроизведение "щелкающего" шума - PullRequest
3 голосов
/ 28 июня 2010

Я пытаюсь написать программу для воспроизведения небольшого WAV-файла на C ++. Я запрограммировал его в соответствии с документами DirectX SDK для записи и воспроизведения на вторичном статическом буфере. Он работает правильно, за исключением того, что в конце воспроизведения для любого файла .wav есть очень заметный «щелкающий» шум. Я уверен, что это не является дефектом со стороны моего аудиооборудования, потому что любая другая игра, которую я знаю, использует DirectSound, не имеет ее.

Я пытался опрашивать GetCurrentPosition для каждого цикла и останавливать его прямо перед его завершением, но это было ненадежно. Я не могу воспроизвести его на основном буфере, потому что .wav, проигрываемый на первичных буферах, должен быть зациклен, чего я не хочу.

Кто-нибудь знает решение этой проблемы? Заранее спасибо.

1 Ответ

4 голосов
/ 28 июня 2010

Для загрузки WAV-файла в звуковой буфер нам понадобится как рассматриваемый WAV-файл, так и код.Но вот несколько предположений.

Мое первое предположение состоит в том, что если бы мы загрузили ваш файл WAV в визуальный аудиоредактор, мы бы увидели, что звук внезапно подходит к концу, а не сжимается в тишину,Это может привести к резкому «хлопающему» шуму практически с любым аудиоплеером.

Мое второе предположение - вы копируете данные мусора в звуковой буфер в конце.Некоторые файлы WAV имеют дополнительные метаданные в конце файла после конца блока данных.Не уверен, как вы определили позиции в звуковом файле для копирования сэмплов, но это легко испортить.Проверяли ли вы файл WAV с помощью шестнадцатеричного редактора (например, Visual Studio), чтобы убедиться, что длина фрагмента DATA столь же велика, как утверждается?Когда вы отлаживаете вызов ReadFile для копирования данных из файла в буфер, проверяли ли вы последние несколько байтов вашего буфера на соответствие тому, что вы видели в шестнадцатеричном редакторе?

...