1
1
package com .bladecoder .engine .model ;
2
2
3
+ import com .badlogic .gdx .Gdx ;
4
+ import com .badlogic .gdx .Application .ApplicationType ;
3
5
import com .badlogic .gdx .audio .Music ;
4
6
import com .badlogic .gdx .utils .Json ;
5
7
import com .badlogic .gdx .utils .Json .Serializable ;
6
8
import com .badlogic .gdx .utils .JsonValue ;
9
+ import com .badlogic .gdx .utils .Timer ;
10
+ import com .badlogic .gdx .utils .Timer .Task ;
7
11
import com .bladecoder .engine .actions .ActionCallback ;
8
12
import com .bladecoder .engine .anim .MusicVolumeTween ;
9
13
import com .bladecoder .engine .assets .AssetConsumer ;
@@ -30,6 +34,18 @@ public class MusicManager implements Serializable, AssetConsumer {
30
34
transient private boolean isPaused = false ;
31
35
private MusicVolumeTween volumeTween ;
32
36
37
+ private final Task backgroundLoadingTask = new Task () {
38
+ @ Override
39
+ public void run () {
40
+ if (EngineAssetManager .getInstance ().isLoading ()) {
41
+ cancel ();
42
+ Timer .post (backgroundLoadingTask );
43
+ } else {
44
+ retrieveAssets ();
45
+ }
46
+ }
47
+ };
48
+
33
49
public void playMusic () {
34
50
if (music != null && !music .isPlaying ()) {
35
51
@@ -38,6 +54,15 @@ public void playMusic() {
38
54
music .setLooping (desc .isLoop ());
39
55
music .setVolume (desc .getVolume ());
40
56
} catch (Exception e ) {
57
+
58
+ // DEAL WITH OPENAL BUG
59
+ if (Gdx .app .getType () == ApplicationType .Desktop && e .getMessage ().contains ("40963" )) {
60
+ EngineLogger .debug ("!!!!!!!!!!!!!!!!!!!!!!!ERROR playing music trying again...!!!!!!!!!!!!!!!" );
61
+ setMusic (desc );
62
+
63
+ return ;
64
+ }
65
+
41
66
EngineLogger .error ("Error Playing music: " + desc .getFilename (), e );
42
67
}
43
68
}
@@ -65,29 +90,33 @@ public void stopMusic() {
65
90
public void setMusic (MusicDesc d ) {
66
91
EngineLogger .debug (">>>SETTING MUSIC." );
67
92
stopMusic ();
68
- volumeTween = null ;
93
+ volumeTween = null ;
69
94
currentMusicDelay = 0 ;
70
95
71
96
if (d != null ) {
72
- if (desc != null )
97
+ if (desc != null ) {
73
98
dispose ();
99
+ }
74
100
75
101
desc = new MusicDesc (d );
76
102
77
- // Load and play the voice file in a different Thread to avoid
103
+ // Load the music file in background to avoid
78
104
// blocking the UI
79
- new Thread () {
80
- @ Override
81
- public void run () {
82
- retrieveAssets ();
83
- }
84
- }.start ();
105
+ loadTask ();
85
106
} else {
86
107
dispose ();
87
108
desc = null ;
88
109
}
89
110
}
90
111
112
+ private void loadTask () {
113
+ loadAssets ();
114
+
115
+ backgroundLoadingTask .cancel ();
116
+ // Timer.schedule(backgroundLoadingTask, 0.2f);
117
+ Timer .post (backgroundLoadingTask );
118
+ }
119
+
91
120
public void setVolume (float volume ) {
92
121
if (desc != null )
93
122
desc .setVolume (volume );
@@ -110,7 +139,7 @@ public void leaveScene(MusicDesc newMusicDesc) {
110
139
return ;
111
140
112
141
if (desc != null ) {
113
- currentMusicDelay = 0 ;
142
+ currentMusicDelay = 0f ;
114
143
stopMusic ();
115
144
dispose ();
116
145
}
@@ -177,10 +206,12 @@ public void loadAssets() {
177
206
@ Override
178
207
public void retrieveAssets () {
179
208
if (music == null && desc != null ) {
180
-
209
+ // Check if not loaded, this happens when setting a cached scene
181
210
if (!EngineAssetManager .getInstance ().isLoaded (EngineAssetManager .MUSIC_DIR + desc .getFilename ())) {
182
- loadAssets ();
183
- EngineAssetManager .getInstance ().finishLoading ();
211
+ // Load the music file in background to avoid
212
+ // blocking the UI
213
+ loadTask ();
214
+ return ;
184
215
}
185
216
186
217
EngineLogger .debug ("RETRIEVING MUSIC: " + desc .getFilename ());
0 commit comments