kake_fisk Skrevet 20. august 2009 Del Skrevet 20. august 2009 (endret) 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 20. august 2009 av kake_fisk Lenke til kommentar
Giddion Skrevet 20. august 2009 Del Skrevet 20. august 2009 (endret) 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 20. august 2009 av Giddion Lenke til kommentar
kake_fisk Skrevet 20. august 2009 Forfatter Del Skrevet 20. august 2009 (endret) 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 20. august 2009 av kake_fisk Lenke til kommentar
Giddion Skrevet 20. august 2009 Del Skrevet 20. august 2009 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
[kami] Skrevet 20. august 2009 Del Skrevet 20. august 2009 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
kake_fisk Skrevet 20. august 2009 Forfatter Del Skrevet 20. august 2009 (endret) 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 20. august 2009 av kake_fisk Lenke til kommentar
Giddion Skrevet 20. august 2009 Del Skrevet 20. august 2009 (endret) Hmm, jeg sjekke både libogg og libvorbis mappa, men kunne ikke finne libvorbis.a eller libvorbis.lib. :XEr 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 20. august 2009 av Giddion Lenke til kommentar
kake_fisk Skrevet 20. august 2009 Forfatter Del Skrevet 20. august 2009 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
Giddion Skrevet 21. august 2009 Del Skrevet 21. august 2009 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
kake_fisk Skrevet 21. august 2009 Forfatter Del Skrevet 21. august 2009 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
luser32 Skrevet 23. august 2009 Del Skrevet 23. august 2009 (endret) 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 23. august 2009 av luser32 Lenke til kommentar
kake_fisk Skrevet 23. august 2009 Forfatter Del Skrevet 23. august 2009 Ojaa, selvfølgelig. Jeg kan jo ikke kompilere VC++ kode i Code::Blocks. Bare glem min forrige post. Men er det noen som kan ta seg tid til å lage en vorbisfile.lib for meg? :X Lenke til kommentar
Giddion Skrevet 24. august 2009 Del Skrevet 24. august 2009 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
kake_fisk Skrevet 24. august 2009 Forfatter Del Skrevet 24. august 2009 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
GeirGrusom Skrevet 24. august 2009 Del Skrevet 24. august 2009 Høyreklikk på prosjektet, velg Properties. Finn frem C/C++ og det skal ligge en sak som heter "Include directories" eller noe sånt. Husk også å legg til .lib filer i Linker(under Linker->Input->Additional dependencies) Lenke til kommentar
kake_fisk Skrevet 24. august 2009 Forfatter Del Skrevet 24. august 2009 (endret) 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 24. august 2009 av kake_fisk Lenke til kommentar
kake_fisk Skrevet 24. august 2009 Forfatter Del Skrevet 24. august 2009 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
GeirGrusom Skrevet 24. august 2009 Del Skrevet 24. august 2009 Du kan kanskje prøve å laste ned DirectShow filter eller noe og ta vorbis.dll fra den. Lenke til kommentar
kake_fisk Skrevet 24. august 2009 Forfatter Del Skrevet 24. august 2009 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
Giddion Skrevet 26. august 2009 Del Skrevet 26. august 2009 Har dere noen flere tips? :\ Litt desperat forsøk, men du trenger jo egentlig ikke å lage en lib fil. Du kan legge alle source filene inn i prosjektet, noen av filene inneholder main funksjonen så de må fjernes. Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå