]> git.mxchange.org Git - simgear.git/blobdiff - simgear/sound/sample_openal.hxx
Ready for 0.3.8 release.
[simgear.git] / simgear / sound / sample_openal.hxx
index c6411cbd72df2d9ca8a8ebf12d7281ee03a3982d..6ed815d51ac54697f9e88d95467251ffaac520a0 100644 (file)
@@ -2,7 +2,7 @@
 // 
 // Written by Curtis Olson, started April 2004.
 //
-// Copyright (C) 2004  Curtis L. Olson - curt@flightgear.org
+// Copyright (C) 2004  Curtis L. Olson - http://www.flightgear.org/~curt
 //
 // This program is free software; you can redistribute it and/or
 // modify it under the terms of the GNU General Public License as
 
 #include <simgear/compiler.h>
 
-#include <AL/al.h>
+#include STL_STRING
 
 #include <simgear/debug/logstream.hxx>
 
+#include <plib/sg.h>
+
+#if defined(__APPLE__)
+# define AL_ILLEGAL_ENUM AL_INVALID_ENUM
+# define AL_ILLEGAL_COMMAND AL_INVALID_OPERATION
+# include <OpenAL/al.h>
+# include <OpenAL/alut.h>
+#else
+# include <AL/al.h>
+# include <AL/alut.h>
+#endif
+
+SG_USING_STD(string);
 
 /**
  * manages everything we need to know for an individual sound sample
@@ -47,6 +60,8 @@ class SGSoundSample {
 
 private:
 
+    string sample_name;
+
     // Buffers hold sound data.
     ALuint buffer;
 
@@ -56,6 +71,13 @@ private:
     // Position of the source sound.
     ALfloat source_pos[3];
 
+    // A constant offset to be applied to the final source_pos
+    ALfloat offset_pos[3];
+
+    // The orientation of the sound (direction and cut-off angles)
+    ALfloat direction[3];
+    ALfloat inner, outer, outergain;
+
     // Velocity of the source sound.
     ALfloat source_vel[3];
 
@@ -67,18 +89,40 @@ private:
 
     double pitch;
     double volume;
+    double reference_dist;
+    double max_dist;
     ALboolean loop;
 
+
 public:
 
-    SGSoundSample( const char *path, const char *file );
-    SGSoundSample( unsigned char *_data, int len, int _freq );
+    /**
+     * Constructor
+     * @param path Path name to sound
+     * @param file File name of sound
+     * @param cleanup Request clean up the intermediate data (this
+       should usually be true unless you want to manipulate the data
+       later.)
+     */
+    SGSoundSample( const char *path, const char *file, bool cleanup );
+
+    /**
+     * Constructor.
+     * @param _data Pointer to a memory buffer containing the sample data
+     * @param len Byte length of array
+     * @param _freq Frequency of the provided data (bytes per second)
+     * @param cleanup Request clean up the intermediate data (this
+       should usually be true unless you want to manipulate the data
+       later.)
+     */
+    SGSoundSample( unsigned char *_data, int len, int _freq, bool cleanup );
+
     ~SGSoundSample();
 
     /**
      * Start playing this sample.
      *
-     * @param looped Define wether the sound should be played in a loop.
+     * @param _loop Define wether the sound should be played in a loop.
      */
     void play( bool _loop );
 
@@ -110,7 +154,7 @@ public:
         alGetSourcei( source, AL_SOURCE_STATE, &result );
         if ( alGetError() != AL_NO_ERROR) {
             SG_LOG( SG_GENERAL, SG_ALERT,
-                    "Oops AL error in sample is_playing()!" );
+                    "Oops AL error in sample is_playing(): " << sample_name );
         }
         return (result == AL_PLAYING) ;
     }
@@ -131,7 +175,8 @@ public:
         alSourcef( source, AL_PITCH, pitch );
         if ( alGetError() != AL_NO_ERROR) {
             SG_LOG( SG_GENERAL, SG_ALERT,
-                    "Oops AL error in sample set_pitch()! " << p );
+                    "Oops AL error in sample set_pitch()! " << p
+                    << " for " << sample_name );
         }
     }
 
@@ -148,7 +193,8 @@ public:
         alSourcef( source, AL_GAIN, volume );
         if ( alGetError() != AL_NO_ERROR) {
             SG_LOG( SG_GENERAL, SG_ALERT,
-                    "Oops AL error in sample set_volume()!" );
+                    "Oops AL error in sample set_volume()! " << v
+                    << " for " << sample_name  );
         }
     }
 
@@ -165,6 +211,82 @@ public:
     inline char *get_data() {
         return (char *)data;
     }
+
+    /**
+     * Set position of sound source (uses same coordinate system as opengl)
+     */
+    inline void set_source_pos( ALfloat *pos ) {
+        source_pos[0] = pos[0];
+        source_pos[1] = pos[1];
+        source_pos[2] = pos[2];
+
+        sgVec3 final_pos;
+        sgAddVec3( final_pos, source_pos, offset_pos );
+
+        alSourcefv( source, AL_POSITION, final_pos );
+    }
+
+    /**
+     * Set "constant" offset position of sound source (uses same
+     * coordinate system as opengl)
+     */
+    inline void set_offset_pos( ALfloat *pos ) {
+        offset_pos[0] = pos[0];
+        offset_pos[1] = pos[1];
+        offset_pos[2] = pos[2];
+
+        sgVec3 final_pos;
+        sgAddVec3( final_pos, source_pos, offset_pos );
+
+        alSourcefv( source, AL_POSITION, final_pos );
+    }
+
+    /**
+     * Set the orientation of the sound source, both for direction
+     * and audio cut-off angles.
+     */
+    inline void set_orientation( ALfloat *dir, ALfloat inner_angle=360.0,
+                                               ALfloat outer_angle=360.0,
+                                               ALfloat outer_gain=0.0)
+    {
+        inner = inner_angle;
+        outer = outer_angle;
+        outergain = outer_gain;
+        alSourcefv( source, AL_DIRECTION, dir);
+        alSourcef( source, AL_CONE_INNER_ANGLE, inner );
+        alSourcef( source, AL_CONE_OUTER_ANGLE, outer );
+        alSourcef( source, AL_CONE_OUTER_GAIN, outergain );
+    }
+
+    /**
+     * Set velocity of sound source (uses same coordinate system as opengl)
+     */
+    inline void set_source_vel( ALfloat *vel ) {
+        source_vel[0] = vel[0];
+        source_vel[1] = vel[1];
+        source_vel[2] = vel[2];
+        alSourcefv( source, AL_VELOCITY, source_vel );
+    }
+
+
+    /**
+     * Set reference distance of sound (the distance where the gain
+     * will be half.)
+     */
+    inline void set_reference_dist( ALfloat dist ) {
+        reference_dist = dist;
+        alSourcef( source, AL_REFERENCE_DISTANCE, reference_dist );
+    }
+
+
+    /**
+     * Set maximume distance of sound (the distance where the sound is
+     * no longer audible.
+     */
+    inline void set_max_dist( ALfloat dist ) {
+        max_dist = dist;
+        alSourcef( source, AL_MAX_DISTANCE, max_dist );
+    }
 };