@urso/core 0.8.21 → 0.9.1-dev

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