package code.kalter.longflight; import java.io.IOException; import java.util.Vector; import javax.microedition.media.MediaException; import javax.microedition.media.Player; import javax.microedition.media.PlayerListener; /** * Фоновая музыка: поочерёдное воспроизведение с цикличностью. Для создания * необходимо применить трюк Double-Brace, где сначала нужно загрузить ресурсы, * а после запустить * * @author KalterFive */ public class Sound { // вызывается для смены текущей мелодии private final PlayerListener playerListener; { playerListener = new PlayerListener() { // override public void playerUpdate(Player player, String event, Object eventData) { if (event.equals(PlayerListener.END_OF_MEDIA)) { try { player.stop(); player.deallocate(); play(); } catch (MediaException e) { LongFlight.link.catchException(e); } } } }; } private final Vector dump; private int active; public Sound() throws MediaException { active = -1; dump = new Vector(); } // останавливает каждый плеер, освобождает ресурсы и закрывает public void stop() throws MediaException { for (int i = 0; i < dump.size(); i++) { final Player player = (Player) dump.elementAt(i); if (i == active) { player.stop(); player.deallocate(); } player.close(); } } /* * Берёт из вектора следующий плеер, реализует, упреждает выборку, ставит * воспроизведение на начало и включает */ protected void play() throws MediaException { if (++active >= dump.size()) { active = 0; } final Player player = (Player) dump.elementAt(active); player.realize(); player.prefetch(); player.setMediaTime(0); player.start(); } // добавляет загруженный плеер в вектор - ничего более protected void add(Player player) throws MediaException { player.addPlayerListener(playerListener); dump.addElement(player); } protected void add(String path, String type) throws IOException, MediaException { final Loader loader = Loader.getInstance(); add(loader.getPlayer(path, type)); } }