Witam. Uczę się allegro.h, składniowo jestem średnio-zaawansowany. Mam pytanie co do odtwarzania plików ogg pod allegro.h. Ściągnąłem plugin'a alogg.h, i mnie z kilka razy zdążyła krew zalać zanim zfixowałem błąd "undefined reference to x". Teraz o dziwo działa. Prawie działa.
Kiedy próbuję odtworzyć plik ogg za pomocą funkcji zawartych w przykładzie, nic się nie wydobywa z głośników.
Oto mój kod:
#include <allegro.h>
//...
#include <alogg.h>
// ...
/*************************************** OGG FUNCTIONS */
#define DATASZ (1<<15) /* (32768) amount of data to read from disk each time */
#define BUFSZ (1<<16) /* (65536) size of audiostream buffer */
#define coss
typedef struct {
PACKFILE *f;
ALOGG_OGGSTREAM *s;
} OGGFILE;
void putstr(char *s) {
static int y = 0;
textout_ex(screen, font, s, 0, y, makecol(0, 0, 0), -1);
y += text_height(font);
}
/********************************************/
OGGFILE *open_ogg_file(char *filename) {
OGGFILE *p = NULL;
PACKFILE *f = NULL;
ALOGG_OGGSTREAM *s = NULL;
char data[DATASZ];
int len;
if (!(p = (OGGFILE *)malloc(sizeof(OGGFILE))))
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 = alogg_create_oggstream(data, len, TRUE)))
goto error;
}
else {
if (!(s = alogg_create_oggstream(data, DATASZ, FALSE)))
goto error;
}
p->f = f;
p->s = s;
return p;
error:
pack_fclose(f);
free(p);
return NULL;
}
/********************************************/
int play_ogg_file(OGGFILE *ogg, int buflen, int vol, int pan) {
return alogg_play_oggstream(ogg->s, buflen, vol, pan);
}
/********************************************/
void close_ogg_file(OGGFILE *ogg) {
if (ogg) {
pack_fclose(ogg->f);
alogg_destroy_oggstream(ogg->s);
free(ogg);
}
}
/********************************************/
int poll_ogg_file(OGGFILE *ogg) {
char *data;
long len;
data = (char *)alogg_get_oggstream_buffer(ogg->s);
if (data) {
len = pack_fread(data, DATASZ, ogg->f);
if (len < DATASZ)
alogg_free_oggstream_buffer(ogg->s, len);
else
alogg_free_oggstream_buffer(ogg->s, -1);
}
return alogg_poll_oggstream(ogg->s);
}
/********************************************/
void do_example(int n, char *filenames[]) {
OGGFILE **ogg = (OGGFILE **)malloc(sizeof(OGGFILE *) * n);
int remain, i;
remain = n;
for (i = 0; i < n; i++) {
putstr(filenames[i]);
if ((ogg[i] = open_ogg_file(filenames[i])))
play_ogg_file(ogg[i], BUFSZ, 255, 128);
else {
remain--;
putstr("Error opening.");
}
}
while ((!keypressed()) && (remain > 0)) {
for (i = 0; i < n; i++) {
if ((ogg[i]) && (poll_ogg_file(ogg[i]) != ALOGG_OK)) {
close_ogg_file(ogg[i]);
ogg[i] = NULL;
remain--;
}
}
}
for (i = 0; i < n; i++)
close_ogg_file(ogg[i]);
free(ogg);
}
/********************************************/
int main()
{
////////////////////////////INICJALIZACJE////////////////////////////
allegro_init();
//...
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;
}
set_volume_per_voice(0);
//...
// ...
OGGFILE *fatboy = NULL;
fatboy = open_ogg_file("fatboy.ogg");
// ...
if(!fatboy)
{
set_gfx_mode(GFX_TEXT,0,0,0,0);
allegro_message("Nie mozna zaladowac fatboy'a!");
allegro_exit();
return 0;
}
////////////////////////////////////////////////////////////////
//...
play_ogg_file(fatboy, 1000, 255, 127);
//...
//...
//...
allegro_exit();
return 0;
}END_OF_MAIN();
Założenia:
- Głośniki (słuchawki) mam dobre i działające.
- Warunek if(!fatboy) działa poprawnie - gdy nazwa pliku jest zła, warunek jest prawdziwy
- Wszystkie funkcje powyżej maina są z przykładu dołączonego do biblioteki alogg, więc (z założenia) mają działać dobrze.
- Powyższy kod może nie działać poprawnie! Zamieściłem tu tylko fragmenty które pracują na dźwiękach.
- Program poprawnie się włącza. Wszystko działa poprawnie - oprócz dźwięku, który w ogóle nie wydobywa się z słuchawek.
Chodzi mi przede wszystkim o interpretację argumentów funkcji play ogg coś tam.
Aha... jeśli naprawdę nic się nie da z tym zrobić, to niech ktoś mi poda jakiś inny kompatybilny z allegro sposób na odtwarzanie plików .ogg. Z góry THX.