[Grafika] [WebTip] [Fotografování] [Galerie] [MujMac] [Printing]
  Redakce: info (at) builder.cz   Inzerce: reklama (at) grafika.cz
Diskuzní fóra
.Net (68468)
ASP (1591)
ActiveX (168)
Allegro (136)
Assembler (3926)
C++ Builder (23160)
C/C++ (44499)
Databáze (30680)
Delphi (78806)
DelphiX (1655)
DirectX (1464)
Java (39508)
JavaScript (12598)
Matematické programy (2178)
OOP a UML (732)
OpenGL (6920)
Php (65224)
PowerBuilder (464)
Problémy a algoritmy (10473)
Programování v Linuxu (2000)
Právo a programování (3384)
Python (1353)
Ruby (136)
Visual Basic (12078)
Visual C++ (12956)
Wap (56)
Web (10895)
Web servery (5549)
Win32 (13553)
Windows CE (865)
XML/XSL (1860)
Textová inzerce
Služby Builder.cz
  • Bazar - koupím(0)
  • Bazar - prodám(0)
  • Hledám práci(0)
  • Nabízíme práci(0)
  • Projekty(0)
  • Allegro - Hudba a zvuky (8. díl)
    První seznámeni s hudbou v Allegru, které nás zavede do přehrávání WAV souborů.
    Allegro - Knihovna pro programování her
    Předchozí díl: Allegro - Instalace a konfigurace (7. díl)

    Následující díl: Allegro - Midi a zvukové proudy (9. díl)
    Autor: Matoušek Pavel
    Rubrika: C/C++
    Publikováno: 04.03. 2002
     Tisk článku
    Poslat odkaz emailem
     

    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.


    Zpět na začátek stránky

    Pavel Matoušek
    Osobní stránky autora naleznete na www.pmatousek.com

    Hodnocení článku
    1 | 2 | 3 | 4 | 5
    Aktuální známka: 2.62
    (Počet známek: 3513)

    Komentáře k článku
    -- Žádné příspěvky --
    Přidat příspěvek




    info@builder.cz
    Vydává Grafika Publishing, s.r.o.
    Copyright (c) 1997-2002 Všechna práva vyhrazena