OpenAL

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку
OpenAL
OpenAL Logo
Тип Прикладний програмний інтерфейс
Автор Loki Software
Розробник Creative Technology
Стабільний випуск 2.0.7.0 (3 червня 2009; 14 років тому (2009-06-03))
Операційна система 15 операційних систем
Мова програмування C[1]
Ліцензія BSD у ранніх версіях,[2] 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 та ентузіастів вільного програмного забезпечення.[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 реалізований на наступних платформах:

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

  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[5]
  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:

Інші додатки[ред. | ред. код]

  • 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. Позиціонується як швидка високопродуктивна заміна іншим реалізаціям.

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

  1. The openal Open Source Project on Open Hub: Languages Page — 2006.
  2. OpenAL License. Архів оригіналу за 30 грудня 2012. Процитовано 30 травня 2013.
  3. Press release with regards to OpenAL. Архів оригіналу за 6 березня 2016. Процитовано 30 травня 2013.
  4. OpenAL - Platforms. Архів оригіналу за 2 червня 2013. Процитовано 30 травня 2013.
  5. OpenAL for OpenBSD. Архів оригіналу за 18 березня 2012. Процитовано 30 травня 2013.
  6. Архівована копія. Архів оригіналу за 20 червня 2013. Процитовано 30 травня 2013.{{cite web}}: Обслуговування CS1: Сторінки з текстом «archived copy» як значення параметру title (посилання)

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