X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fsound%2Fsample_openal.cxx;h=6f913bd881f062b316496209de0ca4b2ac36e710;hb=2af37b484ec146346dd848b5d0ba5fa74e307411;hp=c616bdc843725792ff406368827f7391c3ba0695;hpb=70faa252e7d27e8b8eaa085dc6759881b7d71836;p=simgear.git diff --git a/simgear/sound/sample_openal.cxx b/simgear/sound/sample_openal.cxx index c616bdc8..6f913bd8 100644 --- a/simgear/sound/sample_openal.cxx +++ b/simgear/sound/sample_openal.cxx @@ -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 = " @@ -107,24 +116,16 @@ SGSoundSample::SGSoundSample( const char *path, const char *file, buffer = alutCreateBufferFromFile(samplepath.c_str()); if (buffer == AL_NONE) { + ALenum error = alutGetError (); print_openal_error("constructor (alutCreateBufferFromFile)"); - throw sg_exception("Failed to load wav file."); + throw sg_exception("Failed to load wav file: "+string(alutGetErrorString (error))); } #else // // 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 ); @@ -133,20 +134,14 @@ 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), +SGSoundSample::SGSoundSample( unsigned char *_data, int len, int _freq ) : buffer(0), source(0), pitch(1.0), @@ -177,19 +172,13 @@ 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; - } - print_openal_error("constructor return"); } @@ -197,7 +186,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); } @@ -238,6 +228,9 @@ SGSoundSample::bind_source() { if ( playing ) { return true; } + if ( buffer == 0 ) { + return false; + } // Bind buffer with a source. alGetError(); @@ -375,3 +368,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; +} +