1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package javax.microedition.media;
21
22 import java.io.IOException;
23 import java.io.InputStream;
24 import java.util.Iterator;
25 import java.util.Vector;
26
27 import javax.sound.midi.InvalidMidiDataException;
28 import javax.sound.midi.MetaEventListener;
29 import javax.sound.midi.MetaMessage;
30 import javax.sound.midi.MidiSystem;
31 import javax.sound.midi.MidiUnavailableException;
32 import javax.sound.midi.Receiver;
33 import javax.sound.midi.Sequence;
34 import javax.sound.midi.Sequencer;
35 import javax.sound.midi.Synthesizer;
36 import javax.sound.midi.Transmitter;
37
38 class MidiAudioPlayer implements Player, MetaEventListener
39 {
40 private Sequence sequence = null;
41 private Sequencer sequencer = null;
42 private Vector vListeners = null;
43 private int iLoopCount = 1;
44
45 public boolean open( InputStream stream, String type )
46 {
47 try
48 {
49
50
51 sequencer = MidiSystem.getSequencer( );
52 sequencer.open();
53
54 Synthesizer synth = MidiSystem.getSynthesizer( );
55 synth.open( );
56
57
58 Transmitter transmitter = sequencer.getTransmitter( );
59 Receiver receiver = synth.getReceiver( );
60 transmitter.setReceiver(receiver);
61
62 sequence = MidiSystem.getSequence( stream );
63 sequencer.setSequence(sequence);
64 }
65 catch( IOException e ){ e.printStackTrace(); }
66 catch( MidiUnavailableException e ){ e.printStackTrace(); }
67 catch( InvalidMidiDataException e ){ e.printStackTrace(); }
68 return false;
69 }
70
71 protected void dispose()
72 {
73 close();
74 }
75
76 public void addPlayerListener(PlayerListener playerListener)
77 {
78 if( vListeners == null )
79 vListeners = new Vector();
80 vListeners.add( playerListener );
81 }
82
83 public void close()
84 {
85 Manager.mediaDone( this );
86 if( sequencer != null )
87 sequencer.close();
88 }
89
90 public void deallocate() {
91 }
92
93 public String getContentType() {
94 return "audio/midi";
95 }
96
97 public long getDuration() {
98 return 0;
99 }
100
101 public long getMediaTime()
102 {
103 if( sequencer != null )
104 return sequencer.getMicrosecondPosition();
105 return 0;
106 }
107
108 public int getState() {
109
110 return 0;
111 }
112
113 public void prefetch() throws MediaException {
114
115
116 }
117
118 public void realize() throws MediaException {
119
120
121 }
122
123 public void removePlayerListener(PlayerListener playerListener)
124 {
125 if( vListeners == null )
126 return;
127 for( Iterator it = vListeners.iterator (); it.hasNext (); )
128 {
129 PlayerListener listener = (PlayerListener) it.next ();
130 if( listener == playerListener )
131 {
132 vListeners.remove( listener );
133 break;
134 }
135 }
136 }
137
138 public void setLoopCount(int count)
139 {
140 iLoopCount = count;
141 }
142
143 public long setMediaTime(long now) throws MediaException {
144 if( sequencer != null )
145 sequencer.setMicrosecondPosition( now );
146 return now;
147 }
148
149 public void start() throws MediaException {
150 if( sequencer != null )
151 {
152 sequencer.addMetaEventListener( this );
153 sequencer.start();
154 }
155 }
156
157 public void stop() throws MediaException {
158 if( sequencer != null )
159 sequencer.stop();
160 }
161
162 public Control getControl(String controlType) {
163
164 return null;
165 }
166
167 public Control[] getControls() {
168
169 return null;
170 }
171
172 public void meta( MetaMessage event )
173 {
174 if (event.getType() == 47)
175 {
176 iLoopCount--;
177 if( iLoopCount > 0 )
178 {
179 sequencer.setMicrosecondPosition( 0 );
180 try{ start(); }
181 catch( MediaException e ) { e.printStackTrace(); }
182 }
183 else
184 {
185 close();
186 if( vListeners != null )
187 {
188 for( Iterator it = vListeners.iterator (); it.hasNext (); )
189 {
190 PlayerListener listener = (PlayerListener) it.next ();
191 listener.playerUpdate( this, PlayerListener.END_OF_MEDIA, null );
192 }
193 }
194 }
195 }
196 }
197
198 }