diff options
Diffstat (limited to 'libs/CocosDenshion/CocosDenshion.h')
-rwxr-xr-x | libs/CocosDenshion/CocosDenshion.h | 440 |
1 files changed, 440 insertions, 0 deletions
diff --git a/libs/CocosDenshion/CocosDenshion.h b/libs/CocosDenshion/CocosDenshion.h new file mode 100755 index 0000000..638d852 --- /dev/null +++ b/libs/CocosDenshion/CocosDenshion.h | |||
@@ -0,0 +1,440 @@ | |||
1 | /* | ||
2 | Copyright (c) 2010 Steve Oldmeadow | ||
3 | |||
4 | Permission is hereby granted, free of charge, to any person obtaining a copy | ||
5 | of this software and associated documentation files (the "Software"), to deal | ||
6 | in the Software without restriction, including without limitation the rights | ||
7 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||
8 | copies of the Software, and to permit persons to whom the Software is | ||
9 | furnished to do so, subject to the following conditions: | ||
10 | |||
11 | The above copyright notice and this permission notice shall be included in | ||
12 | all copies or substantial portions of the Software. | ||
13 | |||
14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
15 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
16 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||
17 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||
18 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||
19 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||
20 | THE SOFTWARE. | ||
21 | |||
22 | $Id$ | ||
23 | */ | ||
24 | |||
25 | |||
26 | |||
27 | /** | ||
28 | @file | ||
29 | @b IMPORTANT | ||
30 | There are 3 different ways of using CocosDenshion. Depending on which you choose you | ||
31 | will need to include different files and frameworks. | ||
32 | |||
33 | @par SimpleAudioEngine | ||
34 | This is recommended for basic audio requirements. If you just want to play some sound fx | ||
35 | and some background music and have no interest in learning the lower level workings then | ||
36 | this is the interface to use. | ||
37 | |||
38 | Requirements: | ||
39 | - Firmware: OS 2.2 or greater | ||
40 | - Files: SimpleAudioEngine.*, CocosDenshion.* | ||
41 | - Frameworks: OpenAL, AudioToolbox, AVFoundation | ||
42 | |||
43 | @par CDAudioManager | ||
44 | CDAudioManager is basically a thin wrapper around an AVAudioPlayer object used for playing | ||
45 | background music and a CDSoundEngine object used for playing sound effects. It manages the | ||
46 | audio session for you deals with audio session interruption. It is fairly low level and it | ||
47 | is expected you have some understanding of the underlying technologies. For example, for | ||
48 | many use cases regarding background music it is expected you will work directly with the | ||
49 | backgroundMusic AVAudioPlayer which is exposed as a property. | ||
50 | |||
51 | Requirements: | ||
52 | - Firmware: OS 2.2 or greater | ||
53 | - Files: CDAudioManager.*, CocosDenshion.* | ||
54 | - Frameworks: OpenAL, AudioToolbox, AVFoundation | ||
55 | |||
56 | @par CDSoundEngine | ||
57 | CDSoundEngine is a sound engine built upon OpenAL and derived from Apple's oalTouch | ||
58 | example. It can playback up to 32 sounds simultaneously with control over pitch, pan | ||
59 | and gain. It can be set up to handle audio session interruption automatically. You | ||
60 | may decide to use CDSoundEngine directly instead of CDAudioManager or SimpleAudioEngine | ||
61 | because you require OS 2.0 compatibility. | ||
62 | |||
63 | Requirements: | ||
64 | - Firmware: OS 2.0 or greater | ||
65 | - Files: CocosDenshion.* | ||
66 | - Frameworks: OpenAL, AudioToolbox | ||
67 | |||
68 | */ | ||
69 | |||
70 | #import <OpenAL/al.h> | ||
71 | #import <OpenAL/alc.h> | ||
72 | #import <AudioToolbox/AudioToolbox.h> | ||
73 | #import <Foundation/Foundation.h> | ||
74 | #import "CDConfig.h" | ||
75 | |||
76 | |||
77 | #if !defined(CD_DEBUG) || CD_DEBUG == 0 | ||
78 | #define CDLOG(...) do {} while (0) | ||
79 | #define CDLOGINFO(...) do {} while (0) | ||
80 | |||
81 | #elif CD_DEBUG == 1 | ||
82 | #define CDLOG(...) NSLog(__VA_ARGS__) | ||
83 | #define CDLOGINFO(...) do {} while (0) | ||
84 | |||
85 | #elif CD_DEBUG > 1 | ||
86 | #define CDLOG(...) NSLog(__VA_ARGS__) | ||
87 | #define CDLOGINFO(...) NSLog(__VA_ARGS__) | ||
88 | #endif // CD_DEBUG | ||
89 | |||
90 | |||
91 | #import "CDOpenALSupport.h" | ||
92 | |||
93 | //Tested source limit on 2.2.1 and 3.1.2 with up to 128 sources and appears to work. Older OS versions e.g 2.2 may support only 32 | ||
94 | #define CD_SOURCE_LIMIT 32 //Total number of sources we will ever want, may actually get less | ||
95 | #define CD_NO_SOURCE 0xFEEDFAC //Return value indicating playback failed i.e. no source | ||
96 | #define CD_IGNORE_AUDIO_SESSION 0xBEEFBEE //Used internally to indicate audio session will not be handled | ||
97 | #define CD_MUTE 0xFEEDBAB //Return value indicating sound engine is muted or non functioning | ||
98 | #define CD_NO_SOUND = -1; | ||
99 | |||
100 | #define CD_SAMPLE_RATE_HIGH 44100 | ||
101 | #define CD_SAMPLE_RATE_MID 22050 | ||
102 | #define CD_SAMPLE_RATE_LOW 16000 | ||
103 | #define CD_SAMPLE_RATE_BASIC 8000 | ||
104 | #define CD_SAMPLE_RATE_DEFAULT 44100 | ||
105 | |||
106 | extern NSString * const kCDN_BadAlContext; | ||
107 | extern NSString * const kCDN_AsynchLoadComplete; | ||
108 | |||
109 | extern float const kCD_PitchDefault; | ||
110 | extern float const kCD_PitchLowerOneOctave; | ||
111 | extern float const kCD_PitchHigherOneOctave; | ||
112 | extern float const kCD_PanDefault; | ||
113 | extern float const kCD_PanFullLeft; | ||
114 | extern float const kCD_PanFullRight; | ||
115 | extern float const kCD_GainDefault; | ||
116 | |||
117 | enum bufferState { | ||
118 | CD_BS_EMPTY = 0, | ||
119 | CD_BS_LOADED = 1, | ||
120 | CD_BS_FAILED = 2 | ||
121 | }; | ||
122 | |||
123 | typedef struct _sourceGroup { | ||
124 | int startIndex; | ||
125 | int currentIndex; | ||
126 | int totalSources; | ||
127 | bool enabled; | ||
128 | bool nonInterruptible; | ||
129 | int *sourceStatuses;//pointer into array of source status information | ||
130 | } sourceGroup; | ||
131 | |||
132 | typedef struct _bufferInfo { | ||
133 | ALuint bufferId; | ||
134 | int bufferState; | ||
135 | void* bufferData; | ||
136 | ALenum format; | ||
137 | ALsizei sizeInBytes; | ||
138 | ALsizei frequencyInHertz; | ||
139 | } bufferInfo; | ||
140 | |||
141 | typedef struct _sourceInfo { | ||
142 | bool usable; | ||
143 | ALuint sourceId; | ||
144 | ALuint attachedBufferId; | ||
145 | } sourceInfo; | ||
146 | |||
147 | #pragma mark CDAudioTransportProtocol | ||
148 | |||
149 | @protocol CDAudioTransportProtocol <NSObject> | ||
150 | /** Play the audio */ | ||
151 | -(BOOL) play; | ||
152 | /** Pause the audio, retain resources */ | ||
153 | -(BOOL) pause; | ||
154 | /** Stop the audio, release resources */ | ||
155 | -(BOOL) stop; | ||
156 | /** Return playback to beginning */ | ||
157 | -(BOOL) rewind; | ||
158 | @end | ||
159 | |||
160 | #pragma mark CDAudioInterruptProtocol | ||
161 | |||
162 | @protocol CDAudioInterruptProtocol <NSObject> | ||
163 | /** Is audio mute */ | ||
164 | -(BOOL) mute; | ||
165 | /** If YES then audio is silenced but not stopped, calls to start new audio will proceed but silently */ | ||
166 | -(void) setMute:(BOOL) muteValue; | ||
167 | /** Is audio enabled */ | ||
168 | -(BOOL) enabled; | ||
169 | /** If NO then all audio is stopped and any calls to start new audio will be ignored */ | ||
170 | -(void) setEnabled:(BOOL) enabledValue; | ||
171 | @end | ||
172 | |||
173 | #pragma mark CDUtilities | ||
174 | /** | ||
175 | Collection of utilities required by CocosDenshion | ||
176 | */ | ||
177 | @interface CDUtilities : NSObject | ||
178 | { | ||
179 | } | ||
180 | |||
181 | /** Fundamentally the same as the corresponding method is CCFileUtils but added to break binding to cocos2d */ | ||
182 | +(NSString*) fullPathFromRelativePath:(NSString*) relPath; | ||
183 | |||
184 | @end | ||
185 | |||
186 | |||
187 | #pragma mark CDSoundEngine | ||
188 | |||
189 | /** CDSoundEngine is built upon OpenAL and works with SDK 2.0. | ||
190 | CDSoundEngine is a sound engine built upon OpenAL and derived from Apple's oalTouch | ||
191 | example. It can playback up to 32 sounds simultaneously with control over pitch, pan | ||
192 | and gain. It can be set up to handle audio session interruption automatically. You | ||
193 | may decide to use CDSoundEngine directly instead of CDAudioManager or SimpleAudioEngine | ||
194 | because you require OS 2.0 compatibility. | ||
195 | |||
196 | Requirements: | ||
197 | - Firmware: OS 2.0 or greater | ||
198 | - Files: CocosDenshion.* | ||
199 | - Frameworks: OpenAL, AudioToolbox | ||
200 | |||
201 | @since v0.8 | ||
202 | */ | ||
203 | @class CDSoundSource; | ||
204 | @interface CDSoundEngine : NSObject <CDAudioInterruptProtocol> { | ||
205 | |||
206 | bufferInfo *_buffers; | ||
207 | sourceInfo *_sources; | ||
208 | sourceGroup *_sourceGroups; | ||
209 | ALCcontext *context; | ||
210 | NSUInteger _sourceGroupTotal; | ||
211 | UInt32 _audioSessionCategory; | ||
212 | BOOL _handleAudioSession; | ||
213 | ALfloat _preMuteGain; | ||
214 | NSObject *_mutexBufferLoad; | ||
215 | BOOL mute_; | ||
216 | BOOL enabled_; | ||
217 | |||
218 | ALenum lastErrorCode_; | ||
219 | BOOL functioning_; | ||
220 | float asynchLoadProgress_; | ||
221 | BOOL getGainWorks_; | ||
222 | |||
223 | //For managing dynamic allocation of sources and buffers | ||
224 | int sourceTotal_; | ||
225 | int bufferTotal; | ||
226 | |||
227 | } | ||
228 | |||
229 | @property (readwrite, nonatomic) ALfloat masterGain; | ||
230 | @property (readonly) ALenum lastErrorCode;//Last OpenAL error code that was generated | ||
231 | @property (readonly) BOOL functioning;//Is the sound engine functioning | ||
232 | @property (readwrite) float asynchLoadProgress; | ||
233 | @property (readonly) BOOL getGainWorks;//Does getting the gain for a source work | ||
234 | /** Total number of sources available */ | ||
235 | @property (readonly) int sourceTotal; | ||
236 | /** Total number of source groups that have been defined */ | ||
237 | @property (readonly) NSUInteger sourceGroupTotal; | ||
238 | |||
239 | /** Sets the sample rate for the audio mixer. For best performance this should match the sample rate of your audio content */ | ||
240 | +(void) setMixerSampleRate:(Float32) sampleRate; | ||
241 | |||
242 | /** Initializes the engine with a group definition and a total number of groups */ | ||
243 | -(id)init; | ||
244 | |||
245 | /** Plays a sound in a channel group with a pitch, pan and gain. The sound could played looped or not */ | ||
246 | -(ALuint) playSound:(int) soundId sourceGroupId:(int)sourceGroupId pitch:(float) pitch pan:(float) pan gain:(float) gain loop:(BOOL) loop; | ||
247 | |||
248 | /** Creates and returns a sound source object for the specified sound within the specified source group. | ||
249 | */ | ||
250 | -(CDSoundSource *) soundSourceForSound:(int) soundId sourceGroupId:(int) sourceGroupId; | ||
251 | |||
252 | /** Stops playing a sound */ | ||
253 | - (void) stopSound:(ALuint) sourceId; | ||
254 | /** Stops playing a source group */ | ||
255 | - (void) stopSourceGroup:(int) sourceGroupId; | ||
256 | /** Stops all playing sounds */ | ||
257 | -(void) stopAllSounds; | ||
258 | -(void) defineSourceGroups:(NSArray*) sourceGroupDefinitions; | ||
259 | -(void) defineSourceGroups:(int[]) sourceGroupDefinitions total:(NSUInteger) total; | ||
260 | -(void) setSourceGroupNonInterruptible:(int) sourceGroupId isNonInterruptible:(BOOL) isNonInterruptible; | ||
261 | -(void) setSourceGroupEnabled:(int) sourceGroupId enabled:(BOOL) enabled; | ||
262 | -(BOOL) sourceGroupEnabled:(int) sourceGroupId; | ||
263 | -(BOOL) loadBufferFromData:(int) soundId soundData:(ALvoid*) soundData format:(ALenum) format size:(ALsizei) size freq:(ALsizei) freq; | ||
264 | -(BOOL) loadBuffer:(int) soundId filePath:(NSString*) filePath; | ||
265 | -(void) loadBuffersAsynchronously:(NSArray *) loadRequests; | ||
266 | -(BOOL) unloadBuffer:(int) soundId; | ||
267 | -(ALCcontext *) openALContext; | ||
268 | |||
269 | /** Returns the duration of the buffer in seconds or a negative value if the buffer id is invalid */ | ||
270 | -(float) bufferDurationInSeconds:(int) soundId; | ||
271 | /** Returns the size of the buffer in bytes or a negative value if the buffer id is invalid */ | ||
272 | -(ALsizei) bufferSizeInBytes:(int) soundId; | ||
273 | /** Returns the sampling frequency of the buffer in hertz or a negative value if the buffer id is invalid */ | ||
274 | -(ALsizei) bufferFrequencyInHertz:(int) soundId; | ||
275 | |||
276 | /** Used internally, never call unless you know what you are doing */ | ||
277 | -(void) _soundSourcePreRelease:(CDSoundSource *) soundSource; | ||
278 | |||
279 | @end | ||
280 | |||
281 | #pragma mark CDSoundSource | ||
282 | /** CDSoundSource is a wrapper around an OpenAL sound source. | ||
283 | It allows you to manipulate properties such as pitch, gain, pan and looping while the | ||
284 | sound is playing. CDSoundSource is based on the old CDSourceWrapper class but with much | ||
285 | added functionality. | ||
286 | |||
287 | @since v1.0 | ||
288 | */ | ||
289 | @interface CDSoundSource : NSObject <CDAudioTransportProtocol, CDAudioInterruptProtocol> { | ||
290 | ALenum lastError; | ||
291 | @public | ||
292 | ALuint _sourceId; | ||
293 | ALuint _sourceIndex; | ||
294 | CDSoundEngine* _engine; | ||
295 | int _soundId; | ||
296 | float _preMuteGain; | ||
297 | BOOL enabled_; | ||
298 | BOOL mute_; | ||
299 | } | ||
300 | @property (readwrite, nonatomic) float pitch; | ||
301 | @property (readwrite, nonatomic) float gain; | ||
302 | @property (readwrite, nonatomic) float pan; | ||
303 | @property (readwrite, nonatomic) BOOL looping; | ||
304 | @property (readonly) BOOL isPlaying; | ||
305 | @property (readwrite, nonatomic) int soundId; | ||
306 | /** Returns the duration of the attached buffer in seconds or a negative value if the buffer is invalid */ | ||
307 | @property (readonly) float durationInSeconds; | ||
308 | |||
309 | /** Stores the last error code that occurred. Check against AL_NO_ERROR */ | ||
310 | @property (readonly) ALenum lastError; | ||
311 | /** Do not init yourself, get an instance from the sourceForSound factory method on CDSoundEngine */ | ||
312 | -(id)init:(ALuint) theSourceId sourceIndex:(int) index soundEngine:(CDSoundEngine*) engine; | ||
313 | |||
314 | @end | ||
315 | |||
316 | #pragma mark CDAudioInterruptTargetGroup | ||
317 | |||
318 | /** Container for objects that implement audio interrupt protocol i.e. they can be muted and enabled. | ||
319 | Setting mute and enabled for the group propagates to all children. | ||
320 | Designed to be used with your CDSoundSource objects to get them to comply with global enabled and mute settings | ||
321 | if that is what you want to do.*/ | ||
322 | @interface CDAudioInterruptTargetGroup : NSObject <CDAudioInterruptProtocol> { | ||
323 | BOOL mute_; | ||
324 | BOOL enabled_; | ||
325 | NSMutableArray *children_; | ||
326 | } | ||
327 | -(void) addAudioInterruptTarget:(NSObject<CDAudioInterruptProtocol>*) interruptibleTarget; | ||
328 | @end | ||
329 | |||
330 | #pragma mark CDAsynchBufferLoader | ||
331 | |||
332 | /** CDAsynchBufferLoader | ||
333 | TODO | ||
334 | */ | ||
335 | @interface CDAsynchBufferLoader : NSOperation { | ||
336 | NSArray *_loadRequests; | ||
337 | CDSoundEngine *_soundEngine; | ||
338 | } | ||
339 | |||
340 | -(id) init:(NSArray *)loadRequests soundEngine:(CDSoundEngine *) theSoundEngine; | ||
341 | |||
342 | @end | ||
343 | |||
344 | #pragma mark CDBufferLoadRequest | ||
345 | |||
346 | /** CDBufferLoadRequest */ | ||
347 | @interface CDBufferLoadRequest: NSObject | ||
348 | { | ||
349 | NSString *filePath; | ||
350 | int soundId; | ||
351 | //id loader; | ||
352 | } | ||
353 | |||
354 | @property (readonly) NSString *filePath; | ||
355 | @property (readonly) int soundId; | ||
356 | |||
357 | - (id)init:(int) theSoundId filePath:(const NSString *) theFilePath; | ||
358 | @end | ||
359 | |||
360 | /** Interpolation type */ | ||
361 | typedef enum { | ||
362 | kIT_Linear, //!Straight linear interpolation fade | ||
363 | kIT_SCurve, //!S curved interpolation | ||
364 | kIT_Exponential //!Exponential interpolation | ||
365 | } tCDInterpolationType; | ||
366 | |||
367 | #pragma mark CDFloatInterpolator | ||
368 | @interface CDFloatInterpolator: NSObject | ||
369 | { | ||
370 | float start; | ||
371 | float end; | ||
372 | float lastValue; | ||
373 | tCDInterpolationType interpolationType; | ||
374 | } | ||
375 | @property (readwrite, nonatomic) float start; | ||
376 | @property (readwrite, nonatomic) float end; | ||
377 | @property (readwrite, nonatomic) tCDInterpolationType interpolationType; | ||
378 | |||
379 | /** Return a value between min and max based on t which represents fractional progress where 0 is the start | ||
380 | and 1 is the end */ | ||
381 | -(float) interpolate:(float) t; | ||
382 | -(id) init:(tCDInterpolationType) type startVal:(float) startVal endVal:(float) endVal; | ||
383 | |||
384 | @end | ||
385 | |||
386 | #pragma mark CDPropertyModifier | ||
387 | |||
388 | /** Base class for classes that modify properties such as pitch, pan and gain */ | ||
389 | @interface CDPropertyModifier: NSObject | ||
390 | { | ||
391 | CDFloatInterpolator *interpolator; | ||
392 | float startValue; | ||
393 | float endValue; | ||
394 | id target; | ||
395 | BOOL stopTargetWhenComplete; | ||
396 | |||
397 | } | ||
398 | @property (readwrite, nonatomic) BOOL stopTargetWhenComplete; | ||
399 | @property (readwrite, nonatomic) float startValue; | ||
400 | @property (readwrite, nonatomic) float endValue; | ||
401 | @property (readwrite, nonatomic) tCDInterpolationType interpolationType; | ||
402 | |||
403 | -(id) init:(id) theTarget interpolationType:(tCDInterpolationType) type startVal:(float) startVal endVal:(float) endVal; | ||
404 | /** Set to a fractional value between 0 and 1 where 0 equals the start and 1 equals the end*/ | ||
405 | -(void) modify:(float) t; | ||
406 | |||
407 | -(void) _setTargetProperty:(float) newVal; | ||
408 | -(float) _getTargetProperty; | ||
409 | -(void) _stopTarget; | ||
410 | -(Class) _allowableType; | ||
411 | |||
412 | @end | ||
413 | |||
414 | #pragma mark CDSoundSourceFader | ||
415 | |||
416 | /** Fader for CDSoundSource objects */ | ||
417 | @interface CDSoundSourceFader : CDPropertyModifier{} | ||
418 | @end | ||
419 | |||
420 | #pragma mark CDSoundSourcePanner | ||
421 | |||
422 | /** Panner for CDSoundSource objects */ | ||
423 | @interface CDSoundSourcePanner : CDPropertyModifier{} | ||
424 | @end | ||
425 | |||
426 | #pragma mark CDSoundSourcePitchBender | ||
427 | |||
428 | /** Pitch bender for CDSoundSource objects */ | ||
429 | @interface CDSoundSourcePitchBender : CDPropertyModifier{} | ||
430 | @end | ||
431 | |||
432 | #pragma mark CDSoundEngineFader | ||
433 | |||
434 | /** Fader for CDSoundEngine objects */ | ||
435 | @interface CDSoundEngineFader : CDPropertyModifier{} | ||
436 | @end | ||
437 | |||
438 | |||
439 | |||
440 | |||