Введение
API для рендеринга аудио
OpenAL (Open Audio Library) — это кроссплатформенный интерфейс программирования приложений для работы со звуком (API). Он предназначен для эффективного рендеринга многоканального трёхмерного позиционного аудио. Стиль API и соглашения намеренно напоминают OpenGL. OpenAL — это библиотека для создания объёмного 3D-звука, которая может добавить реалистичности игре, имитируя затухание (ослабление звука с расстоянием), эффект Доплера (изменение частоты из-за движения) и плотность материалов. Изначально OpenAL задумывался как открытый стандарт и замена с открытым исходным кодом проприетарным (и, как правило, несовместимым друг с другом) 3D-аудио API, таким как DirectSound и Core Audio, однако на практике он во многом реализован на различных платформах как оболочка вокруг этих проприетарных API или как проприетарная, специфичная для поставщика, версия. Хотя эталонная реализация впоследствии стала проприетарной и больше не поддерживается, существуют реализации с открытым исходным кодом, такие как OpenAL Soft.
История
OpenAL был первоначально разработан в 2000 году компанией Loki Software для облегчения переноса игр с Windows на Linux. После прекращения существования Loki, проект некоторое время поддерживался сообществом свободного программного обеспечения и открытого исходного кода и был реализован на звуковых картах и материнских платах NVIDIA nForce. Он размещался (и в основном разрабатывался) компанией Creative Technology до примерно 2012 года. Начиная с версии 1.1 (2009), пример реализации от Creative стала проприетарной, однако последние выпуски под свободными лицензиями остаются доступными в репозитории исходного кода проекта Subversion. Тем не менее, OpenAL Soft является широко используемой альтернативой с открытым исходным кодом и продолжает активно поддерживаться и расширяться. Хотя в уставе OpenAL предусматривалось создание "Архитектурного совета" (ARB) по образцу OpenGL ARB, такая организация так и не была сформирована, и спецификация OpenAL обычно обрабатывается и обсуждается по электронной почте в публичном списке рассылки. Изначальный список рассылки openal devel, размещенный Creative, функционировал с марта 2003 года по август 2012 года. Райан С. Гордон, ветеран Loki, впоследствии разработавший Simple DirectMedia Layer, в январе 2014 года создал новый список рассылки и веб-сайт на OpenAL.org. По состоянию на февраль 2023 года список продолжает использоваться.
Структура и функциональность API
Общая функциональность OpenAL реализована через источники, аудио-буферы и один слушатель. Источник содержит указатель на буфер, скорость, положение и направление звука, а также его громкость. Объект слушателя содержит скорость, положение и направление слушателя, а также общую громкость, применяемую ко всему звуку. Буферы содержат аудиоданные в формате PCM, 8 или 16 бит, моно или стерео. Механизм рендеринга выполняет все необходимые вычисления для затухания звука с расстоянием, эффекта Доплера и т.д. В результате, в правильно написанном приложении OpenAL звуки ведут себя естественно при перемещении пользователя в трехмерном пространстве виртуального мира. С точки зрения программиста, для достижения этого эффекта в существующем 3D графическом приложении на основе OpenGL требуется немного дополнительной работы. В отличие от спецификации OpenGL, спецификация OpenAL включает два подраздела API: ядро, состоящее из фактических вызовов функций OpenAL, и API ALC (Audio Library Context), используемое для управления контекстами рендеринга, использованием ресурсов и блокировками на кроссплатформенной основе. Также существует библиотека ALUT (Audio Library Utility Toolkit), предоставляющая функции более высокого уровня для удобства, аналогичные GLUT в OpenGL. Для обеспечения дополнительной функциональности в будущем OpenAL использует механизм расширений. Это позволяет отдельным производителям включать собственные расширения в дистрибутивы OpenAL, как правило, для предоставления дополнительной функциональности на их проприетарном оборудовании. Расширения могут быть повышены до статуса ARB (Architecture Review Board), что указывает на стандартное расширение, которое будет поддерживаться для обратной совместимости. Расширения ARB могут быть добавлены в основное API по истечении определенного времени. Для продвинутой обработки цифровых сигналов и аппаратного ускорения звуковых эффектов можно использовать EFX (Effects Extension) или расширения для пространственного звука (EAX).
Ограничения
Модель единственного слушателя в OpenAL рассчитана на одного человека и не подходит для искусственного интеллекта, роботизированных симуляций или ситуаций с несколькими участниками, например, при совместном музыкальном исполнении. В таких случаях требуется модель с несколькими слушателями. OpenAL также не учитывает задержки распространения звука (скорость звука используется только для эффекта Доплера). Расстояние до источника звука влияет только на амплитуду (затухание), но не на задержку. Следовательно, OpenAL нельзя использовать для вычисления разности времени прихода звука, если эта функциональность не добавлена отдельно. Чтобы в полной мере использовать возможности OpenAL, необходима реализация, специфичная для поставщика/оборудования, но такие реализации редко публикуются с открытым исходным кодом. Многие поддерживаемые платформы фактически реализуют OpenAL как обертку, которая просто преобразует вызовы в собственный, часто проприетарный, аудио-API платформы. В Windows, если не обнаружена реализация, специфичная для поставщика, используется оберточная библиотека oal.dll, которая преобразует OpenAL в DirectSound (Generic Software) или DirectSound3D (Generic Hardware); удаление последнего, начиная с Windows Vista, фактически привело к отказу от аппаратного ускорения на современных версиях Windows.
Поддерживаемые платформы
API доступен на следующих платформах и операционных системах: Android (поддерживает OpenSL ES), AmigaOS 3.x и 4.x, Bada, BlackBerry 10, BlackBerry PlayBook, BSD, iOS (поддерживает Core Audio), IRIX, Linux (поддерживает ALSA, OSS, PortAudio и PulseAudio), Mac OS 8, Mac OS 9 и Mac OS X (Core Audio), Microsoft Windows (поддерживает DirectSound, Windows Multimedia API и Windows Multimedia Device (MMDevice) API), MorphOS, OpenBSD, Solaris, QNX и AROS. Среди поддерживаемых игровых устройств: GameCube, PlayStation 2, PlayStation 3, Xbox, Xbox 360, Wii и PlayStation Portable.