Hlavní navigace

Knihovna ClanLib (26)

Petr Kavánek 8. 11. 2004

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?

9. 11. 2004 14:57

Petr Kavanek (neregistrovaný)

No vidite, tak to mi davate docela zajimavy namet :-). Me by asi taky vic bavilo psat o tvorbe hry, ale ten serial by se musel jmenovat trochu jinak ... zkusim se zeptat, jestli by Root nemel o neco takoveho zajem.

Co se tyce tech poslednich clanku, tak to je vas pohled na vec a nejspis je to prevazujici pohled, protoze opacny nazor sem nikdo nenapsal.

Muj pohled vychazel z me vlastni zkusenosti, ze nez bych hledal v dokumentaci navic neceske informace o tak jednoduchych tridach, tak bych…



8. 11. 2004 21:20

Pavel (neregistrovaný)

No, jde o to, ze treba mne by prisla tvorba hry daleko zajimavejsi. Kdyz jsem mluvil o manualu, mel jsem na mysli skutecne overview na strankach ClanLibu (dnesni dil viz. http://www.clanlib.org/docs/overview/sound_overview.html). Je to sice strucnejsi nez text tady, ale dle meho nazoru dostatecne.
Pokud jde o predchazejici dva dily, ty se daly shrnout do jednoho odstavce. Uplne stacilo rict, ze ty tridy jsou. Metody (vzhledem k jejich jednoduchosti) by snad byl kazdy schopny najit v dokumentaci…

Měšec.cz: U levneELEKTRO.cz už reklamaci nevyřídíte

U levneELEKTRO.cz už reklamaci nevyřídíte

Měšec.cz: Kdy vám stát dá na stěhování 50 000 Kč?

Kdy vám stát dá na stěhování 50 000 Kč?

DigiZone.cz: ČRo rozšiřuje DAB do Berouna

ČRo rozšiřuje DAB do Berouna

Podnikatel.cz: Přehledná titulka, průvodci, responzivita

Přehledná titulka, průvodci, responzivita

DigiZone.cz: ČRa DVB-T2 ověřeno: Hisense a Sencor

ČRa DVB-T2 ověřeno: Hisense a Sencor

Podnikatel.cz: Na poslední chvíli šokuje vyjímkami v EET

Na poslední chvíli šokuje vyjímkami v EET

Vitalia.cz: Jsou čajové sáčky toxické?

Jsou čajové sáčky toxické?

Vitalia.cz: „Připluly“ z Německa a možná obsahují jed

„Připluly“ z Německa a možná obsahují jed

Vitalia.cz: Paštiky plné masa ho zatím neuživí

Paštiky plné masa ho zatím neuživí

Podnikatel.cz: Prodává přes internet. Kdy platí zdravotko?

Prodává přes internet. Kdy platí zdravotko?

DigiZone.cz: Sony KD-55XD8005 s Android 6.0

Sony KD-55XD8005 s Android 6.0

Vitalia.cz: 9 největších mýtů o mase

9 největších mýtů o mase

Lupa.cz: Google měl výpadek, nejel Gmail ani YouTube

Google měl výpadek, nejel Gmail ani YouTube

Lupa.cz: Co se dá měřit přes Internet věcí

Co se dá měřit přes Internet věcí

Vitalia.cz: Láska na vozíku: Přitažliví jsme pro tzv. pečovatelky

Láska na vozíku: Přitažliví jsme pro tzv. pečovatelky

Vitalia.cz: Tesco: Chudá rodina si koupí levné polské kuře

Tesco: Chudá rodina si koupí levné polské kuře

120na80.cz: Rakovina oka. Jak ji poznáte?

Rakovina oka. Jak ji poznáte?

Vitalia.cz: Baletky propagují zdravotní superpostel

Baletky propagují zdravotní superpostel

Lupa.cz: UX přestává pro firmy být magie

UX přestává pro firmy být magie

Vitalia.cz: To není kašel! Správná diagnóza zachrání život

To není kašel! Správná diagnóza zachrání život