Allegro - Hudba a zvuky (8. díl) - 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++

Allegro - Hudba a zvuky (8. díl)

4. března 2002, 00.00 | První seznámeni s hudbou v Allegru, které nás zavede do přehrávání WAV souborů.

Dodatek


Na upozornění jednoho čtenáře bych s dovolením využil z Allegra o možnost více a to o funkci 

void allegro_message(char *msg, ...);

která má formátování jako funkce printf. Je nutné ji použít pouze v textovém módu, kde má standardní výstup. Používá se s externí proměnou extern char allegro_error[ALLEGRO_ERROR_SIZE]; která v sobě nese informace o tom, ke které chybě došlo.

Malý příkládek

if (set_gfx_mode(GFX_SAFE, 320, 200, 0, 0) != 0) 
{
  set_gfx_mode(GFX_TEXT, 0, 0, 0, 0);
  allegro_message("Nelze nastavit grafický mód.\n%s\n", 
                  allegro_error);
  return 1;
}

To by mělo stačit k allegro_message, abyste nebyli překvapeni jakou funkci to používám.

Hudba je důležitá...


Ano je to tak. Dneska už snad nevyjde na světě hra, která by byla bez hudby a zvuků. A proto po částečném vysvětlení grafiky, která ještě nekončí je čas se taky seznámit s hudbou a zvukem.

V Allegru je to podobné...


V knihovně Allegro, když chcete téměř cokoliv použít musíte to nejdřív nainstalovat. To většinou v Allegru znamená inicializaci proměnných a několik málo nastavení. Slouží k tomu funkce, která se skládá ze dvou názvů oddělných znakem "_". První název je install a druhý může být například keyboard, mouse atd. A u zvuku je to slovo sound. To znamená, že jako první než začneme pracovat s Allegrem je potřeba zavolat funkci 

int install_sound(int digi, int midi, const char *cfg_path);

a ta se nám postará o již zmiňovanou inicializaci. Některé instalační funkce mají parametry a některé ne. To není žádná vada. My se k jednotlivým parametrům hned dostaneme.

Jaké formáty Allegro umí?


Tak jako první bych zmínil soubor typu wav nebo voc. Dále umí Allegro přehrávat i midi soubory nebo tzv. "audio stream" (přeložil bych to jako zvukové proudy, ale nejsem si jist). Také pro Allegro není problém nahrávat zvuk z mikrofonu. Dnešní díl nám řekne o formátech wav nebo voc, protože se k tomu používají stejné funkce..

Formát WAV a VOC

Jako tomu bylo u obrázků kde nám sloužila pro načtení struktura BITMAP Allegro pro tento druh zvuk. souboru typ SAMPLE.

Definovám v hlav. souboru je takto:

typedef struct SAMPLE             /* a sample */
{
   int bits;                      /* 8 or 16 */
   int stereo;                    /* sample type flag */
   int freq;                      /* sample frequency */
   int priority;                  /* 0-255 */
   unsigned long len;             /* length (in samples) */
   unsigned long loop_start;      /* loop start position */
   unsigned long loop_end;        /* loop finish position */
   unsigned long param;           /*for internal use by the driver*/
   void *data;                    /* sample data */
} SAMPLE;

Do vlastní struktury zasahovat přímo nebudeme, protože k tomu máme již funkce, ale je dobré vědět jak taková struktura SAMPLE vypadá. I když jsem ponechal anglické komentáře, myslím si, že není potřeba jednotlivé položky nějak představovat.

Nejlepší bude si vše vysvětlit na zdrojovém příkladě:

#include "allegro.h"

int main(int argc, char *argv[])
{
   SAMPLE *the_sample;

   allegro_init();

   install_keyboard();

   if (argc != 2) {
      allegro_message(
        "Pouziti: 'allegro8_1.exe jmeno_souboru.[wav|voc]'\n");
      return 1;
   }

   if (install_sound(DIGI_AUTODETECT, MIDI_NONE, argv[0]) != 0) {

      allegro_message("Chyba pri inicializaci hudby\n%s\n",
       allegro_error);

      return 1;
   }

   the_sample = load_sample(argv[1]);
   if (!the_sample) {
      allegro_message("Chyba pri nacitani '%s'\n", argv[1]);
      return 1;
   }

   play_sample(the_sample, 255, 128, 1000, TRUE);

   do {
   } while ((!key[KEY_ESC]) && (!key[KEY_ENTER]));

   destroy_sample(the_sample);

   return 0;
}
END_OF_MAIN();

Přejdu rovnou k věci. Jako první po spuštění programu si inicializujeme proměnnou the_sample, která je pointer na strukturu SAMPLE a do té později nahrajeme zvuk, se kterým můžeme manipulovat pomocí funkcí.

Funkce 

int install_sound(int digi, int midi, const char *cfg_path);

o které jsem se zmínil již na začátku článku má parametry. Nyní si povíme co jednotlivé parametry znamenají.
Parametr digi, ovládá tzv. digitální formát zvuku a midi ovládá midi soubory. Poslední parametr je zde pro kompatibilitu Allegra se staršími verzemi a můžeme ho tudíž dát NULL nebo např.: jméno našeho spustitelného souboru pomocí parametru argv[0]. První větu, která vyjadřuje použití proměnných jsem neřekl naprosto srozumitelně a je to taky z toho důvodu, že jsem se s tím nikdy neobtěžoval a moc dokumentace k tomu nenašel. A proto nám v našem případě bude stačit, když první parametr dáme DIGI_AUTODETECT a druhý buď MIDI_NONE pokud nebudeme používat midi soubory a nebo podobně MIDI_AUTODETECT pokud budeme chtít přehrávat midi soubory. Tyto dva parametry AUTODETECT nám zajistí, že Allegro si přečte nastavení hardwaru z konfiguračního souboru. Věřím, že tato informace Vám pro psaní programů v Allegru stačí neboť stačila i mne.

K návratovým hodnotám: Pokud vrací funkce 0 je vše v pořádku a -1 při chybě. Příčinu chyby najdete v proměnné allegro_error popsané opět na začátku článku.

Další důležitá funkce je funkce:

SAMPLE *load_sample(const char *filename);

Jako parametr bere jméno zvuk. souboru Wav nebo Voc a vrací pointer na SAMPLE nebo při chybě NULL. Je dobrým zvykem tedy otestovat nahraní zda proběhlo v pořádku či nikoliv. Umí nahrát zvuk Wav v 8 nebo 16 bitů a to bude stereo nebo mono a voc buď 8 nebo taky 16 bitů, ale pouze mono. Tedy takto je to napsáno v manuálu k Allegru a je možné, že to může být i docela jinak. Nejlepší je vše vyzkoušet a taky se rozhodnout co vlastně očekáváte od Vaší hry ;-).

A nyní přichází čas si hudbu nebo zvuk přehrát. A k tomu slouží funkce:

int play_sample(const SAMPLE *spl, int vol, int pan, int freq, int loop);

První parametr netřeba představovat. Jedná se o naší naplněnou strukturu nějakým zvukem.vol je hlasitost přehrávání souboru, která může být v rozmezí 0-255. pan je něco jako balanc u rádia.  Opět nabývá hodnot 0-255, přičemž 128 je rovnoměrně vyvážené a tedy stereo. Předposlední parametr freq, znamená tzv. frekvenci poslechu. Při hodnotě 1000 hraje zvuk tak jak je nahrán. Když dáme 500 máme 2x pomalejší poslech a 2000 je naopak 2x rychlejší poslech apod. Poslední parametr je tzv. příznakový - Může nabývat hodnot TRUE nebo FALSE. FALSE znamená, že se zvuk přehraje "pouze" 1x. TRUE znamená, že se zvuk bude přehrávat pořád dokola. Tedy od toho název proměnné loop
A v této souvislosti se ještě seznámíme s funkcí 

void stop_sample(const SAMPLE *spl);

která nám pomůže ten nekonečný cyklus, bez ukončení programu, zastavit. A šoupneme ji naši strukturu SAMPLE! Musíme tedy stejnou, aby nezastavila jiný zvuk než chceme my!

Pokud chcete měnit při nekonečném přehrávání zvuku balanc, hlasitost, frekvenci apod. A nechcete zvuk zastavit a pouštět ho znovu od začátku poslouží Vám dobře funkce:

void adjust_sample(const SAMPLE *spl, int vol, int pan, int freq, int loop);

kterou zavoláte s novými parametry tedy např.: třeba s menší hlasitostí a balancem pouze na levý reproduktor.

Jako poslední bych představil 

void destroy_sample(SAMPLE *spl);

ale na druhou stranu ani nemusím představovat, protože každý čtenář jistě ví o co jde...

Dneska už bych ale raději doporučil použít formát MP3 vzhledem k velikosti a jeho kompresi. A i když to Allegro standardně neumí tak se pokusím Vás někdy příště seznámit s knihovnou AllegrMP3.

Doporučuji si prostudovat příklad exsample v podadresáři examples.

Obsah seriálu (více o seriálu):

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: