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 }