kept in memory and accessible.
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();
// 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)
if ( strlen(file) ) {
samplepath.append( file );
}
-
+
+ sample_name = samplepath.str();
+
SG_LOG( SG_GENERAL, SG_DEBUG, "From file sounds sample = "
<< samplepath.str() );
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);
{
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;
}
// destructor
SGSoundSample::~SGSoundSample() {
SG_LOG( SG_GENERAL, SG_INFO, "Deleting a sample" );
+ if ( data != NULL ) {
+ delete data;
+ }
alDeleteSources(1, &source);
alDeleteBuffers(1, &buffer);
}
#include <simgear/compiler.h>
+#include STL_STRING
+
#if defined(__APPLE__)
# define AL_ILLEGAL_ENUM AL_INVALID_ENUM
# define AL_ILLEGAL_COMMAND AL_INVALID_OPERATION
#include <simgear/debug/logstream.hxx>
+SG_USING_STD(string);
+
/**
* manages everything we need to know for an individual sound sample
private:
+ string sample_name;
+
// Buffers hold sound data.
ALuint buffer;
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 );
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) ;
}
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 );
}
}
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 );
}
}
_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 );
}