2015-09-12 6 views
0

Я хочу создать программное обеспечение, которое считывает необработанное аудио с внешнего аудиоинтерфейса (Focusrite Scarlett 2i2) и обрабатывает его на C++, прежде чем возвращать его в интерфейс для воспроизведения. В настоящее время я запускаю Windows 8 и задавался вопросом, как это сделать с минимальной задержкой?обработка звука в реальном времени в C++

Я потратил некоторое время на изучение (повышение) ASIO, но документация кажется довольно бедной. Я также рассматриваю OpenCL, но мне сказали, что, скорее всего, будет иметь более высокую задержку. В идеале я хотел бы иметь возможность напрямую обращаться к драйверу Focusrite.

Прошу прощения за то, что это такой открытый вопрос, но у меня возникли проблемы с поиском учебных материалов по аудиопрограмме, кроме как манипулирование аудио при предоставлении стороннего подключаемого модуля, такого как RackAFX. Я также был бы признателен, если бы кто-нибудь мог рекомендовать некоторые чтения на таких низкоуровневых материалах.

+0

также я понимаю, что я вряд ли получу конечный продукт с незаметно низкой задержкой, мне просто интересно узнать, как близко я могу получить. –

+0

Вы не сказали, какую платформу вы используете. На MacOSX можно получить латентность буфера до менее 1 мс для устройств Firewire/Thunderbolt. Для USB это будет немного больше. 5-10 мс лавирование в оба конца достижимо, хотя это происходит за счет высокой загрузки процессора. – marko

ответ

3

Вы можете получить очень низкую задержку, обратившись непосредственно к драйверу Focuswrite ASIO (это совершенно не так, как увеличение ASIO). Для работы с этим вам нужно будет зарегистрировать и скачать ASIO SDK от Steinberg. Внутри загрузки API есть пример проекта Visual C++ под названием hostsample, который является хорошей отправной точкой, и есть довольно хорошая документация о процессе буферизации, который используется ASIO.

ASIO использует двойную буферизацию. Приложение может выбирать размер буфера в пределах драйвера. Для каждого входного канала и каждого выходного канала создаются 2 буфера такого размера. Пока драйвер воспроизводит и записывает на один набор буферов, которые ваша программа считывает и записывает в другой набор. Если ваша программа выполняла простую петлю, тогда у нее был бы доступ к периоду буфера ввода 1 после ее записи, он записывался бы непосредственно в выходной буфер, который будет воспроизводиться в следующий период, так что было бы два периода задержки буфера. Вам нужно поэкспериментировать, чтобы найти наименьший размер буфера, который вы можете терпеть без глюков, и это даст вам самую низкую задержку. И, конечно, код обработки сигналов должен быть оптимизирован достаточно хорошо, чтобы идти в ногу с ним. 64 образца (1,3 мс при 48 кГц) не являются неслыханными.

+0

MAC-эквивалент - это звуковой драйвер Core – UmNyobe

+1

@UmNyobe: Сортировка: для достижения низкой латентности на MacOSX просто используются обычные API более высокого уровня CoreAudio и AudioUnits. Вы также можете использовать ASIO на MacOSX - он просто расположен поверх CoreAudio, а не использует его собственный набор драйверов, который он традиционно выполнял в Windows, чтобы избежать системного стека аудио. Причины, по которым вы хотите сделать это, - это кросс-платформенная абстракция. – marko

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