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!!!
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!!!