FMOD - Music & sound effects system


Představuje se FMOD
Protože ještě nemam nijak zvlášť prozkoumané součásti DirectX, které pracují se zvukem, rozhodl jsem se umístit zde takovou menší recenzi na jistou alternativu - knihovnu fmod. Její aktuální verzi naleznete zde. V době, kdy jsem psal tento článek, to byla verze 3.63

Je to vynikající sound systém, který podporuje obrovskou škálu zvukových formátů (např. MOD, S3M, XM, IT, MID, RMI, SGT, WAV, MP2, MP3,OGG, WMA, ASF, ...).
Důležité je i to, že tuto knihovnu lze používat jak na systému Windows, tak na systémech Linux, Windows CE, Macintosh ale nově i na GameCube, PS2 & XBox.
Vybírat můžete i z programovacích jazyků, které hodláte použít - FMOD totiž "skousne" jak C/C++, tak i VisualBasic, Delphi, MASM a další.

Je to prostě všestranná knihovna s mnoha funkcema. Pokud chcete vědět více, co se podpory různých technologií týče, mrkněte sem.
Jinak, co se licenčních podmínek týče, je tato knihovna zcela zdarma pouze pro ty, kteří se rozhodnout své dílo vytvořit jako freeware... Ostatní už si musí trochu připlatit. Tak například za jeden produkt pro Win32 musíte z kapsy vytáhnout 2000 USD. Pokud se rozhodnete programovat pro konzole PS2 tak to budete mít za 4000 USD. Částka se však může vyšplhat až na 20000 USD podle počtu licencí. Z toho lze usoudit že se jedná o opravdu kvalitní systém. Ba dokonce jeho autoři uvádí, že některé z jeho funkcí patří mezi nejrychlejší na světě - to už stojí za to ho vyzkoušet, ne? :)

Jak přimět Visual C++ aby spolupracoval s FMOD
Nic na tom není. Prostě si založte nový projekt (Ať už čistě Win32 API nebo s podporou knihovny MFC, je to jen na Vás). První krok, který musíte udělat, je v nastavení projektu - záložka Link - zde přidejte knihovnu fmodvc.lib k ostatním. Poté do zdrojového souboru, ve kterém budete funkce FMOD používat, vložte hlavičkový soubor fmod.h... No a jako poslední - nezapomeňte přidat knihovnu fmod.dll do adresáře s vaším programem:)

Použítí knihovny v praxi
Tak to bysme měli teorii za sebou. Teď už se vrhnem rovnou na popis některých důležitých funkcí, bez kterých se určitě neobejdeme...
Ale teď už s chutí do toho!

Inicializace FMOD
Je to nejdůležitější krok - bez správné inicializace není možno s knihovnou dále pracovat. Tato inicializace se musí provést pouze jednou na začátku programu. Je provedena pomocí funkce FSOUND_Init - ta se musí volat dříve než většina ostatních funkcí FMOD. Zde je její deklarace:

signed char F_API FSOUND_Init(
int mixrate,
int maxsoftwarechannels,
unsigned int flags
);

Tak první parametr udává vzorkovací frekvenci výstupu - přípustné hodnoty jsou od 4000Hz do 65535Hz. Nejpřirozenější je však již zažitý standard 44KHz (44100Hz).
Co znamená druhý parametr už asi tušíte - je to maximalní počet softwarových kanálů. Kanály hardwarové jsou detekuje FMOD automaticky. Po inicializaci můžeme zjistit maximální počet všech dostupných kanálů (SW i HW) pomocí funkce FSOUND_GetMaxChannels.
No a poslední parametr určuje různé flagy... Tak například flag FSOUND_INIT_GLOBALFOCUS způsobí to, že se zvuk přehrává i pokud okno ztratí fokus(není aktivní).

Před touto funkcí je však vhodné ještě zjistit, zda použitá knihovna se schoduje s tou, z které chcete volat funkce. To provedete následujícím kusem kódu:

if (FSOUND_GetVersion() < FMOD_VERSION)
{    MSG_ERR("Špatná verze DLL knihovny FMOD!!);
    //...
}

Její použití je snad jasné...

Otevření zvukového souboru
Je jasné, že než si něco poslechneme, musíme to prvně nějak otevřít:) Teď je asi ten pravý okamžik na to trochu se zmínit o rozdělení knihovny FMOD.
Skládá se ze dvou částí - FSOUND a FMUSIC. Každá slouží k přehrávání něčeho jiného. Takže, pokud budeme chtít přehrávat sekvenční hudební soubory typu .MOD, .S3M, .XM, .IT, .RMI, .SGT .FSB nebo .MID, je na místě FMUSIC se svými moduly. Pro nahrátí souboru do paměti slouží funkce FMUSIC_LoadModule. Ta vrací handle typu FMUSIC_MODULE, které je pak použito ve funkci FMUSIC_PlaySong pro přehrátí daného souboru.
FMUSIC_MODULE * F_API FMUSIC_LoadSong(
const char *name //Jmeno souboru
);

U FSOUND je to krapet jiné. Tuto variantu je vhodné zvolit pro soubory postavěné na PCM nebo komprimované typu .WAV, .MP2, .MP3, .OGG nebo .RAW.
Zde je ale důležité si uvědomit jedno - FMOD, pokud má otevřít nějaký komprimovaný soubor (např. MP3), tak si ho dekomprimuje do paměti pro rychlejší přehrávání. Toto je ideální pro menší soubory, které jsou často přehrávány, například výstřely apod. Pro tento případ použijte pro načtení funkci FSOUND_Sample_Load, která vám pak vrátí handle typu FSOUND_SAMPLE. Tento handle pak dosadíte jako parametr funkci FSOUND_PlaySound a je to.
FSOUND_SAMPLE * F_API FSOUND_Sample_Load(
int index, //vetsinou jen FSOUND_FREE
const char *name_or_data,//Jmeno souboru nebo ukaz. na data
unsigned int inputmode, //soubor nebo data, popis dat
int memlength //velikost bufferu v Bytech
);

Pokud ale budete chtít přehrávat dlouhé a objemné soubory, jako písničky, pak použijte proudy (streams). Použijeme tedy funkci FSOUND_Stream_OpenFile, která soubor otevře a připraví k přehrátí - k tomu už nám dobře poslouží funkce FSOUND_Stream_Play.
FSOUND_STREAM * F_API FSOUND_Stream_OpenFile(
const char *filename //Jmeno souboru nebo ukaz. na data,
unsigned int mode, //ruzne flagy...
int memlength //velikost bufferu v bytech
);

To způsobí že se soubor dekompresuje v reálném čase. O hodně menší nároky na paměť tak nyní kompenzují trochu vyšší požadavky na výkon procesoru(zvlášť když běží více streamů současně). Zatížení procesoru lze mimochodem zjistit voláním funkce FSOUND_GetCPUUsage.

Přehrávání načtených souborů
No tak soubor už máme načtený, tak nezbývá než ho přehrát. Jak už víte, záleží na druhu souboru, tedy na funkci, pomocí které jsme daný soubor otevřeli. Pomocí té vybereme tu správnou funkci na přehrátí souboru.
Tak to vezmeme hezky popořadě. Jako první si tedy představíme funkci FMUSIC_PlaySong:
signed int F_API FMUSIC_PlaySong(
FMUSIC_MODULE *mod //Handle na soubor v pameti
);

Tato funkce vrátí TRUE pokud je soubor přehrán úspěšně, jinak vrací FALSE.

Další funkcí je FSOUND_PlaySound:
int F_API FSOUND_PlaySound(
int channel,
FSOUND_SAMPLE *sptr
);

První parametr indikuje kanál, na kterém se má zvuk přehrát. Raději použijte flag FSOUND_FREE a nechte FMOD vybrat ten nejvhodnější.
Parametr druhý je ukazatel vrácený funkcí FSOUND_Sample_Load.
V případě úspěchu vrací funkce číslo kanálu, na kterém je přehrávána (vhodné pak například pro zesilování atp.), jinak -1.

Poslední funkcí je FSOUND_Stream_Play. Tady je její deklarace:
int F_API FSOUND_Stream_Play(
int channel,
FSOUND_STREAM *stream
);

Zde je situace obdobná jako u předchozí funkce.

Zavření FMOD
Je to opak inicializace, takže se jedná též o velmi důležitou věc. Uvolní se tak veškeré zdroje a paměť. Pokud jste vytvářeli "samply" (FSOUND_SAMPLE) a při načítání nepoužili flag FSOUND_UNMANAGED, tak se o jejich odstranění z paměti postará sám FMOD, jinak si musíte poradit sami. Streamy musíte vždy odstranit vy!
Takže tu funkci, která vše zavře ukončí tak naši práci s FMOD, vidíte níže:
void F_API FSOUND_Close();

Závěr
No to by bylo k této knihovně prozatím vše. Časem si možná vytvoříme malou 3D scénu kde využijeme některé 3D funkce této knihovny. Pokud vás tento článek zaujal a chtěli byste tuto knihovnu využívat pro své programy, tak jsem pro vás vytvořil třídu zapouzdřující nejzákladnější funkce této knihovny. Můžete si ji stáhnout zde. Prosím omluvte možné chybějící nebo přebývající součásti této třídy. Je totiž "vypreparovaná" z jednoho z mých starších projektů a je docela možné, že jsem tam prostě něco nechal, nebo naopak smázl to co sem neměl (ale snad sem to zkontroloval správně:) ).

Poker How To Play Free. The best place for Online Gambling.

Autor: Jiří Pipošiar, napsáno dne 23.6.2003