annotate game/SoundElement.java @ 22:afde253ec705

More work.
author Matti Hamalainen <ccr@tnsp.org>
date Mon, 31 Jan 2011 21:28:59 +0200
parents
children 0741dc117808
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
22
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1 /*
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
2 * Ristipolku Game Engine
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
3 * (C) Copyright 2011 Matti 'ccr' Hämäläinen <ccr@tnsp.org>
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
4 */
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
5 package game;
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
6
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
7 import java.util.*;
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
8 import java.io.*;
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
9 import game.*;
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
10 import javax.sound.sampled.*;
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
11
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
12
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
13 class SoundElement implements Runnable
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
14 {
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
15 private final String name;
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
16
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
17 private AudioInputStream stream;
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
18 private AudioFormat format;
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
19 private SourceDataLine line;
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
20 private Thread playThread;
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
21 private int loopCount;
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
22 private boolean playing, streaming;
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
23 private int volume = 100;
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
24
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
25 byte[] buffer;
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
26 int length;
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
27
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
28
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
29 SoundElement(String filename, boolean streaming) throws IOException
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
30 {
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
31 this.name = filename;
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
32 this.streaming = streaming;
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
33
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
34 ResourceLoader res = new ResourceLoader(name);
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
35 if (res == null || res.getStream() == null)
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
36 {
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
37 throw new IOException("Could not load audio resource '"+name+"'.\n");
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
38 }
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
39
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
40
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
41 try {
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
42 stream = AudioSystem.getAudioInputStream(res.getStream());
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
43 format = stream.getFormat();
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
44 }
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
45 catch (UnsupportedAudioFileException e) {
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
46 throw new IOException("Unsupported audio file format for '"+name+"'.\n");
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
47 }
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
48 catch (IOException e)
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
49 {
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
50 throw new IOException("Could not load audio resource '"+name+"'.\n");
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
51 }
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
52
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
53
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
54 if (streaming) {
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
55 System.out.print("Loading '"+name+"' as a clip\n");
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
56 try {
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
57 clip = AudioSystem.getClip();
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
58 clip.open(stream);
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
59 }
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
60 catch (LineUnavailableException e)
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
61 {
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
62 throw new IOException("Line unavailable for '"+name+"'.\n");
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
63 }
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
64 finally {
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
65 stream.close();
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
66 }
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
67 }
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
68 else
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
69 {
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
70 clip = null;
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
71 System.out.print("Loading '"+name+"' as stream\n");
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
72
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
73 try {
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
74 SourceDataLine.Info info = new DataLine.Info(SourceDataLine.class, format);
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
75 System.out.print("info: "+stream.getFrameLength() + ", " + format.getFrameSize() + "\n");
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
76 line = (SourceDataLine) AudioSystem.getLine(info);
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
77 line.open(format);
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
78 }
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
79 catch (LineUnavailableException e) {
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
80 throw new IOException("Line unavailable for '"+name+"'.\n");
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
81 }
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
82 }
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
83 }
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
84
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
85 public void play()
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
86 {
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
87 System.out.print("Sound("+name+").play()\n");
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
88 if (streaming)
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
89 {
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
90 clip.setFramePosition(0);
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
91 clip.start();
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
92 }
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
93 else
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
94 {
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
95 if (playThread == null)
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
96 {
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
97 doPlay = true;
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
98 loopCount = 1;
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
99 playThread = new Thread(this);
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
100 playThread.start();
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
101 }
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
102 }
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
103 }
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
104
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
105 public void loop(int n)
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
106 {
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
107 System.out.print("Sound("+name+").loop("+n+")\n");
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
108 if (isClip())
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
109 {
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
110 clip.setFramePosition(0);
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
111 if (n < 0)
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
112 clip.loop(Clip.LOOP_CONTINUOUSLY);
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
113 else
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
114 clip.loop(n);
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
115 }
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
116 else
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
117 {
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
118 if (playThread == null)
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
119 {
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
120 doPlay = true;
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
121 loopCount = n;
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
122 playThread = new Thread(this);
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
123 playThread.start();
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
124 }
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
125 }
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
126 }
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
127
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
128 public void stop()
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
129 {
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
130 if (isClip())
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
131 {
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
132 if (clip.isRunning())
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
133 clip.stop();
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
134 }
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
135 else
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
136 {
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
137 if (playThread != null)
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
138 {
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
139 playThread.interrupt();
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
140 doPlay = false;
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
141 playThread = null;
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
142 }
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
143 }
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
144 }
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
145
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
146 public boolean isPlaying()
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
147 {
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
148 if (isClip())
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
149 return clip.isRunning();
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
150 else
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
151 return (playThread != null && line.isRunning());
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
152 }
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
153
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
154 public void run()
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
155 {
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
156 line.start();
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
157 byte[] buf = new byte[line.getBufferSize()];
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
158
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
159 while (doPlay && (loopCount > 0 || loopCount == -1))
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
160 {
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
161 try {
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
162 int numRead = 0;
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
163 while ((numRead = stream.read(buf, 0, buf.length)) >= 0 && doPlay)
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
164 {
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
165 int offset = 0;
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
166 while (offset < numRead)
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
167 {
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
168 System.out.print("audioThread: offs="+offset+", numread="+numRead+"\n");
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
169 offset += line.write(buf, offset, numRead - offset);
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
170 }
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
171 }
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
172 line.drain();
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
173
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
174 System.out.print("audioThread: stream.reset()\n");
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
175 stream.reset();
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
176 }
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
177 catch (IOException e) {
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
178 }
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
179
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
180 if (loopCount > 0)
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
181 loopCount--;
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
182 }
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
183
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
184 line.stop();
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
185 doPlay = false;
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
186 }
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
187 }
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
188
afde253ec705 More work.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
189