blob: 68e72ca59369b74aac3ae38d3d627b44dd70b646 [file] [log] [blame]
J. Duke319a3b92007-12-01 00:00:00 +00001/*
2 * Copyright 1999-2003 Sun Microsystems, Inc. All Rights Reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Sun designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Sun in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
22 * CA 95054 USA or visit www.sun.com if you need additional information or
23 * have any questions.
24 */
25
26package javax.sound.sampled;
27
28/**
29 * The <code>LineEvent</code> class encapsulates information that a line
30 * sends its listeners whenever the line opens, closes, starts, or stops.
31 * Each of these four state changes is represented by a corresponding
32 * type of event. A listener receives the event as a parameter to its
33 * {@link LineListener#update update} method. By querying the event,
34 * the listener can learn the type of event, the line responsible for
35 * the event, and how much data the line had processed when the event occurred.
36 *
37 * <p>Although this class implements Serializable, attempts to
38 * serialize a <code>LineEvent</code> object will fail.
39 *
40 * @author Kara Kytle
41 *
42 * @see Line
43 * @see LineListener#update
44 * @since 1.3
45 *
46 * @serial exclude
47 */
48public class LineEvent extends java.util.EventObject {
49
50 // INSTANCE VARIABLES
51
52 /**
53 * The kind of line event (<code>OPEN</code>, <code>CLOSE</code>,
54 * <code>START</code>, or <code>STOP</code>).
55 * @see #getType
56 * @serial
57 */
58 private final Type type;
59
60 /**
61 * The media position when the event occurred, expressed in sample frames.
62 * Note that this field is only relevant to certain events generated by
63 * data lines, such as <code>START</code> and <code>STOP</code>. For
64 * events generated by lines that do not count sample frames, and for any
65 * other events for which this value is not known, the position value
66 * should be {@link AudioSystem#NOT_SPECIFIED}.
67 * @serial
68 * @see #getFramePosition
69 */
70 private final long position;
71
72
73 /**
74 * Constructs a new event of the specified type, originating from the specified line.
75 * @param line the source of this event
76 * @param type the event type (<code>OPEN</code>, <code>CLOSE</code>, <code>START</code>, or <code>STOP</code>)
77 * @param position the number of sample frames that the line had already processed when the event occurred,
78 * or {@link AudioSystem#NOT_SPECIFIED}
79 *
80 * @throws IllegalArgumentException if <code>line</code> is
81 * <code>null</code>.
82 */
83 public LineEvent(Line line, Type type, long position) {
84
85 super(line);
86 this.type = type;
87 this.position = position;
88 }
89
90 /**
91 * Obtains the audio line that is the source of this event.
92 * @return the line responsible for this event
93 */
94 public final Line getLine() {
95
96 return (Line)getSource();
97 }
98
99
100 /**
101 * Obtains the event's type.
102 * @return this event's type ({@link Type#OPEN}, {@link Type#CLOSE},
103 * {@link Type#START}, or {@link Type#STOP})
104 */
105 public final Type getType() {
106
107 return type;
108 }
109
110 /**
111 * Obtains the position in the line's audio data when the event occurred, expressed in sample frames.
112 * For example, if a source line had already played back 14 sample frames at the time it was
113 * paused, the pause event would report the line's position as 14. The next frame to be processed
114 * would be frame number 14 using zero-based numbering, or 15 using one-based numbering.
115 * <p>
116 * Note that this field is relevant only to certain events generated by
117 * data lines, such as <code>START</code> and <code>STOP</code>. For
118 * events generated by lines that do not count sample frames, and for any
119 * other events for which this value is not known, the position value
120 * should be {@link AudioSystem#NOT_SPECIFIED}.
121 *
122 * @return the line's position as a sample frame number
123 */
124 /*
125 * $$kk: 04.20.99: note to myself: should make sure our implementation is consistent with this.
126 * which is a reasonable definition....
127 */
128 public final long getFramePosition() {
129
130 return position;
131 }
132
133 /**
134 * Obtains a string representation of the event. The contents of the string may vary
135 * between implementations of Java Sound.
136 * @return a string describing the event.
137 */
138 public String toString() {
139 String sType = "";
140 if (type != null) sType = type.toString()+" ";
141 String sLine;
142 if (getLine() == null) {
143 sLine = "null";
144 } else {
145 sLine = getLine().toString();
146 }
147 return new String(sType + "event from line " + sLine);
148 }
149
150
151 /**
152 * The LineEvent.Type inner class identifies what kind of event occurred on a line.
153 * Static instances are provided for the common types (OPEN, CLOSE, START, and STOP).
154 *
155 * @see LineEvent#getType()
156 */
157 public static class Type {
158
159
160 /**
161 * Type name.
162 */
163 // $$kk: 03.25.99: why can't this be final??
164 private /*final*/ String name;
165
166 /**
167 * Constructs a new event type.
168 * @param name name of the type
169 */
170 protected Type(String name) {
171 this.name = name;
172 }
173
174
175 //$$fb 2002-11-26: fix for 4695001: SPEC: description of equals() method contains typo
176 /**
177 * Indicates whether the specified object is equal to this event type,
178 * returning <code>true</code> if the objects are identical.
179 * @param obj the reference object with which to compare
180 * @return <code>true</code> if this event type is the same as
181 * <code>obj</code>; <code>false</code> otherwise
182 */
183 public final boolean equals(Object obj) {
184 return super.equals(obj);
185 }
186
187
188 /**
189 * Finalizes the hashcode method.
190 */
191 public final int hashCode() {
192 return super.hashCode();
193 }
194
195
196 /**
197 * Returns the type name as the string representation.
198 */
199 public String toString() {
200 return name;
201 }
202
203
204 // LINE EVENT TYPE DEFINES
205
206 /**
207 * A type of event that is sent when a line opens, reserving system
208 * resources for itself.
209 * @see #CLOSE
210 * @see Line#open
211 */
212 public static final Type OPEN = new Type("Open");
213
214
215 /**
216 * A type of event that is sent when a line closes, freeing the system
217 * resources it had obtained when it was opened.
218 * @see #OPEN
219 * @see Line#close
220 */
221 public static final Type CLOSE = new Type("Close");
222
223
224 /**
225 * A type of event that is sent when a line begins to engage in active
226 * input or output of audio data in response to a
227 * {@link DataLine#start start} request.
228 * @see #STOP
229 * @see DataLine#start
230 */
231 public static final Type START = new Type("Start");
232
233
234 /**
235 * A type of event that is sent when a line ceases active input or output
236 * of audio data in response to a {@link DataLine#stop stop} request,
237 * or because the end of media has been reached.
238 * @see #START
239 * @see DataLine#stop
240 */
241 public static final Type STOP = new Type("Stop");
242
243
244 /**
245 * A type of event that is sent when a line ceases to engage in active
246 * input or output of audio data because the end of media has been reached.
247 */
248 /*
249 * ISSUE: we may want to get rid of this. Is JavaSound
250 * responsible for reporting this??
251 *
252 * [If it's decided to keep this API, the docs will need to be updated to include mention
253 * of EOM events elsewhere.]
254 */
255 //public static final Type EOM = new Type("EOM");
256
257
258 /**
259 * A type of event that is sent when a line begins to engage in active
260 * input or output of audio data. Examples of when this happens are
261 * when a source line begins or resumes writing data to its mixer, and
262 * when a target line begins or resumes reading data from its mixer.
263 * @see #STOP
264 * @see SourceDataLine#write
265 * @see TargetDataLine#read
266 * @see DataLine#start
267 */
268 //public static final Type ACTIVE = new Type("ACTIVE");
269
270
271 /**
272 * A type of event that is sent when a line ceases active input or output
273 * of audio data.
274 * @see #START
275 * @see DataLine#stop
276 */
277 //public static final Type INACTIVE = new Type("INACTIVE");
278
279 } // class Type
280
281} // class LineEvent