[ Dark Icarus @ 30.12.2004. 15:35 ] @
Možda bi ova poruka više pristajala u "audio kompresiji", ali... hm... nisam siguran da se tamo toliko bave programiranjem... Daklem, 2-3 jednostavna pitanja za one koji su koristili .ogg format muzike u igrama.

1) Koliko je realtime dekodiranje .ogg formata opterećenje za procesor?
2) Da li postoji način da se .ogg tokom runtime-a potpuno dekodira u .wav fajl (koji bih tek onda slao DirectSoundu/DirectMusicu na puštanje) i koliko to traje (da znam da li da planiram decode kada se pokrene igra, kada igra krene da ucitava track, ili (idealno rešenje) kada se igra instalira), ili da batalim ovaj pristup i vratim se na realtime dekodiranje.
3) Pretpostavljam da je najlakše implementirati rad sa .ogg-om (unutar executable fajla) preko dll-a. Takođe, koliko ja znam programere, pretpostavljam da postoji ceo interfejs za rad sa ogg-om u jednom dll-u (a ako ne postoji, valjalo bi ga izmisliti). E sad, ako je tako, gde bih mogao da nađem takav dll, sa propratnom dokumentacijom? Napominjem da sam dosta dugo taborio i na googlu i na vorbis.com i nisam našao takav dll. (Jedino sam našao OCX kontrolu koja pušta ogg ali ona nije bila ni izbliza dovoljno fleksibilna za rad.)

Ili možda predlažete neko drugo rešenje? Napominjem da mi je bilo kakva komercijalna licenca neprihvatljiva!
[ Angel_of_Dark @ 30.12.2004. 17:10 ] @
Nisam se licno upustao u programiranje podrske za OGG, ali je moj kolega odlicno odradio dll komponentu za engine koji koristimo. Znaci, citav interfejs je uspesno smestio u jedan Dll koristeci OggVorbis Sdk Win32 1.0.1. Sdk ima opsirnu dokumentaciju, i predlazem ti da potrazis u njoj ono sto te zanima.
Sto se brzine tice, dekodiranje je brzo i ne opterecuje preterano procesor (za projekat smo koristili oko 8 kanala koji se dekodiraju u isto vreme i nije bilo nikakvog vidnog opterecenja). Mislim da je bolje da fajl dekodiras u letu a ne da ga dekodiras u Wav, pogotovo ako imas dosta simultanih fajlova. Na performansama dobijas automatski, jer nema potrebe za citanjem velike kolicine podataka sa harda.
[ Angel_of_Dark @ 30.12.2004. 17:32 ] @
Ah da, zaboravih, pogledaj ovaj site, mozda nadjes nesto sto ce ti koristiti:
http://www.xiph.org/
[ Dark Icarus @ 30.12.2004. 19:26 ] @
OK, hvala! Ja sam mislio da već postoji neki javni standardizovani dll koji bi se mogao samo ubaciti u aplikaciju... iskreno, nisam siguran da mogu da odvojim vremena da napišem sopstveni dekoder, tako da ću uzeti neki ogg->wav dekoder i lansirati ga po instalaciji. Pošto ne planiram da zakrčim igru preterano semplovima, wave će odraditi posao sasvim dobro. U svakom slučaju, hvala na savetu...
[ yooyo @ 02.02.2005. 17:00 ] @
Novi OpenAL ima podrsku za ogg vorbis fajlove... www.openal.org

yooyo
[ yooyo @ 07.02.2005. 14:49 ] @
A moze i http://audiere.sourceforge.net/home.php

yooyo
[ Nothingman @ 07.02.2005. 18:01 ] @
Moze i Bass:
http://www.un4seen.com/

Znam da si rekao da su bilo kakve komercijalne licence neprihvatljive, ali ova i nije bash skupa ;)
A s obzirom da pravis shareware igricu dobro je i to sto je dll manji od 100kb...
[ Goq @ 17.03.2005. 18:38 ] @
Moze SDL_Mixer www.libsdl.org

TIP:
Za DevC++ koristi (SDL_mixer-devel-1.2.5a-VC6) ili novije....

Evo koda koji ucitava ogg
Code:

#include <stdio.h>
#include <stdlib.h>
#include "SDL.h"
#include "SDL_mixer.h"

/* Mix_Music actually holds the music information.  */
Mix_Music *music = NULL;

void handleKey(SDL_KeyboardEvent key);
void musicDone();

int main(void) {

  SDL_Surface *screen;
  SDL_Event event;
  int done = 0;

  /* We're going to be requesting certain things from our audio
     device, so we set them up beforehand */
  int audio_rate = 22050;
  Uint16 audio_format = AUDIO_S16; /* 16-bit stereo */
  int audio_channels = 2;
  int audio_buffers = 4096;

  SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO);

  /* This is where we open up our audio device.  Mix_OpenAudio takes
     as its parameters the audio format we'd /like/ to have. */
  if(Mix_OpenAudio(audio_rate, audio_format, audio_channels, audio_buffers)) {
    printf("Unable to open audio!\n");
    exit(1);
  }

  /* If we actually care about what we got, we can ask here.  In this
     program we don't, but I'm showing the function call here anyway
     in case we'd want to know later. */
  Mix_QuerySpec(&audio_rate, &audio_format, &audio_channels);

  /* We're going to be using a window onscreen to register keypresses
     in.  We don't really care what it has in it, since we're not
     doing graphics, so we'll just throw something up there. */
  screen = SDL_SetVideoMode(320, 240, 0, 0);

  while(!done) {
    while(SDL_PollEvent(&event)) {
      switch(event.type) {
      case SDL_QUIT:
    done = 1;
    break;
      case SDL_KEYDOWN:
      case SDL_KEYUP:
    handleKey(event.key);
    break;
      }
    }

    /* So we don't hog the CPU */
    SDL_Delay(50);

  }

  /* This is the cleaning up part */
  Mix_CloseAudio();
  SDL_Quit();

}

void handleKey(SDL_KeyboardEvent key) {
  switch(key.keysym.sym) {
  case SDLK_m:
    if(key.state == SDL_PRESSED) {

      /* Here we're going to have the 'm' key toggle the music on and
     off.  When it's on, it'll be loaded and 'music' will point to
     something valid.  If it's off, music will be NULL. */

      if(music == NULL) {
    
    /* Actually loads up the music */
    music = Mix_LoadMUS("music.ogg");

    /* This begins playing the music - the first argument is a
       pointer to Mix_Music structure, and the second is how many
       times you want it to loop (use -1 for infinite, and 0 to
       have it just play once) */
    Mix_PlayMusic(music, 0);

    /* We want to know when our music has stopped playing so we
       can free it up and set 'music' back to NULL.  SDL_Mixer
       provides us with a callback routine we can use to do
       exactly that */
    Mix_HookMusicFinished(musicDone);
    
      } else {
    /* Stop the music from playing */
    Mix_HaltMusic();

    /* Unload the music from memory, since we don't need it
       anymore */
    Mix_FreeMusic(music);
    
    music = NULL;
      }
      break;
    }
  }
}

/* This is the function that we told SDL_Mixer to call when the music
   was finished. In our case, we're going to simply unload the music
   as though the player wanted it stopped.  In other applications, a
   different music file might be loaded and played. */
void musicDone() {
  Mix_HaltMusic();
  Mix_FreeMusic(music);
  music = NULL;
}