]> git.mxchange.org Git - simgear.git/commitdiff
Make a clear separation between loading a sound file into main memroy and sending...
authorehofman <ehofman>
Sat, 12 Nov 2005 10:26:21 +0000 (10:26 +0000)
committerehofman <ehofman>
Sat, 12 Nov 2005 10:26:21 +0000 (10:26 +0000)
simgear/sound/openal_test2.cxx
simgear/sound/sample_openal.cxx
simgear/sound/sample_openal.hxx
simgear/sound/xmlsound.cxx

index bee6c4e7a2f85df2ae30833b0e3b17ca1773ca51..f887769c7fa2a9fe02b7b37d01f48e7c7ca1705d 100644 (file)
@@ -14,37 +14,37 @@ static unsigned int sleep(unsigned int secs) { return 0; }
 int main( int argc, char *argv[] ) {
     SGSoundMgr sm;
 
-    SGSoundSample sample1( ".", "jet.wav", true );
+    SGSoundSample sample1( ".", "jet.wav" );
     sample1.set_volume(0.5);
     sample1.set_volume(0.2);
     sample1.play_looped();
     sleep(1);
 
-    SGSoundSample sample2( ".", "jet.wav", true );
+    SGSoundSample sample2( ".", "jet.wav" );
     sample2.set_volume(0.5);
     sample2.set_pitch(0.4);
     sample2.play_looped();
     sleep(1);
 
-    SGSoundSample sample3( ".", "jet.wav", true );
+    SGSoundSample sample3( ".", "jet.wav" );
     sample3.set_volume(0.5);
     sample3.set_pitch(0.8);
     sample3.play_looped();
     sleep(1);
 
-    SGSoundSample sample4( ".", "jet.wav", true );
+    SGSoundSample sample4( ".", "jet.wav" );
     sample4.set_volume(0.5);
     sample4.set_pitch(1.2);
     sample4.play_looped();
     sleep(1);
 
-    SGSoundSample sample5( ".", "jet.wav", true );
+    SGSoundSample sample5( ".", "jet.wav" );
     sample5.set_volume(0.5);
     sample5.set_pitch(1.6);
     sample5.play_looped();
     sleep(1);
 
-    SGSoundSample sample6( ".", "jet.wav", true );
+    SGSoundSample sample6( ".", "jet.wav" );
     sample6.set_volume(0.5);
     sample6.set_pitch(2.0);
     sample6.play_looped();
index c182e829c041bc135e53ec970c3b0b12d8ea59ab..124ad93904d64497db156ce88877b42064d0177e 100644 (file)
@@ -63,11 +63,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 +91,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 = "
@@ -116,16 +125,7 @@ SGSoundSample::SGSoundSample( const char *path, const char *file,
         //
        // 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 +134,15 @@ 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),
     buffer(0),
     source(0),
     pitch(1.0),
@@ -178,17 +173,15 @@ 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;
+        free(_data);
     }
 
     print_openal_error("constructor return");
@@ -198,7 +191,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 +233,9 @@ SGSoundSample::bind_source() {
     if ( playing ) {
         return true;
     }
+    if ( buffer == 0 ) {
+        return false;
+    }
 
     // Bind buffer with a source.
     alGetError();
@@ -376,3 +373,37 @@ 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_exception("Failed to load wav file.");
+    }
+    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_exception("Failed to load wav file.");
+    }
+#endif
+
+    return data;
+}
+
index 68b7af7aeff01e0951bff9502dc33dfb9dc0243e..0f6d2a62c6fb2d598cbe46b0d8b61bc82191641c 100644 (file)
@@ -84,7 +84,6 @@ private:
     // configuration values
     ALenum format;
     ALsizei size;
-    ALvoid* data;
     ALsizei freq;
 
     double pitch;
@@ -98,15 +97,20 @@ private:
 
 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( const char *path, const char *file );
 
     /**
      * Constructor.
@@ -180,13 +184,6 @@ 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)
      */
@@ -224,6 +221,11 @@ public:
      * no longer audible.
      */
     void set_max_dist( ALfloat dist );
+
+    /**
+     * Load a sound file into a memory buffer only.
+     */
+    ALvoid* load_file(const char *path, const char *file);
 };
 
 
index 16d88b48aa7f33ac191b2a06394c0ca5d1481dd2..3e27b82b4933b57e4d60d7d7186241c9bd78913e 100644 (file)
@@ -275,8 +275,7 @@ SGXmlSound::init(SGPropertyNode *root, SGPropertyNode *node, SGSoundMgr *sndmgr,
        // "alSource".  The semantics of what is going on here seems
        // confused and needs to be thought through more carefully.
         _sample = new SGSoundSample( path.c_str(),
-                                    node->getStringValue("path", ""),
-                                    true );
+                                    node->getStringValue("path", "") );
 
        _mgr->add( _sample, _name );
    }