diff --git a/src/share/classes/com/sun/media/sound/RealTimeSequencer.java b/src/share/classes/com/sun/media/sound/RealTimeSequencer.java index 96ea4775fe42fc5f0d9069c7977b5ceba2c74a6e..0fc6406648aa188c92f832cff63efec3788d5829 100644 --- a/src/share/classes/com/sun/media/sound/RealTimeSequencer.java +++ b/src/share/classes/com/sun/media/sound/RealTimeSequencer.java @@ -775,15 +775,22 @@ class RealTimeSequencer extends AbstractMidiDevice implements Sequencer, AutoCon Receiver rec = null; // first try to connect to the default synthesizer // IMPORTANT: this code needs to be synch'ed with - // MidiSystem.getReceiver(boolean), because the same + // MidiSystem.getSequencer(boolean), because the same // algorithm needs to be used! try { Synthesizer synth = MidiSystem.getSynthesizer(); - synth.open(); if (synth instanceof ReferenceCountingDevice) { rec = ((ReferenceCountingDevice) synth).getReceiverReferenceCounting(); } else { - rec = synth.getReceiver(); + synth.open(); + try { + rec = synth.getReceiver(); + } finally { + // make sure that the synth is properly closed + if (rec == null) { + synth.close(); + } + } } } catch (Exception e) { // something went wrong with synth diff --git a/src/share/classes/javax/sound/midi/MidiSystem.java b/src/share/classes/javax/sound/midi/MidiSystem.java index b2a47dc96540cbf76878015be43f5a941706e9f5..a03c91e086c67b6b3c92c326deee8d12fe998aeb 100644 --- a/src/share/classes/javax/sound/midi/MidiSystem.java +++ b/src/share/classes/javax/sound/midi/MidiSystem.java @@ -441,13 +441,6 @@ public class MidiSystem { Synthesizer synth = getSynthesizer(); if (synth instanceof ReferenceCountingDevice) { rec = ((ReferenceCountingDevice) synth).getReceiverReferenceCounting(); - // only use MixerSynth if it could successfully load a soundbank - if (synth.getClass().toString().contains("com.sun.media.sound.MixerSynth") - && (synth.getDefaultSoundbank() == null)) { - // don't use this receiver if no soundbank available - rec = null; - synth.close(); - } } else { synth.open(); try { diff --git a/test/javax/sound/midi/Sequencer/SequencerImplicitSynthOpen.java b/test/javax/sound/midi/Sequencer/SequencerImplicitSynthOpen.java new file mode 100644 index 0000000000000000000000000000000000000000..f305d331bbc116c23b4bd583489774833e79e4d8 --- /dev/null +++ b/test/javax/sound/midi/Sequencer/SequencerImplicitSynthOpen.java @@ -0,0 +1,110 @@ +/** + * @test + * @bug 6660470 + * @summary Tests that sequencer correctly opens/closes (implicitly) devices + * @author Alex Menkov + */ + +import java.util.List; +import javax.sound.midi.MidiDevice; +import javax.sound.midi.MidiDeviceReceiver; +import javax.sound.midi.MidiSystem; +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Receiver; +import javax.sound.midi.Sequencer; +import javax.sound.midi.Transmitter; + +public class SequencerImplicitSynthOpen { + + static int TEST_COUNT = 5; + + public static void main(String[] args) { + try { + log("getting sequencer..."); + Sequencer sequencer = MidiSystem.getSequencer(); + log(" - got " + getDeviceStr(sequencer)); + + // obtain connected device (usually synthesizer) + MidiDevice synth = getConnectedDevice(sequencer); + if (synth == null) { + log("could not get connected device, returning"); + return; + } + + log("connected device: " + getDeviceStr(synth)); + + int success = 0; + for (int i=0; i trans = sequencer.getTransmitters(); + log(" sequencer has " + trans.size() + " opened transmitters:"); + for (Transmitter tr: trans) { + Receiver r = tr.getReceiver(); + log(" " + getClassStr(tr) + " connected to " + getClassStr(r)); + if (r instanceof MidiDeviceReceiver) { + MidiDeviceReceiver recv = (MidiDeviceReceiver)r; + MidiDevice dev = recv.getMidiDevice(); + log(" - receiver of " + getClassStr(dev)); + return dev; + } else { + log(" - does NOT implement MidiDeviceReceiver"); + } + } + return null; + } + + static String getClassStr(Object o) { + if (o == null) { + return ""; + } + return o.getClass().getName(); + } + + static String getDeviceStr(MidiDevice dev) { + if (dev == null) { + return "NULL"; + } + return getClassStr(dev) + ", " + (dev.isOpen() ? "OPENED" : "CLOSED"); + } + + static void log(String s) { + System.out.println(s); + } + +}