Update the SoundSample api so we can request that a copy of the sample be

kept in memory and accessible.
This commit is contained in:
curt
2004-04-26 22:02:14 +00:00
parent ffeb174ca1
commit bb383998bb
4 changed files with 44 additions and 16 deletions

View 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();

View 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);
}

View 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 );
}
}

View 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 );
}