Dokumentace knihovny zvuků

Čas poslední aktualizace 25. Sep 2016 01:29:AM

Úvod

V multimediálních aplikacích se na celkovém dojmu značně podílí zvuk. Zvláště ve hrách pak přidává na realističnosti prostředí a hráč si tak dokáže lépe představit, jaké by to bylo, stát v prostředí hry. Pro využití ozvučení v těchto projektech je vhodné vlastnit nástroj, který udělá za nás co nejvíce práce sám, aby na samotného programátora zbylo pouze používání několika jednoduchých funkcí, které všechny starosti vyřeší za něj. Pro tyto účely vznikla tato knihovna zvuků, která je postavena na zvukovém aplikačním rozhraní OpenAL. Je multiplatformní, protože je napsaný v c++ bez závislostí na operačním systému a používá pouze knihovnu OpenAL a Vorbis file, které jsou také multiplatformní.

Tento modul je primárně určen pro hry nebo pro aplikace, kde lze využít prostorový zvuk. Umožňuje vytvářet zdroje zvuku, nastavovat jim pozici a směr pohybu v prostoru, přičemž o všechny výpočty výsledné hlasitosti zvuků se stará OpenAL, které je svým stylem funkcí podobný grafické knihovně OpenGL. Podporovanými formáty zvukových souborů je WAV a OGG a jejich data se načtou do paměti vcelku, takže streamování není podporováno. Zvuková data lze sdílet mezi jednotlivými zdroji zvuku ve scéně a tím se sníží paměťová náročnost a redundance, protože každý zvukový záznam v databázi bude unikátní.

Soubory

Soubory knihovny zvuků

Text

Závislosti

Obsah

Vlastnosti

Include

Pro použití knihovny zvuků je potřeba ve vašem projektu naincludovat:

#include "soundslib.h"

Upozornění: V hlavičkovém souboru soundslib.h je definován adresář s modely, který je nastaven na "Sounds/". Pokud chcete mít modely v jiné složce, tak hodnotu přepište.

Vytvoření virtuálního zvukového zdroje

Nejprve vytvoříme nový SoundElement (virtuální zdroj) a poté načteme data.

SoundElement zvuk1, zvuk2;
if( !soundLibrary.loadSound( zvuk1, "soubor.wav" ) )
chyba;

Pokud se zvuk používá poprvé, tak se data načtou ze souboru. Pokud už byl zvuk jednou použit, tak se nastaví jen příslušné informace a nic se ze souboru nemusí nahrávat.

Funkce vrátí vrátí false, pokud soubor neexistuje.

Pokud teď budu chtít použít stejný zvuk, ale pro jiný zdroj, tak použiju stejnou funkci. Rozdílem ale je, že v tomto případě už se nebude se souborem soubor.wav pracovat, protože data už jsou v paměti.

if( !soundLibrary.loadSound( zvuk2, "soubor.wav" ) )
chyba;

Přehrávání

Přehrávání zvuků je velice jednoduché:

zvuk1.play();

Přehrávání s opožděným startem

Kromě obyčejného přehrávání můžeme zvuk zaregistrovat a začít přehrávat až po uplynutí určitého času. K tomu využijeme následující kód:

soundLibrary.postSoundPlay( &zvuk1, 1000 ); //zpoždění startu o 1 sekundu

Aby tato funkce fungovala, je nutné periodicky volat funkci run(), která zkontroluje, jestli se nemá nějaký zvuk začít přehrávat:

soundLibrary->run();

Parametry zvuků.

Každý virtuální zvuk má několik parametrů, které mu lze nastavit. Pro výčet všech doporučuji projít zdrojový kód nebo dokumentaci. Z těch nejdůležitějších je například pozice, opakování, rychlost pohybu a nebo relativní pozice vzhledem k posluchači.

zvuk1.setPosition( 1, 0, 0 ); //pozice
zvuk1.setLooping( AL_TRUE );
zvuk1.setVelocity( 3, 2, 1 ); //vektor rychlosti
zvuk1.setSourceRelative( AL_FALSE ); //relativní pozice vzhledem k posluchači

Vlastnosti posluchače.

Dále můžeme nastavovat parametry posluchači. Zde se nastavuje pozice, rychlost a orientace.

soundLibrary.setListenerPosition( 0, 0, 0 ); //pozice
soundLibrary.setListenerVelocity( 0, 0, 0 ); //vektor rychlosti pohybu
soundLibrary.setListenerOrientation( 1, 0, 0, 0, 0, 1 ); //orientace ( 1. vektor pohledu, 2. vektor směr nahoru )

Pokročilé vlastnosti

Zvláště u vlastnosti 'relativní pozice zdroje vzhledem k posluchači' je vhodné nastavit globálně tuto vlastnost pro nově vytvářené zdroje. Například chceme, aby byl zvuk slyšet pořád stejně nezávisle na pozici posluchače, což může být například hudba a nebo zvuky, které vydává hráč.

soundLibrary.pushAttrib(); //uložíme dosavadní parametry
soundLibrary.setDefaultRelativity( AL_TRUE );

....
vytvoříme zvukové zdroje
....
....
soundLibrary.popAttrib(); //obnovíme staré parametry

Další věc se týká přidělování hardwarových zdrojů. Doporučuji nejdříve přečíst dokumentační text. Knihovna umožňuje rezervování hardwarového zdroje a ten pak lze globálně přiřazovat nově vytvářeným virtuálním zdrojům.

soundLibrary.reserveSource( 0 ); // rezervuje hardwarový zdroj s indexem 0
soundLibrary.pushAttrib(); //uložíme dosavadní parametry
soundLibrary.setDefaultForceSourceUse( AL_TRUE ); //nastavíme nutnost používání aktuálního hardwarového zdroje
soundLibrary.setDefaultSourdeId( 0 ); //hardwarový zdroj s indexem 0, který sme si rezervovali, se stane aktuálním

....
vytvoříme virtuální zvukové zdroje (všechny pak budou používat pouze hardwarový zdroj s indexem 0 a přehrávat se bude moci vždy jen jeden, čehož se využívá právě u zvuků, které mají vlastnost, že hraje vždy pouze jeden, jak například zvuky různých zbraní hráče, protože hráč může mít v ruce vždy jen jedinou zbraň.)
....
....
soundLibrary.popAttrib(); //obnovíme staré parametry

Smazání zvuku

Pokud už zvuk dále nechceme používat, zavoláme:

soundLibrary.unloadSound( zvuk1 );

Tím se sníží počet referencí zvukových dat o jedna. Pak můžeme zavolat funkci, která otestuje počet uživatelů každého zvuku v databázi a pokud je hodnota rovna nule, tak se data smažou z paměti.

soundLibrary.checkSoundsUsage();

Vyprázdnění knihovny

Při ukončení programu je vhodné zavolat následující funkci, která smaže všechny data v knihovně.

soundLibrary.destroy();

Literatura

Pro pochopení některých funkcí je vhodné si přečíst vlastnosti knihovny v dokumentačním textu. Pro další informace je možné se přečíst články na ostatních odkazech.

Dokumentační text knihovny zvuků
Domovská stránka OpenAL ( popis, dokumentace, referenční manuál )
Wikipedia o OpenAL
Tutoriál o OpenAL
Tutoriál o OpenAL a Ogg vorbis
Stránky Fmod
Domovská stránka Vorbis