1/*
2 * Copyright (c) 2006, 2016, Oracle and/or its affiliates. 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.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24import java.io.IOException;
25import java.util.Iterator;
26import java.util.List;
27
28import javax.sound.midi.MidiDevice;
29import javax.sound.midi.MidiSystem;
30import javax.sound.midi.MidiUnavailableException;
31import javax.sound.midi.Receiver;
32import javax.sound.midi.Sequencer;
33import javax.sound.midi.Synthesizer;
34import javax.sound.midi.Transmitter;
35
36/**
37 * This test should be run on specific environment (solaris or linux w/o
38 * audio card installed).
39 */
40public class bug6411624 {
41
42    public static void main(String args[]) throws Exception {
43        log("This test should only be run on solaris or linux system");
44        log("without audio card installed (to test on SunRay set");
45        log("incorrect $AUDIODEV value).");
46        readln();
47
48        boolean testRecv = false;
49        boolean testTrans = false;
50        boolean testSeq = true;
51
52        // print add info (midi device list)
53        try {
54            MidiDevice.Info[] midis = MidiSystem.getMidiDeviceInfo();
55            log("MidiDevices (total " + midis.length + "):");
56            for (int i=0; i<midis.length; i++) {
57                log("" + i + ": " + midis[i].toString());
58//                MidiDevice dev = MidiSystem.getMidiDevice(midis[i]);
59//                log("    device: " + dev);
60            }
61        } catch (Exception ex) {
62            log("!!!EXCEPTION:");
63            ex.printStackTrace();
64        }
65
66        log("");
67        log("getting default receiver...");
68        try {
69            Receiver rec = MidiSystem.getReceiver();
70            log(" - OK: " + rec);
71            testRecv = checkDevice(rec);
72            rec.close();
73        } catch (MidiUnavailableException e) {
74            log("MidiUnavailableException has been thrown - OK");
75            testRecv = true;
76        }
77
78
79        log("");
80        log("getting default transmitter...");
81        try {
82            Transmitter trans = MidiSystem.getTransmitter();
83            log(" - OK: " + trans);
84            testTrans = checkDevice(trans);
85            trans.close();
86        } catch (MidiUnavailableException e) {
87            log("MidiUnavailableException has been thrown - OK");
88            testTrans = true;
89        }
90
91
92        // print default synthesizer
93        log("");
94        log("getting default synth...");
95        try {
96            Synthesizer synth = MidiSystem.getSynthesizer();
97            log(" - OK: " + synth);
98            synth.close();
99        } catch (MidiUnavailableException e) {
100            log("MidiUnavailableException has been thrown - OK:");
101            e.printStackTrace();
102        }
103
104
105        log("");
106        log("getting default sequencer (connected)...");
107        try {
108            Sequencer seq = MidiSystem.getSequencer();
109            log("OK: " + seq);
110
111            // check that returned sequencer doesn't connected to another sequencer
112            log("  receivers:");
113            log("    max=" + seq.getMaxReceivers());
114            List<Receiver> recvList = seq.getReceivers();
115            log("    count=" + recvList.size());
116            Iterator<Receiver> recvIter = recvList.iterator();
117            int i = 0;
118            while (recvIter.hasNext()) {
119                Receiver recv = recvIter.next();
120                log("    " + (++i) + ": " + recv);
121            }
122
123            log("  transmitters:");
124            log("    max=" + seq.getMaxTransmitters());
125            List<Transmitter> transList = seq.getTransmitters();
126            log("    count=" + transList.size());
127            Iterator<Transmitter> transIter = transList.iterator();
128            i = 0;
129            while (transIter.hasNext()) {
130                Transmitter trans = transIter.next();
131                log("    " + (++i) + ": " + trans);
132                Receiver recv = trans.getReceiver();
133                log("      recv: " + recv);
134                if (!checkDevice(recv))
135                    testSeq = false;
136            }
137
138            log("opening sequencer...");
139            seq.open();
140            log("OK.");
141
142            log("closing...");
143            seq.close();
144            log("OK.");
145        } catch (MidiUnavailableException e) {
146            log("MidiUnavailableException has been thrown - OK:");
147            e.printStackTrace();
148        }
149
150
151        // debug testing - non-connected sequencer
152        log("");
153        log("getting default sequencer (non-connected)...");
154        try {
155            Sequencer seq = MidiSystem.getSequencer(false);
156            log("OK: " + seq);
157
158            log("  receivers:");
159            log("    max=" + seq.getMaxReceivers());
160            List<Receiver> recvList = seq.getReceivers();
161            log("    count=" + recvList.size());
162            Iterator<Receiver> recvIter = recvList.iterator();
163            int i = 0;
164            while (recvIter.hasNext()) {
165                Receiver recv = recvIter.next();
166                log("    " + (++i) + ": " + recv);
167            }
168
169            log("  transmitters:");
170            log("    max=" + seq.getMaxTransmitters());
171            List<Transmitter> transList = seq.getTransmitters();
172            log("    count=" + transList.size());
173            Iterator<Transmitter> transIter = transList.iterator();
174            i = 0;
175            while (transIter.hasNext()) {
176                Transmitter trans = transIter.next();
177                log("    " + (++i) + ": " + trans);
178                Receiver recv = trans.getReceiver();
179                log("      recv: " + recv);
180            }
181            seq.close();
182        } catch (MidiUnavailableException e) {
183            log("MidiUnavailableException has been thrown (shouln't?):");
184            e.printStackTrace();
185        }
186
187        log("");
188        log("Test result:");
189        // print results
190        if (testRecv && testTrans && testSeq) {
191            log("  All tests sucessfully passed.");
192        } else {
193            log("  Some tests failed:");
194            log("    receiver test:    " + (testRecv ? "OK" : "FAILED"));
195            log("    transmitter test: " + (testTrans ? "OK" : "FAILED"));
196            log("    sequencer test:   " + (testSeq ? "OK" : "FAILED"));
197        }
198        log("\n\n\n");
199    }
200
201    // check that device is not sequencer
202    static boolean checkDevice(Object dev) {
203        String className = dev.getClass().toString().toLowerCase();
204        boolean result = (className.indexOf("sequencer") < 0);
205        if (!result)
206            log("ERROR: inapropriate device");
207        return result;
208    }
209
210    // helper routines
211    static long startTime = currentTimeMillis();
212    static long currentTimeMillis() {
213        //return System.nanoTime() / 1000000L;
214        return System.currentTimeMillis();
215    }
216    static void log(String s) {
217        long time = currentTimeMillis() - startTime;
218        long ms = time % 1000;
219        time /= 1000;
220        long sec = time % 60;
221        time /= 60;
222        long min = time % 60;
223        time /= 60;
224        System.out.println(""
225                + (time < 10 ? "0" : "") + time
226                + ":" + (min < 10 ? "0" : "") + min
227                + ":" + (sec < 10 ? "0" : "") + sec
228                + "." + (ms < 10 ? "00" : (ms < 100 ? "0" : "")) + ms
229                + " (" + Thread.currentThread().getName() + ") " + s);
230    }
231    static void delay(int millis) {
232        try {
233            Thread.sleep(millis);
234        } catch (InterruptedException e) {}
235    }
236    static void readln() {
237        log("");
238        log("Press ENTER to continue...");
239        try {
240            while (System.in.read() != 10) ;
241        } catch (IOException e) { }
242        log("");
243    }
244}
245