Allegro - MP3 (17. 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:

Soutěž

Sponzorem soutěže je:

IDIF

 

Kde se koná výstava fotografií Luďka Vojtěchovského?

V dnešní soutěži hrajeme o:



C/C++

Allegro - MP3 (17. díl)

allegro

10. ledna 2003, 00.00 | MPTrojky jsou velice užitečný formát, díky své velikosti a proto se je naučíme přehrávat v Allegru. Přesněji v knihovně AllegroMP3 - jednoduše, elegantně a rychle.

{Allegro MP3}

V minulých dílech jsme se mimo jiné seznámili i s hudbou a jak ji pomocí Allegra přehrávat. Ukazovali jsme si např. formát wav a midi. V dnešním díle se seznámíme s tím jak pomocí Allegra přehrávat i MPTrojky. Neboli nejrozšířenější zvukový formát na světě. Jeho komprese je zhruba 1:10, možná jde i více, ale to pro nás není důležité. My budeme pro přehrávání formátu MP3 potřebovat knihovnu AllegroMP3 od Javier Gonzalez a dalších spoluautorů.

Nejprve je potřeba ji nainstalovat, protože ji každý, kdo čte tento seriál nemusí mít ještě na svém počítači nainstalovanou. Pokud ji tedy nemáte pokračujte, prosím, dále ve čtení tohoto dílu instalací, která následuje. A ti co už knihovnu AllegroMP3 mají nainstalovanou mohou přeskočit na popis ukázkového příkladu.Dneska si tedy ukážeme první spuštění AllegraMP3 a ukázkového příkladu.

Instalace - obecně

Samozřejmě, že nejdříve je potřeba si stáhnout knihovnu AllegroMP3 např. na této adrese http://www.hero6.com/filereviver/almp3.zip . Poté co si ji stáhnete, ji rozbalte např. do adresáře c:\almp3 (Dále se budu obracet pouze na tento adresář, pokud jste knihovnu rozbalili jinam, prosím doplňte si místo tohoto jiný.). Nyní již můžeme knihovnu bez problémů nainstalovat. Máme na výběr více možností. Rozhodl jsem se, že zde uvedu instalaci pro DOS a to pro DJGPP a pro Windows a to pro VC++.

Instalace pro DOS - DJGPP

Jako první bychom měli zkonvertovat konce řádku z LF na CR/LF formát. To znamená místo \n tam mít \r\n (známé z prinft). To se provede pomocí předvytvořeného souboru fixdos.bat, který je v adresáři kam jste rozbalili knihovnu. Můžete ho rovnou spustit. Pokud se vám ohlásí chyba "chybný příkaz nebo název souboru" tak je to nejspíš způsobeno tím, že to nemůže najít soubor utod.exe, který je v adresáři c:\djgpp\bin. Samozřejmě za předpokladu, že máte DJGPP nainstalované v adresáři c:\djgpp. Zkopírujte ho do adresáře kde je soubor fixdos.bat, a spusťte jej znovu. Nyní by mělo být již vše pořádku.

To byla příprava na instalaci a nyní již samotná instalace, která je velmi jednoduchá: do příkazového řádku v adresáři c:\almp3 napište make. Nyní se překládají zdrojové soubory AllegraMP3 a vytváří se knihovní soubor libalmp3.a, který se objeví v podadresáři lib\djgpp.

Pokud vše proběhlo bez problémů, můžeme se vrhnout rovnou na příklad. Přejděte do adresáře examples kde se nacházejí soubory example.c, example.dsp (developer studio projekt - to se týká VC++) a makefile. Opět do příkazové řádky napište make a program example.c se přeloží. Nyní je potřeba si jej vyzkoušet, jestli se opravdu přeložil a taky jestli nám AllegroMP3 vůbec funguje.

Pokud vše proběhlo bez problémů, měl by být v adresáři djgpp mj. soubor example.exe. Můžete jej zkusit spustit. Mělo by se vám objevit hlášení, že program je potřeba spustit s nějakým parametrem typu soubor. Pokud máte (a já v to doufám) nějakou MPTrojku, zkopírujte ji do tohoto adresáře. Pojmenujte ji například moje.mp3 a pak do příkazové řádky vepište

example.exe moje.mp3

Nyní by se program měl již spustit bez chybového hlášení s bílou obrazovkou, kde by v levém horním robu mělo být napsáno, jméno souboru. Program, lze spustit i s více soubory typu MP3 oddělených mezerou a pak všechny hrají současně. Což můžete využít ve hrách, kde budete mít hodně efektů.

To by bylo pro instalaci DJGPP vše, pokud již máte nainstalováno a nechcete instalovat AllegroMP3 pro VC++ můžete tento kus přeskočit a pustit se rovnou do toho. Tedy do zkoumání příkladu.

Instalace pro Windows - VC++

Tato instalace je malinko odlišná než instalace pro DJGPP, ale opět není nikterak těžká. V instalaci pro DOS a DJGPP jsme se zabývali statickou instalací, tedy soubor *.lib (nebo lépe pro DJGPP s koncovkou a - linkovací soubor libalmp3.a), se přilinkuje do EXE souboru a je tedy statický. Pokud tedy dostaneme novou verzi, která pracuje třeba 2x rychleji a spotřebuje méně paměti, musíme znovu sestavit celý soubor znovu.
Pro VC++ máme stejnou možnost akorát se souboru jmenuje almp3.lib, ale k tomu se ještě později dostaneme.

Pak existuje ještě jedna možnost a to dynamická linkovací knihovna (neboli pro všechny kdo používají Windows známé DLL - Dynamic Link Library), kde se do EXE souboru přilinkuje soubor almp3dll.lib (pokud zvolíme tuto instalaci) a zároveň s dodávkou našeho EXE souboru např. s nějakou hrou musíme dodat i samotnou knihovnu a to soubor almp3.dll. Tady je pak výhoda, že když obdržíme novou verzi, která používá stejné funkce, jenom mají "jiné" tělo a to je právě rychlejší, tak stačí vyměnit pouze ten DLL soubor almp3.dll a program není třeba znovu linkovat. Takto fungují např. patche v některých moderních hrách.. Nevýhoda je taková, že pokud se soubor nedodá nebo je nějak poškozený nebude pak program fungovat. Pro naše příklady budeme používat statickou linkovací knihovnu, kterou jednou přilinkujeme ve VC++ a dále se o to nemusíme starat.

Ty byl stručně rozdíl mezi DLL a SLL (SLL se normálně jako zkratka moc neužívá - nebo aspoň ne v takové míře jako velice známé DLL). A nyní přejdeme k samotné instalaci.

V hlavním adresáři c:\almp3 otevřeme, nebo poklepeme na soubor almp3_static.dsp, což je projekt VC++. Otevře se nám a již stačí samotnou knihovnu pouze vytvořit. To uděláme zkratkovou klávesou F7 ve VC++. Dole v okně výstupu by se nám mělo objevit něco jako je tento kus výstupu.

Creating library...

almp3.lib - 0 error(s), 0 warning(s)

Pokud samozřejmě proběhlo vše bez problémů. Tím jsme vytvořili samotnou knihovnu a jako u DJGPP se můžeme vrhnout na příklad (example). Opět přejdeme do adresáře example kde už nás nyní bude zajímat i soubor example.dsp a starý známý example.c (starý známý jen pro ty co četli instalaci DJGPP). Pro sestavení programu je potřeba si otevřít projekt VC++ tedy soubor s příponou dsp. Pomocí toho pak vytvoříme EXE soubor opět volbou F7. Pokud chcete soubor i s parametrem spustit rovnou z VC++ je potřeba zadat jeho parametr. To provedeme pomocí nabídky nastavení projektu pomocí kláves ALT+F7, kde do textového pole se jménem program arguments v záložce DEBUG zadáme jméno našeho souboru *.MP3. Pozor na správnou cestu, která se vztahuje k tomu, kde leží soubor *.dsp tedy example.dsp. Pokud máte MPTrojku v adresáři msvc, kde je i samotný EXE soubor zadejte jako parametr toto: msvc/*.mp3. Program spustíte pomocí CTRL+F5.

To by bylo k instalaci AllegroMP3 vše.

Nový projekt

Na začátku bych zmínil, že je potřeba do KAŽDÉHO projektu přilinkovat odpovídající soubor.

Pokud vytváříte nový projekt v DJGPP, je nejlepší si vypůjčit pro překlad soubor makefile z adresáře examples a ten editovat. Kromě knihovny allegro je taky potřeba přilinkovat soubor libalmp3.a, ale to vše již máte ve výše jmenovaném souboru makefile.

Pro vytvoření projektu ve VC++, nastává jiná situace. No, jiná není pokud použijete soubor example.dsp z adresáře examples a ten si opět upravíte podle sebe. Myslím, že do projektu přidáte Váš soubor místo původního example.c.

Nyní tedy postup na vytvoření nového projektu ve VC++. Nejdříve je potřeba si nový projekt založit. Musíte si vytvořit projekt typu Win32 Application a ne Win32 Console Application. Poté je potřeba, jako vždy u Allegra přidat do nastavení knihovnu alleg.lib. To provedeme v nastavení pomocí ALT+F7 v kartě Link a textovém poli Object/library modules. Do tohoto okna přidejte kromě alleg.lib i almp3.lib (pro statickou knihovnu, pro dynamickou by to bylo almp3dll.lib). Je potřeba si dám pozor na adresáře. Lepší je, když máte v adresáři kde máte nainstalovaný Vaše VC++ a podadresáři lib oba soubory zkopírovaný a máte to bez problémů. Allegro tedy původně tam soubor kopíruje samo při instalaci, ale raději bych to ještě překontroloval.

Poté přidáte do projektu soubor, který chcete zkompilovat a je to.

A kdyby při překladu nastala chyba tohoto typu:

MSVCRT.lib(MSVCRT.dll) : error LNK2005:
          _malloc already defined in LIBC.lib(malloc.obj)
MSVCRT.lib(MSVCRT.dll) : error LNK2005: 
          _free already defined in LIBC.lib(free.obj)

apod., tak opět v nastavení běžte do karty C/C++. Tam, úplně dole v položce Project Options vyhledejte řetězec /MLd a zaměňte jej za řetězec /MD. Jde o nastavení překladače, ale neptejte se mě prosím, co to je :). Více se dozvíte v nápovědě MSDN, protože toto nespadá do našeho seriálu.

Jak funguje AllegroMP3?

Funkce přehrávání MPTrojek pomocí AllegraMP3 vypadá následovně:

1. Na počátku máme vstupní soubor *.mp3, který chceme přehrát.

2. Otevřeme ho a načteme ho do paměti, přesněji jenom kus (z důvodu potřeby menší části paměti).

3. Pokud se povedlo otevřít soubor a načíst jeho první část, necháme ji zahrát. Samozřejmě na pozadí programu.

4. Ale co se děje, když se přehraje ta první část? Jak bude pokračovat další část písničky v přehrávání? No a proto je potřeba v programu neustále volat funkci, která načítá další a další část programu a neustále jej doplňuje. Pro ty co programují pod Windows ve WinAPI určitě vidí smyčku zpráv, která se musí neustále volat dokola, jestli náhodou ve frontě není nějaká nová zpráva? A přesně takhle funguje i "doplňování" bufferu (to je ta paměť kde je část souboru, která se zrovna přehrává) u AllegroMP3.

5. Bod 4 se opakuje pořád dokola, dokud se nedostaneme na konec písničky, pak se soubor uzavře a dál už se nic nepřehrává. Jiná možnost nastává pokud jsme na počátku inicializace nastavili, ať se písnička přehrává neustále dokola. To ba znamenalo, že se po konci souboru přetočí na začátek a vrací se zpět na bod 3, již bez otevření souboru.

V programu si s naší MPTrojkou můžeme dělat téměř cokoliv, klidně ji nechat ovládat uživatelem, pomocí vstupu z klávesnice. Pokud ji používáme ve hře, můžeme do nastavení hry zamontovat, zapnutí/vypnutí hudby na pozadí hry atd.

Tak a teď už to je snad opravdu k instalování, teorii a nastavení nového projektu pro dnešní díl naprosto vše a můžeme se pustit do ukázkového příkladu.

[-more-]{Example.c - ukázkový soubor}

Example.c - ukázkový soubor

Probereme si hlavní část programu, jaké funkce se v ně vyskytují apod.

Nejdříve doporučuji si otevřít soubor example.c v adresáři examples.

Jako první si můžete všimnout tohoto řádku:

#include "almp3.h"

Je tedy pro používání knihovny a hlavně jejich funkcí nutnost přidat jejich prototypy, to znamená includovat soubor almp3.h.

Dále přeskočte k hlavní funkci programu main, která se stará o inicializaci a poté předává řízení hudby funkci do_example.

Pro používání AllegraMP3 je, kromě includovaného souboru almp3.h, důležitá tato věc:

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;
}

Nainstalovat zvuk pomocí Allegra a zároveň otestovat jestli vše proběhlo v pořádku. Jako jsme tomu dělali například u inicializace grafického módu. Doporučuji hodnoty DIGI_AUTODETECT a MIDI_NONE ponechat takto, protože autor AllegraMP3 je tam nedal jen tak pro nic za nic. Samozřejmě malý experiment neuškodí, vždyť o nic přeci nejde :).

Poté co se vše inicializuje a předá se řízení funkci do_example s parametry jako počet souborů k přehrání a jejich názvy, můžeme přejít do této funkce také.

Ve funkci se vytvoří pointer na pointer na typ MP3FILE, což je struktura MP3 souboru, která vypadá následovně

typedef struct {
  PACKFILE *f;
  ALMP3_MP3STREAM *s;
} MP3FILE;

Obsahuje další dvě struktury a to pakovací soubor (To jsme ještě nebrali, Allegro má totiž vlastní formát a vlastní funkce na rozbalování/zabalování souborů.) a strukturu MP3 souboru, jak ji definuje AllegroMP3. Tuto strukturu můžete najít s souboru almp3.c v adresáři src.

Když se podíváme zpětně výše v souboru na podpůrné funkce, můžeme tam najít tyto

MP3FILE *open_mp3_file(char *filename);
int play_mp3_file(MP3FILE *mp3, int buflen, int vol, int pan);
close_mp3_file(MP3FILE *mp3);
int poll_mp3_file(MP3FILE *mp3); 

První, otevře MP3 soubor a vrací pointer na strukturu MP3FILE.
Druhá, přehraje kus souboru.
Třetí, zavře soubor, pokud je konec přehrávání.
Čtvrtá, načte další kus souboru, tedy doplní buffer pro další přehrávání písničky.

Všechny tyto funkce jsou volané ve funkci do_example, která se vlastně o všechno stará.
Pro ilustraci ji zde uvádím v celém znění:

void do_example(int n, char *filenames[]) {
  MP3FILE **mp3 = (MP3FILE **)malloc(sizeof(MP3FILE *) * n);
  int remain, i;

  remain = n;
  for (i = 0; i < n; i++) {
    putstr(filenames[i]);
    if ((mp3[i] = open_mp3_file(filenames[i])))
      play_mp3_file(mp3[i], BUFSZ, 255, 128);
    else {
      remain--;
      putstr("Error opening.");
    }
  }

  while ((!keypressed()) && (remain > 0)) {
    for (i = 0; i < n; i++) {
      if ((mp3[i]) && (poll_mp3_file(mp3[i]) != ALMP3_OK)) {
        close_mp3_file(mp3[i]);
        mp3[i] = NULL;
        remain--;
      }
    }
  }

  for (i = 0; i < n; i++)
    close_mp3_file(mp3[i]);

  free(mp3);
}

Jak vidíte, tak nejdříve se alokuje paměť pro všechny soubory (podle toho kolik jich chceme přehrát), to je v prvním řádku pomocí malloc().

Dále je otevření všech souborů (proto ten cykl) a spuštění již samotné hudby. Pokud se nepodaří soubor otevřít (málo paměti, špatná cesta apod.), vypíše se chybové hlášení pomocí putstr, což je funkce, na kterou se můžete podívat úplně dole zdrojového souboru, kterou myslím není třeba nějak komentovat.

Za tímto cyklem následuje další, který tentokrát doplňuje paměť neboli náš buffer. Provádí se tak dlouho dokud není konec písničky, nebo zmáčknuta klávesa pro ukončení.

Jako předposlední je uvolnění paměti, každého souboru, který byl na počátku inicializován.

A jako poslední je uvolnění prvně definovaného pointeru na pointer na typ MP3FILE, který v sobě uchovával naprosto všechny písničky (samozřejmě pokud jsme jich spustili více).

V příštím díle si probereme soubor example.c více do hloubky a taky se podíváme na to co AllegroMP3 vůbec umí.

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: