OpenAL

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до: навігація, пошук
OpenAL
OpenAL Logo
Автор(и) Loki Software
Розробник(и) Creative Technology
Стабільний випуск 2.0.7.0 (3 червня 2009; 1965 днів тому)
Операційна система 15 операційних систем
Тип Прикладний програмний інтерфейс
Ліцензія BSD у ранніх версіях,[1] LGPL до v1.1, власницьке від v1.1
Сайт www.openal.org

OpenAL (Open Audio Library) — кросплатформовий прикладний програмний інтерфейс (API) для роботи з аудіоданими. Розроблявся для ефективної взаємодії з багатоканальним звуком у тривимірному просторі. Ранні версії OpenAL мали відкритий початковий код, однак більш пізні ревізії є власницьким програмним забезпеченням.

Історія[ред.ред. код]

OpenAL був створений фірмою Loki Software у 2000 році як інструмент для їх бізнесу - портування комп’ютерних ігор з Windows на Linux. Після того, як Loki Software припинила своє існування проект певний час розвивався силами спільноти вільного програмного забезпечення, зокрема була реалізована підтримка чіпсета, вбудованого в звукові адаптери та материнські плати NVIDIA nForce. Сьогодні куратором (та головним розробником) проекту є Creative Technology. Поточну підтримку OpenAL отримує від Apple, Blue Ripple Sound та ентузіастів вільного програмного забезпечення.[2]

Хоча хартія 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 реалізований на наступних платформах:

Операційні системи:[3]

  1. Android (через OpenSL ES)
  2. AmigaOS 3.x
  3. Bada
  4. BlackBerry 10
  5. BlackBerry PlayBook
  6. BSD
  7. iOS (через Core Audio)
  8. IRIX
  9. Linux (через ALSA, OSS, PortAudio та PulseAudio)
  10. Mac OS 8, Mac OS 9 and Mac OS X (Core Audio)
  11. Microsoft Windows (через DirectSound, Windows Multimedia API та Windows Multimedia Device (MMDevice) API)
  12. MorphOS
  13. OpenBSD[4]
  14. Solaris
  15. QNX
  16. AROS

Ігрові консолі:

  1. GameCube
  2. PlayStation 2
  3. PlayStation 3
  4. Xbox
  5. Xbox 360
  6. Wii
  7. PlayStation Portable

Додатки, що використовують 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 виведення звуку.[5]
AeonWave-OpenAL
Шар емуляції OpenAL, що поширюється за LGPL-ліцензією. Головною перевагою є більш досконале апаратне прискорення. За словами автора обробляє AeonWave-OpenAL тривимірний звук від чотирьох (на AMD Athlon 64 X2) до семи (на Intel Atom N270) разів швидше за OpenAL SI та OpenAL Soft за однакових умов.
Rapture3D OpenAL Driver
Пропрієтарна, комерційна, програмна реалізація авторства Blue Ripple Sound, призначена виключно для Windows. Позиціонується як швидка високопродуктивна заміна іншим реалізаціям.

Джерела[ред.ред. код]

Посилання[ред.ред. код]