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)
61 SGVec3f _orientation; // base orientation
62 SGVec3f _direction; // orientation offset
64 // Velocity of the source sound.
70 // configuration values
75 // Buffers hold sound data.
79 // Sources are points emitting sound.
83 // The orientation of the sound (direction and cut-off angles)
91 float _reference_dist;
100 void update_absolute_position();
105 * Empty constructor, can be used to read data to the systems
106 * memory and not to the driver.
112 * @param path Path name to sound
113 * @param file File name of sound
114 should usually be true unless you want to manipulate the data
117 SGSoundSample( const char *path, const char *file );
121 * @param _data Pointer to a memory buffer containing the sample data
122 the application is responsible for freeing the buffer data.
123 * @param len Byte length of array
124 * @param _freq Frequency of the provided data (bytes per second)
125 should usually be true unless you want to manipulate the data
128 SGSoundSample( unsigned char *data, int len, int freq, int format = AL_FORMAT_MONO8 );
133 * detect wheter the sample holds the information of a sound file
135 inline bool is_file() const { return _is_file; }
138 * Test whether this sample has a changed configuration since the last
139 * call. (Calling this function resets the value).
141 inline bool has_changed() {
142 bool b = _changed; _changed = false; return b;
145 inline bool has_static_data_changed() {
146 bool b = _static_changed; _static_changed = false; return b;
151 * Start playing this sample.
153 * @param _loop Define whether the sound should be played in a loop.
155 inline void play( bool loop ) {
156 _playing = true; _loop = loop; _changed = true;
160 * Return if the sample is looping or not.
162 inline bool get_looping() { return _loop; }
165 * Stop playing this sample.
167 * @param sched A pointer to the appropriate scheduler.
170 _playing = false; _changed = true;
174 * Play this sample once.
177 inline void play_once() { play(false); }
180 * Play this sample looped.
183 inline void play_looped() { play(true); }
186 * Test if a sample is currently playing.
187 * @return true if is is playing, false otherwise.
189 inline bool is_playing() { return _playing; }
192 * set the data associated with this sample
194 inline void set_data( unsigned char* data ) {
199 * @return the data associated with this sample
201 inline void* get_data() const { return _data; }
204 * free the data associated with this sample
206 inline void free_data() {
207 if (_data != NULL) { delete[] _data; _data = NULL; }
211 * set the source id of this source
213 inline void set_source(unsigned int s) {
214 _source = s; _valid_source = true; _changed = true;
218 * get the source id of this source
220 inline unsigned int get_source() { return _source; }
223 * detect wheter the source id of the sample is valid
225 inline bool is_valid_source() const { return _valid_source; }
228 * set the source id of the sample to invalid.
230 inline void no_valid_source() {
231 _valid_source = false;
235 * set the buffer id of this source
237 inline void set_buffer(unsigned int b) {
238 _buffer = b; _valid_buffer = true; _changed = true;
242 * get the buffer id of this source
244 inline unsigned int get_buffer() { return _buffer; }
247 * detect wheter the source id of the sample is valid
249 inline bool is_valid_buffer() const { return _valid_buffer; }
252 * set the source id of the sample to invalid.
254 inline void no_valid_buffer() {
255 _valid_buffer = false;
259 * Get the current pitch setting of this sample.
261 inline float get_pitch() { return _pitch; }
264 * Set the pitch of this sample.
266 inline void set_pitch( float p ) {
267 _pitch = p; _changed = true;
271 * Get the current volume setting of this sample.
273 inline float get_volume() { return _volume * _master_volume; }
276 * Set the master (sampel group) volume of this sample.
278 inline void set_master_volume( float v ) {
279 _master_volume = v; _changed = true;
283 * Set the volume of this sample.
285 inline void set_volume( float v ) {
286 _volume = v; _changed = true;
290 * Set the format of the sounds sample
292 inline void set_format( int format ) {
297 * Returns the format of the sounds sample
299 inline int get_format() { return _format; }
303 * Set the frequency of the sounds sample
305 inline void set_frequency( int freq ) {
306 _freq = freq; _changed = true;
310 * Returns the frequency of the sounds sample
312 inline int get_frequency() { return _freq; }
315 * Returns the size of the sounds sample
317 inline void set_size( int size ) {
322 * Returns the size of the sounds sample
324 inline int get_size() const { return _size; }
327 * Set position of the sound source (uses same coordinate system as opengl)
329 void set_base_position( SGVec3d pos );
330 void set_relative_position( SGVec3f pos );
333 * Get position of the sound source (uses same coordinate system as opengl)
335 inline float *get_position() const { return toVec3f(_absolute_pos).data(); }
338 * Set the orientation of the sound source, both for direction
339 * and audio cut-off angles.
341 void set_orientation( SGVec3f ori );
344 * Set the relative direction of the sound source, both for direction
345 * and audio cut-off angles.
347 void set_direction( SGVec3f dir );
350 * Define the audio cone parameters for directional audio
352 inline void set_audio_cone( float inner, float outer, float gain ) {
353 _inner_angle = inner;
354 _outer_angle = outer;
356 _static_changed = true;
360 * Get the orientation of the sound source, the inner or outer angle
363 float *get_orientation();
365 inline float get_innerangle() { return _inner_angle; }
366 inline float get_outerangle() { return _outer_angle; }
367 inline float get_outergain() { return _outer_gain; }
370 * Set velocity of the sound source (uses same coordinate system as opengl)
372 inline void set_velocity( SGVec3f vel ) {
373 _velocity = SGVec3f(vel); _changed = true;
377 * Get velocity of the sound source (uses same coordinate system as opengl)
379 inline float *get_velocity() { return _velocity.data(); }
383 * Set reference distance of sound (the distance where the gain
386 inline void set_reference_dist( float dist ) {
387 _reference_dist = dist; _static_changed = true;
391 * Get reference distance of sound (the distance where the gain
394 inline float get_reference_dist() { return _reference_dist; }
398 * Set maximum distance of sound (the distance where the sound is
401 void set_max_dist( float dist ) {
402 _max_dist = dist; _static_changed = true;
406 * Get maximum istance of sound (the distance where the sound is
409 inline float get_max_dist() { return _max_dist; }
412 * Get the name of this sample
414 inline string get_sample_name() { return _sample_name; }
418 #endif // _SG_SAMPLE_HXX