1 7 8 package javax.sound.midi; 9 10 import java.util.Vector ; 11 import java.util.ArrayList ; 12 import java.util.HashSet ; 13 import com.sun.media.sound.MidiUtils; 14 15 47 public class Track { 48 49 51 private ArrayList eventsList = new ArrayList (); 53 54 private HashSet set = new HashSet (); 56 57 private MidiEvent eotEvent; 58 59 60 64 Track() { 65 MetaMessage eot = new ImmutableEndOfTrack(); 67 eotEvent = new MidiEvent (eot, 0); 68 eventsList.add(eotEvent); 69 set.add(eotEvent); 70 } 71 72 82 public boolean add(MidiEvent event) { 83 if (event == null) { 84 return false; 85 } 86 synchronized(eventsList) { 87 88 if (!set.contains(event)) { 89 int eventsCount = eventsList.size(); 90 91 MidiEvent lastEvent = null; 93 if (eventsCount > 0) { 94 lastEvent = (MidiEvent ) eventsList.get(eventsCount - 1); 95 } 96 if (lastEvent != eotEvent) { 98 if (lastEvent != null) { 100 eotEvent.setTick(lastEvent.getTick()); 102 } else { 103 eotEvent.setTick(0); 105 } 106 eventsList.add(eotEvent); 109 set.add(eotEvent); 110 } 111 112 if (MidiUtils.isMetaEndOfTrack(event.getMessage())) { 115 if (event.getTick() > eotEvent.getTick()) { 121 eotEvent.setTick(event.getTick()); 122 } 123 return true; 124 } 125 126 set.add(event); 128 129 int i = eventsCount; 132 for ( ; i > 0; i--) { 133 if (event.getTick() >= ((MidiEvent )eventsList.get(i-1)).getTick()) { 134 break; 135 } 136 } 137 if (i == eventsCount) { 138 143 eventsList.set(eventsCount - 1, event); 145 if (eotEvent.getTick() < event.getTick()) { 147 eotEvent.setTick(event.getTick()); 148 } 149 eventsList.add(eotEvent); 151 } else { 152 eventsList.add(i, event); 153 } 154 return true; 155 } 156 } 157 158 return false; 159 } 160 161 162 168 public boolean remove(MidiEvent event) { 169 170 176 synchronized(eventsList) { 181 if (set.remove(event)) { 182 int i = eventsList.indexOf(event); 183 if (i >= 0) { 184 eventsList.remove(i); 185 return true; 186 } 187 } 188 } 189 return false; 190 } 191 192 193 201 public MidiEvent get(int index) throws ArrayIndexOutOfBoundsException { 202 try { 203 synchronized(eventsList) { 204 return (MidiEvent )eventsList.get(index); 205 } 206 } catch (IndexOutOfBoundsException ioobe) { 207 throw new ArrayIndexOutOfBoundsException (ioobe.getMessage()); 208 } 209 } 210 211 212 216 public int size() { 217 synchronized(eventsList) { 218 return eventsList.size(); 219 } 220 } 221 222 223 233 public long ticks() { 234 long ret = 0; 235 synchronized (eventsList) { 236 if (eventsList.size() > 0) { 237 ret = ((MidiEvent )eventsList.get(eventsList.size() - 1)).getTick(); 238 } 239 } 240 return ret; 241 } 242 243 private static class ImmutableEndOfTrack extends MetaMessage { 244 private ImmutableEndOfTrack() { 245 super(new byte[3]); 246 data[0] = (byte) META; 247 data[1] = MidiUtils.META_END_OF_TRACK_TYPE; 248 data[2] = 0; 249 } 250 251 public void setMessage(int type, byte[] data, int length) throws InvalidMidiDataException { 252 throw new InvalidMidiDataException ("cannot modify end of track message"); 253 } 254 } 255 256 } 257 | Popular Tags |