]> git.mxchange.org Git - simgear.git/commitdiff
Update the SoundSample api so we can request that a copy of the sample be
authorcurt <curt>
Mon, 26 Apr 2004 22:02:14 +0000 (22:02 +0000)
committercurt <curt>
Mon, 26 Apr 2004 22:02:14 +0000 (22:02 +0000)
kept in memory and accessible.

simgear/sound/openal_test2.cxx
simgear/sound/sample_openal.cxx
simgear/sound/sample_openal.hxx
simgear/sound/xmlsound.cxx

index 10884c59bea7d65276ca612e2f1fbb8c57ec8344..44a36e2627b74be0654e0602b906748af86d9c04 100644 (file)
@@ -7,37 +7,37 @@
 int main( int argc, char *argv[] ) {
     SGSoundMgr sm;
 
-    SGSoundSample sample1( ".", "jet.wav" );
+    SGSoundSample sample1( ".", "jet.wav", true );
     sample1.set_volume(0.5);
     sample1.set_volume(0.2);
     sample1.play_looped();
     sleep(1);
 
-    SGSoundSample sample2( ".", "jet.wav" );
+    SGSoundSample sample2( ".", "jet.wav", true );
     sample2.set_volume(0.5);
     sample2.set_pitch(0.4);
     sample2.play_looped();
     sleep(1);
 
-    SGSoundSample sample3( ".", "jet.wav" );
+    SGSoundSample sample3( ".", "jet.wav", true );
     sample3.set_volume(0.5);
     sample3.set_pitch(0.8);
     sample3.play_looped();
     sleep(1);
 
-    SGSoundSample sample4( ".", "jet.wav" );
+    SGSoundSample sample4( ".", "jet.wav", true );
     sample4.set_volume(0.5);
     sample4.set_pitch(1.2);
     sample4.play_looped();
     sleep(1);
 
-    SGSoundSample sample5( ".", "jet.wav" );
+    SGSoundSample sample5( ".", "jet.wav", true );
     sample5.set_volume(0.5);
     sample5.set_pitch(1.6);
     sample5.play_looped();
     sleep(1);
 
-    SGSoundSample sample6( ".", "jet.wav" );
+    SGSoundSample sample6( ".", "jet.wav", true );
     sample6.set_volume(0.5);
     sample6.set_pitch(2.0);
     sample6.play_looped();
index 107d630e005b44d54d81045ad5f254b8ac4093d6..6cc22836034f4d22eb0a7486bcf8f67478b35871 100644 (file)
@@ -61,7 +61,8 @@ static void print_openal_error( ALuint error ) {
 
 
 // constructor
-SGSoundSample::SGSoundSample( const char *path, const char *file ) :
+SGSoundSample::SGSoundSample( const char *path, const char *file,
+                              bool cleanup ) :
     pitch(1.0),
     volume(1.0),
     loop(AL_FALSE)
@@ -70,7 +71,9 @@ 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 = "
             << samplepath.str() );
 
@@ -108,7 +111,10 @@ SGSoundSample::SGSoundSample( const char *path, const char *file ) :
         throw sg_exception("Failed to buffer data.");
     }
 
-    alutUnloadWAV( format, data, size, freq );
+    if ( cleanup ) {
+        alutUnloadWAV( format, data, size, freq );
+        data = NULL;
+    }
 
     // Bind buffer with a source.
     alGenSources(1, &source);
@@ -133,13 +139,15 @@ SGSoundSample::SGSoundSample( unsigned char *_data, int len, int _freq ) :
 {
     SG_LOG( SG_GENERAL, SG_DEBUG, "In memory sounds sample" );
 
+    sample_name = "unknown, generated from data";
+
     source_pos[0] = 0.0; source_pos[1] = 0.0; source_pos[2] = 0.0;
     source_vel[0] = 0.0; source_vel[1] = 0.0; source_vel[2] = 0.0;
 
     // Load wav data into a buffer.
     alGenBuffers(1, &buffer);
     if (alGetError() != AL_NO_ERROR) {
-        SG_LOG( SG_GENERAL, SG_ALERT, "Error in alGenBuffers()" );
+        throw sg_exception("Failed to gen buffer." );
         return;
     }
 
@@ -168,6 +176,9 @@ SGSoundSample::SGSoundSample( unsigned char *_data, int len, int _freq ) :
 // destructor
 SGSoundSample::~SGSoundSample() {
     SG_LOG( SG_GENERAL, SG_INFO, "Deleting a sample" );
+    if ( data != NULL ) {
+        delete data;
+    }
     alDeleteSources(1, &source);
     alDeleteBuffers(1, &buffer);
 }
index 0d907a0b4bc02b57d923ef79511328fb6caa092f..edc61ec8c9efe8cbac44be61a808700c467dfa81 100644 (file)
@@ -34,6 +34,8 @@
 
 #include <simgear/compiler.h>
 
+#include STL_STRING
+
 #if defined(__APPLE__)
 # define AL_ILLEGAL_ENUM AL_INVALID_ENUM
 # define AL_ILLEGAL_COMMAND AL_INVALID_OPERATION
@@ -46,6 +48,8 @@
 
 #include <simgear/debug/logstream.hxx>
 
+SG_USING_STD(string);
+
 
 /**
  * manages everything we need to know for an individual sound sample
@@ -55,6 +59,8 @@ class SGSoundSample {
 
 private:
 
+    string sample_name;
+
     // Buffers hold sound data.
     ALuint buffer;
 
@@ -79,14 +85,22 @@ private:
 
 public:
 
-    SGSoundSample( const char *path, const char *file );
+    /**
+     * 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();
 
     /**
      * 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 );
 
@@ -118,7 +132,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) ;
     }
@@ -139,7 +153,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 );
         }
     }
 
@@ -156,7 +171,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  );
         }
     }
 
index f9d6e3e5c3303623b756c3e3a73e434a96274752..79d441e7fd823d4d0b7dd0923a288c5da394d8e3 100644 (file)
@@ -239,7 +239,8 @@ SGXmlSound::init(SGPropertyNode *root, SGPropertyNode *node, SGSoundMgr *sndmgr,
    _mgr = sndmgr;
    if ( (_sample = _mgr->find(_name)) == NULL ) {
        _sample = new SGSoundSample( path.c_str(),
-                                    node->getStringValue("path", "") );
+                                    node->getStringValue("path", ""),
+                                    true );
        _mgr->add( _sample, _name );
    }