]> git.mxchange.org Git - simgear.git/blob - simgear/sound/sample_openal.hxx
Changes to get SimGear to configure and compile out-of-the-box on
[simgear.git] / simgear / sound / sample_openal.hxx
1 // sample.hxx -- Sound sample encapsulation class
2 // 
3 // Written by Curtis Olson, started April 2004.
4 //
5 // Copyright (C) 2004  Curtis L. Olson - curt@flightgear.org
6 //
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.
11 //
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.
16 //
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.
20 //
21 // $Id$
22
23 /**
24  * \file sample.hxx
25  * Provides a sound sample encapsulation
26  */
27
28 #ifndef _SG_SAMPLE_HXX
29 #define _SG_SAMPLE_HXX 1
30
31 #ifndef __cplusplus
32 # error This library requires C++
33 #endif
34
35 #include <simgear/compiler.h>
36
37 #include STL_STRING
38
39 #include <simgear/debug/logstream.hxx>
40
41 #include <plib/sg.h>
42
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>
48 #else
49 # include <AL/al.h>
50 # include <AL/alut.h>
51 #endif
52
53 SG_USING_STD(string);
54
55 /**
56  * manages everything we need to know for an individual sound sample
57  */
58
59 class SGSoundSample {
60
61 private:
62
63     string sample_name;
64
65     // Buffers hold sound data.
66     ALuint buffer;
67
68     // Sources are points emitting sound.
69     ALuint source;
70
71     // Position of the source sound.
72     ALfloat source_pos[3];
73
74     // A constant offset to be applied to the final source_pos
75     ALfloat offset_pos[3];
76
77     // Velocity of the source sound.
78     ALfloat source_vel[3];
79
80     // configuration values
81     ALenum format;
82     ALsizei size;
83     ALvoid* data;
84     ALsizei freq;
85
86     double pitch;
87     double volume;
88     double reference_dist;
89     double max_dist;
90     ALboolean loop;
91
92
93 public:
94
95     /**
96      * Constructor
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
101        later.)
102      */
103     SGSoundSample( const char *path, const char *file, bool cleanup );
104     SGSoundSample( unsigned char *_data, int len, int _freq );
105     ~SGSoundSample();
106
107     /**
108      * Start playing this sample.
109      *
110      * @param _loop Define wether the sound should be played in a loop.
111      */
112     void play( bool _loop );
113
114     /**
115      * Stop playing this sample.
116      *
117      * @param sched A pointer to the appropriate scheduler.
118      */
119     void stop();
120
121     /**
122      * Play this sample once.
123      * @see #play
124      */
125     inline void play_once() { play(false); }
126
127     /** 
128      * Play this sample looped.
129      * @see #play
130      */
131     inline void play_looped() { play(true); }
132
133     /**
134      * Test if a sample is curretnly playing.
135      * @return true if is is playing, false otherwise.
136      */
137     inline bool is_playing( ) {
138         ALint result;
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 );
143         }
144         return (result == AL_PLAYING) ;
145     }
146
147     /**
148      * Get the current pitch setting of this sample.
149      */
150     inline double get_pitch() const { return pitch; }
151
152     /**
153      * Set the pitch of this sample.
154      */
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; }
159         pitch = p;
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 );
165         }
166     }
167
168     /**
169      * Get the current volume setting of this sample.
170      */
171     inline double get_volume() const { return volume; }
172
173     /**
174      * Set the volume of this sample.
175      */
176     inline void set_volume( double v ) {
177         volume = 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  );
183         }
184     }
185
186     /**
187      * Returns the size of the sounds sample
188      */
189     inline int get_size() {
190         return size;
191     }
192
193     /**
194      * Return a pointer to the raw data
195      */
196     inline char *get_data() {
197         return (char *)data;
198     }
199
200     /**
201      * Set position of sound source (uses same coordinate system as opengl)
202      */
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];
207
208         sgVec3 final_pos;
209         sgAddVec3( final_pos, source_pos, offset_pos );
210
211         alSourcefv( source, AL_POSITION, final_pos );
212     }
213
214     /**
215      * Set "constant" offset position of sound source (uses same
216      * coordinate system as opengl)
217      */
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];
222
223         sgVec3 final_pos;
224         sgAddVec3( final_pos, source_pos, offset_pos );
225
226         alSourcefv( source, AL_POSITION, final_pos );
227     }
228
229     /**
230      * Set velocity of sound source (uses same coordinate system as opengl)
231      */
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 );
237     }
238
239
240     /**
241      * Set reference distance of sound (the distance where the gain
242      * will be half.)
243      */
244     inline void set_reference_dist( ALfloat dist ) {
245         reference_dist = dist;
246         alSourcef( source, AL_REFERENCE_DISTANCE, reference_dist );
247     }
248
249
250     /**
251      * Set maximume distance of sound (the distance where the sound is
252      * no longer audible.
253      */
254     inline void set_max_dist( ALfloat dist ) {
255         max_dist = dist;
256         alSourcef( source, AL_MAX_DISTANCE, max_dist );
257     }
258 };
259
260
261 #endif // _SG_SAMPLE_HXX
262
263