]> git.mxchange.org Git - simgear.git/blob - simgear/sound/soundmgr.hxx
962459994ba2cb5c9f0a191171ecd63cac7553eb
[simgear.git] / simgear / sound / soundmgr.hxx
1 // soundmgr.hxx -- Sound effect management class
2 //
3 // Sound manager initially written by David Findlay
4 // <david_j_findlay@yahoo.com.au> 2001
5 //
6 // C++-ified by Curtis Olson, started March 2001.
7 //
8 // Copyright (C) 2001  Curtis L. Olson - curt@flightgear.org
9 //
10 // This program is free software; you can redistribute it and/or
11 // modify it under the terms of the GNU General Public License as
12 // published by the Free Software Foundation; either version 2 of the
13 // License, or (at your option) any later version.
14 //
15 // This program is distributed in the hope that it will be useful, but
16 // WITHOUT ANY WARRANTY; without even the implied warranty of
17 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18 // General Public License for more details.
19 //
20 // You should have received a copy of the GNU General Public License
21 // along with this program; if not, write to the Free Software
22 // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23 //
24 // $Id$
25
26
27 #ifndef _SG_SOUNDMGR_HXX
28 #define _SG_SOUNDMGR_HXX 1
29
30 #ifndef __cplusplus
31 # error This library requires C++
32 #endif
33
34 #include <simgear/compiler.h>
35 #include <simgear/timing/timestamp.hxx>
36
37 #include STL_STRING
38 #include <map>
39
40 #include <plib/sl.h>
41 #include <plib/sm.h>
42
43 SG_USING_STD(map);
44 SG_USING_STD(string);
45
46
47 // manages everything we need to know for an individual sound sample
48 class SimpleSound {
49
50 private:
51
52     slSample *sample;
53     slEnvelope *pitch_envelope;
54     slEnvelope *volume_envelope;
55     double pitch;
56     double volume;
57
58 public:
59
60     SimpleSound( const char *path, const char *file = NULL );
61     SimpleSound( unsigned char *buffer, int len );
62     ~SimpleSound();
63
64     void play( slScheduler *sched, bool looped );
65     void stop( slScheduler *sched, bool quick = true );
66
67     inline void play_once( slScheduler *sched ) { play( sched, false); }
68     inline void play_looped( slScheduler *sched ) { play( sched, true); }
69     inline bool is_playing( ) {
70         return ( sample->getPlayCount() > 0 );
71     }
72
73     inline double get_pitch() const { return pitch; }
74     inline void set_pitch( double p ) {
75        pitch = p;
76        pitch_envelope->setStep( 0, 0.01, pitch );
77     }
78     inline double get_volume() const { return volume; }
79     inline void set_volume( double v ) {
80        volume = v;
81        volume_envelope->setStep( 0, 0.01, volume );
82     }
83
84     inline slSample *get_sample() { return sample; }
85     inline slEnvelope *get_pitch_envelope() { return pitch_envelope; }
86     inline slEnvelope *get_volume_envelope() { return volume_envelope; }
87 };
88
89
90 typedef struct {
91         int n;
92         slSample *sample;
93 } sample_ref;
94
95 typedef map < string, sample_ref * > sample_map;
96 typedef sample_map::iterator sample_map_iterator;
97 typedef sample_map::const_iterator const_sample_map_iterator;
98
99
100 typedef map < string, SimpleSound * > sound_map;
101 typedef sound_map::iterator sound_map_iterator;
102 typedef sound_map::const_iterator const_sound_map_iterator;
103
104
105 class SoundMgr
106 {
107
108     slScheduler *audio_sched;
109     smMixer *audio_mixer;
110
111     sound_map sounds;
112     sample_map samples;
113
114     double safety;
115
116 public:
117
118     SoundMgr();
119     ~SoundMgr();
120
121
122     /**
123      * (re) initialize the sound manager.
124      */
125     void init();
126
127
128     /**
129      * Bind properties for the sound manager.
130      */
131     void bind ();
132
133
134     /**
135      * Unbind properties for the sound manager.
136      */
137     void unbind ();
138
139
140     /**
141      * Run the audio scheduler.
142      */
143     void update(double dt);
144
145
146     /**
147      * Pause all sounds.
148      */
149     void pause ();
150
151
152     /**
153      * Resume all sounds.
154      */
155     void resume ();
156
157
158     // is audio working?
159     inline bool is_working() const { return !audio_sched->notWorking(); }
160
161     // reinitialize the sound manager
162     inline void reinit() { init(); }
163
164     // add a sound effect, return true if successful
165     bool add( SimpleSound *sound, const string& refname);
166
167     // add a sound file, return the sample if successful, else return NULL
168     SimpleSound *add( const string& refname,
169                       const char *path, const char *file = NULL );
170
171     // remove a sound effect, return true if successful
172     bool remove( const string& refname );
173
174     // return true of the specified sound exists in the sound manager system
175     bool exists( const string& refname );
176
177     // return a pointer to the SimpleSound if the specified sound
178     // exists in the sound manager system, otherwise return NULL
179     SimpleSound *find( const string& refname );
180
181     // tell the scheduler to play the indexed sample in a continuous
182     // loop
183     bool play_looped( const string& refname );
184
185     // tell the scheduler to play the indexed sample once
186     bool play_once( const string& refname );
187
188     // return true of the specified sound is currently being played
189     bool is_playing( const string& refname );
190
191     // immediate stop playing the sound
192     bool stop( const string& refname );
193
194     // return the audio scheduler 
195     inline slScheduler *get_scheduler( ) { return audio_sched; };
196 };
197
198
199 #endif // _SG_SOUNDMGR_HXX
200
201