]> git.mxchange.org Git - simgear.git/blobdiff - simgear/sound/sample_openal.hxx
Logging - downgrade play/stop messages to debug.
[simgear.git] / simgear / sound / sample_openal.hxx
index 0a5afdacd117b474fcd130bbf27ac7b8223b17db..1131981bf70a61a17ed8acd65dfe5b4282c308d7 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
@@ -16,7 +16,7 @@
 //
 // You should have received a copy of the GNU General Public License
 // along with this program; if not, write to the Free Software
-// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 //
 // $Id$
 
 
 #include <simgear/compiler.h>
 
-#include STL_STRING
+#include <string>
 
 #include <simgear/debug/logstream.hxx>
+#include <simgear/structure/SGReferenced.hxx>
+#include <simgear/structure/SGSharedPtr.hxx>
 
 #include <plib/sg.h>
 
 # include <AL/alut.h>
 #endif
 
-SG_USING_STD(string);
+#ifndef HAVE_WINDOWS_H
+ #ifdef AL_VERSION_1_2
+  #define USE_OPEN_AL_DOPPLER should work
+ #else
+  #define USE_OPEN_AL_DOPPLER_WITH_FIXED_LISTENER better than nothing
+ #endif
+#else
+ // the Open_AL Doppler calculation seems to be buggy on windows
+ #define USE_SOFTWARE_DOPPLER seem to be necessary
+#endif
+
+using std::string;
 
 /**
  * manages everything we need to know for an individual sound sample
  */
 
-class SGSoundSample {
+class SGSoundSample : public SGReferenced {
 
 private:
 
@@ -74,40 +87,66 @@ private:
     // 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];
 
     // configuration values
     ALenum format;
     ALsizei size;
-    ALvoid* data;
     ALsizei freq;
 
     double pitch;
     double volume;
+#ifdef USE_SOFTWARE_DOPPLER
+    double doppler_pitch_factor;
+    double doppler_volume_factor;
+#endif
     double reference_dist;
     double max_dist;
     ALboolean loop;
 
+    bool playing;
+    bool bind_source();
+    bool no_Doppler_effect;
 
 public:
 
+     /**
+      * Empty constructor, can be used to read data to the systems
+      * memory and not to the driver.
+      */
+    SGSoundSample();
+
     /**
      * 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 );
-    SGSoundSample( unsigned char *_data, int len, int _freq );
+    SGSoundSample( const char *path, const char *file, bool no_Doppler_effect = true );
+
+    /**
+     * Constructor.
+     * @param _data Pointer to a memory buffer containing the sample data
+       the application is responsible for freeing the buffer data.
+     * @param len Byte length of array
+     * @param _freq Frequency of the provided data (bytes per second)
+       should usually be true unless you want to manipulate the data
+       later.)
+     */
+    SGSoundSample( unsigned char *_data, int len, int _freq, bool no_Doppler_effect = true );
+
     ~SGSoundSample();
 
     /**
      * Start playing this sample.
      *
-     * @param _loop Define wether the sound should be played in a loop.
+     * @param _loop Define whether the sound should be played in a loop.
      */
     void play( bool _loop );
 
@@ -131,18 +170,10 @@ public:
     inline void play_looped() { play(true); }
 
     /**
-     * Test if a sample is curretnly playing.
+     * Test if a sample is currently playing.
      * @return true if is is playing, false otherwise.
      */
-    inline bool is_playing( ) {
-        ALint result;
-        alGetSourcei( source, AL_SOURCE_STATE, &result );
-        if ( alGetError() != AL_NO_ERROR) {
-            SG_LOG( SG_GENERAL, SG_ALERT,
-                    "Oops AL error in sample is_playing(): " << sample_name );
-        }
-        return (result == AL_PLAYING) ;
-    }
+    bool is_playing( );
 
     /**
      * Get the current pitch setting of this sample.
@@ -152,18 +183,7 @@ public:
     /**
      * Set the pitch of this sample.
      */
-    inline void set_pitch( double p ) {
-        // clamp in the range of 0.01 to 2.0
-        if ( p < 0.01 ) { p = 0.01; }
-        if ( p > 2.0 ) { p = 2.0; }
-        pitch = p;
-        alSourcef( source, AL_PITCH, pitch );
-        if ( alGetError() != AL_NO_ERROR) {
-            SG_LOG( SG_GENERAL, SG_ALERT,
-                    "Oops AL error in sample set_pitch()! " << p
-                    << " for " << sample_name );
-        }
-    }
+    void set_pitch( double p );
 
     /**
      * Get the current volume setting of this sample.
@@ -173,15 +193,7 @@ public:
     /**
      * Set the volume of this sample.
      */
-    inline void set_volume( double v ) {
-        volume = v;
-        alSourcef( source, AL_GAIN, volume );
-        if ( alGetError() != AL_NO_ERROR) {
-            SG_LOG( SG_GENERAL, SG_ALERT,
-                    "Oops AL error in sample set_volume()! " << v
-                    << " for " << sample_name  );
-        }
-    }
+    void set_volume( double v );
 
     /**
      * Returns the size of the sounds sample
@@ -190,71 +202,48 @@ public:
         return size;
     }
 
-    /**
-     * Return a pointer to the raw data
-     */
-    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 );
-    }
+    void set_source_pos( ALfloat *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];
+    void set_offset_pos( ALfloat *pos );
 
-        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.
+     */
+    void set_orientation( ALfloat *dir, ALfloat inner_angle=360.0,
+                                               ALfloat outer_angle=360.0,
+                                               ALfloat outer_gain=0.0);
 
     /**
      * 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 );
-    }
+    void set_source_vel( ALfloat *vel, ALfloat *listener_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 );
-    }
+    void set_reference_dist( ALfloat dist );
 
 
     /**
-     * Set maximume distance of sound (the distance where the sound is
+     * Set maximum 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 );
-    }
+    void set_max_dist( ALfloat dist );
+
+    /**
+     * Load a sound file into a memory buffer only.
+     */
+    ALvoid* load_file(const char *path, const char *file);
 };