00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #ifndef OAL_SOUND_SYSTEM
00032 #define OAL_SOUND_SYSTEM
00033
00034 #include <AL/al.h>
00035 #include <AL/alc.h>
00036 #include <AL/alut.h>
00037
00038 #include <iostream>
00039 #include <vector>
00040 #include <string>
00041
00042 #ifdef HAVE_VPR
00043 # include "vpr/vpr.h"
00044 # ifdef VPR_USE_IRIX_SPROC
00045 #error "VPR_USE_IRIX_SPROC: you idiot"
00046 # endif
00047 #endif
00048
00049 #ifdef _WIN32
00050 #include <windows.h>
00051 #endif
00052
00053 #include "syn/Stream/AudioContext.h"
00054
00055 namespace syn
00056 {
00057
00058
00059 class OpenALAudioContext : public syn::AudioContext
00060 {
00061 #ifdef WIN32
00062 ALCcontext* context_id;
00063 #else
00064 void* context_id;
00065 #endif
00066 ALCdevice* dev;
00067
00068 public:
00069 OpenALAudioContext() : context_id( NULL ), dev( NULL )
00070 {
00071 }
00072
00073
00074 void open()
00075 {
00076 if (context_id == NULL && dev == NULL)
00077 {
00078 std::vector<int> attrlist;
00079 attrlist.push_back( ALC_FREQUENCY );
00080 attrlist.push_back( 44100 );
00081 attrlist.push_back( ALC_INVALID );
00082
00083
00084 dev = alcOpenDevice( NULL );
00085 if (dev == NULL)
00086 {
00087 std::cerr<<"[syn]openalctx: Could not open device\n"<<std::flush;
00088 return;
00089 }
00090
00091
00092
00093 context_id = alcCreateContext( dev, &attrlist[0] );
00094 if (context_id == NULL)
00095 {
00096 std::string err = (char*)alGetString( alcGetError(dev) );
00097 std::cerr<<"[syn]openalctx: Could not open context: ";
00098 return;
00099 }
00100
00101 alcMakeContextCurrent( context_id );
00102 }
00103 std::cout<<"[syn]openalctx: Opened context\n"<<std::endl;
00104 }
00105
00106 void printError()
00107 {
00108 std::string err = (char*)alGetString( alcGetError(dev) );
00109 std::cerr<<err.c_str()<<"\n";
00110 }
00111
00112
00113 void close()
00114 {
00115 alcDestroyContext( context_id );
00116 alcCloseDevice( dev );
00117 }
00118 };
00119
00120 }
00121
00122 #endif