Revision: 7281 http://playerstage.svn.sourceforge.net/playerstage/?rev=7281&view=rev Author: natepak Date: 2009-01-20 05:39:31 +0000 (Tue, 20 Jan 2009)
Log Message: ----------- Update to the openal implementation Modified Paths: -------------- code/gazebo/trunk/SConstruct code/gazebo/trunk/server/World.cc code/gazebo/trunk/server/audio_video/OpenAL.cc code/gazebo/trunk/server/audio_video/OpenAL.hh code/gazebo/trunk/server/audio_video/SConscript Modified: code/gazebo/trunk/SConstruct =================================================================== --- code/gazebo/trunk/SConstruct 2009-01-18 01:56:16 UTC (rev 7280) +++ code/gazebo/trunk/SConstruct 2009-01-20 05:39:31 UTC (rev 7281) @@ -58,12 +58,13 @@ '#server/controllers/position2d', '#server/controllers/position2d/pioneer2dx', '#server/controllers/irarray', + '#server/audio_video', ], - LIBPATH=Split('#libgazebo'), + LIBPATH=Split('#libgazebo #server/audio_video'), #LIBS=Split('gazebo boost_python') - LIBS=Split('gazebo boost_signals'), + LIBS=Split('gazebo gazeboav boost_signals'), LINKFLAGS=Split('-export-dynamic'), TARFLAGS = '-c -z', Modified: code/gazebo/trunk/server/World.cc =================================================================== --- code/gazebo/trunk/server/World.cc 2009-01-18 01:56:16 UTC (rev 7280) +++ code/gazebo/trunk/server/World.cc 2009-01-20 05:39:31 UTC (rev 7281) @@ -38,6 +38,7 @@ #include "Simulator.hh" #include "gazebo.h" #include "World.hh" +#include "OpenAL.hh" #include "Geom.hh" using namespace gazebo; @@ -170,8 +171,12 @@ (*miter)->Init(); } + // Initialize the physics engine this->physicsEngine->Init(); + // Initialize openal + OpenAL::Instance()->Init(); + this->toAddModels.clear(); this->toDeleteModels.clear(); @@ -219,6 +224,9 @@ this->toDeleteModels.clear(); + // Update the audio + OpenAL::Instance()->Update(); + return 0; } Modified: code/gazebo/trunk/server/audio_video/OpenAL.cc =================================================================== --- code/gazebo/trunk/server/audio_video/OpenAL.cc 2009-01-18 01:56:16 UTC (rev 7280) +++ code/gazebo/trunk/server/audio_video/OpenAL.cc 2009-01-20 05:39:31 UTC (rev 7281) @@ -2,32 +2,37 @@ #include <unistd.h> #include <iostream> -#include <AL/alut.h> +#ifdef ENABLE_OPENAL #include <AL/alc.h> +#endif +#include "GazeboError.hh" +#include "GazeboMessage.hh" #include "AudioDecoder.hh" #include "OpenAL.hh" -#ifndef NULL -#define NULL 0 -#endif +using namespace gazebo; - //////////////////////////////////////////////////////////////////////////////// ///// Constructor OpenAL::OpenAL() { +#ifdef ENABLE_OPENAL + printf("CONSTRUCTOR!!!!|\n\n\n"); this->context = NULL; this->audioDevice = NULL; this->pos[0] = this->pos[1] = this->pos[2] = 0.0; this->pos[0] = -10.0; +#endif } //////////////////////////////////////////////////////////////////////////////// /// Destructor OpenAL::~OpenAL() { + +#ifdef ENABLE_OPENAL if (this->context && this->audioDevice) { this->context = alcGetCurrentContext(); @@ -36,6 +41,7 @@ alcDestroyContext(this->context); alcCloseDevice(this->audioDevice); } +#endif this->sources.clear(); this->buffers.clear(); @@ -45,8 +51,11 @@ /// Initialize int OpenAL::Init() { +#ifdef ENABLE_OPENAL + // Open the default audio device this->audioDevice = alcOpenDevice("ALSA Software on HDA Intel"); + if (this->audioDevice == NULL) { printf("Unable to open audio device\n"); @@ -59,6 +68,7 @@ //Clear error code alGetError(); +#endif // TODO: put in function to set distance model //alDistanceModel(AL_EXPONENT_DISTANCE); @@ -69,6 +79,15 @@ /// Create a sound source unsigned int OpenAL::CreateSource() { +#ifdef ENABLE_OPENAL + + // Make sure we have an audio device + if (!this->audioDevice) + { + gzerr(0) << "Audio device not open\n"; + return -1; + } + unsigned int source; //Create 1 source @@ -76,17 +95,30 @@ this->sources.push_back(source); +#endif + return this->sources.size()-1; + } //////////////////////////////////////////////////////////////////////////////// /// Create an audio data buffer unsigned int OpenAL::CreateBuffer(const std::string &audioFile) { + +#ifdef ENABLE_OPENAL + unsigned int buffer; uint8_t *dataBuffer = NULL; unsigned int dataBufferSize; + // Make sure we have an audio device + if (!this->audioDevice) + { + gzerr(0) << "Audio device not open\n"; + return -1; + } + // Create an audio decoder AudioDecoder audioDecoder; @@ -106,6 +138,7 @@ if (dataBuffer) delete [] dataBuffer; +#endif return this->buffers.size()-1; } @@ -115,9 +148,18 @@ /// Update all the sources and the listener void OpenAL::Update() { +#ifdef ENABLE_OPENAL + //ALfloat pos[3]; ALfloat vel[3]; + // Make sure we have an audio device + if (!this->audioDevice) + { + gzerr(10) << "Audio device not open\n"; + return; + } + //for (int i=0; i< this->sourceCount; i++) { @@ -135,12 +177,22 @@ //printf("p[%f %f %f] v[%f %f %f]\n", pos[0], pos[1], pos[2], vel[0], vel[1], vel[2]); this->SetSourcePos(0, this->pos[0], this->pos[1], this->pos[2] ); } +#endif } //////////////////////////////////////////////////////////////////////////////// /// Set the data int OpenAL::SetData(unsigned int index, uint8_t *data, unsigned int dataSize, unsigned int freq) { +#ifdef ENABLE_OPENAL + + // Make sure we have an audio device + if (!this->audioDevice) + { + gzerr(0) << "Audio device not open\n"; + return -1; + } + // Clear the error buffer; alGetError(); @@ -158,8 +210,7 @@ alDeleteBuffers(1, &this->buffers[index]); return -1; } - - +#endif return 0; } @@ -167,6 +218,15 @@ /// \brief Attach a buffer to a source int OpenAL::SetSourceBuffer(unsigned int sourceIndex, unsigned int bufferIndex) { +#ifdef ENABLE_OPENAL + + // Make sure we have an audio device + if (!this->audioDevice) + { + gzerr(0) << "Audio device not open\n"; + return -1; + } + if (sourceIndex >= this->sources.size()) { std::cerr << "Invalid source index\n"; @@ -190,6 +250,7 @@ return -1; } +#endif return 0; } @@ -198,6 +259,15 @@ // Play the source void OpenAL::Play( unsigned int index ) { +#ifdef ENABLE_OPENAL + + // Make sure we have an audio device + if (!this->audioDevice) + { + gzerr(0) << "Audio device not open\n"; + return; + } + // Play the source alSourcePlay( this->sources[index] ); @@ -210,13 +280,22 @@ alGetSourcei(this->sources[index], AL_SOURCE_STATE, &state); } while ( state == AL_PLAYING); */ - +#endif } //////////////////////////////////////////////////////////////////////////////// /// Set the listener position int OpenAL::SetListenerPos( float x, float y, float z ) { +#ifdef ENABLE_OPENAL + + // Make sure we have an audio device + if (!this->audioDevice) + { + gzerr(0) << "Audio device not open\n"; + return -1; + } + // Clear error state alGetError(); @@ -227,7 +306,7 @@ std::cerr << "OpenAL SetListenerPos Error: [%d]\n" << this->error << "\n"; return -1; } - +#endif return 0; } @@ -235,6 +314,15 @@ /// Set the listener velocity int OpenAL::SetListenerVel( float x, float y, float z ) { +#ifdef ENABLE_OPENAL + + // Make sure we have an audio device + if (!this->audioDevice) + { + gzerr(0) << "Audio device not open\n"; + return -1; + } + // Clear error state alGetError(); @@ -244,7 +332,7 @@ std::cerr << "OpenAL SetListenerVel Error: [%d]" << this->error << "\n"; return -1; } - +#endif return 0; } @@ -253,8 +341,16 @@ int OpenAL::SetListenerOrient( float cx, float cy, float cz, float ux, float uy, float uz ) { +#ifdef ENABLE_OPENAL ALfloat orient[]={cx, cy, cz, ux, uy, uz}; + // Make sure we have an audio device + if (!this->audioDevice) + { + gzerr(0) << "Audio device not open\n"; + return -1; + } + // Clear error state alGetError(); @@ -265,7 +361,7 @@ std::cerr << "OpenAL SetListenerOrientation Error: [%d]" << this->error << "\n"; return -1; } - +#endif return 0; } @@ -273,8 +369,16 @@ // Set the position of the source int OpenAL::SetSourcePos(unsigned int index, float x, float y, float z) { +#ifdef ENABLE_OPENAL ALfloat p[3] = {x, y, z}; + // Make sure we have an audio device + if (!this->audioDevice) + { + gzerr(0) << "Audio device not open\n"; + return -1; + } + if (index >= this->sources.size()) { std::cerr << "Invalid source index[" << index <<" ]\n"; @@ -291,7 +395,7 @@ std::cerr << "OpenAL::SetSourcePos Error: [%d]" << this->error << "\n"; return -1; } - +#endif return 0; } @@ -299,8 +403,17 @@ // Set the position of the source int OpenAL::SetSourceVel(unsigned int index, float x, float y, float z) { +#ifdef ENABLE_OPENAL ALfloat v[3] = {x, y, z}; + // Make sure we have an audio device + if (!this->audioDevice) + { + gzerr(0) << "Audio device not open\n"; + return -1; + } + + if (index >= this->sources.size()) { std::cerr << "Invalid source index[" << index <<" ]\n"; @@ -317,7 +430,7 @@ std::cerr << "OpenAL::SetSourceVel Error: [%d]" << this->error << "\n"; return -1; } - +#endif return 0; } @@ -325,6 +438,16 @@ // Set the pitch of the source int OpenAL::SetSourcePitch(unsigned int index, float p) { + +#ifdef ENABLE_OPENAL + + // Make sure we have an audio device + if (!this->audioDevice) + { + gzerr(0) << "Audio device not open\n"; + return -1; + } + if (index >= this->sources.size()) { std::cerr << "Invalid source index[" << index <<" ]\n"; @@ -341,7 +464,7 @@ std::cerr << "OpenAL::SetSourcePitch Error: [%d]\n" << this->error; return -1; } - +#endif return 0; } @@ -349,6 +472,16 @@ // Set the pitch of the source int OpenAL::SetSourceGain(unsigned int index, float g) { +#ifdef ENABLE_OPENAL + + // Make sure we have an audio device + if (!this->audioDevice) + { + gzerr(0) << "Audio device not open\n"; + return -1; + } + + if (index >= this->sources.size()) { std::cerr << "Invalid source index[" << index <<" ]\n"; @@ -365,7 +498,7 @@ std::cerr << "OpenAL::SetSourceGain Error: [%d]\n" << this->error; return -1; } - +#endif return 0; } @@ -373,6 +506,16 @@ // Set whether the source loops the audio int OpenAL::SetSourceLoop(unsigned int index, bool state) { +#ifdef ENABLE_OPENAL + + // Make sure we have an audio device + if (!this->audioDevice) + { + gzerr(0) << "Audio device not open\n"; + return -1; + } + + if (index >= this->sources.size()) { std::cerr << "Invalid source index[" << index <<" ]\n"; @@ -390,7 +533,7 @@ std::cerr << "OpenAL::SetSourceLoop Error: [%d]\n" << this->error << "\n"; return -1; } +#endif - return 0; } Modified: code/gazebo/trunk/server/audio_video/OpenAL.hh =================================================================== --- code/gazebo/trunk/server/audio_video/OpenAL.hh 2009-01-18 01:56:16 UTC (rev 7280) +++ code/gazebo/trunk/server/audio_video/OpenAL.hh 2009-01-20 05:39:31 UTC (rev 7281) @@ -1,81 +1,95 @@ #ifndef OPENAL_HH #define OPENAL_HH +#ifndef DISABLE_OPENAL #include <AL/al.h> #include <AL/alc.h> #include <AL/alext.h> +#endif + #include <stdint.h> #include <deque> +#include "SingletonT.hh" -class OpenAL +namespace gazebo { - /// \brief Constructor - public: OpenAL(); + + class OpenAL : public SingletonT<OpenAL> + { + /// \brief Constructor + private: OpenAL(); + + /// \brief Destructor + private: virtual ~OpenAL(); + + /// \brief Initialize + public: int Init(); + + /// \brief Update all the sources and the listener + public: void Update(); + + /// \brief Create a sound source + public: unsigned int CreateSource(); + + /// \brief Create an audio data buffer + public: unsigned int CreateBuffer(const std::string &audioFile); + + /// \brief Set the data + public: int SetData(unsigned int index, uint8_t *data, unsigned int dataSize, unsigned int freq); + + /// \brief Attach a buffer to a source + public: int SetSourceBuffer(unsigned int sourceIndex, unsigned int bufferIndex); + + /// \brief Play a sound + public: void Play(unsigned int source); + + /// \brief Set the listener position + public: int SetListenerPos( float x, float y, float z ); + + /// \brief Set the listener velocity + public: int SetListenerVel( float x, float y, float z ); + + /// \brief Set the listener orientation + public: int SetListenerOrient(float cx, float cy, float cz, + float ux, float uy, float uz); + + /// \brief Set the position of the source + public: int SetSourcePos(unsigned int index, float x, float y, float z); + + /// \brief Set the position of the source + public: int SetSourceVel(unsigned int index, float x, float y, float z); + + /// \brief Set the pitch of the source + public: int SetSourcePitch(unsigned int index, float p); + + /// \brief Set the pitch of the source + public: int SetSourceGain(unsigned int index, float g); + + /// \brief Set whether the source loops the audio + public: int SetSourceLoop(unsigned int index, bool state); - /// \brief Destructor - public: virtual ~OpenAL(); +#ifndef DISABLE_OPENAL + private: ALCcontext *context; + private: ALCdevice *audioDevice; + + private: ALfloat pos[3]; - /// \brief Initialize - public: int Init(); + // OpenAL error code + private: ALenum error; +#endif - /// \brief Update all the sources and the listener - public: void Update(); + // Audio sources. + private: std::deque<unsigned int> sources; + + // Audio data buffers + private: std::deque<unsigned int> buffers; + + private: friend class DestroyerT<OpenAL>; + private: friend class SingletonT<OpenAL>; + }; + +} - /// \brief Create a sound source - public: unsigned int CreateSource(); - - /// \brief Create an audio data buffer - public: unsigned int CreateBuffer(const std::string &audioFile); - - /// \brief Set the data - public: int SetData(unsigned int index, uint8_t *data, unsigned int dataSize, unsigned int freq); - - /// \brief Attach a buffer to a source - public: int SetSourceBuffer(unsigned int sourceIndex, unsigned int bufferIndex); - - /// \brief Play a sound - public: void Play(unsigned int source); - - /// \brief Set the listener position - public: int SetListenerPos( float x, float y, float z ); - - /// \brief Set the listener velocity - public: int SetListenerVel( float x, float y, float z ); - - /// \brief Set the listener orientation - public: int SetListenerOrient(float cx, float cy, float cz, - float ux, float uy, float uz); - - /// \brief Set the position of the source - public: int SetSourcePos(unsigned int index, float x, float y, float z); - - /// \brief Set the position of the source - public: int SetSourceVel(unsigned int index, float x, float y, float z); - - /// \brief Set the pitch of the source - public: int SetSourcePitch(unsigned int index, float p); - - /// \brief Set the pitch of the source - public: int SetSourceGain(unsigned int index, float g); - - /// \brief Set whether the source loops the audio - public: int SetSourceLoop(unsigned int index, bool state); - - private: ALCcontext *context; - private: ALCdevice *audioDevice; - - // OpenAL error code - private: ALenum error; - - // Audio sources. - private: std::deque<unsigned int> sources; - - // Audio data buffers - private: std::deque<unsigned int> buffers; - - private: ALfloat pos[3]; -}; - #endif Modified: code/gazebo/trunk/server/audio_video/SConscript =================================================================== --- code/gazebo/trunk/server/audio_video/SConscript 2009-01-18 01:56:16 UTC (rev 7280) +++ code/gazebo/trunk/server/audio_video/SConscript 2009-01-20 05:39:31 UTC (rev 7281) @@ -1,11 +1,10 @@ #Import variable -Import('env sharedObjs headers') +Import('env sharedObjs headers install_prefix') parseConfigs = [ 'pkg-config --cflags --libs libavformat', 'pkg-config --cflags --libs libavcodec', - 'pkg-config --cflags --libs openal', - 'pkg-config --cflags --libs freealut' + 'pkg-config --cflags --libs openal' ] myEnv = env.Clone() @@ -18,6 +17,10 @@ ['server/audio_video/AudioDecoder.hh', 'server/audio_video/OpenAL.hh', ] ) + +enable_openal = 1 + + # # Parse all the pacakge configurations # @@ -32,10 +35,17 @@ if cfg.find("OpenAL") >= 0: print "OpenAL not found. 3D audio is disabled." print " http://connect.creativelabs.com/" - Exit(1) + enable_openal = 0 if cfg.find("avcodec") >= 0 or cfg.find("avformat") >= 0: print "FFMpeg not found. Audio decoding disabled." print " http://ffmpeg.mplayerhq.hu/" - Exit(1) + enable_openal = 0 -myEnv.SharedLibrary('gazeboav', sources) +conf = Configure(myEnv) +if conf.CheckLib('openal'): + conf.env.Append(CCFLAGS = " -DENABLE_OPENAL") +myEnv = conf.Finish() + +sharedLib = myEnv.SharedLibrary('gazeboav', sources) +myEnv.Install(install_prefix+'/lib', sharedLib) + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. ------------------------------------------------------------------------------ This SF.net email is sponsored by: SourcForge Community SourceForge wants to tell your story. http://p.sf.net/sfu/sf-spreadtheword _______________________________________________ Playerstage-commit mailing list Playerstage-commit@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/playerstage-commit