@urso/core 0.7.92 → 0.7.93

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (132) hide show
  1. package/.babelrc +11 -11
  2. package/LICENSE +20 -20
  3. package/README.md +227 -227
  4. package/build/js/index.js +1 -1
  5. package/build/js/index.js.LICENSE.txt +2 -2
  6. package/package.json +51 -50
  7. package/src/js/app.js +104 -104
  8. package/src/js/components/base/controller.js +78 -78
  9. package/src/js/components/debug/controller.js +38 -38
  10. package/src/js/components/debug/coords.js +23 -23
  11. package/src/js/components/debug/fps.js +36 -36
  12. package/src/js/components/debug/template.js +55 -55
  13. package/src/js/components/debug/timescale.js +60 -60
  14. package/src/js/components/deviceRotate/controller.js +95 -95
  15. package/src/js/components/editor/api.js +127 -127
  16. package/src/js/components/editor/controller.js +12 -12
  17. package/src/js/components/fullscreen/android.js +104 -104
  18. package/src/js/components/fullscreen/controller.js +76 -76
  19. package/src/js/components/fullscreen/desktop.js +49 -49
  20. package/src/js/components/fullscreen/ios.js +115 -115
  21. package/src/js/components/layersSwitcher/config.js +26 -26
  22. package/src/js/components/layersSwitcher/controller.js +36 -36
  23. package/src/js/components/loader/controller.js +66 -66
  24. package/src/js/components/loader/template.js +70 -70
  25. package/src/js/components/soundInitialPopup/controller.js +42 -42
  26. package/src/js/components/soundInitialPopup/template.js +109 -109
  27. package/src/js/components/stateDriven/controller.js +123 -123
  28. package/src/js/config/load.js +194 -194
  29. package/src/js/config/main.js +17 -17
  30. package/src/js/extra/browserEvents.js +57 -57
  31. package/src/js/extra/main.js +21 -19
  32. package/src/js/extra/pixiPatch.js +171 -171
  33. package/src/js/index.js +7 -7
  34. package/src/js/lib/cache.js +125 -125
  35. package/src/js/lib/composition.js +85 -85
  36. package/src/js/lib/device.js +1215 -1215
  37. package/src/js/lib/helper.js +678 -678
  38. package/src/js/lib/loader.js +211 -211
  39. package/src/js/lib/localData.js +28 -28
  40. package/src/js/lib/logger.js +69 -69
  41. package/src/js/lib/math.js +161 -161
  42. package/src/js/lib/objectPool.js +207 -207
  43. package/src/js/lib/time.js +18 -18
  44. package/src/js/lib/tween.js +152 -152
  45. package/src/js/modules/assets/baseModel.js +20 -20
  46. package/src/js/modules/assets/config.js +38 -38
  47. package/src/js/modules/assets/controller.js +65 -65
  48. package/src/js/modules/assets/models/atlas.js +18 -18
  49. package/src/js/modules/assets/models/audiosprite.js +28 -28
  50. package/src/js/modules/assets/models/bitmapFont.js +10 -10
  51. package/src/js/modules/assets/models/container.js +18 -18
  52. package/src/js/modules/assets/models/font.js +10 -10
  53. package/src/js/modules/assets/models/html.js +10 -10
  54. package/src/js/modules/assets/models/image.js +17 -17
  55. package/src/js/modules/assets/models/json.js +10 -10
  56. package/src/js/modules/assets/models/jsonAtlas.js +10 -10
  57. package/src/js/modules/assets/models/sound.js +16 -16
  58. package/src/js/modules/assets/models/spine.js +16 -16
  59. package/src/js/modules/assets/service.js +541 -541
  60. package/src/js/modules/i18n/config.js +17 -17
  61. package/src/js/modules/i18n/controller.js +71 -71
  62. package/src/js/modules/instances/controller.js +357 -357
  63. package/src/js/modules/logic/config/sounds.js +23 -23
  64. package/src/js/modules/logic/controller.js +52 -52
  65. package/src/js/modules/logic/main.js +8 -8
  66. package/src/js/modules/logic/sounds.js +103 -103
  67. package/src/js/modules/objects/baseModel.js +207 -207
  68. package/src/js/modules/objects/cache.js +99 -99
  69. package/src/js/modules/objects/config.js +9 -9
  70. package/src/js/modules/objects/controller.js +139 -139
  71. package/src/js/modules/objects/find.js +58 -58
  72. package/src/js/modules/objects/models/atlasImage.js +52 -52
  73. package/src/js/modules/objects/models/bitmapText.js +48 -48
  74. package/src/js/modules/objects/models/button.js +196 -196
  75. package/src/js/modules/objects/models/buttonComposite.js +37 -37
  76. package/src/js/modules/objects/models/checkbox.js +96 -96
  77. package/src/js/modules/objects/models/collection.js +54 -54
  78. package/src/js/modules/objects/models/component.js +48 -48
  79. package/src/js/modules/objects/models/container.js +21 -21
  80. package/src/js/modules/objects/models/dragContainer.js +664 -664
  81. package/src/js/modules/objects/models/emitter.js +69 -69
  82. package/src/js/modules/objects/models/emitterFx.js +114 -114
  83. package/src/js/modules/objects/models/graphics.js +40 -40
  84. package/src/js/modules/objects/models/group.js +21 -21
  85. package/src/js/modules/objects/models/hitArea.js +170 -119
  86. package/src/js/modules/objects/models/image.js +36 -36
  87. package/src/js/modules/objects/models/imagesAnimation.js +115 -115
  88. package/src/js/modules/objects/models/mask.js +40 -40
  89. package/src/js/modules/objects/models/nineSlicePlane.js +32 -32
  90. package/src/js/modules/objects/models/scrollbox.js +66 -66
  91. package/src/js/modules/objects/models/slider.js +352 -352
  92. package/src/js/modules/objects/models/spine.js +338 -338
  93. package/src/js/modules/objects/models/text.js +70 -70
  94. package/src/js/modules/objects/models/textInput.js +68 -68
  95. package/src/js/modules/objects/models/toggle.js +179 -179
  96. package/src/js/modules/objects/models/world.js +21 -21
  97. package/src/js/modules/objects/pool.js +68 -68
  98. package/src/js/modules/objects/propertyAdapter.js +588 -588
  99. package/src/js/modules/objects/proxy.js +298 -298
  100. package/src/js/modules/objects/selector.js +136 -136
  101. package/src/js/modules/objects/service.js +254 -254
  102. package/src/js/modules/objects/styles.js +210 -210
  103. package/src/js/modules/observer/controller.js +167 -167
  104. package/src/js/modules/observer/events.js +56 -56
  105. package/src/js/modules/scenes/controller.js +127 -127
  106. package/src/js/modules/scenes/model.js +28 -28
  107. package/src/js/modules/scenes/pixiWrapper.js +351 -351
  108. package/src/js/modules/scenes/resolutions.js +173 -173
  109. package/src/js/modules/scenes/resolutionsConfig.js +73 -73
  110. package/src/js/modules/scenes/service.js +146 -146
  111. package/src/js/modules/soundManager/controller.js +103 -103
  112. package/src/js/modules/soundManager/soundSprite.js +285 -285
  113. package/src/js/modules/statesManager/action.js +97 -97
  114. package/src/js/modules/statesManager/all.js +23 -23
  115. package/src/js/modules/statesManager/configStates.js +77 -77
  116. package/src/js/modules/statesManager/controller.js +218 -218
  117. package/src/js/modules/statesManager/functionsStorage.js +82 -82
  118. package/src/js/modules/statesManager/helper.js +27 -27
  119. package/src/js/modules/statesManager/race.js +91 -91
  120. package/src/js/modules/statesManager/sequence.js +48 -48
  121. package/src/js/modules/template/controller.js +28 -28
  122. package/src/js/modules/template/model.js +11 -11
  123. package/src/js/modules/template/service.js +137 -137
  124. package/src/js/modules/template/types.js +48 -48
  125. package/src/js/modules/transport/baseConnectionType.js +25 -25
  126. package/src/js/modules/transport/config.js +13 -13
  127. package/src/js/modules/transport/connectionTypes/websocket.js +76 -76
  128. package/src/js/modules/transport/connectionTypes/xhr.js +46 -46
  129. package/src/js/modules/transport/controller.js +48 -48
  130. package/src/js/modules/transport/decorator.js +17 -17
  131. package/src/js/modules/transport/service.js +150 -150
  132. package/webpack.config.js +47 -47
@@ -1,286 +1,286 @@
1
- const DUMMY_SOUND_DELAY = 500; // ms
2
- class SoundSprite {
3
- constructor({ name, sprite, audiosprite }) {
4
- this._player = null;
5
- this._totalVolume = 0;
6
- this._makePlayer(sprite, audiosprite);
7
-
8
- this._name = name;
9
- this._sprite = sprite;
10
-
11
- this._soundsState = this._initSoundsState();
12
-
13
- this._eventsCfg = {};
14
- this._fadeTweens = {};
15
- this._eventsQueue = [];
16
- this._isAudioUnlocked = false;
17
- this._reactToEvent = this._reactToEvent.bind(this);
18
- this._timeout = null;
19
- this._dummy = null;
20
- };
21
-
22
-
23
- _initSoundsState() {
24
- const soundsNames = Object.keys(this._sprite);
25
- const soundsStateObj = {};
26
-
27
- soundsNames.forEach(soundName => {
28
- soundsStateObj[soundName] = {
29
- id: null,
30
- loop: false,
31
- volume: 1,
32
- relaunch: false,
33
- _muted: false
34
- }
35
- });
36
-
37
- return soundsStateObj;
38
- }
39
-
40
- _makePlayer(sprite, audiosprite) {
41
- var reader = new FileReader();
42
- reader.readAsDataURL(audiosprite);
43
- reader.onloadend = () => {
44
- var base64data = reader.result;
45
- this._player = new Howl({
46
- src: base64data,
47
- sprite
48
- });
49
- this._subscribePlayerEvents();
50
- }
51
- };
52
-
53
- _subscribePlayerEvents() {
54
- this._player.on('unlock', () => setTimeout(() => {
55
- this._isAudioUnlocked = true;
56
- this._onUnlock();
57
- this.emit(Urso.events.MODULES_SOUND_MANAGER_CONTEXT_UNLOCKED);
58
- }, 1000));
59
-
60
- this._player.on('end', id => {
61
- const soundState = this._getSoundStateById(id);
62
-
63
- if (!soundState)
64
- return Urso.logger.error(`SoundSprite error: soundState for id '${id}' not found!`);
65
-
66
- if (!soundState.loop)
67
- soundState.id = null;
68
- });
69
- };
70
-
71
- _getSoundStateById(soundId) {
72
- return Object.values(this._soundsState).find(({ id }) => id === soundId);
73
- }
74
-
75
- canPlayCheck() {
76
- return this._isAudioUnlocked;
77
- };
78
-
79
- play({ soundKey, loop = false, volume = this._volume, relaunch = false, resetVolume = true }) {
80
- if (!this.canPlayCheck() || (this._soundsState[soundKey].id !== null && !relaunch))
81
- return false;
82
-
83
- this.stop({ soundKey });
84
-
85
- this._soundsState[soundKey].id = this._player.play(soundKey);
86
-
87
- this.setRelaunch(soundKey, relaunch);
88
- this.setLoop(soundKey, loop);
89
-
90
- if (!resetVolume) //set saved volume value
91
- volume = this._soundsState[soundKey].volume
92
-
93
- this.setVolume({ soundKey, volume });
94
-
95
- return true;
96
- };
97
-
98
- setLoop(soundKey, loop = false) {
99
- this._soundsState[soundKey].loop = loop;
100
- this._player.loop(loop, this._soundsState[soundKey].id);
101
- };
102
-
103
- setVolume({ soundKey, volume = 1, saveVolumeState = true }) {
104
- this._player.volume(volume, this._soundsState[soundKey].id);
105
-
106
- if (volume === 0) {
107
- this._changeSoundMute(true, soundKey);
108
- return;
109
- } else if (this._soundsState[soundKey]._muted) {
110
- this._changeSoundMute(false, soundKey);
111
- }
112
-
113
- if (saveVolumeState) {
114
- this._soundsState[soundKey].volume = volume;
115
- }
116
- };
117
-
118
- setAllVolume(volume) {
119
- this._totalVolume = volume;
120
-
121
- if (this._player) {
122
- this._player._volume = volume;
123
- }
124
-
125
- if (this.canPlayCheck()) {
126
- this._updateVolume();
127
- }
128
- }
129
-
130
- _updateVolume() {
131
- const soundKeys = Object.keys(this._soundsState);
132
- this._player._volume = this._totalVolume;
133
- soundKeys.forEach(soundKey => {
134
- const soundVolume = this._soundsState[soundKey].volume * this._totalVolume;
135
- this.setVolume({ soundKey, volume: soundVolume, saveVolumeState: false });
136
- });
137
- }
138
-
139
- _changeSoundMute(needMute, soundKey) {
140
- this._player.mute(needMute, soundKey);
141
- this._soundsState[soundKey]._muted = needMute;
142
- }
143
-
144
- setRelaunch(soundKey, needRelaunch = false) {
145
- this._soundsState[soundKey].relaunch = needRelaunch;
146
- };
147
-
148
- stop({ soundKey }) {
149
- if (!this._soundsState[soundKey].id)
150
- return;
151
-
152
- this._player.stop(this._soundsState[soundKey].id);
153
- this._soundsState[soundKey].id = null;
154
- };
155
-
156
- pause({ soundKey }) {
157
- if (this.canPlayCheck() || this._player.playing(this._soundsState[soundKey].id))
158
- this._player.pause(this._soundsState[soundKey].id);
159
- };
160
-
161
- resume({ soundKey }) {
162
- if (this.canPlayCheck() && !this._player.playing(this._soundsState[soundKey].id))
163
- this._player.play(this._soundsState[soundKey].id);
164
- };
165
-
166
- updateEvents(eventsCfg) {
167
- this._customUnsubscribe();
168
- this._saveEvents(eventsCfg);
169
- this._customSubscribe();
170
- };
171
-
172
- _stopPrevFade(soundKey) {
173
- if (this._fadeTweens[soundKey]) {
174
- this._fadeTweens[soundKey].kill();
175
- }
176
-
177
- delete this._fadeTweens[soundKey];
178
- }
179
-
180
- _startFade({ fadeTo, fadeDuration, soundKey }) {
181
- const fadeFrom = this._soundsState[soundKey].volume;
182
- const delta = fadeTo - fadeFrom;
183
-
184
- const onUpdate = () => {
185
- const volume = (fadeFrom + (delta * this._fadeTweens[soundKey].ratio)) * this._totalVolume;
186
- this.setVolume({ soundKey, volume });
187
- };
188
-
189
- this._fadeTweens[soundKey] = gsap.to({}, fadeDuration / 1000, { onUpdate });
190
- }
191
-
192
- fade({ fadeTo = 1, fadeDuration = 200, startSound = false, soundKey, ...others }) {
193
- if (startSound) {
194
- this.play({ ...others, soundKey });
195
- }
196
- if (this._soundsState[soundKey].id === null) {
197
- return;
198
- }
199
-
200
- this._stopPrevFade(soundKey);
201
- this._startFade({ fadeTo, fadeDuration, soundKey });
202
- }
203
-
204
- _saveEvents(eventsCfg) {
205
- this._eventsCfg = eventsCfg;
206
- }
207
-
208
- _setEventCallback(soundKey, event) {
209
- return function () {
210
- const params = this._eventsCfg[soundKey].events[event];
211
-
212
- this._reactToEvent(soundKey, params);
213
- };
214
- };
215
-
216
- _onUnlock() {
217
- this._runEventsFromQueue();
218
- this._updateVolume();
219
- };
220
-
221
- _runEventsFromQueue() {
222
- this._eventsQueue.forEach(event => this._reactToEvent(event.soundKey, event));
223
- this._eventsQueue = [];
224
- };
225
-
226
- _addEventToQueue(data) {
227
- this._eventsQueue.push(data);
228
- };
229
-
230
- _reactToEvent(soundKey, { action, volume, ...otherParams }) {
231
- volume *= this._totalVolume;
232
- const self = this;
233
- const params = { ...otherParams, action, soundKey, volume };
234
-
235
- if (!self[action])
236
- return Urso.logger.error(`SoundSprite error: Sound action '${action}' not found!`);
237
-
238
- if (!this._isAudioUnlocked)
239
- this._addEventToQueue({ ...params, action });
240
-
241
- self[action](params);
242
- };
243
-
244
- _customSubscribe() {
245
- for (const soundKey in this._eventsCfg) {
246
- const { events = {} } = this._eventsCfg[soundKey];
247
-
248
- for (const event in events) {
249
- this.addListener(event, this._setEventCallback(soundKey, event).bind(this), true);
250
- }
251
- }
252
- };
253
-
254
- _customUnsubscribe() {
255
- for (const event in this._eventsCfg) {
256
- this.removeListener(event, this._setEventCallback(event).bind(this), true);
257
- }
258
- };
259
-
260
- playDummy() {
261
- if (this._timeout) {
262
- clearTimeout(this._timeout);
263
- this._timeout = null;
264
- }
265
-
266
- if (!Urso.device.iOS) {
267
- return;
268
- }
269
-
270
- this._timeout = setTimeout(() => {
271
- if (this._dummy) {
272
- this._dummy.stop();
273
- this._dummy.unload();
274
- }
275
-
276
- this._dummy = new Howl({
277
- src: `data:audio/x-wav;base64,UklGRooWAABXQVZFZm10IBAAAAABAAEAIlYAAESsAAACABAAZGF0YWYWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA`,
278
- html5: true
279
- });
280
-
281
- this._dummy.play();
282
- }, DUMMY_SOUND_DELAY);
283
- }
284
- };
285
-
1
+ const DUMMY_SOUND_DELAY = 500; // ms
2
+ class SoundSprite {
3
+ constructor({ name, sprite, audiosprite }) {
4
+ this._player = null;
5
+ this._totalVolume = 0;
6
+ this._makePlayer(sprite, audiosprite);
7
+
8
+ this._name = name;
9
+ this._sprite = sprite;
10
+
11
+ this._soundsState = this._initSoundsState();
12
+
13
+ this._eventsCfg = {};
14
+ this._fadeTweens = {};
15
+ this._eventsQueue = [];
16
+ this._isAudioUnlocked = false;
17
+ this._reactToEvent = this._reactToEvent.bind(this);
18
+ this._timeout = null;
19
+ this._dummy = null;
20
+ };
21
+
22
+
23
+ _initSoundsState() {
24
+ const soundsNames = Object.keys(this._sprite);
25
+ const soundsStateObj = {};
26
+
27
+ soundsNames.forEach(soundName => {
28
+ soundsStateObj[soundName] = {
29
+ id: null,
30
+ loop: false,
31
+ volume: 1,
32
+ relaunch: false,
33
+ _muted: false
34
+ }
35
+ });
36
+
37
+ return soundsStateObj;
38
+ }
39
+
40
+ _makePlayer(sprite, audiosprite) {
41
+ var reader = new FileReader();
42
+ reader.readAsDataURL(audiosprite);
43
+ reader.onloadend = () => {
44
+ var base64data = reader.result;
45
+ this._player = new Howl({
46
+ src: base64data,
47
+ sprite
48
+ });
49
+ this._subscribePlayerEvents();
50
+ }
51
+ };
52
+
53
+ _subscribePlayerEvents() {
54
+ this._player.on('unlock', () => setTimeout(() => {
55
+ this._isAudioUnlocked = true;
56
+ this._onUnlock();
57
+ this.emit(Urso.events.MODULES_SOUND_MANAGER_CONTEXT_UNLOCKED);
58
+ }, 1000));
59
+
60
+ this._player.on('end', id => {
61
+ const soundState = this._getSoundStateById(id);
62
+
63
+ if (!soundState)
64
+ return Urso.logger.error(`SoundSprite error: soundState for id '${id}' not found!`);
65
+
66
+ if (!soundState.loop)
67
+ soundState.id = null;
68
+ });
69
+ };
70
+
71
+ _getSoundStateById(soundId) {
72
+ return Object.values(this._soundsState).find(({ id }) => id === soundId);
73
+ }
74
+
75
+ canPlayCheck() {
76
+ return this._isAudioUnlocked;
77
+ };
78
+
79
+ play({ soundKey, loop = false, volume = this._volume, relaunch = false, resetVolume = true }) {
80
+ if (!this.canPlayCheck() || (this._soundsState[soundKey].id !== null && !relaunch))
81
+ return false;
82
+
83
+ this.stop({ soundKey });
84
+
85
+ this._soundsState[soundKey].id = this._player.play(soundKey);
86
+
87
+ this.setRelaunch(soundKey, relaunch);
88
+ this.setLoop(soundKey, loop);
89
+
90
+ if (!resetVolume) //set saved volume value
91
+ volume = this._soundsState[soundKey].volume
92
+
93
+ this.setVolume({ soundKey, volume });
94
+
95
+ return true;
96
+ };
97
+
98
+ setLoop(soundKey, loop = false) {
99
+ this._soundsState[soundKey].loop = loop;
100
+ this._player.loop(loop, this._soundsState[soundKey].id);
101
+ };
102
+
103
+ setVolume({ soundKey, volume = 1, saveVolumeState = true }) {
104
+ this._player.volume(volume, this._soundsState[soundKey].id);
105
+
106
+ if (volume === 0) {
107
+ this._changeSoundMute(true, soundKey);
108
+ return;
109
+ } else if (this._soundsState[soundKey]._muted) {
110
+ this._changeSoundMute(false, soundKey);
111
+ }
112
+
113
+ if (saveVolumeState) {
114
+ this._soundsState[soundKey].volume = volume;
115
+ }
116
+ };
117
+
118
+ setAllVolume(volume) {
119
+ this._totalVolume = volume;
120
+
121
+ if (this._player) {
122
+ this._player._volume = volume;
123
+ }
124
+
125
+ if (this.canPlayCheck()) {
126
+ this._updateVolume();
127
+ }
128
+ }
129
+
130
+ _updateVolume() {
131
+ const soundKeys = Object.keys(this._soundsState);
132
+ this._player._volume = this._totalVolume;
133
+ soundKeys.forEach(soundKey => {
134
+ const soundVolume = this._soundsState[soundKey].volume * this._totalVolume;
135
+ this.setVolume({ soundKey, volume: soundVolume, saveVolumeState: false });
136
+ });
137
+ }
138
+
139
+ _changeSoundMute(needMute, soundKey) {
140
+ this._player.mute(needMute, soundKey);
141
+ this._soundsState[soundKey]._muted = needMute;
142
+ }
143
+
144
+ setRelaunch(soundKey, needRelaunch = false) {
145
+ this._soundsState[soundKey].relaunch = needRelaunch;
146
+ };
147
+
148
+ stop({ soundKey }) {
149
+ if (!this._soundsState[soundKey].id)
150
+ return;
151
+
152
+ this._player.stop(this._soundsState[soundKey].id);
153
+ this._soundsState[soundKey].id = null;
154
+ };
155
+
156
+ pause({ soundKey }) {
157
+ if (this.canPlayCheck() || this._player.playing(this._soundsState[soundKey].id))
158
+ this._player.pause(this._soundsState[soundKey].id);
159
+ };
160
+
161
+ resume({ soundKey }) {
162
+ if (this.canPlayCheck() && !this._player.playing(this._soundsState[soundKey].id))
163
+ this._player.play(this._soundsState[soundKey].id);
164
+ };
165
+
166
+ updateEvents(eventsCfg) {
167
+ this._customUnsubscribe();
168
+ this._saveEvents(eventsCfg);
169
+ this._customSubscribe();
170
+ };
171
+
172
+ _stopPrevFade(soundKey) {
173
+ if (this._fadeTweens[soundKey]) {
174
+ this._fadeTweens[soundKey].kill();
175
+ }
176
+
177
+ delete this._fadeTweens[soundKey];
178
+ }
179
+
180
+ _startFade({ fadeTo, fadeDuration, soundKey }) {
181
+ const fadeFrom = this._soundsState[soundKey].volume;
182
+ const delta = fadeTo - fadeFrom;
183
+
184
+ const onUpdate = () => {
185
+ const volume = (fadeFrom + (delta * this._fadeTweens[soundKey].ratio)) * this._totalVolume;
186
+ this.setVolume({ soundKey, volume });
187
+ };
188
+
189
+ this._fadeTweens[soundKey] = gsap.to({}, fadeDuration / 1000, { onUpdate });
190
+ }
191
+
192
+ fade({ fadeTo = 1, fadeDuration = 200, startSound = false, soundKey, ...others }) {
193
+ if (startSound) {
194
+ this.play({ ...others, soundKey });
195
+ }
196
+ if (this._soundsState[soundKey].id === null) {
197
+ return;
198
+ }
199
+
200
+ this._stopPrevFade(soundKey);
201
+ this._startFade({ fadeTo, fadeDuration, soundKey });
202
+ }
203
+
204
+ _saveEvents(eventsCfg) {
205
+ this._eventsCfg = eventsCfg;
206
+ }
207
+
208
+ _setEventCallback(soundKey, event) {
209
+ return function () {
210
+ const params = this._eventsCfg[soundKey].events[event];
211
+
212
+ this._reactToEvent(soundKey, params);
213
+ };
214
+ };
215
+
216
+ _onUnlock() {
217
+ this._runEventsFromQueue();
218
+ this._updateVolume();
219
+ };
220
+
221
+ _runEventsFromQueue() {
222
+ this._eventsQueue.forEach(event => this._reactToEvent(event.soundKey, event));
223
+ this._eventsQueue = [];
224
+ };
225
+
226
+ _addEventToQueue(data) {
227
+ this._eventsQueue.push(data);
228
+ };
229
+
230
+ _reactToEvent(soundKey, { action, volume, ...otherParams }) {
231
+ volume *= this._totalVolume;
232
+ const self = this;
233
+ const params = { ...otherParams, action, soundKey, volume };
234
+
235
+ if (!self[action])
236
+ return Urso.logger.error(`SoundSprite error: Sound action '${action}' not found!`);
237
+
238
+ if (!this._isAudioUnlocked)
239
+ this._addEventToQueue({ ...params, action });
240
+
241
+ self[action](params);
242
+ };
243
+
244
+ _customSubscribe() {
245
+ for (const soundKey in this._eventsCfg) {
246
+ const { events = {} } = this._eventsCfg[soundKey];
247
+
248
+ for (const event in events) {
249
+ this.addListener(event, this._setEventCallback(soundKey, event).bind(this), true);
250
+ }
251
+ }
252
+ };
253
+
254
+ _customUnsubscribe() {
255
+ for (const event in this._eventsCfg) {
256
+ this.removeListener(event, this._setEventCallback(event).bind(this), true);
257
+ }
258
+ };
259
+
260
+ playDummy() {
261
+ if (this._timeout) {
262
+ clearTimeout(this._timeout);
263
+ this._timeout = null;
264
+ }
265
+
266
+ if (!Urso.device.iOS) {
267
+ return;
268
+ }
269
+
270
+ this._timeout = setTimeout(() => {
271
+ if (this._dummy) {
272
+ this._dummy.stop();
273
+ this._dummy.unload();
274
+ }
275
+
276
+ this._dummy = new Howl({
277
+ src: `data:audio/x-wav;base64,UklGRooWAABXQVZFZm10IBAAAAABAAEAIlYAAESsAAACABAAZGF0YWYWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA`,
278
+ html5: true
279
+ });
280
+
281
+ this._dummy.play();
282
+ }, DUMMY_SOUND_DELAY);
283
+ }
284
+ };
285
+
286
286
  module.exports = SoundSprite;