1 // sample.hxx -- Sound sample encapsulation class
3 // Written by Curtis Olson, started April 2004.
5 // Copyright (C) 2004 Curtis L. Olson - http://www.flightgear.org/~curt
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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
25 * Provides a sound sample encapsulation
28 #ifndef _SG_SAMPLE_HXX
29 #define _SG_SAMPLE_HXX 1
32 # error This library requires C++
37 #include <simgear/compiler.h>
38 #include <simgear/debug/logstream.hxx>
39 #include <simgear/structure/SGReferenced.hxx>
40 #include <simgear/structure/SGSharedPtr.hxx>
41 #include <simgear/math/SGMath.hxx>
48 * manages everything we need to know for an individual sound sample
51 class SGSoundSample : public SGReferenced {
55 // Position of the source sound.
56 SGVec3d _absolute_pos; // absolute position
57 SGVec3f _relative_pos; // position relative to the base position
58 SGVec3d _base_pos; // base position
60 // The orientation of the sound (direction and cut-off angles)
63 // Velocity of the source sound.
69 // configuration values
74 // Buffers hold sound data.
78 // Sources are points emitting sound.
82 // The orientation of the sound (direction and cut-off angles)
90 float _reference_dist;
99 void update_absolute_position();
104 * Empty constructor, can be used to read data to the systems
105 * memory and not to the driver.
111 * @param path Path name to sound
112 * @param file File name of sound
113 should usually be true unless you want to manipulate the data
116 SGSoundSample( const char *path, const char *file );
120 * @param _data Pointer to a memory buffer containing the sample data
121 the application is responsible for freeing the buffer data.
122 * @param len Byte length of array
123 * @param _freq Frequency of the provided data (bytes per second)
124 should usually be true unless you want to manipulate the data
127 SGSoundSample( unsigned char *data, int len, int freq, int format = AL_FORMAT_MONO8 );
132 * detect wheter the sample holds the information of a sound file
134 inline bool is_file() const { return _is_file; }
137 * Test whether this sample has a changed configuration since the last
138 * call. (Calling this function resets the value).
140 inline bool has_changed() {
141 bool b = _changed; _changed = false; return b;
144 inline bool has_static_data_changed() {
145 bool b = _static_changed; _static_changed = false; return b;
150 * Start playing this sample.
152 * @param _loop Define whether the sound should be played in a loop.
154 inline void play( bool loop ) {
155 _playing = true; _loop = loop; _changed = true;
159 * Return if the sample is looping or not.
161 inline bool get_looping() { return _loop; }
164 * Stop playing this sample.
166 * @param sched A pointer to the appropriate scheduler.
169 _playing = false; _changed = true;
173 * Play this sample once.
176 inline void play_once() { play(false); }
179 * Play this sample looped.
182 inline void play_looped() { play(true); }
185 * Test if a sample is currently playing.
186 * @return true if is is playing, false otherwise.
188 inline bool is_playing() { return _playing; }
191 * set the data associated with this sample
193 inline void set_data( unsigned char* data ) {
198 * @return the data associated with this sample
200 inline void* get_data() const { return _data; }
203 * free the data associated with this sample
205 inline void free_data() {
206 if (_data != NULL) { delete[] _data; _data = NULL; }
210 * set the source id of this source
212 inline void set_source(unsigned int s) {
213 _source = s; _valid_source = true; _changed = true;
217 * get the source id of this source
219 inline unsigned int get_source() { return _source; }
222 * detect wheter the source id of the sample is valid
224 inline bool is_valid_source() const { return _valid_source; }
227 * set the source id of the sample to invalid.
229 inline void no_valid_source() {
230 _valid_source = false;
234 * set the buffer id of this source
236 inline void set_buffer(unsigned int b) {
237 _buffer = b; _valid_buffer = true; _changed = true;
241 * get the buffer id of this source
243 inline unsigned int get_buffer() { return _buffer; }
246 * detect wheter the source id of the sample is valid
248 inline bool is_valid_buffer() const { return _valid_buffer; }
251 * set the source id of the sample to invalid.
253 inline void no_valid_buffer() {
254 _valid_buffer = false;
258 * Get the current pitch setting of this sample.
260 inline float get_pitch() { return _pitch; }
263 * Set the pitch of this sample.
265 inline void set_pitch( float p ) {
266 _pitch = p; _changed = true;
270 * Get the current volume setting of this sample.
272 inline float get_volume() { return _volume * _master_volume; }
275 * Set the master (sampel group) volume of this sample.
277 inline void set_master_volume( float v ) {
278 _master_volume = v; _changed = true;
282 * Set the volume of this sample.
284 inline void set_volume( float v ) {
285 _volume = v; _changed = true;
289 * Set the format of the sounds sample
291 inline void set_format( int format ) {
296 * Returns the format of the sounds sample
298 inline int get_format() { return _format; }
302 * Set the frequency of the sounds sample
304 inline void set_frequency( int freq ) {
305 _freq = freq; _changed = true;
309 * Returns the frequency of the sounds sample
311 inline int get_frequency() { return _freq; }
314 * Returns the size of the sounds sample
316 inline void set_size( int size ) {
321 * Returns the size of the sounds sample
323 inline int get_size() const { return _size; }
326 * Set position of the sound source (uses same coordinate system as opengl)
328 void set_base_position( SGVec3d pos );
329 void set_relative_position( SGVec3f pos );
332 * Get position of the sound source (uses same coordinate system as opengl)
334 inline float *get_position() const { return toVec3f(_absolute_pos).data(); }
337 * Set the orientation of the sound source, both for direction
338 * and audio cut-off angles.
340 void set_orientation( SGVec3f dir );
343 * Define the audio cone parameters for directional audio
345 inline void set_audio_cone( float inner, float outer, float gain ) {
346 _inner_angle = inner;
347 _outer_angle = outer;
349 _static_changed = true;
353 * Get the orientation of the sound source, the inner or outer angle
356 inline float *get_orientation() { return _direction.data(); }
357 inline float *get_direction() { return _direction.data(); }
358 inline float get_innerangle() { return _inner_angle; }
359 inline float get_outerangle() { return _outer_angle; }
360 inline float get_outergain() { return _outer_gain; }
363 * Set velocity of the sound source (uses same coordinate system as opengl)
365 inline void set_velocity( SGVec3f vel ) {
366 _velocity = SGVec3f(vel); _changed = true;
370 * Get velocity of the sound source (uses same coordinate system as opengl)
372 inline float *get_velocity() { return _velocity.data(); }
376 * Set reference distance of sound (the distance where the gain
379 inline void set_reference_dist( float dist ) {
380 _reference_dist = dist; _static_changed = true;
384 * Get reference distance of sound (the distance where the gain
387 inline float get_reference_dist() { return _reference_dist; }
391 * Set maximum distance of sound (the distance where the sound is
394 void set_max_dist( float dist ) {
395 _max_dist = dist; _static_changed = true;
399 * Get maximum istance of sound (the distance where the sound is
402 inline float get_max_dist() { return _max_dist; }
405 * Get the name of this sample
407 inline string get_sample_name() { return _sample_name; }
411 #endif // _SG_SAMPLE_HXX