//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
-// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
// $Id$
+#ifdef HAVE_CONFIG_H
+# include <simgear_config.h>
+#endif
#if defined( __APPLE__ )
# define AL_ILLEGAL_ENUM AL_INVALID_ENUM
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),
if ( strlen(file) ) {
samplepath.append( file );
}
-
sample_name = samplepath.str();
SG_LOG( SG_GENERAL, SG_DEBUG, "From file sounds sample = "
}
// Load the sample file
-#if defined (__APPLE__)
- alutLoadWAVFile( (ALbyte *)samplepath.c_str(),
- &format, &data, &size, &freq );
+#if defined(ALUT_API_MAJOR_VERSION) && ALUT_API_MAJOR_VERSION >= 1
+
+ buffer = alutCreateBufferFromFile(samplepath.c_str());
+ if (buffer == AL_NONE) {
+ ALenum error = alutGetError ();
+ print_openal_error("constructor (alutCreateBufferFromFile)");
+ throw sg_io_exception("Failed to load wav file: ",
+ sg_location(string(alutGetErrorString (error))));
+ }
+
#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.");
- }
+ //
+ // pre 1.0 alut version
+ //
+ ALvoid* data = load_file(path, file);
// Copy data to the internal OpenAL buffer
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;
- }
+ 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),
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");
}
// destructor
SGSoundSample::~SGSoundSample() {
SG_LOG( SG_GENERAL, SG_INFO, "Deleting a sample" );
- alDeleteBuffers(1, &buffer);
+ if (buffer)
+ alDeleteBuffers(1, &buffer);
}
if ( playing ) {
return true;
}
+ if ( buffer == 0 ) {
+ return false;
+ }
// Bind buffer with a source.
alGetError();
inner = inner_angle;
outer = outer_angle;
outergain = outer_gain;
+ direction[0] = dir[0];
+ direction[1] = dir[1];
+ direction[2] = dir[2];
if (playing) {
alSourcefv( source, AL_DIRECTION, dir);
alSourcef( source, AL_CONE_INNER_ANGLE, inner );
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_io_exception("Failed to load wav file.",
+ sg_location(samplepath.str()));
+ }
+ 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_io_exception("Failed to load wav file.",
+ sg_location(samplepath.str()));
+ }
+#endif
+
+ return data;
+}
+