package com.cookbook.audio; import java.util.Iterator; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.audio.Sound; import com.badlogic.gdx.files.FileHandle; import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.Disposable; import com.badlogic.gdx.utils.JsonReader; import com.badlogic.gdx.utils.JsonValue; import com.badlogic.gdx.utils.JsonValue.JsonIterator; import com.badlogic.gdx.utils.ObjectMap; public class SoundManager implements Disposable { private Listener listener; private Array<SoundInstance> sounds; private ObjectMap<String, SoundData> soundsData; public SoundManager(FileHandle handle) { listener = new Listener(); sounds = new Array<SoundInstance>(); soundsData = new ObjectMap<String, SoundData>(); loadSoundData(handle); } @Override public void dispose() { Iterator<SoundData> it = soundsData.values().iterator(); while (it.hasNext()) { it.next().getSound().dispose(); } soundsData.clear(); sounds.clear(); } public SoundInstance play(String soundName) { SoundData data = soundsData.get(soundName); if (data != null) { SoundInstance instance = new SoundInstance(data); instance.update(listener); sounds.add(instance); return instance; } return null; } public void updateListener(Vector2 position, Vector2 direction) { listener.update(position, direction); } public void update() { for (int i = 0; i < sounds.size; ) { SoundInstance instance = sounds.get(i); if (instance.update(listener)) { sounds.removeIndex(i); } else { ++i; } } } private void loadSoundData(FileHandle handle) { try { JsonReader reader = new JsonReader(); JsonIterator it = reader.parse(handle).iterator(); while (it.hasNext()) { JsonValue value = it.next(); String name = value.getString("name"); Sound sound = Gdx.audio.newSound(Gdx.files.internal(name)); float duration = value.getFloat("duration"); float falloffStart = value.getFloat("falloffStart", 0.0f); float maxDistance = value.getFloat("maxDistance", 10.0f); SoundData soundData = new SoundData(sound, duration, falloffStart, maxDistance); soundsData.put(name, soundData); } } catch (Exception e) { e.printStackTrace(); } } }