1 // sample.hxx -- Sound sample encapsulation class
3 // Written by Curtis Olson, started April 2004.
5 // Copyright (C) 2004 Curtis L. Olson - curt@flightgear.org
7 // This program is free software; you can redistribute it and/or
8 // modify it under the terms of the GNU General Public License as
9 // published by the Free Software Foundation; either version 2 of the
10 // License, or (at your option) any later version.
12 // This program is distributed in the hope that it will be useful, but
13 // WITHOUT ANY WARRANTY; without even the implied warranty of
14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 // General Public License for more details.
17 // You should have received a copy of the GNU General Public License
18 // along with this program; if not, write to the Free Software
19 // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
25 * Provides a sound sample encapsulation
28 #ifndef _SG_SAMPLE_HXX
29 #define _SG_SAMPLE_HXX 1
32 # error This library requires C++
35 #include <simgear/compiler.h>
39 #include <simgear/debug/logstream.hxx>
43 #if defined(__APPLE__)
44 # define AL_ILLEGAL_ENUM AL_INVALID_ENUM
45 # define AL_ILLEGAL_COMMAND AL_INVALID_OPERATION
46 # include <OpenAL/al.h>
47 # include <OpenAL/alut.h>
56 * manages everything we need to know for an individual sound sample
65 // Buffers hold sound data.
68 // Sources are points emitting sound.
71 // Position of the source sound.
72 ALfloat source_pos[3];
74 // A constant offset to be applied to the final source_pos
75 ALfloat offset_pos[3];
77 // Velocity of the source sound.
78 ALfloat source_vel[3];
80 // configuration values
88 double reference_dist;
97 * @param path Path name to sound
98 * @param file File name of sound
99 * @param cleanup Request clean up the intermediate data (this
100 should usually be true unless you want to manipulate the data
103 SGSoundSample( const char *path, const char *file, bool cleanup );
104 SGSoundSample( unsigned char *_data, int len, int _freq );
108 * Start playing this sample.
110 * @param _loop Define wether the sound should be played in a loop.
112 void play( bool _loop );
115 * Stop playing this sample.
117 * @param sched A pointer to the appropriate scheduler.
122 * Play this sample once.
125 inline void play_once() { play(false); }
128 * Play this sample looped.
131 inline void play_looped() { play(true); }
134 * Test if a sample is curretnly playing.
135 * @return true if is is playing, false otherwise.
137 inline bool is_playing( ) {
139 alGetSourcei( source, AL_SOURCE_STATE, &result );
140 if ( alGetError() != AL_NO_ERROR) {
141 SG_LOG( SG_GENERAL, SG_ALERT,
142 "Oops AL error in sample is_playing(): " << sample_name );
144 return (result == AL_PLAYING) ;
148 * Get the current pitch setting of this sample.
150 inline double get_pitch() const { return pitch; }
153 * Set the pitch of this sample.
155 inline void set_pitch( double p ) {
156 // clamp in the range of 0.01 to 2.0
157 if ( p < 0.01 ) { p = 0.01; }
158 if ( p > 2.0 ) { p = 2.0; }
160 alSourcef( source, AL_PITCH, pitch );
161 if ( alGetError() != AL_NO_ERROR) {
162 SG_LOG( SG_GENERAL, SG_ALERT,
163 "Oops AL error in sample set_pitch()! " << p
164 << " for " << sample_name );
169 * Get the current volume setting of this sample.
171 inline double get_volume() const { return volume; }
174 * Set the volume of this sample.
176 inline void set_volume( double v ) {
178 alSourcef( source, AL_GAIN, volume );
179 if ( alGetError() != AL_NO_ERROR) {
180 SG_LOG( SG_GENERAL, SG_ALERT,
181 "Oops AL error in sample set_volume()! " << v
182 << " for " << sample_name );
187 * Returns the size of the sounds sample
189 inline int get_size() {
194 * Return a pointer to the raw data
196 inline char *get_data() {
201 * Set position of sound source (uses same coordinate system as opengl)
203 inline void set_source_pos( ALfloat *pos ) {
204 source_pos[0] = pos[0];
205 source_pos[1] = pos[1];
206 source_pos[2] = pos[2];
209 sgAddVec3( final_pos, source_pos, offset_pos );
211 alSourcefv( source, AL_POSITION, final_pos );
215 * Set "constant" offset position of sound source (uses same
216 * coordinate system as opengl)
218 inline void set_offset_pos( ALfloat *pos ) {
219 offset_pos[0] = pos[0];
220 offset_pos[1] = pos[1];
221 offset_pos[2] = pos[2];
224 sgAddVec3( final_pos, source_pos, offset_pos );
226 alSourcefv( source, AL_POSITION, final_pos );
230 * Set velocity of sound source (uses same coordinate system as opengl)
232 inline void set_source_vel( ALfloat *vel ) {
233 source_vel[0] = vel[0];
234 source_vel[1] = vel[1];
235 source_vel[2] = vel[2];
236 alSourcefv( source, AL_VELOCITY, source_vel );
241 * Set reference distance of sound (the distance where the gain
244 inline void set_reference_dist( ALfloat dist ) {
245 reference_dist = dist;
246 alSourcef( source, AL_REFERENCE_DISTANCE, reference_dist );
251 * Set maximume distance of sound (the distance where the sound is
254 inline void set_max_dist( ALfloat dist ) {
256 alSourcef( source, AL_MAX_DISTANCE, max_dist );
261 #endif // _SG_SAMPLE_HXX