PDA

View Full Version : [C][libreria almp3 di allegro] Strano problema...


mfonz85
24-07-2006, 21:33
Ciao a tutti, mi rivolgo a coloro che conoscono la libreria Allegro e in particolare la libreria almp3 (quella che permette l'uso di file mp3 con poche semplici funzioni e che si basa per l'appunto sulla libreria Allegro)
Il codice di esempio che dà il developer della libreria recita più o meno così, a parte qualche modifica...

#include <string.h>
#include <allegro.h>
#include <almp3.h>


void putstr(char *s);


#define DATASZ (1<<15)
#define BUFSZ (1<<16)


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

void putstr(char *s) {
static int y = 0;
textout_ex(screen, font, s, 0, y, makecol(0, 0, 0), -1);
y += text_height(font);
}

MP3FILE *open_mp3_file(char *filename) {
MP3FILE *p = NULL;
PACKFILE *f = NULL;
ALMP3_MP3STREAM *s = NULL;
char data[DATASZ];
int len;

if (!(p = (MP3FILE *)malloc(sizeof(MP3FILE))))
goto error;
if (!(f = pack_fopen(filename, F_READ)))
goto error;
if ((len = pack_fread(data, DATASZ, f)) <= 0)
goto error;
if (len < DATASZ) {
if (!(s = almp3_create_mp3stream(data, len, TRUE)))
goto error;
}
else {
if (!(s = almp3_create_mp3stream(data, DATASZ, FALSE)))
goto error;
}
p->f = f;
p->s = s;
return p;

error:
pack_fclose(f);
free(p);
return NULL;
}


int play_mp3_file(MP3FILE *mp3, int buflen, int vol, int pan) {
return almp3_play_mp3stream(mp3->s, buflen, vol, pan);
}


void close_mp3_file(MP3FILE *mp3) {
if (mp3) {
pack_fclose(mp3->f);
almp3_destroy_mp3stream(mp3->s);
free(mp3);
}
}


int poll_mp3_file(MP3FILE *mp3) {
char *data;
long len;

data = (char *)almp3_get_mp3stream_buffer(mp3->s);
if (data) {
len = pack_fread(data, DATASZ, mp3->f);
if (len < DATASZ)
almp3_free_mp3stream_buffer(mp3->s, len);
else
almp3_free_mp3stream_buffer(mp3->s, -1);
}

return almp3_poll_mp3stream(mp3->s);
}


void do_example(char *filename) {
MP3FILE **mp3 = (MP3FILE **)malloc(sizeof(MP3FILE *));
int remain, i;

if ((*mp3 = open_mp3_file(filename)))
play_mp3_file(*mp3, BUFSZ, 255, 128);
else putstr("Error opening.");

while(almp3_is_playing_mp3((ALMP3_MP3 *)mp3)) {
if ((*mp3) && (poll_mp3_file(*mp3) != ALMP3_OK)) {
close_mp3_file(*mp3);
*mp3 = NULL;
remain--;
}
}

close_mp3_file(*mp3);

free(mp3);
}


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

char filename[255];

printf("Inserisci il nome del file da caricare (es. c:\\tuosuono.mp3): ");
scanf("%s",filename);

install_timer();
install_keyboard();

if (set_gfx_mode(GFX_SAFE, 640, 480, 0, 0) < 0) {
allegro_message("Impossibile inizializzare il video.\n");
return 1;
}
clear_to_color(screen, makecol(255, 255, 255));

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("Impossibile inizializzare il suono.\n");
return 1;
}

set_display_switch_mode(SWITCH_BACKGROUND);

do_example(filename);

allegro_exit();

return 0;
}
END_OF_MAIN();


Il punto è che funziona perfettamente, ma il programma occupa il 100% del processore :eek: :eek: :eek:
E' normale e capita pure a voi, oppure il codice fà un pò schifo???
C'è qualche modo per ottimizzare il tutto??

Seconda domanda...me lo chiedo da molto...
Con la funzione allegro_init() praticamente si apre una nuova finestra dalla finestra console primaria del programma...
Come è possibile inglobare il tutto dentro un'unica "grossa" finestra di windows in modo che l'allegro_init() funzioni lì dentro???

Grazie anticipatamente x l'aiuto!!!

mfonz85
27-07-2006, 22:03
Nessuna idea?? :confused: