/* * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ import javax.sound.midi.MidiDevice; import javax.sound.midi.MidiSystem; import javax.sound.midi.MidiUnavailableException; import javax.sound.midi.Receiver; import javax.sound.midi.Sequencer; import javax.sound.midi.Synthesizer; import javax.sound.midi.Transmitter; /** * @test * @bug 4616517 * @summary Receiver.send() does not work properly. Tests open/close behaviour * of MidiDevices. For this test, it is essential that the MidiDevice * picked from the list of devices (MidiSystem.getMidiDeviceInfo()) is * the same as the one used by * MidiSystem.getReceiver()/getTransmitter(). To achieve this, default * provider properties for Receivers/Transmitters are used. */ public class OpenClose { private static boolean isTestExecuted; private static boolean isTestPassed; public static void main(String[] args) throws Exception { boolean failed = false; out("#4616517: Receiver.send() does not work properly"); if (!isMidiInstalled()) { out("Soundcard does not exist or sound drivers not installed!"); out("This test requires sound drivers for execution."); return; } MidiDevice.Info[] infos = MidiSystem.getMidiDeviceInfo(); MidiDevice outDevice = null; MidiDevice inDevice = null; for (int i = 0; i < infos.length; i++) { MidiDevice device = MidiSystem.getMidiDevice(infos[i]); if (! (device instanceof Synthesizer) && ! (device instanceof Sequencer)) { if (device.getMaxReceivers() != 0) { outDevice = device; } if (device.getMaxTransmitters() != 0) { inDevice = device; } } } if (outDevice != null) { // set the default provider properties System.setProperty(Receiver.class.getName(), "#" + outDevice.getDeviceInfo().getName()); } if (inDevice != null) { System.setProperty(Transmitter.class.getName(), "#" + inDevice.getDeviceInfo().getName()); } out("Using MIDI OUT Device: " + outDevice); out("Using MIDI IN Device: " + inDevice); isTestExecuted = false; if (outDevice != null) { isTestExecuted = true; TestHelper testHelper = new ReceiverTestHelper(outDevice); try { doTest("Receiver", testHelper); failed |= testHelper.hasFailed(); } catch (Exception e) { out("Exception occured, cannot test!"); isTestExecuted = false; } } if (inDevice != null) { isTestExecuted = true; TestHelper testHelper = new TransmitterTestHelper(inDevice); try { doTest("Transmitter", testHelper); failed |= testHelper.hasFailed(); } catch (Exception e) { out("Exception occured, cannot test!"); isTestExecuted = false; } } isTestPassed = ! failed; if (isTestExecuted) { if (isTestPassed) { out("Test PASSED."); } else { throw new Exception("Test FAILED."); } } else { out("Test NOT FAILED"); } } private static void doTest(String type, TestHelper testHelper) throws Exception { /* Case 1: - MidiDevice.open() - MidiDevice.close() */ out("checking " + type + " case 1..."); testHelper.checkClosed(); testHelper.openDevice(); testHelper.checkOpen(); testHelper.closeDevice(); testHelper.checkClosed(); out("...OK"); /* Case 2a: - MidiSystem.get[Receiver|Transmitter]() - [Receiver|Transmitter].close() */ out("checking " + type + " case 2a..."); testHelper.checkClosed(); testHelper.fetchObjectMidiSystem(); testHelper.checkOpen(); testHelper.closeObjectMidiSystem(); testHelper.checkClosed(); out("...OK"); /* Case 2b: - MidiDevice.get[Receiver|Transmitter]() - [Receiver|Transmitter].close() */ out("checking " + type + " case 2b..."); testHelper.checkClosed(); testHelper.fetchObjectDevice(); testHelper.checkClosed(); testHelper.closeObjectDevice(); testHelper.checkClosed(); out("...OK"); /* Case 3a: - MidiSystem.get[Receiver|Transmitter]() - MidiDevice.open() - MidiDevice.close() - [Receiver|Transmitter].close() */ out("checking " + type + " case 3a..."); testHelper.checkClosed(); testHelper.fetchObjectMidiSystem(); testHelper.checkOpen(); testHelper.openDevice(); testHelper.checkOpen(); testHelper.closeDevice(); testHelper.checkClosed(); testHelper.closeObjectMidiSystem(); testHelper.checkClosed(); out("...OK"); /* Case 3b: - MidiDevice.get[Receiver|Transmitter]() - MidiDevice.open() - MidiDevice.close() - [Receiver|Transmitter].close() */ out("checking " + type + " case 3b..."); testHelper.checkClosed(); testHelper.fetchObjectDevice(); testHelper.checkClosed(); testHelper.openDevice(); testHelper.checkOpen(); testHelper.closeDevice(); testHelper.checkClosed(); testHelper.closeObjectDevice(); testHelper.checkClosed(); out("...OK"); /* Case 4a: - MidiSystem.get[Receiver|Transmitter]() - MidiDevice.open() - [Receiver|Transmitter].close() - MidiDevice.close() */ out("checking " + type + " case 4a..."); testHelper.checkClosed(); testHelper.fetchObjectMidiSystem(); testHelper.checkOpen(); testHelper.openDevice(); testHelper.checkOpen(); testHelper.closeObjectMidiSystem(); testHelper.checkOpen(); testHelper.closeDevice(); testHelper.checkClosed(); out("...OK"); /* Case 4b: - MidiDevice.get[Receiver|Transmitter]() - MidiDevice.open() - [Receiver|Transmitter].close() - MidiDevice.close() */ out("checking " + type + " case 4b..."); testHelper.checkClosed(); testHelper.fetchObjectDevice(); testHelper.checkClosed(); testHelper.openDevice(); testHelper.checkOpen(); testHelper.closeObjectDevice(); testHelper.checkOpen(); testHelper.closeDevice(); testHelper.checkClosed(); out("...OK"); /* Case 5a: - MidiDevice.open() - MidiSystem.get[Receiver|Transmitter]() - MidiDevice.close() - [Receiver|Transmitter].close() */ out("checking " + type + " case 5a..."); testHelper.checkClosed(); testHelper.openDevice(); testHelper.checkOpen(); testHelper.fetchObjectMidiSystem(); testHelper.checkOpen(); testHelper.closeDevice(); testHelper.checkClosed(); testHelper.closeObjectMidiSystem(); testHelper.checkClosed(); out("...OK"); /* Case 5b: - MidiDevice.open() - MidiDevice.get[Receiver|Transmitter]() - MidiDevice.close() - [Receiver|Transmitter].close() */ out("checking " + type + " case 5b..."); testHelper.checkClosed(); testHelper.openDevice(); testHelper.checkOpen(); testHelper.fetchObjectDevice(); testHelper.checkOpen(); testHelper.closeDevice(); testHelper.checkClosed(); testHelper.closeObjectDevice(); testHelper.checkClosed(); out("...OK"); /* Case 6a: - MidiDevice.open() - MidiSystem.get[Receiver|Transmitter]() - [Receiver|Transmitter].close() - MidiDevice.close() */ out("checking " + type + " case 6a..."); testHelper.checkClosed(); testHelper.openDevice(); testHelper.checkOpen(); testHelper.fetchObjectMidiSystem(); testHelper.checkOpen(); testHelper.closeObjectMidiSystem(); testHelper.checkOpen(); testHelper.closeDevice(); testHelper.checkClosed(); out("...OK"); /* Case 6b: - MidiDevice.open() - MidiDevice.get[Receiver|Transmitter]() - [Receiver|Transmitter].close() - MidiDevice.close() */ out("checking " + type + " case 6b..."); testHelper.checkClosed(); testHelper.openDevice(); testHelper.checkOpen(); testHelper.fetchObjectDevice(); testHelper.checkOpen(); testHelper.closeObjectDevice(); testHelper.checkOpen(); testHelper.closeDevice(); testHelper.checkClosed(); out("...OK"); /* Case 7: - MidiSystem.get[Receiver|Transmitter]() // 1 - MidiDevice.get[Receiver|Transmitter]() // 2 - [Receiver|Transmitter].close() // 2 - [Receiver|Transmitter].close() // 1 */ out("checking " + type + " case 7..."); testHelper.checkClosed(); testHelper.fetchObjectMidiSystem(); testHelper.checkOpen(); testHelper.fetchObjectDevice(); testHelper.checkOpen(); testHelper.closeObjectDevice(); testHelper.checkOpen(); testHelper.closeObjectMidiSystem(); testHelper.checkClosed(); out("...OK"); /* Case 8: - MidiSystem.get[Receiver|Transmitter]() // 1 - MidiDevice.get[Receiver|Transmitter]() // 2 - [Receiver|Transmitter].close() // 1 - [Receiver|Transmitter].close() // 2 */ out("checking " + type + " case 8..."); testHelper.checkClosed(); testHelper.fetchObjectMidiSystem(); testHelper.checkOpen(); testHelper.fetchObjectDevice(); testHelper.checkOpen(); testHelper.closeObjectMidiSystem(); testHelper.checkClosed(); testHelper.closeObjectDevice(); testHelper.checkClosed(); out("...OK"); /* Case 9: - MidiDevice.get[Receiver|Transmitter]() // 2 - MidiSystem.get[Receiver|Transmitter]() // 1 - [Receiver|Transmitter].close() // 2 - [Receiver|Transmitter].close() // 1 */ out("checking " + type + " case 9..."); testHelper.checkClosed(); testHelper.fetchObjectDevice(); testHelper.checkClosed(); testHelper.fetchObjectMidiSystem(); testHelper.checkOpen(); testHelper.closeObjectDevice(); testHelper.checkOpen(); testHelper.closeObjectMidiSystem(); testHelper.checkClosed(); out("...OK"); /* Case 10: - MidiDevice.get[Receiver|Transmitter]() // 2 - MidiSystem.get[Receiver|Transmitter]() // 1 - [Receiver|Transmitter].close() // 1 - [Receiver|Transmitter].close() // 2 */ out("checking " + type + " case 10..."); testHelper.checkClosed(); testHelper.fetchObjectDevice(); testHelper.checkClosed(); testHelper.fetchObjectMidiSystem(); testHelper.checkOpen(); testHelper.closeObjectMidiSystem(); testHelper.checkClosed(); testHelper.closeObjectDevice(); testHelper.checkClosed(); out("...OK"); /* Case N - 1: - 10 x MidiSystem.get[Receiver|Transmitter]() - 10 x [Receiver|Transmitter].close() */ out("checking " + type + " case N - 1..."); TestHelper[] testHelpers = new TestHelper[10]; for (int i = 0; i < 10; i++) { testHelpers[i] = (TestHelper) testHelper.clone(); } testHelper.checkClosed(); for (int i = 0; i < 10; i++) { testHelpers[i].fetchObjectMidiSystem(); testHelper.checkOpen(); } for (int i = 0; i < 9; i++) { testHelpers[i].closeObjectMidiSystem(); testHelper.checkOpen(); } testHelpers[9].closeObjectMidiSystem(); testHelper.checkClosed(); out("...OK"); } private static void out(String message) { System.out.println(message); } private static abstract class TestHelper implements Cloneable { private MidiDevice device; private boolean failed; protected TestHelper(MidiDevice device) { this.device = device; failed = false; } protected MidiDevice getDevice() { return device; } public boolean hasFailed() { return failed; } public void openDevice() throws MidiUnavailableException { getDevice().open(); } public void closeDevice() { getDevice().close(); } public void checkOpen(){ checkOpen(getDevice(), true); } public void checkClosed(){ checkOpen(getDevice(), false); } private void checkOpen(MidiDevice device, boolean desiredState) { if (device.isOpen() != desiredState) { out("device should be " + getStateString(desiredState) + ", but isn't!"); failed = true; } } private String getStateString(boolean state) { return state ? "open" : "closed"; } public abstract void fetchObjectMidiSystem() throws MidiUnavailableException; public abstract void fetchObjectDevice() throws MidiUnavailableException; public abstract void closeObjectMidiSystem(); public abstract void closeObjectDevice(); public Object clone() { try { return super.clone(); } catch (CloneNotSupportedException e) { return null; } } } private static class ReceiverTestHelper extends TestHelper { private Receiver receiverMidiSystem; private Receiver receiverDevice; public ReceiverTestHelper(MidiDevice device) { super(device); } public void fetchObjectMidiSystem() throws MidiUnavailableException { receiverMidiSystem = MidiSystem.getReceiver(); } public void fetchObjectDevice() throws MidiUnavailableException { receiverDevice = getDevice().getReceiver(); } public void closeObjectMidiSystem() { receiverMidiSystem.close(); } public void closeObjectDevice() { receiverDevice.close(); } } private static class TransmitterTestHelper extends TestHelper { private Transmitter transmitterMidiSystem; private Transmitter transmitterDevice; public TransmitterTestHelper(MidiDevice device) { super(device); } public void fetchObjectMidiSystem() throws MidiUnavailableException { transmitterMidiSystem = MidiSystem.getTransmitter(); } public void fetchObjectDevice() throws MidiUnavailableException { transmitterDevice = getDevice().getTransmitter(); } public void closeObjectMidiSystem() { transmitterMidiSystem.close(); } public void closeObjectDevice() { transmitterDevice.close(); } } /** * Returns true if at least one MIDI (port) device is correctly installed on * the system. */ public static boolean isMidiInstalled() { boolean result = false; MidiDevice.Info[] devices = MidiSystem.getMidiDeviceInfo(); for (int i = 0; i < devices.length; i++) { try { MidiDevice device = MidiSystem.getMidiDevice(devices[i]); result = ! (device instanceof Sequencer) && ! (device instanceof Synthesizer); } catch (Exception e1) { System.err.println(e1); } if (result) break; } return result; } }