FMOD - sound system - Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



C/C++

FMOD - sound system

29. listopadu 2001, 00.00 | Kvalitního zvuku není nikdy dost, a proto je potřeba spolehlivý sound system. Jeden se jmenuje fmod a přečíst si o něm můžete v tomto článku.

Dnes jsem si pro vás připravil povídání o velice kvalitním zvukovém systému, který se jmenuje fmod. Musím říci, že jsem na něj narazil úplně náhodou při svých pravidelných toulkách po všemožných programátorských stránkách na internetu. A když čtete v titulku stránky "Playing MP3/WAV" , jak říkám, to se musí vyzkoušet.

Oficiální stránka:
www.fmod.org

Aby vaše hra byla opravdu dobrá, musí mít dobrou atmosféru. Té docílíte kvalitním a strhujícím zvukem.
Aby vaše multimediální dílo bylo dokonalé, musí být kvalitně ozvučené.
A aby jste překonali kultovní přehrávač WinAmp, musíte použít knihovnu fmod.

Pokud se řídíte při programování svého multimediálního dílka podobnými hesly jako já, potřebujete velmi kvalitní sound systém. A kde jej hledat? Jako první bych prstem ukázal na MediaPlayer, komponenta v C++ Builderu (Delphi) slouží k přehrávání nejrůznějších multimediálních formátů (taková "děvka" pro všechno). Práce s ní je velmi jednoduchá, zvládá hodně formátů (avi, wav, mp3 ...). Přesto je pomalejší a nehodí se do projektů, kde je důležitá rychlá odezva. Další velmi dobrou možností je sáhnout přímo po DirectX nebo velmi oblíbené sadě komponent DelphiX, kde máme možnost využít přímo komponenty DXSound a DXWave. S těmito nástroji se pracuje rovněž pohodlně. Já nabízím alternativu fmod.

Knihovna fmod slouží výhradně pro práci se zvukem a rozchodíte ji ve velkém množství systémů jako je Windows, Linux a dokonce i WinCE. Podporuje velkou škálu zvukových formátů, od wav, midi, mod po formáty s3m a hlavně velmi populární mp3. Kromě toho fmod podporuje i 3D zvuk a velké množství efektů (jako vkládání prostředí, pokud to karta podporuje).

Rozchodíme ji ve velkém množství programovacích nástrojů: v C++ Builderu, Visual C++, Watcom, ale i Delphi, Visual Basic a MASM.

Jednoduchý přehrávač zvukových souborů (BC++ Builder)

Lépe vám fmod nepředstavím než při práci v konkrétním programu. Uděláme si velmi jednoduchý přehrávač zvukových souborů MOD, S3M, XM, IT, MID, RMI, SGT, WAV, MP2, MP3,OGG, WMA, ASF.

Takže pěkně po pořádku, knihovnu si stáhněte na oficiálních stránkách (viz úvod). V současné době je k dispozici verze 3.4.
Ze staženého archivu si překopírujte do adresáře s nový projektem soubor fmod.dll. Dále navštívíme adresář inc a přehrajeme hlavičkový soubor fmod.h. A do třetice ještě potřebujeme statickou knihovnu fmodbc.lib (pro borlandovské prostředí). Můžeme začít programovat.
#include "fmod.h"
Zpřístupníme funkce knihovny fmod.
#pragma comment(lib, "fmodbc.lib")
Přilinkujeme knihovnu fmod k programu. Definujeme potřebné proměnné a ukazatele.

FSOUND_SAMPLE *pSound;  // vrací ukazatel na záznam
int soundChannel = 0;
char *sname;

Teď již můžeme inicializovat zvukový systém.

 // testuje správnost verze fmod
if (FSOUND_GetVersion() < FMOD_VERSION)
Application->MessageBox("Chyba ve verzi.", "!!!", MB_OK); // nastartuje sound systém na 44 Khz
if (!FSOUND_Init(44100, 32, FSOUND_INIT_GLOBALFOCUS))
Application->MessageBox("Chyba pri inicializaci","!!!", MB_OK);

Funkce FSOUND_Init inicializuje zvukový systém a v nápovědě je popsána takto:
signed char F_API FSOUND_Init(int mixrate,int maxsoftwarechannels,unsigned int flags);
mixrate - nastavuje výstupní vzorkování, čím vyšší hodnota, tím kvalitnější výstup. Hodnota se zadává v Hz mezi 4000 a 65535 (obvykle 48khz, 44 khz, 22 khz, 11 khz ...).
maxsoftwarechannels - udává počet kanálů, které se budou softwarově používat (maximální použitelná hodnota se zjistí FSOUND_GetMaxChannels ).
flags - u této hodnoty se help rozchází s komentářem hlavičkového souboru, takže doporučuji FSOUND_INIT_GLOBALFOCUS.

  char *dname;
// vrací ukazatel na jméno ovladače (podle pořadí GetDriver) dname = FSOUND_GetDriverName(FSOUND_GetDriver()); Label4->Caption = dname; AnsiString DJmeno; for (int i = 0; i < FSOUND_GetNumDrivers(); i++) { dname = FSOUND_GetDriverName(i); DJmeno = dname; ListBox1->Items->Add(DJmeno); }

V cyklu vyplníme listbox seznamem ovladačů. GetNumDrivers vrátí počet ovladačů a pomocí funkce GetDriverName vyplníme celý seznam. Do této funkce dosazujeme pořadové číslo ovladače.

FSOUND_StopSound(soundChannel);
pSound = FSOUND_Sample_Load(FSOUND_FREE, dlgOpen->FileName.c_str(),0,0);
if (!pSound)
  Application->MessageBox("Soubor se nepodarilo nacist.", "!!!", MB_OK);

Předtím, než si poslechneme nějakou hudbu, musíme začíst zvukový soubor funkcí FSOUND_Sample_Load, která vrací ukazatel na zvukový záznam. Pokud funkce vrátí hodnotu NULL, soubor se nenačetl.

soundChannel = FSOUND_PlaySound(FSOUND_FREE,pSound);
FSOUND_SetVolume(soundChannel, TrackBar1->Position);
SongAct->Max = FSOUND_Sample_GetLength(pSound);
if (Loop->Checked == true)
 FSOUND_SetLoopMode(soundChannel, FSOUND_LOOP_NORMAL);
else 
 FSOUND_SetLoopMode(soundChannel, FSOUND_LOOP_OFF);

Funkce FSOUND_PlaySound spustí přehrávání zvuku, který zadáme přes ukazatel pSound. Funkce také vrací číslo kanálu, na kterém zvuk přehraje. To je velice užitečné, když chceme nastavit hlasitost výstupu pomocí FSOUND_SetVolume. Nastavujeme hlasitost kanálu v rozmezí od 0 do 255. FSOUND_SetLoopMode nastavuje opakovací mód. Dvě základní možnosti jsou FSOUND_LOOP_NORMAL, to znamená, že se zvuk bude cyklicky opakovat nebo FSOUND_LOOP_OFF znamená, že se zvuk přehraje jednou a dost.

Samozřejmě nemusíte čekat, až se zvuk přehraje a můžete přehrávání kdykoliv přerušit pomocí FSOUND_StopSound(soundChannel);

V ukázkovém příkladu jsem využil navíc ještě pár funkcí, které mají pouze informační charakter:
FSOUND_GetCPUUsage - vrací hodnotu zatížení procesoru v procentech
FSOUND_GetChannelsPlaying - vrací TRUE nebo FALSE, podle toho, jestli daný kanál hraje
FSOUND_GetCurrentPosition(soundChannel) - vrací pozici v přehrávaném souboru (jestli jste v půlce, na konci). Tato hodnota má smysl pouze tehdy, jestli známe celkovou délku nahrávky. To zjistíme pomocí FSOUND_Sample_GetLength(pSound). Pomocí těchto dvou hodnot si lehce spočítáme, na jaké pozici v nahrávce (zvuku) se nacházíme.

Celý příklad si můžete stáhnout zde (360 KB).

Příklad jste jistě vyzkoušeli a zjistili jste, že práce s knihovnou fmod je velice příjemná a dosažené výsledky jsou uspokojující.

Na závěr vám ještě povím, jaké funkce v knihovně najdete a jak je rozdělená. Knihovna je rozdělená na dvě základní části označené FMUSIC a FSOUN. FMUSIC slouží pro práci s moduly a FSOUND naopak pro práci s hudbou, zvuky ze streamem a CD.

V obou částech najdeme podobné funkce základní funkce pro načítání, přehrávání, nastavování hlasitosti atd. Nesmím opomenout, že lze přehrávat na více kanálech naráz, potlačovat šumy měnit frekvenci přehrávání a jiné vymoženosti. Kromě toho systém nabízí možnost využít prostorový zvuk, pokud to vaše zvuková karta podporuje, či filtrovat výstupy různými prostředími (jako jsou místnost, koupelna atd..), ale opět to musí podporovat vaše zvuková karta (např. SB Live, EAX, A3D).

Závěr

Fmod je velice kvalitní zvukový systém, který lze používat na profesionální úrovni. Tomu také odpovídají licenční podmínky. Každá sranda něco stojí. Takže pokud se rozhodnete použít tuto knihovnu do svého freewarového dílka, máte zelenou. Knihovna je pro freeware zcela zdarma. Pokud ale vytváříte shareware zaplatíte za licenci 200 dolarů a za licence pro plnohodnotný software stojí "bratru" 1250 dolarů a jak říkám: "To už se vyplatí". Tím je asi jasné, pro koho je tato knihovna dobrá.

Pokusím se ještě poohlédnout po jiné knihovně, stejně kvalitní, ať máte z čeho vybírat.

 

Tématické zařazení:

 » Rubriky  » C/C++  

 

 

 

Nejčtenější články
Nejlépe hodnocené články

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: