I have a single activity game while playing (after login and character selection). My sound pool for SFX works great, but my background music randomly stops playing. I tried to add in setOnErrorListener, but never saw anything there. I am wondering if the thread is being garbage collected?
When you are in different towns or wilderness the music changes and that is checked here: !currentPlayingMusicFilename.equals(shortFilename). If you stay in the same music area, randomly the music stops looping.
I have read so many posts on here and google and can't find the "proper" way to play game background music. I've tried soundpool, but they are over 1MB, saw many things saying not to do service, and having an issue with this approach. Any help is greatly appreciated.
I am leaving in the "SFX" portion in case that code can help anyone and provide a full picture.
public static void playSoundOrMusic(final String shortFilename, final String type, double distanceFactor) {
String fullFilename = "";
if (type.equals("SFX")){
fullFilename = "res/sounds/sfx/" + shortFilename;
} else if (type.equals("MUSIC")){
if (mp3MUSICPlayer != null && mp3MUSICPlayer.isPlaying() && !currentPlayingMusicFilename.equals(shortFilename)){
mp3MUSICPlayer.stop();
}
fullFilename = "res/sounds/music/" + shortFilename;
}
float volumeManipulation = 1.0f;
if (type.equals("SFX")){
int sfxVolume = MyCommandReceiver.GetSharedPreferences().getInt(MyCommandReceiver.GetStringById(R.string.pref_general_sfx_volume_key), 100);
sfxVolume *= distanceFactor;
volumeManipulation = (float) (sfxVolume / 100.0);
//volumeManipulation = (float) (1 - (Math.log(MAX_VOLUME - sfxVolume) / Math.log(MAX_VOLUME)));
LoggerWrite("v", TAG, "sfxVolume: " + volumeManipulation);
} else if (type.equals("MUSIC")){
int musicVolume = MyCommandReceiver.GetSharedPreferences().getInt(MyCommandReceiver.GetStringById(R.string.pref_general_music_volume_key), 100);
volumeManipulation = (float) (musicVolume / 100.0);
//volumeManipulation = (float) (1 - (Math.log(MAX_VOLUME - musicVolume) / Math.log(MAX_VOLUME)));
LoggerWrite("v", TAG, "musicVolume: " + volumeManipulation);
}
final float finalVolume = volumeManipulation;
if (MyCommandReceiver.GetActiveActivity() == null){ //if not yet in Activity
return;
}
try {
Uri myUri = Uri.fromFile(new File(Environment.getExternalStorageDirectory() + "/KisnardOnline/" + fullFilename));
if (type.equals("SFX")){
if (!soundPoolIds.containsKey(Environment.getExternalStorageDirectory() + "/KisnardOnline/" + fullFilename)){ //not yet in soundpool
int soundId = soundPool.load(Environment.getExternalStorageDirectory() + "/KisnardOnline/" + fullFilename, 1);
soundPoolIds.put(Environment.getExternalStorageDirectory() + "/KisnardOnline/" + fullFilename, soundId);
//play it manually one time
mp3SFXPlayer = new MediaPlayer();
mp3SFXPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mp3SFXPlayer.setVolume(finalVolume, finalVolume);
mp3SFXPlayer.setDataSource(MyCommandReceiver.GetActiveActivity(), myUri);
new Thread(new Runnable() {
@Override
public void run() {
try {
mp3SFXPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mp3SFXPlayer.start();
}
});
mp3SFXPlayer.prepare();
} catch (Exception ex) {
GameActivity.LoggerWrite("e", TAG, "Sound(sfx) playing issue" + ex);
}
}
}).start();
} else { //already in soundpool - play it
soundPool.play(soundPoolIds.get(Environment.getExternalStorageDirectory() + "/KisnardOnline/" + fullFilename), finalVolume, finalVolume, 0, 0, 1);
}
} else if (type.equals("MUSIC")){
if (!currentPlayingMusicFilename.equals(shortFilename)){
mp3MUSICPlayer = new MediaPlayer();
mp3MUSICPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mp3MUSICPlayer.setVolume(finalVolume, finalVolume);
mp3MUSICPlayer.setDataSource(MyCommandReceiver.GetActiveActivity(), myUri);
}
}
} catch (Exception e) {
GameActivity.LoggerWrite("e", TAG, "Sound file issue" + e);
}
if (type.equals("MUSIC") && !currentPlayingMusicFilename.equals(shortFilename)){
new Thread(new Runnable() {
@Override
public void run() {
try {
mp3MUSICPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
currentPlayingMusicFilename = shortFilename;
mp3MUSICPlayer.start();
}
});
mp3MUSICPlayer.prepare();
mp3MUSICPlayer.setLooping(true);
} catch (Exception ex) {
GameActivity.LoggerWrite("e", TAG, "Sound(music) playing issue" + ex);
}
}
}).start();
}
}
Here is how I solved this as it does not seem there is an answer out there to why it dies randomly.
if (type.equals("MUSIC") && (!currentPlayingMusicFilename.equals(shortFilename) || !mp3MUSICPlayer.isPlaying())){
new Thread(new Runnable() {
...