Hlavní navigace

Knihovna ClanLib (26)

Petr Kavánek

V dalším pokračování seriálu si uděláme úvod do práce se zvuky v programech využívajících knihovnu ClanLib. Ukážeme si, jak je možné přehrát klasické .wav soubory. Tyto základní znalosti nám v příštích dílech umožní přehrávat i .ogg a .xm soubory a dynamicky měnit vlastnosti zvuků (např. hlasitost nebo váhu) během jejich přehrávání.

CL_SetupSound

Abychom mohli používat hudební podporu v našem programu, bude třeba inicializovat příslušný modul sloužící k přehrávání hudby. Tímto modulem je CL_SetupSound. Už nás asi nepřekvapí, že bude třeba naincludovat příslušný hlavičkový soubor a modul inicializovat před prvním použitím jeho funkcí. Na konci programu bychom ho neměli zapomenout deinicializovat:

#include <ClanLib/sound.h>
        ...
CL_SetupSound::init();
        ...
CL_SetupSound::deinit();

Od chvíle, kdy inicializujeme CL_SetupSound, budeme moci využít dvě třídy nezbytné pro přehrávání zvuků. Jsou jimi CL_SoundOutput a CL_SoundBuffer.

CL_SoundOutput

CL_SoundOutput si můžete představit jako jakýsi ovladač hlavního zvukového výstupu. Hlavní zvukový výstup vznikne smíšením všech aktuálně přehrávaných zvuků. To znamená, že nastavení CL_SoundOutput ovlivňují globálně všechny přehrávané zvuky.

Jak popis napovídá, nemělo by příliš rozumný smysl v danou chvíli používat více Cl_SoundOutputů, proto obvykle na začátku hned po inicializaci CL_SetupSound vytvoříme jeden globální zvukový výstup:

        ...
CL_SetupSound::init();
CL_SoundOutput vystup(44100);
        ...

Číslo 44100 předané jako parametr konstruktoru představuje frekvenci, kterou chceme používat.

K dispozici pak budeme mít následující metodu umožňující globální nastavení přehrávaných zvuků:

float get_global_volume() const;
void set_global_volume(float volume);

Pomocí první z metod zjistíme, jaká je právě nastavená hlasitost, pomocí druhé ji můžeme nastavit.

float get_global_pan() const;
void set_global_pan(float pan);

Pomocí první metody zjistíme, jaká je právě nastavená váha zvukového výstupu, druhá metoda nám umožňuje váhu nastavit.

int get_mixing_frequency() const;

Tato metoda nám umožní zjistit, jakou jsme na začátku nastavili frekvenci.

void stop_all();

Podle očekávání zastaví veškeré přehrávání.

CL_Sound

Tato třída slouží k usnadnění práce s CL_SoundOutput. Bylo by totiž docela otravné, kdybychom museli všude tam, kde chceme měnit globální zvukové nastavení programu, předávat ukazatel na CL_SoundOutput. Naštěstí máme k dispozici třídu CL_Sound a její statickou metodu:

static CL_SoundOutput *get_current_output();

Tato metoda vrátí ukazatel na aktuálně používaný CL_SoundOutput, a když říkám aktuálně používaný, musím dodat, že pomocí následně uvedené metody dokonce můžeme nastavit jiný aktuálně používaný CL_SoundOutput, což nám konec konců občas může ulehčit práci:

static void select_output(CL_SoundOutput *output);

CL_SoundBuffer

Třída CL_SoundBuffer reprezentuje vlastní sample, který chceme přehrávat, a samozřejmě toto přehrání umožňuje. Můžeme ho vytvořit buď tak, že konstruktoru předáme přímo cestu k příslušnému .wav souboru, nebo pro ClanLib řekl bych typičtějším a užitečnějším způsobem využívajícím soubor zrdojů.

První způsob může vypadat třeba nějak takto:

CL_SoundBuffer sample("zvuk.wav");

Druhý způsob vyžaduje nejprve vytvoření příslušné položky v souboru zdrojů (např. zdroje.xml), jako je tomu například zde:

<resources>
  <sample name="zvuk" file="zvuk.wav" />
</resources>

Nyní již postupujeme obvyklým způsobem:

        ...
CL_ResourceManager zdroje("zdroje.xml");
        ...
CL_SoundBuffer sample("zvuk", &zdroje);
        ...

Takto vytvořený CL_SoundBuffer již můžeme jednoduše přehrát zavoláním jeho metody play().

sample.play();

Chceme-li, aby se sample přehrával dokola, zavoláme

sample.play(true);

Dalšími užitečnými metodami jsou:

float get_volume() const;
void set_volume(float new_volume);

float get_pan() const;
void set_pan(float new_pan);

bool is_playing() const;

void stop();

Význam těchto metod je obdobný jako u CL_SoundOutput. Důležité však je uvědomit si, že nastavení provedená pomocí nich se neprojeví na zvucích, které jsou již v danou chvíli přehrávány, ale až na zvucích, které přehrajeme po této změně. Tuto problematiku si však necháme až na příště. Dnes jen naznačím, že volání metody play() vytvářejí objekty třídy CL_SoundBuffer_Ses­sion, které si poté žijí svým autonomním životem. Metoda stop() zastaví přehrávání všech těchto CL_SoundBuffer_Ses­sion.

Závěr

Nemusíte se bát – to není vše, co ClanLib umí. ClanLib nám poskytuje dostatek nástrojů, abychom mohli například měnit hlasitost přehrávaného zvuku dynamicky během jeho přehrávání. Umožňuje také přehrávat kromě .wav souborů i soubory .ogg (Vorbis) a .xm (MikMod), jak se ostatně budete moci dočíst v dalších dílech seriálu.

Našli jste v článku chybu?