This repository has been archived by the owner on Jan 1, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 3
/
flxsound.monkey
411 lines (308 loc) · 7.21 KB
/
flxsound.monkey
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
Strict
Import mojo.audio
Import flxbasic
Import flxobject
Import flxu
Import flxg
Import system.flxassetsmanager
Import system.flxresourcesmanager
Class FlxSound Extends FlxBasic
Global __CLASS__:Object
Field x:Float
Field y:Float
Field survive:Bool
Field name:String
Field artist:String
Field autoDestroy:Bool
Field _paused:Bool
Field _looped:Bool
Private
Const _CHANNELS_COUNT:Int = 32
Global _NextChannel:Int = -1
Global _LoopedChannels:Bool[_CHANNELS_COUNT]
Field _sound:Sound
Field _channel:Int
Field _soundVolume:Float
Field _soundPan:Float
Field _volume:Float
Field _volumeAdjust:Float
Field _target:FlxObject
Field _radius:Float
Field _pan:Bool
Field _fadeOutTimer:Float
Field _fadeOutTotal:Float
Field _pauseOnFadeOut:Bool
Field _fadeInTimer:Float
Field _fadeInTotal:Float
Field _oldMute:Bool
Public
Method New()
Super.New()
_channel = -1
_CreateSound()
End Method
Method Destroy:Void()
Kill()
_sound = Null
_target = Null
End Method
Method Update:Void()
If (_paused) Return
Local radial:Float = 1.0
Local fade:Float = 1.0
Local updateNeeded:Bool = False
If (_target <> Null) Then
'in original flixel: radial = FlxU.GetDistance(_target.x, _target.y, x, y) / _radius. Maybe a bug?
radial = 1 - FlxU.GetDistance(_target.x, _target.y, x, y) / _radius
If (radial < 0) radial = 0
If (_pan) Then
'in original flixel: Local d:Float = (_target.x - x) / _radius. Maybe a bug?
Local d:Float = -(_target.x - x) / _radius
If (d < -1) Then
d = -1
ElseIf (d > 1) Then
d = 1
End If
_soundPan = d
End If
updateNeeded = True
End If
If (_fadeOutTimer > 0) Then
_fadeOutTimer -= FlxG.Elapsed
If (_fadeOutTimer <= 0) Then
If (_pauseOnFadeOut) Then
Pause()
Else
Stop()
End If
End If
fade = _fadeOutTimer / _fadeOutTotal
If (fade < 0) fade = 0
updateNeeded = True
ElseIf (_fadeInTimer > 0) Then
_fadeInTimer -= FlxG.Elapsed
fade = _fadeInTimer / _fadeInTotal
If (fade < 0) fade = 0
fade = 1 - fade
updateNeeded = True
End If
_volumeAdjust = radial * fade
If (_oldMute <> FlxG.Mute) Then
_UpdateTransform()
_oldMute = FlxG.Mute
updateNeeded = True
End If
If (updateNeeded) _UpdateTransform()
If ( Not _looped And _channel >= 0 And ChannelState(_channel) <= 0) Then
exists = False
End If
End Method
Method Kill:Void()
Stop()
Super.Kill()
End Method
Method Load:FlxSound(sound:String, looped:Bool = False, autoDestroy:Bool = False, stopPrevious:Bool = True)
If (stopPrevious) Stop()
_CreateSound()
_channel = _GetFreeChannel()
If (looped And _channel >= 0) _LoopedChannels[_channel] = True
name = sound
_sound = FlxG.AddSound(New SoundResource(name))
_looped = looped
_UpdateTransform()
If (_sound <> Null) exists = True
Return Self
End Method
Method Proximity:FlxSound(x:Float, y:Float, object:FlxObject, radius:Float, pan:Bool = True)
Self.x = x
Self.y = y
_target = object
_radius = radius
_pan = pan
Return Self
End Method
Method Play:Void(forceRestart:Bool = False)
If (forceRestart) Then
Local oldAutoDestroy:Bool = autoDestroy
autoDestroy = False
Stop()
autoDestroy = oldAutoDestroy
End If
If (_channel < 0) Then
_channel = _GetFreeChannel()
If (_channel < 0) Then
exists = False
Return
ElseIf (_looped) Then
_LoopedChannels[_channel] = True
End If
End If
_UpdateTransform()
If (Not _paused) Then
PlaySound(_sound, _channel, _looped)
Else
ResumeChannel(_channel)
End If
active = True
_paused = False
End Method
Method Resume:Void()
If (Not _paused) Return
If (_channel < 0) Then
exists = False
Return
End If
ResumeChannel(_channel)
_paused = False
active = True
End Method
Method Pause:Void()
If (_channel < 0) Then
exists = False
Return
End If
PauseChannel(_channel)
_paused = True
active = False
End Method
Method Stop:Void()
_paused = False
If (_channel >= 0 And exists) Then
StopChannel(_channel)
If (_looped) _LoopedChannels[_channel] = False
_channel = -1
active = False
If (autoDestroy) Then
Destroy()
End If
Else
exists = False
End If
End Method
Method FadeOut:Void(seconds:Float, pauseInstead:Bool = False)
_pauseOnFadeOut = pauseInstead
_fadeInTimer = 0
_fadeOutTimer = seconds
_fadeOutTotal = _fadeOutTimer
End Method
Method FadeIn:Void(seconds:Float)
_fadeOutTimer = 0
_fadeInTimer = seconds
_fadeInTotal = _fadeInTimer
End Method
Method Volume:Float() Property
Return _volume
End Method
Method Volume:Void(volume:Float) Property
_volume = volume
If (_volume < 0) Then
_volume = 0
ElseIf(_volume > 1)
_volume = 1
End If
_UpdateTransform()
End Method
Method GetActualVolume:Float()
Return _volume * _volumeAdjust
End Method
Function GetValidExt:String()
#If FLX_SOUND_EXTENSION = "wav"
Return "wav"
#ElseIf FLX_SOUND_EXTENSION = "ogg"
Return "ogg"
#ElseIf FLX_SOUND_EXTENSION = "mp3"
Return "mp3"
#ElseIf FLX_SOUND_EXTENSION = "m4a"
Return "m4a"
#ElseIf FLX_SOUND_EXTENSION = "caf"
Return "caf"
#ElseIf FLX_SOUND_EXTENSION = "aiff"
Return "aiff"
#ElseIf FLX_SOUND_EXTENSION = "unknown"
Return FlxGetValidSoundExt()
#End
End Function
Method _SetTransform:Void(volume:Float, pan:Float)
If (_channel >= 0) Then
SetChannelVolume(_channel, volume)
SetChannelPan(_channel, pan)
End If
End Method
Method _CreateSound:Void()
Destroy()
x = 0
y = 0
_sound = Null
_channel = -1
_paused = False
_volume = 1.0
_volumeAdjust = 1.0
_looped = False
_target = Null
_radius = 0
_pan = False
_fadeOutTimer = 0
_fadeOutTotal = 0
_pauseOnFadeOut = False
_fadeInTimer = 0
_fadeInTotal = 0
exists = False
active = False
visible = False
name = ""
artist = ""
autoDestroy = False
End Method
Method _UpdateTransform:Void()
If (Not FlxG.Mute) Then
_soundVolume = FlxG._Volume * _volume * _volumeAdjust
Else
_soundVolume = 0
End If
If (_soundVolume < 0) _soundVolume = 0
_SetTransform(_soundVolume, _soundPan)
End Method
Private
Method _GetFreeChannel:Int()
Local i:Int = 0
If (ChannelState(0) >= 0) Then
While (i < _CHANNELS_COUNT)
If (ChannelState(i) = 0) Return i
i += 1
Wend
Else
Local counter:Int = 0
Repeat
_NextChannel += 1
If (_NextChannel >= _CHANNELS_COUNT) _NextChannel = 0
counter += 1
If (counter >= _CHANNELS_COUNT) Then
#If FLX_DEBUG_ENABLED
FlxG.Log("Free channels for sound " + name + " are not found")
#End
Exit
End If
Until (Not _LoopedChannels[_NextChannel])
Return _NextChannel
End If
Return -1
End Method
End Class
Private
Class SoundResource Extends FlxResource<Sound>
Field sound:Sound
Method New(name:String)
Super.New(name)
End Method
Method Load:Sound()
sound = LoadSound(FlxAssetsManager.GetSoundPath(name))
Return sound
End Method
Method Use:Sound()
Return sound
End Method
Method Discard:Void()
sound.Discard()
sound = Null
End Method
End Class