Blob Blame History Raw
--- vegastrike-0.4.3/src/aldrv/al_init.cpp.alut	2004-05-20 03:04:26.000000000 +0200
+++ vegastrike-0.4.3/src/aldrv/al_init.cpp	2007-03-23 16:04:13.000000000 +0100
@@ -144,6 +144,9 @@
 bool AUDInit () {
   g_game.sound_enabled = false;
 #ifdef HAVE_AL
+  /* Initialize Alut, this must always be done otherwise the sample loading
+     code segfaults */
+  alutInitWithoutContext(NULL, NULL);
   usedoppler = XMLSupport::parse_bool (vs_config->getVariable ("audio","Doppler","false"));
   usepositional = XMLSupport::parse_bool (vs_config->getVariable ("audio","Positional","true"));
 
--- vegastrike-0.4.3/src/aldrv/al_sound.cpp.alut	2005-01-08 02:25:32.000000000 +0100
+++ vegastrike-0.4.3/src/aldrv/al_sound.cpp	2007-03-23 16:26:49.000000000 +0100
@@ -37,216 +37,10 @@
 #include <algorithm>
 #include <stdio.h>
 #ifdef HAVE_AL
-#ifdef HAVE_OGG
-
-#include <vorbis/vorbisfile.h>
-#endif
 std::vector <unsigned int> dirtysounds;
 std::vector <OurSound> sounds;
 std::vector <ALuint> buffers;
 
-static void convertToLittle(unsigned int tmp, char * data){
-  data[0]=(char)(tmp%256);
-  data[1]=(char)((tmp/256)%256);
-  data[2]=(char)((tmp/65536)%256);
-  data[3]=(char)((tmp/65536)/256);  
-}
-#ifdef HAVE_OGG
-struct fake_file{
-  char * data;
-  size_t size;
-  size_t loc;
-};
-size_t mem_read(void * ptr, size_t size, size_t nmemb, void * datasource) {
-  fake_file * fp = (fake_file*)datasource;
-  if (fp->loc+size>fp->size) {
-    size_t tmp=fp->size-fp->loc;
-    if (tmp)
-      memcpy (ptr,fp->data+fp->loc,tmp);
-    fp->loc=fp->size;
-    return tmp;
-  }else {
-    memcpy(ptr,fp->data+fp->loc,size);
-    fp->loc+=size;
-    return size;
-  }
-}
-int mem_close(void*) {
-  return 0;
-}
-
-long   mem_tell  (void *datasource){
- fake_file * fp = (fake_file*)datasource; 
- return (long)fp->loc;
-}
-int cant_seek (void * datasource, ogg_int64_t offset, int whence) {
-  return -1;
-}
-int mem_seek (void * datasource, ogg_int64_t offset, int whence) {
- fake_file * fp = (fake_file*)datasource; 
- if (whence==SEEK_END) {
-   if (offset<0) {
-     if (fp->size<(size_t)-offset) {
-       return -1;
-     }else {
-       fp->loc = fp->size+offset;
-       return 0;
-     }
-   }else if (offset==0) {
-     fp->loc=fp->size;
-   }else return -1;
- }else if (whence==SEEK_CUR) {
-   if (offset<0) {
-     if (fp->loc<(size_t)-offset)
-       return -1;
-     else {
-       fp->loc+=offset;
-       return 0;
-     }
-   }else {
-     if (fp->loc+offset>fp->size) {
-       return -1;
-     }else {
-       fp->loc+=offset;
-       return 0;
-     }
-   }
- }else if (whence==SEEK_SET) {
-   if (offset>fp->size) 
-     return -1;
-   fp->loc = offset;
-   return 0;
- }
- return -1;
-}
-#endif
-static void ConvertFormat (vector<char>& ogg ) {
-  vector<char> converted;
-
-  if (ogg.size()>4) {
-    if (ogg[0]=='O'&&ogg[1]=='g'&&ogg[2]=='g'&&ogg[3]=='S') {
-#ifdef HAVE_OGG
-      OggVorbis_File vf;
-      ov_callbacks callbacks;
-      vorbis_info *info;       
-      int bitstream = -1;
-      long samplesize;
-      long samples;
-      int read, to_read;
-      int must_close = 1;
-      int was_error = 1;
-      //FILE * tmpf=tmpfile();
-      //fwrite(&ogg[0],ogg.size(),1,tmpf);
-      //fseek(tmpf,0,SEEK_SET);
-      fake_file ff;
-      ff.data=&ogg[0];
-      ff.loc=0;
-      ff.size=ogg.size();
-      callbacks.read_func=&mem_read;
-      callbacks.seek_func=&mem_seek;
-      callbacks.close_func=&mem_close;
-      callbacks.tell_func=&mem_tell;
-      if (ov_open_callbacks(&ff,&vf,NULL,0,callbacks) ){
-        ogg.clear();
-      }else {        
-        int bigendian=0;
-        long bytesread=0;
-        vorbis_info *info=ov_info(&vf,-1);
-        //ogg_int64_t totalsize=ov_pcm_total(&vf,-1);
-        //long num_streams=ov_streams(&vf);
-        const int segmentsize=16384;
-        const int samples=16;
-        converted.push_back('R');
-        converted.push_back('I');
-        converted.push_back('F');
-        converted.push_back('F');
-        converted.push_back(0);
-        converted.push_back(0);
-        converted.push_back(0);
-        converted.push_back(0);//fill in with weight;
-        converted.push_back('W');
-        converted.push_back('A');
-        converted.push_back('V');
-        converted.push_back('E');
-        converted.push_back('f');
-        converted.push_back('m');
-        converted.push_back('t');
-        converted.push_back(' ');
-
-        converted.push_back(18);//size of header (16 bytes)
-        converted.push_back(0);
-        converted.push_back(0);
-        converted.push_back(0);
-        
-        converted.push_back(1);//compression code
-        converted.push_back(0);
-
-        converted.push_back((char)(info->channels%256));//num channels;
-        converted.push_back((char)(info->channels/256));
-        
-        converted.push_back(0);//sample rate
-        converted.push_back(0);//sample rate
-        converted.push_back(0);//sample rate
-        converted.push_back(0);//sample rate
-        convertToLittle(info->rate,&converted[converted.size()-4]);
-
-        long byterate = info->rate*info->channels*samples/8;
-        converted.push_back(0);//bytes per second rate
-        converted.push_back(0);
-        converted.push_back(0);
-        converted.push_back(0);
-        convertToLittle(byterate,&converted[converted.size()-4]);
-
-        converted.push_back((char)((info->channels*samples/8)%256));//num_channels*16 bits/8
-        converted.push_back((char)((info->channels*samples/8)/256));        
-        
-        converted.push_back(samples);// 16 bit samples
-        converted.push_back(0);
-        converted.push_back(0);
-        converted.push_back(0);
-
-
-        // PCM header
-        converted.push_back('d');
-        converted.push_back('a');
-        converted.push_back('t');
-        converted.push_back('a');
-
-
-        converted.push_back(0);        
-        converted.push_back(0);
-        converted.push_back(0);
-        converted.push_back(0);
-        ogg_int64_t pcmsizestart=converted.size();
-        converted.resize(converted.size()+segmentsize);
-        int signedvalue=1;
-        int bitstream=0;
-        while ((bytesread=ov_read(&vf,&converted[converted.size()-segmentsize], segmentsize, 0, samples/8, signedvalue, &bitstream))>0){
-          if (bytesread<segmentsize) {
-            int numtoerase=segmentsize-bytesread;
-            converted.erase(converted.end()-numtoerase,converted.end());
-          }
-          
-          
-          converted.resize(converted.size()+segmentsize);
-        }
-        converted.erase(converted.end()-segmentsize,converted.end());
-        convertToLittle(converted.size()-8,&converted[4]);
-        convertToLittle(converted.size()-pcmsizestart,&converted[pcmsizestart-4]);
-#if 0
-		FILE * tmp = fopen("c:/temp/bleh","wb");
-        fwrite(&converted[0],converted.size(),1,tmp);
-        fclose(tmp);
-#endif
-        converted.swap(ogg);
-      }
-      ov_clear(&vf);
-#else
-      ogg.clear();
-#endif
-    }
-  }
-}
 static int LoadSound (ALuint buffer, bool looping) {
   unsigned int i;
   if (!dirtysounds.empty()) {
@@ -311,53 +105,25 @@
 		  if (error>Ok)
 			  return -1;
 	      wavbuf = (ALuint *) malloc (sizeof (ALuint));
-	      alGenBuffers (1,wavbuf);
-#ifdef SOUND_DEBUG
-		  printf ("Sound %s created with and alBuffer %d\n",s.c_str(),*wavbuf);
-#endif
-	      ALsizei size;	
-	      ALsizei freq;
-	      void *wave;
-		  ALboolean looping;
-	      ALboolean err=AL_TRUE;
               vector <char> dat;
               dat.resize(f.Size());
               f.Read( &dat[0], f.Size());
-              ConvertFormat(dat);
-              if (dat.size()==0)//conversion messed up
+              f.Close();
+              *wavbuf = alutCreateBufferFromFileImage(&dat[0], dat.size());
+              if (*wavbuf == AL_NONE)
+              {
+                ALint err = alutGetError();
+                if (err != ALUT_ERROR_NO_CURRENT_CONTEXT)
+                  printf("loading: %s failed: %s\n", s.c_str(),
+                    alutGetErrorString(err));
                 return -1;
-#ifndef WIN32
-#ifdef __APPLE__
-		  ALint format;
-		  // MAC OS X
-		  err = false;
-		  if( error<=Ok)
-			err=MacFixedLoadWAVFile( &dat[0], &format, &wave, &size, &freq);
-#else
-		  // LINUX
-		  ALsizei format;
-                  alutLoadWAVMemory((ALbyte *)&dat[0], &format, &wave, &size, &freq, &looping);
-#endif
-#else
-		  ALint format;
-	  	  // WIN32
-                  alutLoadWAVMemory(&dat[0], (int*)&format, &wave, &size, &freq, &looping);
-#endif
-
-      	  if(err == AL_FALSE)
-		  {
-			alDeleteBuffers (1,wavbuf);
-			free (wavbuf);
-			return -1;
-      	  }
-      	  alBufferData( *wavbuf, format, wave, size, freq );
-          alutUnloadWAV(format,wave,size,freq);
+              }
+          
       	  if (!music)
 		  {
 			soundHash.Put (hashname,wavbuf);
 			buffers.push_back (*wavbuf);
       	  }
-		  f.Close();
 		}
     	return LoadSound (*wavbuf,LOOP);  
   }
@@ -372,7 +138,7 @@
 }
 
 int AUDCreateSoundMP3 (const std::string &s, const bool music, const bool LOOP){
-#ifdef HAVE_AL
+#if 0 /* was #ifdef HAVE_AL, but we have no mp3 support in Fedora's alut */
   if ((g_game.sound_enabled&&!music)||(g_game.music_enabled&&music)) {
 	VSFile f;
 	VSError error = f.OpenReadOnly( s.c_str(), SoundFile);