OpenAL
OpenAL (Open Audio Library) — кросплатформовий прикладний програмний інтерфейс (API) для роботи з аудіоданими. Розроблявся для ефективної взаємодії з багатоканальним звуком у тривимірному просторі. Ранні версії OpenAL мали відкритий початковий код, однак більш пізні ревізії є власницьким програмним забезпеченням.
Тип | Прикладний програмний інтерфейс |
---|---|
Автор(и) | Loki Software |
Розробник | Creative Technology |
Стабільний випуск | 2.0.7.0 (3 червня 2009 ) |
Операційна система | 15 операційних систем |
Мова програмування | C[1] |
Ліцензія | BSD у ранніх версіях,[2] LGPL до v1.1, власницьке від v1.1 |
Вебсайт | www.openal.org |
Історія
OpenAL був створений фірмою Loki Software у 2000 році як інструмент для їх бізнесу - портування комп’ютерних ігор з Windows на Linux. Після того, як Loki Software припинила своє існування проект певний час розвивався силами спільноти вільного програмного забезпечення, зокрема була реалізована підтримка чипсета, вбудованого в звукові адаптери та материнські плати NVIDIA nForce. Сьогодні куратором (та головним розробником) проекту є Creative Technology. Поточну підтримку OpenAL отримує від Apple, Blue Ripple Sound та ентузіастів вільного програмного забезпечення.[3]
Хоча хартія OpenAL говорить, що проект має мати "Наглядову раду за архітектурою" (ARB) аналогічну OpenGL ARB, проте на сьогодні така організація досі не створена, а специфікації проекту затверджуються та обговорюються безпосередньо розробниками електронною поштою та в загальнодоступних засобах розсилки.
Починаючи з версії 1.1 реалізація OpenAL від Creative Labs має закритий початковий код, однак останні релізи під вільною ліцензією залишаються доступними в офіційному репозиторії. Широко використовуваною альтернативною open-source реалізацією є OpenAL Soft.
Структура та функціональність
Базова функціональність OpenAL реалізується через наступні компоненти: початкові об’єкти (source objects), аудіобуфери (audio buffers), та єдиний слухач (listener). Початковий об’єкт містить покажчик на буфер, швидкість, розташування та направленість звуку, а також його інтенсивність. У слухачі міститься швидкість, розташування та направленість слухача, а також загальне підсилення звуку. Буфери місять аудіодані у форматі PCM, в 8-бітному або 16-бітному представлені, у моно або стерео форматі. Рушій рендерингу виконує всі необхідні обрахунки, такі як визначення відстані, ефект Доплера, тощо.
Для кінцевого користувача результат роботи всіх компонентів OpenAL дає абсолютно природне звучання при переміщенні персонажів у тривимірному віртуальному світі. При цьому розробник може задіяти OpenAL у своїй готовій тривимірній OpenGL-програмі майже не докладаючи зусиль.
На відміну від специфікації OpenGL, специфікація OpenAL включає в себе дві підсекції API: ядро, що містить виклики функцій OpenAL, та ALC (Audio Library Contex) - прикладний інтерфейс, що використовується для керування контекстом рендерингу, використанням ресурсів та блокуванням у кросплатформовому стилі. Також існує бібліотека ALUT, що надає високорівневі функції, які спрощують взаємодію із OpenAL - аналогічно GLUT у OpenGL.
OpenAL є розширюваним. Індивідуальні постачальники мають змогу додавати свої власні розширення в дистрибутив OpenAL, в більшості випадків задля забезпечення додаткової функціональності на своєму апаратному забезпеченні, що має закриті специфікації. Розширення можуть бути підвищені до статусу ARB, яким позначаються розширення, які будуть підтримуватися для забезпечення зворотньої сумісності. ARB-розширення мають шанс з часом потрапити до ядра OpenAL.
Для складнішої обробки цифрових сигналів та апаратно-прискорюваних звукових ефектів можуть використовуватись розширення, такі як EFX (Effects Extension) або EAX (Environmental Audio Extentions).
Відмінності між OpenAL 1.0 та OpenAL 1.1
Однією з відмінностей версії 1.1 стало додавання API, призначеного для запису звуку (Recording API).
Додана також можливість позиціонування всередині джерела звуку (за часом або за семплами).
Фактично скасована бібліотека ALUT, замість неї в SDK запропонована інша бібліотека, на основі якої і зроблені всі приклади з SDK.
Було проведено уточнення документації, додано декілька нових моделей обрахунку відстані до джерела звуку, додані нові типи даних ALchar і ALCchar.
Тепер функція alcCloseDevice повертає значення типу ALCboolean для позначення успішності операції.
Однак найбільш цікавою можливістю стала підтримка звукових фільтрів і ефектів за допомогою розширення ALC_EXT_EFX.
Розширення ефектів EFX
Дане розширення додає в OpenAL підтримку звукових фільтрів і ефектів для виведеного звуку. Акуратне використання даного розширення дозволяє радикально змінити звуковий світ вашої програми або гри. Розширення EFX вводить нову архітектуру обробки звуку в OpenAL. Тепер до будь-якого джерела звуку можна додати безпосередній (direct) фільтр (зазвичай використовується low-pass або high-pass фільтри, тобто фільтри, що утворюють високі або низькі частоти). Звук, після проходження через безпосередній фільтр відразу ж прямує до вихідного мікшеру.
Крім цього з'явилася можливість для джерел звуку посилати дані (при необхідності з обробкою їх фільтром) на додаткові канали виходу (slots). До кожного такого каналу можна підключити певний звуковий ефект, що перетворює звукові дані, які після цього також надходять на вихідний мікшер.
За рахунок використання звукових фільтрів і ефектів стало можливим моделювати звукове оточення для слухача. Так можна задати обробку звуку, що моделює знаходження слухача у певному приміщенні. У реальному житті подібні ефекти оточення виникають за рахунок багаторазового відбиття і поглинання (а також розсіювання) звуку стінами (а також підлогою та стелею) приміщення. Так якщо джерело звуку знаходиться всередині приміщення, то будуть відбуватися численні перевідбиваня звуку від стін, підлоги та стелі.
При цьому як розмір приміщення, так і матеріал, з якого виготовлені його стіни, підлогу та стелю, будуть чинити сильний вплив на те як сприймається слухачем результуючий звук. За задумом розробників OpenAL кожен ефект відповідає певному приміщенню (environment), а використовувані фільтри дозволяють більш точно враховувати особливості поширення та відбиття звуку.
Різні звукові карти підтримують як різне число одночасно працюючих ефектів, так і різні типи ефектів.
Приклад використання OpenAL
Початок роботи
Для того щоби розпочати роботу з OpenAL необхідно встановити OpenAL SDK, та підключити його до проекту:
#include <al.h>
#include <alc.h>
#include <alu.h>
#include <alut.h>
#pragma comment(lib, "alut.lib")
#pragma comment(lib, "OpenAL32.lib")
Ініціалізація
bool InitializeOpenAL()
{
// Розташування слухача
ALfloat ListenerPos[] = { 0.0, 0.0, 0.0 };
// Швидкість слухача
ALfloat ListenerVel[] = { 0.0, 0.0, 0.0 };
// Спрямованість слухача
ALfloat ListenerOri[] = { 0.0, 0.0, -1.0, 0.0, 1.0, 0.0 };
// Відкрити пристрій за умовчанням
pDevice = alcOpenDevice(NULL);
// Перевірка на помилки
if (!pDevice)
{
ERRMSG("Default sound device not present");
return false;
}
// Створення контексту рендерингу
pContext = alcCreateContext(pDevice, NULL);
if (!CheckALCError()) return false;
// Зробити контекст поточним
alcMakeContextCurrent(pContext);
// Встановлення параметрів слухача
// Розташування
alListenerfv(AL_POSITION, ListenerPos);
// Швидкість
alListenerfv(AL_VELOCITY, ListenerVel);
// Спрямованість
alListenerfv(AL_ORIENTATION, ListenerOri);
return true;
}
Першим кроком у методі ініціалізації відкривається звуковий пристрій, заданий за умовчанням. У системах Win32 за умовчанням використовується DirectSound. Якщо необхідно явно задати бажаний пристрій, замість NULL у функцію alcOpenDevice() передається рядок із назвою пристрою.
Наступним кроком створюється контекст, який встановлюється поточним, тобто активним. Усі подальші операції будуть застосовані тільки для поточного контексту. Аудіо контекстів може бути безліч.
Далі відбувається налаштування параметрів слухача. Для кожного контексту можна створити лише одного слухача.
Деініціалізація
void DestroyOpenAL()
{
// Очищення усіх буферів
for (TBuf::iterator i = Buffers.begin(); i != Buffers.end(); i++)
alDeleteBuffers(1, &i->second.ID);
// Вимкнути поточний контекст
alcMakeContextCurrent(NULL);
// Знищити контекст
alcDestroyContext(pContext);
// Закрити звуковий пристрій
alcCloseDevice(pDevice);
}
Деініціалізація відбувається у зворотному порядку. Спочатку видаляються усі буфери, далі знищується контекст і пристрій.
Завантаження звукового файлу
bool remSnd::Open(const string &Filename, bool Looped, bool Streamed)
{
// Перевірити наявність файлу
ifstream a(Filename.c_str());
if (!a.is_open()) return false;
a.close();
mLooped = Looped;
// Створити джерело
alGenSources(1, &mSourceID);
if (!CheckALError()) return false;
alSourcef (mSourceID, AL_PITCH, 1.0f);
alSourcef (mSourceID, AL_GAIN, 1.0f);
alSourcefv(mSourceID, AL_POSITION, mPos);
alSourcefv(mSourceID, AL_VELOCITY, mVel);
alSourcei (mSourceID, AL_LOOPING, mLooped);
// Визначити розширення файлу
string Ext = ExtractFileExt(Filename).data();
if (Ext == "WAV") return LoadWavFile(Filename);
return false;
}
Функція Open() відкриває файл з назвою Filename, визначає його тип, та готує джерело до програвання даних із буферу. Саме джерело не містить аудіоданих, а містить лише ідентифікатор буфера, в якому ці дані зберігаються.
Параметр Looped означає, що звук буде відтворюватися безкінечно, у циклі.
Параметр Streamed означає, що буде реалізовано потокове відтворення. Це необхідно для фонової музики та великих за об'ємом звуків. За стандартного способу відтворення, всі аудіодані завантажуються у буфер, і відтворюється звідти. Завантаження великих за розміром аудіофайлів у один буфер є нераціональним, оскільки на виконання цієї операції знадобиться тривалий час.
Атрибут mSourceID зберігає унікальний ідентифікатор джерела звуку, що використовується за потреби взаємодії із цим джерелом.
Керування відтворенням звуку
Джерело звуку може перебувати в одному із чотирьох станів: AL_INITIAL, AL_PLAYING, AL_PAUSED, AL_STOPPED. Для того, щоб дізнатися стан джерела необхідно викликати функцію alGetSourcei(), передавши їй як параметр ідентифікатор джерела. Стан AL_INITIAL матиме джерело, яке було проініціалізовано, але ще жодного разу не відтворювало звуку. Стани AL_PLAYING, AL_PAUSED, AL_STOPPED позначають, відповідно, відтворюване, призупинене або зупинене джерело.
void remSnd::Play()
{
alSourcePlay(mSourceID);
}
Play() — починає відтворення, викликом однієї єдиної функції - alSourcePlay(), передаючи їй як параметр ідентифікатор джерела.
void remSnd::Close()
{
alSourceStop(mSourceID);
if (alIsSource(mSourceID)) alDeleteSources(1, &mSourceID);
}
Close() — зупиняє відтворення, і видаляє джерело по заданому ідентифікатору.
void remSnd::Stop()
{
alSourceStop(mSourceID);
}
Процедура Stop() зупиняє відтворення звуку, якщо таке мало місце.
void remSnd::Move(float X, float Y, float Z)
{
ALfloat Pos[3] = { X, Y, Z };
alSourcefv(mSourceID, AL_POSITION, Pos);
}
Move() рухає джерело згідно з новими координатами.
Підтримувані платформи
OpenAL реалізований на наступних платформах:
- Android (через OpenSL ES)
- AmigaOS 3.x
- Bada
- BlackBerry 10
- BlackBerry PlayBook
- BSD
- iOS (через Core Audio)
- IRIX
- Linux (через ALSA, OSS, PortAudio та PulseAudio)
- Mac OS 8, Mac OS 9 and Mac OS X (Core Audio)
- Microsoft Windows (через DirectSound, Windows Multimedia API та Windows Multimedia Device (MMDevice) API)
- MorphOS
- OpenBSD[5]
- Solaris
- QNX
- AROS
Ігрові консолі:
Додатки, що використовують OpenAL
Ігри
За інформацією Creative Labs, наступні відеоігри використовують OpenAL:
- 0 A.D.
- America's Army
- Amnesia: The Dark Descent
- Armed Assault
- Battlefield 2
- Battlefield 2142
- Bioshock
- Colin McRae: DiRT
- Dead Hungry Diner
- DiRT 2
- Doom 3
- Enemy Territory: Quake Wars
- Euro Truck Simulator 2
- FlightGear
- Freedom Fighters
- Hitman
- ioquake3
- Jedi Knight 2
- Jedi Knight 3
- Kane & Lynch 2: Dog Days
- Kane & Lynch: Dead Men
- OpenArena
- Osmos
- Penumbra: Black Plague
- Postal²
- Prey
- Psychonauts
- Quake 4
- Race Driver: GRID
- Regnum Online
- Running With Rifles
- S.T.A.L.K.E.R.
- Tremulous
- Unreal II: The Awakening
- Unreal Tournament 2003
- Unreal Tournament 2004
- Unreal Tournament 3
- War§ow
- Warzone 2100
- Wolfenstein
- Wurm Online
Інші додатки
- Blender - середовище для тривимірного моделювання та рендерингу, використовує OpenAL у власному вбудованому ігровому рушії.
- 3DMark06 - ігровий бенчмарк.
- Dolphin (емулятор) - емулятор Gamecube та Wii.
Реалізації
- OpenAL SI
- OpenAL Sample Implementation - оригінальна реалізація від Loki Software, наразі не підтримується.
- OpenAL Soft
- OpenAL Soft - кросплатформова програмна реалізація, що поширюється за LGPL-ліцензією. Розроблюється як сумісна модернізація/заміна для застарілої OpenAL SI, а також як вільна альтернатива наразі пропрієтарної OpenAL. Підтримує одноканальне, двоканальне, 5.1, 6.1 та 7.1 виведення звуку.[6]
- AeonWave-OpenAL
- Шар емуляції OpenAL, що поширюється за LGPL-ліцензією. Головною перевагою є більш досконале апаратне прискорення. За словами автора обробляє AeonWave-OpenAL тривимірний звук від чотирьох (на AMD Athlon 64 X2) до семи (на Intel Atom N270) разів швидше за OpenAL SI та OpenAL Soft за однакових умов.
- Rapture3D OpenAL Driver
- Пропрієтарна, комерційна, програмна реалізація авторства Blue Ripple Sound, призначена виключно для Windows. Позиціонується як швидка високопродуктивна заміна іншим реалізаціям.
Джерела
- The openal Open Source Project on Open Hub: Languages Page — 2006.
- OpenAL License. Архів оригіналу за 30 грудня 2012. Процитовано 30 травня 2013.
- Press release with regards to OpenAL
- OpenAL - Platforms. Архів оригіналу за 2 червня 2013. Процитовано 30 травня 2013.
- OpenAL for OpenBSD
- http://kcat.strangesoft.net/openal.html
Посилання
- ПЗ OpenAL(англ.)
- Керівництво по роботі з OpenAL(англ.)