[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 - MP3 potřetí (19. díl)
    Představíme si nový datový typ a napíšeme si vlastní ukázkový program. Naučíme se, jak pomocí AllegraMP3 nechat přehrávat hudbu automaticky na pozadí a nějaké další užitečné funkce.
    Allegro - Knihovna pro programování her
    Předchozí díl: Allegro - MP3 podruhé (18. díl)

    Obsah článku

    - AllegroMP3
    - Popis ukázkového příkladu
    Autor: Matoušek Pavel
    Rubrika: C/C++
    Publikováno: 10.02. 2003
     Tisk článku
    Poslat odkaz emailem
     

    Poslední dva díly jsme se, stručně řečeno, zabývali příkladem a instalováním knihovny AllegroMP3. Dnešní díl si ukážeme něco nového, co nám může zpříjemnit cestu při programování her. Např. přehrávání hudby na pozadí a také přehrávání stále dokola, bez našeho zásahu.

    Rozdíl mezi ALMP3_MP3STREAM a ALMP3_MP3

    O datové struktuře ALMP3_MP3STREAM a o tom jak funguje jsme si už něco řekli již v minulých dílech. V dnešním díle budeme podrobněji mluvit o struktuře ALMP3_MP3. Ale abych vysvětlil lépe rozdíly, tak malinko připomenu první strukturu.

    ALMP3_MP3STREAM

    Jak z názvu vypovídá jedná se o STREAMING, neboli datové proudy (či proud). Přehrávání probíhá tak, že se do paměti načte kus souboru a ten se začne přehrávat. Později např. v herní smyčce se neustále tento datový proud aktualizuje, nebo spíše se načítá z disku další část souboru, která nahradí tu dosavadní. To znamená, že musíme v programu stále volat "doplňování" našeho souboru v paměti a také dekódování souboru. Výhoda je taková, že tato metoda spotřebuje jen malou část paměti. Počítám tam 100 kb. Podle toho jak velký buffer použijeme.

    ALMP3_MP3

    Rozdíl tohoto datového typu oproti minulému je ten, že tato struktura načte do paměti CELÝ soubor, který se může přehrávat jak chce. Celková práce s tímto typem je jednodušší co do kódování hry (programu) a můžeme s ní dělat přímo psí kusy :) jelikož máte celý soubor v paměti. Nevýhoda je opak výhody STREAMINGu. Tedy, že zabere větší kus paměti. Pokud tedy vezmeme MP3Trojku, která je dlouhá asi 3 minuty v kvalitě 128 kb/s tak to znamená pro nás asi tak 2-3 MB paměti. Hodnotu můžeme zmenšit tím, že použijeme horší kvalitu nebo dokonce mono místo sterea, ale zas tak moc bych to nepřeháněl to šetření. Záleží na volbě každého z Vás. Pokud ale budete mít v programu jednu, dvě písničky a hru postavíte na 32 MB, tak se zas tak nic neděje.

    Dekódování

    To bylo porovnání a představení nového datového typu ALMP3_MP3. Další co stojí za zmínku je přehrávání. Načtený soubor v paměti se potřebuje ještě dekódovat, což se jedná o nárůst původního souboru až na několik násobek. Tedy musíme ještě uvolnit (resp. my jenom řekneme kolik a AllegroMP3 to uvolní za nás) kus paměti pro dekódování. Většinou je to násobek dvěma, což může mít v ideálním případě 32 nebo 64 kB. Více nám prozradí následující příklad, který uvádím v celém znění.

    Příklad na ALMP3_MP3

    #include <string.h>
    #include <stdio.h>
    #include <allegro.h>
    #include "almp3.h"
    
    void putstr(char *s); // prototyp
    
    #define BUFSZ   (1>>16) /* Velikost bufferu pro dekodovaní */
    
    
    ALMP3_MP3 *mymp3; // nase hudba - pro jednoduchost globalni promenna
    
    
    ALMP3_MP3 *open_mp3_file_full(char *filename) {
      FILE *f = NULL;
      ALMP3_MP3 *m = NULL;
      void *data;
      int len;
      int error=0;
      char Integer[21];
    
      if (!(data = (void *)malloc(sizeof(char)*10000000))) {
    	error = 1;
        goto error;
      }
    
      if ((f = fopen(filename, "rb"))== NULL) {
    	error = 2;
        goto error;
      }
    
      if ((len = fread(data, 1, 10000000, f)) <= 0) {
    	error = 3;
        goto error;
      }
    
      if (!(m = almp3_create_mp3(data, len))) {
    	error = 4;
        goto error;
      }
    
      // pro jistotu si vypiseme velikost 
      // souboru kterou jsme nacetli
      memset(Integer,0,21);
      itoa(len,Integer,10);
      putstr(Integer);
    
      fclose(f);
      free(f);
      return m;
    
      error: // zde se program dostane jen pri chybe
      putstr("CHYBA");
      
      switch (error) {
    	case 1:putstr("CHYBA: Málo paměti pro malloc");break;
    	case 2:putstr("CHYBA: Otevření souboru");break;
    	case 3:putstr("CHYBA: Načtení dat ze souboru");break;
    	case 4:putstr("CHYBA: ");break;
    
      }
        
      fclose(f);
      free(m);
      free(f);
      return NULL;
    }
    
    
    int main() { 
      char *s="_a.mp3";
    
      allegro_init();
    
      install_timer();
      install_keyboard();
    
      if (set_gfx_mode(GFX_SAFE, 640, 480, 0, 0) < 0) {
        allegro_message("Error setting video mode.\n");
        return 1;
      }
      clear_to_color(screen, makecol(255, 255, 255));
    
      /* nastavime volume v Allegru na max. */
      set_volume_per_voice(0);
    
      if (install_sound(DIGI_AUTODETECT, MIDI_NONE, 0) < 0) {
        set_gfx_mode(GFX_TEXT, 0, 0, 0, 0);
        allegro_message("Error installing sound.\n");
        return 1;
      }
    
    // hlavni cast kodu, ktera prehrava
    
      putstr(s); // tiskne jmeno souboru.
    
    
      if (mymp3 = open_mp3_file_full(s)) {
        if (almp3_play_ex_mp3(mymp3, BUFSZ, 255, 128,1000,1) != ALMP3_OK)
    		putstr("error play");
      }
      else 
        putstr("Error opening.");
    
      // zde muze byt smycka programu...  
      while (!keypressed()) {
      	  almp3_poll_mp3(mymp3);
      }
    
    
      almp3_destroy_mp3(mymp3);
    
      free(mymp3);
    
    // konec hlavni casti kodu, ktery prehrava
    
      allegro_exit();
    
      return 0;
    }
    END_OF_MAIN();
    
    
    /* jednoducha funkce pro vystup */
    void putstr(char *s) {
      static int y = 0;
      text_mode(-1);
      textout(screen, font, s, 0, y, makecol(0, 0, 0));
      y += text_height(font);
    }
    

     Následující kapitola (Popis ukázkového příkladu) >> 


    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.52
    (Počet známek: 3621)

    Komentáře k článku
    DaemonX23.01.20:14Další díly
    Pavel Matoušek25.01.11:09RE: Další díly
    DaemonX11.02.13:00RE: RE: Další díly
    Pavel24.03.20:59Allegro a Linux
    Pavel24.03.20:58Allegro a Linux
    Honza23.06.21:35RE: Allegro a Linux
    Capy25.02.19:28Pomozte nekdo s nestandardni instalaci
    Pavel Matoušek25.02.23:40RE: Pomozte nekdo s nestandardni instalaci
    Capy27.02.12:03RE: RE: Pomozte nekdo s nestandardni instalaci
    Pavel Matoušek27.02.20:31RE: RE: RE: Pomozte nekdo s nestandardni instalaci
    Capy02.03.11:55RE: RE: RE: RE: Pomozte nekdo s nestandardni instalaci
    Pavel Matoušek02.03.12:51RE: RE: RE: RE: RE: Pomozte nekdo s nestandardni instalaci
         





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