 |
|
 |
 |
 |
| 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.
|
|
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);
}
|
|
|
Hodnocení článku |
1 |
2 |
3 |
4 |
5 Aktuální známka: 2.52 (Počet známek: 3621)
|
|
|
 |
 |
 |