В моем приложении Delphi 6 есть граф фильтров DirectShow, созданный с помощью библиотеки компонентов DSPACK. Структура графика следующая:
- Аудиофильтр с произвольным источником
- Sample Grabber
- Tee Filter (но только когда я включаю как WAV File Writer, так и Renderer)
- Renderer (предпочтительное устройство вывода ПК)
- WAV File Writer
Тройной фильтр добавляется к графику только в том случае, если у меня и включены фильтры Renderer и WAV File Writer. В противном случае я подключаю только фильтр, который включен непосредственно к Sample Grabber.
Звук доставляется через подключенный к WiFi аудиосервер RTSP, который транслирует звук в режиме реального времени. Если я не включаю Wav File Writer, звук, исходящий из моих наушников, имеет типичные звуки накачки и случайные щелчки, связанные с небуферизованным аудиопотоком. Как ни странно, как только я включаю фильтр WAV File Writer, звук становится ровным, как стекло.
У меня есть исходный код для WAV File Writer, и он в основном обрабатывает задачи вывода правильного заголовка WAV-файла, когда это необходимо, и записи аудио-буферов, если необходимо, не намного больше, чем это. Поэтому я нахожу странным, что его включение сглаживает входящий аудиопоток, тем более что он не находится выше по течению от рендерера (фильтра), а вместо этого является одноранговым фильтром, свисающим с конца тройного фильтра рядом с рендерером.
Может кто-нибудь сказать мне, что может произойти, чтобы сделать доставку звука, когда я включаю фильтр File Writer? Фильтр тройника выполняет какую-либо внутреннюю буферизацию? Я хочу продублировать тот же механизм, чтобы иметь ровный звук, когда File Writer не включен. Я пытаюсь избежать добавления своей собственной буферизации, потому что я не хочу добавлять больше задержки в аудиопоток в реальном времени, чем нужно.