Реализация сквозного канала передачи звука средствами библиотеки bass.dll

Сквозной канал – прямая передача звукового сигнала со звукоснимающей на звуковоспроизводящую аппаратуру [2].

Входящий звуковой сигнал в ЭВМ поступает на линейный или микрофонный вход звуковой карты (ЗК). Выходной звуковой сигнал подаётся на выход для динамиков.

Обычно линейный и микрофонный входы звуковой карты используются для записи звука либо для передачи его по сети Internet (например, с помощью программы Skype). В свою очередь, выход для динамиков, как правило, используется для воспроизведения звука записанного ранее (например, в формате MP3) либо принятого по сети.

Однако имеется ряд задач, для решения которых полезна либо просто необходима организация сквозного канала.

Ниже приведён частичный перечень таких задач:

  • Настройка аппаратуры и операционной системы (ОС) (звуковая карта, динамики, микшер ОС);
  • Трансляция звука в реальном времени через динамики или другое звуковоспроизводящее оборудование;
  • Обработка звука для трансляции в реальном времени через динамики или другое звуковоспроизводящее оборудование;
  • Передача речевого сигнала в систему голосового управления;
  • Обработка входящего звукового сигнала (ВЗС), в частности с целью его от шума.

Простейший сквозной канал можно организовать с помощью графического интерфейса драйвера звуковой карты. На рисунке 1 приведен пример графического интерфейса драйвера звуковой карты от компании Realtek.

 

Рис.1. Графический интерфейс драйвера звуковой карты от компании Realtek

Если в графическом интерфейсе драйвера звуковой карты от компании Realtek (рис.1) на вкладке «Микрофон» передвинуть ползунок «Громкость воспроизведения» из крайнего левого положения вправо, то в динамиках будет воспроизводиться звук, поступающий на микрофон.

Однако как поступить в случае, если драйвер или его графический интерфейс не поддерживают работу в режиме сквозного канала, или требуется обработка входящего звукового сигнала (ВЗС), которую невозможно осуществить штатными средствами драйвера звуковой карты или его графического интерфейса?

В этом случае необходимо реализовывать сквозной канал самостоятельно используя средства, предоставляемые непосредственно операционной системой (например, DirectSound или DirectShow) или компоненты сторонних разработчиков. Например, библиотеку bass.dll (bass) компании Un4seen Developments Ltd. Актуальная версия bass 2.4.12.7 [3].

Библиотека bass содержит ряд функций для записи, воспроизведения и обработки звука. Для реализации СК необходимы следующие из них [1]:

  • BASS_RecordInit – инициализирует устройство для записи;
  • BASS-RecordFree – освобождает все ресурсы задействованные для записи;
  • BASS_Init – инициализирует устройство для воспроизведения;
  • BASS_Free – освобождает все ресурсы задействованные для воспроизведения;
  • BASS_RecordStart – начинает запись;
  • BASS_ChannelGetData – получает данные для воспроизведения непосредственно с канала записи;
  • BASS_StreamCreate – создаёт поток для воспроизведения;
  • BASS_ChannelPlay – запускает запись в поток или воспроизведение;
  • BASS_ChannelStop – останавливает запись в поток или воспроизведение.

Помимо всех выше перечисленных функций для реализации сквозного канала также необходима функция обратного вызова для записи данных в поток для воспроизведения созданный функцией BASS_StreamCreate. Собственно именно она и осуществляет сопряжение между потоком записи и воспроизведения.

Полное описание всех вышеупомянутых функций, включая функцию обратного вызова, приведено в документации по bass. Ниже приведён пример реализации функции обратного вызова для сквозного канала на языке программирования Delphi.

В общем, для реализации сквозного канала на основе bass необходимо реализовать следующий алгоритм (Рис.2)

Рис.2. Принципиальная схема реализации сквозного канала на основе bass.dll (СК – сквозной канал, ФОВ – функция обратного вызова)

Как следует из документации по bass [1], захват звука и отправка на воспроизведение происходит в функции обратного вызова (см. также пример выше). Помимо этого процесс передачи входящего звукового сигнала через сквозной канал сопровождается буферизацией данных.

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

Следует особо отметить, что в некоторых версиях ОС Windows выше XP задержка может возникать независимо от настроек буфера в bass [4]. Это негативное явление в ряде случаев можно устранить либо установкой другой версии драйверов звуковой карты, либо с помощью технологии ASIO [4; 5].

Однако установка другой версии драйверов может не дать результата, так как устанавливаемая версия вполне может не содержать решения для данной проблемы. В свою очередь, некоторые версии ASIO (последняя версия 2.12, вышла 7 октября 2014 года) может корректно работать не со всеми звуковыми картами, существующими в настоящее время [5]. Таким образом, при реализации сквозного канала на базе ОС Windows старше XP необходимо уделить повышенное внимание аппаратной части ЭВМ, на которой выполняется разработка и тестирование, а также драйверам.

 

Список использованных источников

Литература

  1. Un4seen Developments Ltd. BASS documentation – 2.4 / Un4seen Developments Ltd., 2013

Интернет-источники

  1. Запись потока с линейного входа /Исходники.Ru https://forum.sources.ru/index.php?showtopic=381118&st=15
  2. Un4seen Developments Ltd (официальный сайт) https://www.un4seen.com/
  3. Задержка звука с микрофона / Форум — Adobe Audition (Cool Edit) https://audition.forumbb.ru/viewtopic.php?id=132
  4. ASIO4ALL — Universal ASIO Driver For WDM Audio (официальный сайт) Режим доступа: https://www.asio4all.com/

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *