[allegro] Odtwarzanie plików .ogg lub mp3

0

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:

  1. Głośniki (słuchawki) mam dobre i działające.
  2. Warunek if(!fatboy) działa poprawnie - gdy nazwa pliku jest zła, warunek jest prawdziwy
  3. Wszystkie funkcje powyżej maina są z przykładu dołączonego do biblioteki alogg, więc (z założenia) mają działać dobrze.
  4. Powyższy kod może nie działać poprawnie! Zamieściłem tu tylko fragmenty które pracują na dźwiękach.
  5. 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.

0
    set_volume_per_voice(0);

a jak po tym dopiszesz to:

    set_volume(150,150);

?

0
piograb napisał(a)
    set_volume_per_voice(0);

a jak po tym dopiszesz to:

    set_volume(150,150);

?

To nic nie daje. Próbowałem też z parametrami dla set_volume_per_voice, bez skutku.
Jedynym rozsądnym wyjściem będzie chyba użycie innej biblioteki.

0

Pozwolę sobie na UP. To dla mnie ważny temat...
Jak ktoś umie obsługiwać ogg lub mp3 w C++ to bardzo proszę o kontakt na GG:
11490602
Z góry thx.

1 użytkowników online, w tym zalogowanych: 0, gości: 1