понедельник, 7 января 2008 г.

ASIO: All we need is Music!

Итак. Если мы хотим получить музыку в реальном времени, чтобы заставить играть собственноручно написанный гениальный программный синтезатор от клавиатуры, midi-клавиатуры, midi-диджериду, терменвокса или линейки со звукоснимателем, подключенным к lpt-порту, - простыми средствами нам не обойтись. Нужно быстрое время отклика, т.е. низкая латентность.

Под Lin у нас есть Jack. And it's amazing. 1.33 милисекунды задержки на встроенной звуковой карте получаются без проблем.
У кого нет Lin, придётся использовать Win.Под Win нам придётся использовать ASIO. На Portaudio пока забъём. (по определённым причинам)

.. Пытался скомпилировать стандартный пример из ASIO SDK. Хм. С помощью GCC + MinGW.
Хм. =). Даже собрался. Даже запускается. И виснет.
GCC + MS Platform SDK. Виснет.
MSVC + MS Platform SDK. Работает.

Оказывается, ASIO работает только с программами-клиентами, собранными MSVC, т.к. используется только MSVC'шная схема вызовов (т.н. thiscall в C++). Другие компиляторы пытаются выполнить вызовы по своей схеме, и в результате приложение падает/виснет.
В Portaudio, которая поддерживает ASIO, эту проблему решили с помощью специальной обёртки: http://www.audiomulch.com/~rossb/code/calliasio/ - вручную эмулируются вызовы MSVC, ассемблерными вставками.
Xм, я в сомнениях, будет ли эта обёртка обновляться постоянно, и будет ли работать под x86_64. Не будем связываться с ассемблером. Будем компилировать MSVC.

Ах да. Это же известная проблема с C++ под Win. Бинарный интерфейс (ABI) для C открыт, С-шные библиотеки собранные MSVC можно слинковать с любым кодом. Для C++ - закрыт (проприетарен). Поэтому из-за чужих бинарных C++-библиотек приходится собирать свой проект компилятором от Майкрософт.