]> git.mxchange.org Git - simgear.git/blobdiff - simgear/sound/sample_openal.cxx
Compile time fixes needed to build SimGear on recent cygwin versions.
[simgear.git] / simgear / sound / sample_openal.cxx
index c182e829c041bc135e53ec970c3b0b12d8ea59ab..310b6339b7ab9deb9f33c4f0d71f37eb790776b3 100644 (file)
 //
 // 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$
 
+#ifdef HAVE_CONFIG_H
+#  include <simgear_config.h>
+#endif
 
 #if defined( __APPLE__ )
 # define AL_ILLEGAL_ENUM AL_INVALID_ENUM
@@ -63,11 +66,21 @@ static bool print_openal_error(const string &s = "unknown") {
     return error;
 }
 
+// empry constructor
+SGSoundSample::SGSoundSample() :
+    buffer(0),
+    source(0),
+    pitch(1.0),
+    volume(1.0),
+    reference_dist(500.0),
+    max_dist(3000.),
+    loop(AL_FALSE),
+    playing(false)
+{
+}
 
 // constructor
-SGSoundSample::SGSoundSample( const char *path, const char *file,
-                              bool cleanup ) :
-    data(NULL),
+SGSoundSample::SGSoundSample( const char *path, const char *file) :
     buffer(0),
     source(0),
     pitch(1.0),
@@ -81,7 +94,6 @@ SGSoundSample::SGSoundSample( const char *path, const char *file,
     if ( strlen(file) ) {
         samplepath.append( file );
     }
-
     sample_name = samplepath.str();
 
     SG_LOG( SG_GENERAL, SG_DEBUG, "From file sounds sample = "
@@ -109,23 +121,15 @@ SGSoundSample::SGSoundSample( const char *path, const char *file,
   if (buffer == AL_NONE) {
      ALenum error = alutGetError ();
      print_openal_error("constructor (alutCreateBufferFromFile)");
-     throw sg_exception("Failed to load wav file: "+string(alutGetErrorString (error)));
+     throw sg_io_exception("Failed to load wav file: ",
+                        sg_location(string(alutGetErrorString (error))));
   }
 
 #else
         //
        // pre 1.0 alut version
         //
-# if defined (__APPLE__)
-    alutLoadWAVFile( (ALbyte *)samplepath.c_str(),
-                     &format, &data, &size, &freq );
-# else
-    alutLoadWAVFile( (ALbyte *)samplepath.c_str(),
-                     &format, &data, &size, &freq, &loop );
-# endif
-    if ( print_openal_error("constructor (alutLoadWAVFile)") ) {
-        throw sg_exception("Failed to load wav file.");
-    }
+    ALvoid* data = load_file(path, file);
 
     // Copy data to the internal OpenAL buffer
     alBufferData( buffer, format, data, size, freq );
@@ -134,20 +138,14 @@ SGSoundSample::SGSoundSample( const char *path, const char *file,
         throw sg_exception("Failed to buffer data.");
     }
 
-    if ( cleanup ) {
-        alutUnloadWAV( format, data, size, freq );
-        data = NULL;
-    }
+    alutUnloadWAV( format, data, size, freq );
 #endif
 
     print_openal_error("constructor return");
 }
 
-
 // constructor
-SGSoundSample::SGSoundSample( unsigned char *_data, int len, int _freq,
-                              bool cleanup) :
-    data(NULL),
+SGSoundSample::SGSoundSample( unsigned char *_data, int len, int _freq ) :
     buffer(0),
     source(0),
     pitch(1.0),
@@ -178,19 +176,13 @@ SGSoundSample::SGSoundSample( unsigned char *_data, int len, int _freq,
 
     format = AL_FORMAT_MONO8;
     size = len;
-    data = _data;
     freq = _freq;
 
-    alBufferData( buffer, format, data, size, freq );
+    alBufferData( buffer, format, _data, size, freq );
     if ( print_openal_error("constructor (alBufferData)") ) {
         throw sg_exception("Failed to buffer data.");
     }
 
-    if ( cleanup ) {
-        alutUnloadWAV( format, data, size, freq );
-        data = NULL;
-    }
-
     print_openal_error("constructor return");
 }
 
@@ -198,7 +190,8 @@ SGSoundSample::SGSoundSample( unsigned char *_data, int len, int _freq,
 // destructor
 SGSoundSample::~SGSoundSample() {
     SG_LOG( SG_GENERAL, SG_INFO, "Deleting a sample" );
-    alDeleteBuffers(1, &buffer);
+    if (buffer)
+        alDeleteBuffers(1, &buffer);
 }
 
 
@@ -239,6 +232,9 @@ SGSoundSample::bind_source() {
     if ( playing ) {
         return true;
     }
+    if ( buffer == 0 ) {
+        return false;
+    }
 
     // Bind buffer with a source.
     alGetError();
@@ -376,3 +372,39 @@ SGSoundSample::set_max_dist( ALfloat dist ) {
         alSourcef( source, AL_MAX_DISTANCE, max_dist );
     }
 }
+
+ALvoid *
+SGSoundSample::load_file(const char *path, const char *file)
+{
+    ALvoid* data = 0;
+
+    SGPath samplepath( path );
+    if ( strlen(file) ) {
+        samplepath.append( file );
+    }
+
+#if defined(ALUT_API_MAJOR_VERSION) && ALUT_API_MAJOR_VERSION >= 1
+    ALfloat freqf;
+    data = alutLoadMemoryFromFile(samplepath.c_str(), &format, &size, &freqf );
+    if (data == NULL) {
+        throw sg_io_exception("Failed to load wav file.",
+                                       sg_location(samplepath.str()));
+    }
+    freq = (ALsizei)freqf;
+#else
+# if defined (__APPLE__)
+    alutLoadWAVFile( (ALbyte *)samplepath.c_str(),
+                     &format, &data, &size, &freq );
+# else
+    alutLoadWAVFile( (ALbyte *)samplepath.c_str(),
+                     &format, &data, &size, &freq, &loop );
+# endif
+    if ( print_openal_error("constructor (alutLoadWAVFile)") ) {
+        throw sg_io_exception("Failed to load wav file.",
+                                       sg_location(samplepath.str()));
+    }
+#endif
+
+    return data;
+}
+