Loading AI tools
кросплатформовий прикладний програмний інтерфейс для роботи з аудіоданими З Вікіпедії, вільної енциклопедії
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).
Однією з відмінностей версії 1.1 стало додавання API, призначеного для запису звуку (Recording API).
Додана також можливість позиціонування всередині джерела звуку (за часом або за семплами).
Фактично скасована бібліотека ALUT, замість неї в SDK запропонована інша бібліотека, на основі якої і зроблені всі приклади з SDK.
Було проведено уточнення документації, додано декілька нових моделей обрахунку відстані до джерела звуку, додані нові типи даних ALchar і ALCchar.
Тепер функція alcCloseDevice повертає значення типу ALCboolean для позначення успішності операції.
Однак найбільш цікавою можливістю стала підтримка звукових фільтрів і ефектів за допомогою розширення ALC_EXT_EFX.
Дане розширення додає в OpenAL підтримку звукових фільтрів і ефектів для виведеного звуку. Акуратне використання даного розширення дозволяє радикально змінити звуковий світ вашої програми або гри. Розширення EFX вводить нову архітектуру обробки звуку в OpenAL. Тепер до будь-якого джерела звуку можна додати безпосередній (direct) фільтр (зазвичай використовується low-pass або high-pass фільтри, тобто фільтри, що утворюють високі або низькі частоти). Звук, після проходження через безпосередній фільтр відразу ж прямує до вихідного мікшеру.
Крім цього з'явилася можливість для джерел звуку посилати дані (при необхідності з обробкою їх фільтром) на додаткові канали виходу (slots). До кожного такого каналу можна підключити певний звуковий ефект, що перетворює звукові дані, які після цього також надходять на вихідний мікшер.
За рахунок використання звукових фільтрів і ефектів стало можливим моделювати звукове оточення для слухача. Так можна задати обробку звуку, що моделює знаходження слухача у певному приміщенні. У реальному житті подібні ефекти оточення виникають за рахунок багаторазового відбиття і поглинання (а також розсіювання) звуку стінами (а також підлогою та стелею) приміщення. Так якщо джерело звуку знаходиться всередині приміщення, то будуть відбуватися численні перевідбиваня звуку від стін, підлоги та стелі.
При цьому як розмір приміщення, так і матеріал, з якого виготовлені його стіни, підлогу та стелю, будуть чинити сильний вплив на те як сприймається слухачем результуючий звук. За задумом розробників OpenAL кожен ефект відповідає певному приміщенню (environment), а використовувані фільтри дозволяють більш точно враховувати особливості поширення та відбиття звуку.
Різні звукові карти підтримують як різне число одночасно працюючих ефектів, так і різні типи ефектів.
Для того щоби розпочати роботу з 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 реалізований на наступних платформах:
Ігрові консолі:
За інформацією Creative Labs, наступні відеоігри використовують OpenAL:
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.