Advertisement
thecplusplusguy

OpenAL tutorial

Aug 14th, 2012
4,385
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.67 KB | None | 0 0
  1. //http://www.youtube.com/user/thecplusplusguy
  2. //Playing 3D sound with OpenAL, and loading a wav file manually
  3. #include <iostream>
  4. #include <fstream>
  5. #include <cstring>
  6. #include <AL/al.h>
  7. #include <AL/alc.h>
  8. #include <SDL/SDL.h>
  9.  
  10. bool isBigEndian()
  11. {
  12.     int a=1;
  13.     return !((char*)&a)[0];
  14. }
  15.  
  16. int convertToInt(char* buffer,int len)
  17. {
  18.     int a=0;
  19.     if(!isBigEndian())
  20.         for(int i=0;i<len;i++)
  21.             ((char*)&a)[i]=buffer[i];
  22.     else
  23.         for(int i=0;i<len;i++)
  24.             ((char*)&a)[3-i]=buffer[i];
  25.     return a;
  26. }
  27.  
  28. char* loadWAV(const char* fn,int& chan,int& samplerate,int& bps,int& size)
  29. {
  30.     char buffer[4];
  31.     std::ifstream in(fn,std::ios::binary);
  32.     in.read(buffer,4);
  33.     if(strncmp(buffer,"RIFF",4)!=0)
  34.     {
  35.         std::cout << "this is not a valid WAVE file"  << std::endl;
  36.         return NULL;
  37.     }
  38.     in.read(buffer,4);
  39.     in.read(buffer,4);  //WAVE
  40.     in.read(buffer,4);  //fmt
  41.     in.read(buffer,4);  //16
  42.     in.read(buffer,2);  //1
  43.     in.read(buffer,2);
  44.     chan=convertToInt(buffer,2);
  45.     in.read(buffer,4);
  46.     samplerate=convertToInt(buffer,4);
  47.     in.read(buffer,4);
  48.     in.read(buffer,2);
  49.     in.read(buffer,2);
  50.     bps=convertToInt(buffer,2);
  51.     in.read(buffer,4);  //data
  52.     in.read(buffer,4);
  53.     size=convertToInt(buffer,4);
  54.     char* data=new char[size];
  55.     in.read(data,size);
  56.     return data;   
  57. }
  58.  
  59. int main(int argc,char** argv)
  60. {
  61.     int channel,sampleRate,bps,size;
  62.     char* data=loadWAV("test.wav",channel,sampleRate,bps,size);
  63.     ALCdevice* device=alcOpenDevice(NULL);
  64.     if(device==NULL)
  65.     {
  66.         std::cout << "cannot open sound card" << std::endl;
  67.         return 0;
  68.     }
  69.     ALCcontext* context=alcCreateContext(device,NULL);
  70.     if(context==NULL)
  71.     {
  72.         std::cout << "cannot open context" << std::endl;
  73.         return 0;
  74.     }
  75.     alcMakeContextCurrent(context);
  76.    
  77.     unsigned int bufferid,format;
  78.     alGenBuffers(1,&bufferid);
  79.     if(channel==1)
  80.     {
  81.         if(bps==8)
  82.         {
  83.             format=AL_FORMAT_MONO8;
  84.         }else{
  85.             format=AL_FORMAT_MONO16;       
  86.         }
  87.     }else{
  88.         if(bps==8)
  89.         {
  90.             format=AL_FORMAT_STEREO8;
  91.         }else{
  92.             format=AL_FORMAT_STEREO16;     
  93.         }  
  94.     }
  95.     alBufferData(bufferid,format,data,size,sampleRate);
  96.     unsigned int sourceid;
  97.     alGenSources(1,&sourceid);
  98.     alSourcei(sourceid,AL_BUFFER,bufferid);
  99.     SDL_Init(SDL_INIT_EVERYTHING);
  100.     SDL_Surface* screen=SDL_SetVideoMode(640,480,32,SDL_SWSURFACE);
  101.     SDL_Event event;
  102.     Uint32 start;
  103.     bool running;
  104.     bool b[4]={0,0,0,0};
  105.     float x=0,z=0;
  106.     while(running)
  107.     {
  108.         start=SDL_GetTicks();
  109.         while(SDL_PollEvent(&event))
  110.         {
  111.             switch(event.type)
  112.             {
  113.                 case SDL_QUIT:
  114.                     running=false;
  115.                     break;
  116.                 case SDL_KEYDOWN:
  117.                     switch(event.key.keysym.sym)
  118.                     {
  119.                         case SDLK_UP:
  120.                             b[0]=true;
  121.                             break;
  122.                         case SDLK_RIGHT:
  123.                             b[1]=true;
  124.                             break;
  125.                         case SDLK_DOWN:
  126.                             b[2]=true;
  127.                             break;
  128.                         case SDLK_LEFT:
  129.                             b[3]=true;
  130.                             break;
  131.                         case SDLK_SPACE:
  132.                             alSourcePlay(sourceid);
  133.                             break;                     
  134.                     }
  135.                     break;
  136.                 case SDL_KEYUP:
  137.                     switch(event.key.keysym.sym)
  138.                     {
  139.                         case SDLK_UP:
  140.                             b[0]=false;
  141.                             break;
  142.                         case SDLK_RIGHT:
  143.                             b[1]=false;
  144.                             break;
  145.                         case SDLK_DOWN:
  146.                             b[2]=false;
  147.                             break;
  148.                         case SDLK_LEFT:
  149.                             b[3]=false;
  150.                             break;
  151.                     }
  152.                     break;
  153.             }
  154.         }
  155.        
  156.         if(b[0])
  157.             z+=0.3;
  158.         if(b[1])
  159.             x+=0.3;
  160.         if(b[2])
  161.             z-=0.3;
  162.         if(b[3])
  163.             x-=0.3;
  164.         alSource3f(sourceid,AL_POSITION,x,0,z);
  165.         alSourcei(sourceid,AL_LOOPING,AL_TRUE);
  166.        
  167.        
  168.         float f[]={1,0,0,0,1,0};
  169.         alListenerfv(AL_ORIENTATION,f);
  170.        
  171.        
  172.         if(1000/30.0>SDL_GetTicks()-start)
  173.             SDL_Delay(1000/30.0-(SDL_GetTicks()-start));
  174.     }
  175.    
  176.     alDeleteSources(1,&sourceid);
  177.     alDeleteBuffers(1,&bufferid);
  178.    
  179.     alcDestroyContext(context);
  180.     alcCloseDevice(device);
  181.     delete[] data;
  182.     return 0;
  183. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement