Gå til innhold

Spille Ogg filer med OpenAL


Anbefalte innlegg

Etter å feile første gang jeg prøvde å spille ogg filer har jeg lært litt mer om c++ og skal prøve igjen nå.

Fikk løst de problemene jeg hadde forrige gang, men har fortsatt noen feilmeldinger.

 

Her er min cpp fil:

 

#include "AL/al.h"
#include "AL/alut.h"
#include "vorbis/vorbisfile.h"
#include <cstdio>
#include <iostream>
#include <vector>

#define BUFFER_SIZE   32768     // 32 KB buffers

using namespace std;

void LoadOGG(char *fileName, vector <char> &buffer, ALenum &format, ALsizei &freq)
{
   int endian = 0;             // 0 for Little-Endian, 1 for Big-Endian
   int bitStream;
   long bytes;
   char array[bUFFER_SIZE];    // Local fixed size array
   FILE *f;

   // Open for binary reading
   f = fopen(fileName, "rb");
   vorbis_info *pInfo;
   OggVorbis_File oggFile;
   ov_open(f, &oggFile, NULL, 0);

   // Get some information about the OGG file
   pInfo = ov_info(&oggFile, -1);

   // Check the number of channels... always use 16-bit samples
   if (pInfo->channels == 1)
   format = AL_FORMAT_MONO16;
   else
   format = AL_FORMAT_STEREO16;
   // end if

   // The frequency of the sampling rate
   freq = pInfo->rate;
   do
   {
       // Read up to a buffer's worth of decoded sound data
       bytes = ov_read(&oggFile, array, BUFFER_SIZE, endian, 2, 1, &bitStream);
       // Append to end of buffer
       buffer.insert(buffer.end(), array, array + bytes);
   } while (bytes > 0);
   ov_clear(&oggFile);
}

int main(int argc, char *argv[])
{
   ALint state;                // The state of the sound source
   ALuint bufferID;            // The OpenAL sound buffer ID
   ALuint sourceID;            // The OpenAL sound source
   ALenum format;              // The sound data format
   ALsizei freq;               // The frequency of the sound data
   vector < char > bufferData; // The sound buffer data from file

   // Initialize the OpenAL library
   alutInit(&argc, argv);

   // Create sound buffer and source
   alGenBuffers(1, &bufferID);
   alGenSources(1, &sourceID);

   // Set the source and listener to the same location
   alListener3f(AL_POSITION, 0.0f, 0.0f, 0.0f);
   alSource3f(sourceID, AL_POSITION, 0.0f, 0.0f, 0.0f);

   // Load the OGG file into memory
   LoadOGG("L.ogg", bufferData, format, freq);

   // Upload sound data to buffer
   alBufferData(bufferID, format, &bufferData[0], static_cast < ALsizei > (bufferData.size()), freq);

   // Attach sound buffer to source
   alSourcei(sourceID, AL_BUFFER, bufferID);

   // Finally, play the sound!!!
   alSourcePlay(sourceID);

   // This is a busy wait loop but should be good enough for example purpose
   do
   {
       // Query the state of the souce
       alGetSourcei(sourceID, AL_SOURCE_STATE, &state);
   } while (state != AL_STOPPED);

   // Clean up sound buffer and source
   alDeleteBuffers(1, &bufferID);
   alDeleteSources(1, &sourceID);

   // Clean up the OpenAL library
   alutExit();

   return 0;
}

 

Her er feilmeldingene:

 

C:\Program Files\Ogg Vorbis\libvorbis-1.2.0\include\vorbis\vorbisfile.h|56|warning: 'OV_CALLBACKS_DEFAULT' defined but not used|

C:\Program Files\Ogg Vorbis\libvorbis-1.2.0\include\vorbis\vorbisfile.h|63|warning: 'OV_CALLBACKS_NOCLOSE' defined but not used|

C:\Program Files\Ogg Vorbis\libvorbis-1.2.0\include\vorbis\vorbisfile.h|70|warning: 'OV_CALLBACKS_STREAMONLY' defined but not used|

C:\Program Files\Ogg Vorbis\libvorbis-1.2.0\include\vorbis\vorbisfile.h|77|warning: 'OV_CALLBACKS_STREAMONLY_NOCLOSE' defined but not used|

obj\Debug\main.o||In function `Z7LoadOGGPcRSt6vectorIcSaIcEERiS4_':|

D:\C++\Ogg\main.cpp|24|undefined reference to `ov_open'|

D:\C++\Ogg\main.cpp|27|undefined reference to `ov_info'|

D:\C++\Ogg\main.cpp|41|undefined reference to `ov_read'|

D:\C++\Ogg\main.cpp|45|undefined reference to `ov_clear'|

||=== Build finished: 4 errors, 4 warnings ===|

 

Jeg har en følelse av at det har noe med linker settingsa å gjøre.

I SDL har jeg "-lSDL", men har ikke lagt inn noe der for ogg vorbis eller openal.

 

Edit: La til "-lalut", nå er det bare 4 feilmeldinger igjen.

Endret av kake_fisk
Lenke til kommentar
Videoannonse
Annonse

Jeg mener å huske at at du mangler -lvorbisfile

 

edit:

På denne linjen:

alBufferData(bufferID, format, &bufferData[0], static_cast < ALsizei > (bufferData.size()), freq);

 

burde du vel gange bufferData.size() med BUFFER_SIZE

Endret av Giddion
Lenke til kommentar
Jeg mener å huske at at du mangler -lvorbisfile

 

Da får jeg denne feilmeldingen: "ld.exe||cannot find -lvorbisfile"

 

burde du vel gange bufferData.size() med BUFFER_SIZE

 

Det er ihvertfall ikke det som lager problemet, men du har sikkert rett i det.

Endret av kake_fisk
Lenke til kommentar
Jeg mener å huske at at du mangler -lvorbisfile

 

Da får jeg denne feilmeldingen: "ld.exe||cannot find -lvorbisfile"

 

Hmmm.. den finner ikke biblioteket vorbisfile skulle man tro. Du må nok sette en henvisning til mappen der du har vorbisfile et sted vil jeg tro.

Lenke til kommentar

for å legge til path til librariet kan du gjøre det globalt eller på prosjektnivå:

 

Prosjektnivå: Høyreklikk på prosjektet -> properties -> Librarian -> additional library directories

 

Globalt nivå:

Tools -> Options -> Projects and Solutions -> VC++ Directories -> library

Lenke til kommentar

Hmm, jeg sjekke både libogg og libvorbis mappa, men kunne ikke finne libvorbis.a eller libvorbis.lib. :X

Er det noe jeg har glemt å laste ned?

 

Med andre ord, hvor får jeg tak i libvorbis.lib?

 

@Kami

Jeg gjør det allerede på globalt nivå. ;)

Bare at jeg bruker Code::Blocks.

Endret av kake_fisk
Lenke til kommentar
Hmm, jeg sjekke både libogg og libvorbis mappa, men kunne ikke finne libvorbis.a eller libvorbis.lib. :X

Er det noe jeg har glemt å laste ned?

Nei, jeg tror ikke du kan laste de ned, du er nødt til å lage de selv.

 

Du kan vel åpne visual studio filene til libogg og libvorbis i Code::Blocks for så kompilere. Det burde være enkelt.... ikke at jeg har prøvd det selv da :)

 

Du kan jo også klaske alle(nesten! alle) source filene inn i prosjektet ditt... da trenger du jo ingen biblioteker.

Endret av Giddion
Lenke til kommentar

Men så er det jo det at jeg har bare headerfilene til de.

Har ingen c/cpp filer med de navnene.

 

Jeg får ikke engang kompilert prosjektet. :X

Men det er jo ikke sikkert det har med linker options heller.

Noen som vet hva "undefined reference to 'function'" feilmeldingene ofte kommer av?

Lenke til kommentar
Men så er det jo det at jeg har bare headerfilene til de.

Har ingen c/cpp filer med de navnene.

Hmm det var rart, godt mulig det er ment å gjøres på en annen måte enn det jeg gjør det på.

Hvor fikk du lastet ned bare headerene?

Du finner hvertfall kildekoden til ogg og vorbis på nettet

 

Noen som vet hva "undefined reference to 'function'" feilmeldingene ofte kommer av?

Det kommer av at du ikke linker med biblioteks filene som inneholder funksjonen.

Kort sagt så finner den ikke den binære versionen av funksjonen noe sted.

Lenke til kommentar

Fant source kodene for de filene for visual c++ nå.

Men er ikke vannt med å måtte kompilere de selv, så..

Vet ikke engang om det er riktig prosjekt engang.

Men den har ihvertfall vorbisfile.cpp og vorbisfil.h.

 

Men hvis du har Ogg Vorbis selv, kan du si akuratt hvilken mappe source koden ligger I som jeg må kompilere?

 

Også fikk jeg konverterings feilmeldinger når jeg prøvde å kompilere projsektet i Code::Blocks.

 

D:\C++\vorbisfile\vorbisfile.cpp|192|error: invalid conversion from `void*' to `long int*'|

 

I denne funksjonen:

 

static void _add_serialno(ogg_page *og,long **serialno_list, int *n){
 long s = ogg_page_serialno(og);
 (*n)++;

 if(*serialno_list){
*serialno_list = _ogg_realloc(*serialno_list, sizeof(**serialno_list)*(*n));
 }else{
*serialno_list = _ogg_malloc(sizeof(**serialno_list));
 }

 (*serialno_list)[(*n)-1] = s;
}

Lenke til kommentar

Jeg ser ikke helt hvordan du kan finne på å være så opphengt i ogg-formatet når du bruker visual C++?

 

Den enkleste måten å lage kode med open source-biblioteker er jo selvfølgelig GNU/Linux med gcc og emacs. (vi-gutta kan gå og legge seg)

Endret av luser32
Lenke til kommentar
Ojaa, selvfølgelig.

Jeg kan jo ikke kompilere VC++ kode i Code::Blocks.

Bare glem min forrige post.

Hva tenker du på?

Det går fint å kompilere libvorbis i visual c++.

 

 

Men er det noen som kan ta seg tid til å lage en vorbisfile.lib for meg? :X

Ikke glem libogg libvorbis :)

Lenke til kommentar

Okay, kan sikkert bare compile med VC++ da.

Men problemet er at jeg ikke kan VC.

Så hvordan legger jeg til sånn search directories?

 

Fordi jeg får denne feilmeldingen:

 

fatal error C1083: Cannot open include file: 'ogg/ogg.h': No such file or directory
Lenke til kommentar

Takk, det hjalp litt.

 

Men jeg har problemer med den nye lib filen jeg trenger å linke til.

For det første så har jeg ikke noen ogg_d.vcproj, men går ut i fra at jeg skal bruke det eneste vc++ prosjektet som ligger i libogg mappa og gjøre navnet om til ogg_d.lib.

 

Men uansett så, vet jeg ikke hvor jeg skal legge filen og hvordan vc kan vite hvor den legger. Hvor kan jeg fortelle vc hvor han skal lete etter lib filene, fordi det er jo bare en liste med tekst, ikke fullt filnavn for lib filene.

 

Edit: Fant det ut!

Endret av kake_fisk
Lenke til kommentar

Okay, har nå fått alle .lib filene.

Elsker når jeg får ting til å virke!

 

Nå får jeg ingen kompiler feilmeldinger, men følgende feilmelding får jeg når jeg skjører programmet:

 

"vorbis_synthesis_halfrate startpunktet for prosedyren fantes ikke i biblioteket for dynamiske koblinger, vorbis.dll."

 

Det kan ha noe med at jeg bare fant vorbis.dll, vorbisfile.dll og ogg.dll I et eksempell prosjekt som fulgte med OpenAL og det kan hende den ikke er up-to-date.

 

Så er det noen som vet hvor eller hvordan jeg får tak I de DLL-ene?

Lenke til kommentar

Okay, jeg fant ut at dll versjonene ble lagd samtdig som lib versjonene, så har alle DLL-ene nå.

Jeg greide også å fikse "vorbis_synthesis_halfrate" feilmeldinga, men den hoppa rett på neste.

Nå får jeg samme feilmelding, bare med "vorbis_synthesis_idheader".

 

Har dere noen flere tips? :\

 

Bare si ifra hvis jeg skal poste noe spesiell informasjon..

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...