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
24 import javax.sound.midi.Instrument;
25 import javax.sound.midi.MidiSystem;
26 import javax.sound.midi.Soundbank;
27 import javax.sound.midi.Synthesizer;
28
29 /**
30 * @test
31 * @bug 4685396
32 * @summary Tests that Synthesizer.remapInstrument works
33 * @run main bug4685396
34 * @key headful
35 */
36 public class bug4685396 {
37
38 static Synthesizer synth = null;
39
40 public static boolean isInstrumentExist(Instrument inst, Instrument[] insts) {
41 for (int i = 0; i < insts.length; i++) {
42 if (inst.equals(insts[i]))
43 return true;
44 }
45 return false;
46 }
47
48 static boolean test(
49 boolean reloadInstr, // reload all instruments?
50 boolean unloadFrom, // unload "from" instrument?
51 boolean unloadTo // unload "to" instrument?
52 ) throws Exception
53 {
54 log("Starting test: reloadInstr=" + reloadInstr
55 + ", unloadFrom=" + unloadFrom
56 + ", unloadTo=" + unloadTo
57 + "");
58
59 log(" creating synthesizer...");
60 synth = MidiSystem.getSynthesizer();
61 log(" opening synthesizer...");
62 synth.open();
63
64 Soundbank sbank = synth.getDefaultSoundbank();
65 if (sbank == null)
66 throw new RuntimeException("ERROR: Could not get default soundbank");
67
68 if (reloadInstr) {
69 synth.unloadAllInstruments(sbank);
70 synth.loadAllInstruments(sbank);
71 }
72
73 Instrument[] instrs = synth.getLoadedInstruments();
74
75 log(" " + instrs.length + " instruments loaded.");
76
77 if (instrs.length < 2)
78 throw new RuntimeException("ERROR: need at least 2 loaded instruments");
79
80 Instrument from = instrs[0];
81 Instrument to = instrs[instrs.length - 1];
82
83 if (unloadFrom)
84 synth.unloadInstrument(from);
85 if (unloadTo)
86 synth.unloadInstrument(to);
87
88 log(" from instrument (" + (unloadFrom ? "UNLOADED" : "LOADED")
89 + "): " + from.toString());
90 log(" to instrument (" + (unloadTo ? "UNLOADED" : "LOADED")
91 + "): " + to.toString());
92
93 boolean result = false;
94 boolean excepted = false;
95 try {
96 result = synth.remapInstrument(from, to);
97 log(" remapInstrument(from, to) returns " + result);
98 } catch (IllegalArgumentException ex) {
99 excepted = true;
100 log(" EXCEPTION:");
101 ex.printStackTrace(System.out);
102 }
103
104 instrs = synth.getLoadedInstruments();
105 log(" " + instrs.length + " instruments remains loaded.");
106
107 boolean toUnloaded = !isInstrumentExist(to, instrs);
108 boolean fromUnloaded = !isInstrumentExist(from, instrs);
109
110 log(" from instrument is " + (fromUnloaded ? "UNLOADED" : "LOADED"));
111 log(" to instrument is " + (toUnloaded ? "UNLOADED" : "LOADED"));
112
113 boolean bOK = true;
114 if (result) {
115 if (unloadTo) {
116 bOK = false;
117 log("ERROR: unloaded to, but sucessfull remap");
118 }
119 if (!fromUnloaded) {
120 bOK = false;
121 log("ERROR: sucessfull remap, but from hasn't been unloaded");
122 }
123 if (toUnloaded) {
124 bOK = false;
125 log("ERROR: to has been unloaded!");
126 }
127 } else {
128 if (!excepted) {
129 bOK = false;
130 log("ERROR: remap returns false, exception hasn't been thrown");
131 }
132 if (!unloadTo) {
133 bOK = false;
134 log("ERROR: to is loaded, but remap returns false");
135 }
136 if (unloadFrom != fromUnloaded) {
137 bOK = false;
138 log("ERROR: remap returns false, but status of from has been changed");
139 }
140 }
141
142 if (bOK) {
143 log("Test result: OK\n");
144 } else {
145 log("Test result: FAIL\n");
146 }
147
148 return bOK;
149 }
150
151 static void cleanup() {
152 if (synth != null) {
153 synth.close();
154 synth = null;
155 }
156 }
157
158 static boolean runTest(
159 boolean reloadInstr, // reload all instruments?
160 boolean unloadTo, // unload "to" instrument?
161 boolean unloadFrom // unload "from" instrument?
162 )
163 {
164 boolean success = false;
165 try {
166 success = test(reloadInstr, unloadFrom, unloadTo);
167 } catch (Exception ex) {
168 log("Exception: " + ex.toString());
169 }
170 cleanup();
171 return success;
172 }
173
174 public static void main(String args[]) throws Exception {
175 boolean failed = false;
176 if (!runTest(true, false, false))
177 failed = true;
178 if (!runTest(true, false, true))
179 failed = true;
180 if (!runTest(true, true, false))
181 failed = true;
182 if (!runTest(true, true, true))
183 failed = true;
184
185 if (failed) {
186 throw new RuntimeException("Test FAILED.");
187 }
188 log("Test sucessfully passed.");
189 }
190
191
192 // helper routines
193 static long startTime = currentTimeMillis();
194 static long currentTimeMillis() {
195 //return System.nanoTime() / 1000000L;
196 return System.currentTimeMillis();
197 }
198 static void log(String s) {
199 long time = currentTimeMillis() - startTime;
200 long ms = time % 1000;
201 time /= 1000;
202 long sec = time % 60;
203 time /= 60;
204 long min = time % 60;
205 time /= 60;
206 System.out.println(""
207 + (time < 10 ? "0" : "") + time
208 + ":" + (min < 10 ? "0" : "") + min
209 + ":" + (sec < 10 ? "0" : "") + sec
210 + "." + (ms < 10 ? "00" : (ms < 100 ? "0" : "")) + ms
211 + " (" + Thread.currentThread().getName() + ") " + s);
212 }
213 static void delay(int millis) {
214 try {
215 Thread.sleep(millis);
216 } catch (InterruptedException e) {}
217 }
218 }