DEADSOFTWARE

9dbd3d3f6968bbbd4377179b9c3662671685eba3
[LongFlight.git] / Sound.java
1 package code.kalter.longflight;
3 import java.io.IOException;
4 import java.util.Vector;
5 import javax.microedition.media.MediaException;
6 import javax.microedition.media.Player;
7 import javax.microedition.media.PlayerListener;
9 /**
10 * Фоновая музыка: поочерёдное воспроизведение с цикличностью. Для создания
11 * необходимо применить трюк Double-Brace, где сначала нужно загрузить ресурсы,
12 * а после запустить
13 *
14 * @author KalterFive
15 */
16 public class Sound {
18 // вызывается для смены текущей мелодии
19 private final PlayerListener playerListener;
21 {
22 playerListener = new PlayerListener() {
23 // override
24 public void playerUpdate(Player player, String event,
25 Object eventData) {
26 if (event.equals(PlayerListener.END_OF_MEDIA)) {
27 try {
28 player.stop();
29 player.deallocate();
30 play();
31 } catch (MediaException e) {
32 LongFlight.link.catchException(e);
33 }
34 }
35 }
36 };
37 }
39 private final Vector dump;
40 private int active;
42 public Sound() throws MediaException {
43 active = -1;
44 dump = new Vector();
45 }
47 // останавливает каждый плеер, освобождает ресурсы и закрывает
48 public void stop() throws MediaException {
49 for (int i = 0; i < dump.size(); i++) {
50 final Player player = (Player) dump.elementAt(i);
51 if (i == active) {
52 player.stop();
53 player.deallocate();
54 }
55 player.close();
56 }
57 }
59 /*
60 * Берёт из вектора следующий плеер, реализует, упреждает выборку, ставит
61 * воспроизведение на начало и включает
62 */
63 protected void play() throws MediaException {
64 if (++active >= dump.size()) {
65 active = 0;
66 }
67 final Player player = (Player) dump.elementAt(active);
68 player.realize();
69 player.prefetch();
70 player.setMediaTime(0);
71 player.start();
72 }
74 // добавляет загруженный плеер в вектор - ничего более
75 protected void add(Player player) throws MediaException {
76 player.addPlayerListener(playerListener);
77 dump.addElement(player);
78 }
80 protected void add(String path, String type) throws IOException,
81 MediaException {
82 final Loader loader = Loader.getInstance();
83 add(loader.getPlayer(path, type));
84 }
85 }