3631N/A/**
3631N/A * @test
3631N/A * @bug 6660470
3631N/A * @summary Tests that sequencer correctly opens/closes (implicitly) devices
3631N/A * @author Alex Menkov
3631N/A */
3631N/A
3631N/Aimport java.util.List;
3631N/Aimport javax.sound.midi.MidiDevice;
3631N/Aimport javax.sound.midi.MidiDeviceReceiver;
3631N/Aimport javax.sound.midi.MidiSystem;
3631N/Aimport javax.sound.midi.MidiUnavailableException;
3631N/Aimport javax.sound.midi.Receiver;
3631N/Aimport javax.sound.midi.Sequencer;
3631N/Aimport javax.sound.midi.Transmitter;
3631N/A
3631N/Apublic class SequencerImplicitSynthOpen {
3631N/A
3631N/A static int TEST_COUNT = 5;
3631N/A
3631N/A public static void main(String[] args) {
3631N/A try {
3631N/A log("getting sequencer...");
3631N/A Sequencer sequencer = MidiSystem.getSequencer();
3631N/A log(" - got " + getDeviceStr(sequencer));
3631N/A
3631N/A // obtain connected device (usually synthesizer)
3631N/A MidiDevice synth = getConnectedDevice(sequencer);
3631N/A if (synth == null) {
3631N/A log("could not get connected device, returning");
3631N/A return;
3631N/A }
3631N/A
3631N/A log("connected device: " + getDeviceStr(synth));
3631N/A
3631N/A int success = 0;
3631N/A for (int i=0; i<TEST_COUNT; i++) {
3631N/A if (test(sequencer)) {
3631N/A success++;
3631N/A }
3631N/A }
3631N/A
3631N/A if (success != TEST_COUNT) {
3631N/A throw new RuntimeException("test FAILS");
3631N/A }
3631N/A } catch (MidiUnavailableException ex) {
3631N/A // this is not a failure
3631N/A log("Could not get Sequencer");
3631N/A }
3631N/A log("test PASSED.");
3631N/A }
3631N/A
3631N/A static boolean test(Sequencer sequencer) throws MidiUnavailableException {
3631N/A log("");
3631N/A log("opening sequencer...");
3631N/A sequencer.open(); // opens connected synthesizer implicitly
3631N/A MidiDevice synth = getConnectedDevice(sequencer);
3631N/A log(" connected device: " + getDeviceStr(synth));
3631N/A
3631N/A log("closing sequencer...");
3631N/A sequencer.close(); // closes the synth implicitly
3631N/A log(" synth is " + getDeviceStr(synth));
3631N/A MidiDevice synth2 = getConnectedDevice(sequencer);
3631N/A log(" currently connected device: " + getDeviceStr(synth2));
3631N/A
3631N/A if (synth != null && synth.isOpen()) {
3631N/A log("FAIL.");
3631N/A return false;
3631N/A }
3631N/A log("OK.");
3631N/A return true;
3631N/A }
3631N/A
3631N/A static MidiDevice getConnectedDevice(Sequencer sequencer) {
3631N/A List<Transmitter> trans = sequencer.getTransmitters();
3631N/A log(" sequencer has " + trans.size() + " opened transmitters:");
3631N/A for (Transmitter tr: trans) {
3631N/A Receiver r = tr.getReceiver();
3631N/A log(" " + getClassStr(tr) + " connected to " + getClassStr(r));
3631N/A if (r instanceof MidiDeviceReceiver) {
3631N/A MidiDeviceReceiver recv = (MidiDeviceReceiver)r;
3631N/A MidiDevice dev = recv.getMidiDevice();
3631N/A log(" - receiver of " + getClassStr(dev));
3631N/A return dev;
3631N/A } else {
3631N/A log(" - does NOT implement MidiDeviceReceiver");
3631N/A }
3631N/A }
3631N/A return null;
3631N/A }
3631N/A
3631N/A static String getClassStr(Object o) {
3631N/A if (o == null) {
3631N/A return "<null>";
3631N/A }
3631N/A return o.getClass().getName();
3631N/A }
3631N/A
3631N/A static String getDeviceStr(MidiDevice dev) {
3631N/A if (dev == null) {
3631N/A return "NULL";
3631N/A }
3631N/A return getClassStr(dev) + ", " + (dev.isOpen() ? "OPENED" : "CLOSED");
3631N/A }
3631N/A
3631N/A static void log(String s) {
3631N/A System.out.println(s);
3631N/A }
3631N/A
3631N/A}