From bb383998bb77002a6d94e83e253de01e116f9268 Mon Sep 17 00:00:00 2001 From: curt Date: Mon, 26 Apr 2004 22:02:14 +0000 Subject: [PATCH] Update the SoundSample api so we can request that a copy of the sample be kept in memory and accessible. --- simgear/sound/openal_test2.cxx | 12 ++++++------ simgear/sound/sample_openal.cxx | 19 +++++++++++++++---- simgear/sound/sample_openal.hxx | 26 +++++++++++++++++++++----- simgear/sound/xmlsound.cxx | 3 ++- 4 files changed, 44 insertions(+), 16 deletions(-) diff --git a/simgear/sound/openal_test2.cxx b/simgear/sound/openal_test2.cxx index 10884c59..44a36e26 100644 --- a/simgear/sound/openal_test2.cxx +++ b/simgear/sound/openal_test2.cxx @@ -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(); diff --git a/simgear/sound/sample_openal.cxx b/simgear/sound/sample_openal.cxx index 107d630e..6cc22836 100644 --- a/simgear/sound/sample_openal.cxx +++ b/simgear/sound/sample_openal.cxx @@ -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); } diff --git a/simgear/sound/sample_openal.hxx b/simgear/sound/sample_openal.hxx index 0d907a0b..edc61ec8 100644 --- a/simgear/sound/sample_openal.hxx +++ b/simgear/sound/sample_openal.hxx @@ -34,6 +34,8 @@ #include +#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 +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 ); } } diff --git a/simgear/sound/xmlsound.cxx b/simgear/sound/xmlsound.cxx index f9d6e3e5..79d441e7 100644 --- a/simgear/sound/xmlsound.cxx +++ b/simgear/sound/xmlsound.cxx @@ -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 ); } -- 2.39.5