//
// Written by Curtis Olson, started April 2004.
//
-// Copyright (C) 2004 Curtis L. Olson - curt@flightgear.org
+// Copyright (C) 2004 Curtis L. Olson - http://www.flightgear.org/~curt
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License as
// $Id$
-#include <AL/al.h>
-#include <AL/alut.h>
+#if defined( __APPLE__ )
+# define AL_ILLEGAL_ENUM AL_INVALID_ENUM
+# define AL_ILLEGAL_COMMAND AL_INVALID_OPERATION
+# include <OpenAL/al.h>
+# include <OpenAL/alut.h>
+#else
+# include <AL/al.h>
+# include <AL/alut.h>
+#endif
#include <simgear/debug/logstream.hxx>
#include <simgear/misc/sg_path.hxx>
// constructor
-SGSoundSample::SGSoundSample( const char *path, const char *file ) :
+SGSoundSample::SGSoundSample( const char *path, const char *file,
+ bool cleanup ) :
+ data(NULL),
pitch(1.0),
volume(1.0),
+ reference_dist(500.0),
+ max_dist(3000.),
loop(AL_FALSE)
{
SGPath samplepath( path );
if ( strlen(file) ) {
samplepath.append( file );
}
-
- SG_LOG( SG_GENERAL, SG_ALERT, "From file sounds sample = "
- << samplepath.str() );
- ALuint error;
+ sample_name = samplepath.str();
+
+ SG_LOG( SG_GENERAL, SG_DEBUG, "From file sounds sample = "
+ << samplepath.str() );
source_pos[0] = 0.0; source_pos[1] = 0.0; source_pos[2] = 0.0;
+ offset_pos[0] = 0.0; offset_pos[1] = 0.0; offset_pos[2] = 0.0;
source_vel[0] = 0.0; source_vel[1] = 0.0; source_vel[2] = 0.0;
+ direction[0] = 0.0; direction[1] = 0.0; direction[2] = 0.0;
+ inner = outer = 360.0; outergain = 0.0;
// clear errors from elsewhere?
alGetError();
// create an OpenAL buffer handle
alGenBuffers(1, &buffer);
- error = alGetError();
+ ALuint error = alGetError();
if ( error != AL_NO_ERROR ) {
print_openal_error( error );
throw sg_exception("Failed to gen OpenAL buffer.");
- } else {
- SG_LOG( SG_GENERAL, SG_ALERT, "Buffer created ok!" );
}
// Load the sample file
+#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 (alGetError() != AL_NO_ERROR) {
throw sg_exception("Failed to load wav 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);
if (alGetError() != AL_NO_ERROR) {
- throw sg_exception("Failed to gen source.");
+ throw sg_exception("Failed to gen source.\nPlease update your sound driver and try again.");
}
alSourcei( source, AL_BUFFER, buffer );
alSourcef( source, AL_PITCH, pitch );
alSourcef( source, AL_GAIN, volume );
alSourcefv( source, AL_POSITION, source_pos );
+ alSourcefv( source, AL_DIRECTION, direction );
+ alSourcef( source, AL_CONE_INNER_ANGLE, inner );
+ alSourcef( source, AL_CONE_OUTER_ANGLE, outer );
+ alSourcef( source, AL_CONE_OUTER_GAIN, outergain);
alSourcefv( source, AL_VELOCITY, source_vel );
alSourcei( source, AL_LOOPING, loop );
+
+ alSourcei( source, AL_SOURCE_RELATIVE, AL_TRUE );
+ alSourcef( source, AL_REFERENCE_DISTANCE, reference_dist );
+ alSourcef( source, AL_MAX_DISTANCE, max_dist );
}
// constructor
-SGSoundSample::SGSoundSample( unsigned char *_data, int len, int _freq ) :
+SGSoundSample::SGSoundSample( unsigned char *_data, int len, int _freq,
+ bool cleanup) :
+ data(NULL),
pitch(1.0),
volume(1.0),
+ reference_dist(500.0),
+ max_dist(3000.),
loop(AL_FALSE)
{
- SG_LOG( SG_GENERAL, SG_ALERT, "In memory sounds sample" );
+ 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;
+ offset_pos[0] = 0.0; offset_pos[1] = 0.0; offset_pos[2] = 0.0;
source_vel[0] = 0.0; source_vel[1] = 0.0; source_vel[2] = 0.0;
+ direction[0] = 0.0; direction[1] = 0.0; direction[2] = 0.0;
+ inner = outer = 360.0; outergain = 0.0;
+
+ // clear errors from elsewhere?
+ alGetError();
// Load wav data into a buffer.
alGenBuffers(1, &buffer);
- if (alGetError() != AL_NO_ERROR) {
- SG_LOG( SG_GENERAL, SG_ALERT, "Error in alGenBuffers()" );
+ ALuint error = alGetError();
+ if ( error != AL_NO_ERROR ) {
+ print_openal_error( error );
+ throw sg_exception("Failed to gen buffer." );
return;
}
freq = _freq;
alBufferData( buffer, format, data, size, freq );
+ if (alGetError() != AL_NO_ERROR) {
+ throw sg_exception("Failed to buffer data.");
+ }
+
+ if ( cleanup ) {
+ alutUnloadWAV( format, data, size, freq );
+ data = NULL;
+ }
// Bind buffer with a source.
alGenSources(1, &source);
if (alGetError() != AL_NO_ERROR) {
- throw sg_exception("Failed to gen source.");
+ throw sg_exception("Failed to gen source.\nPlease update your sound driver and try again.");
}
alSourcei( source, AL_BUFFER, buffer );
alSourcef( source, AL_PITCH, pitch );
alSourcef( source, AL_GAIN, volume );
alSourcefv( source, AL_POSITION, source_pos );
+ alSourcefv( source, AL_DIRECTION, direction );
+ alSourcef( source, AL_CONE_INNER_ANGLE, inner );
+ alSourcef( source, AL_CONE_OUTER_ANGLE, outer );
+ alSourcef( source, AL_CONE_OUTER_GAIN, outergain );
alSourcefv( source, AL_VELOCITY, source_vel );
alSourcei( source, AL_LOOPING, loop );
+
+ alSourcei( source, AL_SOURCE_RELATIVE, AL_TRUE );
+ alSourcef( source, AL_REFERENCE_DISTANCE, reference_dist );
+ alSourcef( source, AL_MAX_DISTANCE, max_dist );
}
// destructor
SGSoundSample::~SGSoundSample() {
- SG_LOG( SG_GENERAL, SG_ALERT, "Deleting a sample" );
+ SG_LOG( SG_GENERAL, SG_INFO, "Deleting a sample" );
alDeleteSources(1, &source);
alDeleteBuffers(1, &buffer);
}