From 64517f97821a6033c8ae27591941d9ca93574eba Mon Sep 17 00:00:00 2001 From: Kaoru Shoji <0x0badc0de@gmail.com> Date: Mon, 6 May 2024 05:39:36 +0900 Subject: [PATCH 1/2] Fix javax.sound.midi initialization --- .../jp/kshoji/javax/sound/midi/BleMidiSystem.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/BLE-MIDI-library/src/main/java/jp/kshoji/javax/sound/midi/BleMidiSystem.java b/BLE-MIDI-library/src/main/java/jp/kshoji/javax/sound/midi/BleMidiSystem.java index 0b6a1d0..d100300 100644 --- a/BLE-MIDI-library/src/main/java/jp/kshoji/javax/sound/midi/BleMidiSystem.java +++ b/BLE-MIDI-library/src/main/java/jp/kshoji/javax/sound/midi/BleMidiSystem.java @@ -17,7 +17,7 @@ import jp.kshoji.javax.sound.midi.ble.BleMidiSynthesizer; /** - * {@link jp.kshoji.javax.sound.midi.MidiSystem} initializer for BLE MIDI + * {@link jp.kshoji.javax.sound.midi.MidiSystem} for BLE MIDI * * @author K.Shoji */ @@ -35,7 +35,7 @@ public final class BleMidiSystem implements OnMidiDeviceAttachedListener, OnMidi * @param context the context */ public BleMidiSystem(@NonNull final Context context) { - this.context = context.getApplicationContext(); + this.context = context; } /** @@ -79,10 +79,19 @@ public void terminate() { synchronized (midiDeviceMap) { for (final BleMidiDevice bleMidiDevice : midiDeviceMap.values()) { bleMidiDevice.close(); + MidiSystem.removeMidiDevice(bleMidiDevice); } midiDeviceMap.clear(); } + + synchronized (midiSynthesizerMap) { + for (final BleMidiSynthesizer bleMidiSynthesizer : midiSynthesizerMap.values()) { + bleMidiSynthesizer.close(); + MidiSystem.removeSynthesizer(bleMidiSynthesizer); + } + midiSynthesizerMap.clear(); + } } /** From 22ca7037b8c899cad7e276d4edcc89a685707511 Mon Sep 17 00:00:00 2001 From: Kaoru Shoji <0x0badc0de@gmail.com> Date: Mon, 6 May 2024 05:40:22 +0900 Subject: [PATCH 2/2] Update MidiSynthesizer.setReceiver method --- .../javax/sound/midi/BleMidiSystem.java | 1 + .../sound/midi/ble/BleMidiSynthesizer.java | 32 ++++++++----------- 2 files changed, 14 insertions(+), 19 deletions(-) diff --git a/BLE-MIDI-library/src/main/java/jp/kshoji/javax/sound/midi/BleMidiSystem.java b/BLE-MIDI-library/src/main/java/jp/kshoji/javax/sound/midi/BleMidiSystem.java index d100300..96aefa3 100644 --- a/BLE-MIDI-library/src/main/java/jp/kshoji/javax/sound/midi/BleMidiSystem.java +++ b/BLE-MIDI-library/src/main/java/jp/kshoji/javax/sound/midi/BleMidiSystem.java @@ -184,6 +184,7 @@ public void onMidiOutputDeviceAttached(@NonNull final MidiOutputDevice midiOutpu try { existingSynthesizer.setReceiver(addedDevice.getReceiver()); } catch (final MidiUnavailableException ignored) { + existingSynthesizer.setReceiver(null); } } } diff --git a/BLE-MIDI-library/src/main/java/jp/kshoji/javax/sound/midi/ble/BleMidiSynthesizer.java b/BLE-MIDI-library/src/main/java/jp/kshoji/javax/sound/midi/ble/BleMidiSynthesizer.java index ea8723b..3fcb550 100644 --- a/BLE-MIDI-library/src/main/java/jp/kshoji/javax/sound/midi/ble/BleMidiSynthesizer.java +++ b/BLE-MIDI-library/src/main/java/jp/kshoji/javax/sound/midi/ble/BleMidiSynthesizer.java @@ -40,19 +40,7 @@ public BleMidiSynthesizer(final BleMidiDevice bleMidiDevice) { } catch (final MidiUnavailableException ignored) { } - if (receiver == null) { - // empty - channels = new MidiChannel[0]; - voiceStatuses = new VoiceStatus[0]; - } else { - // 16 channels - voiceStatuses = new VoiceStatus[16]; - channels = new MidiChannel[16]; - for (int channel = 0; channel < 16; channel++) { - voiceStatuses[channel] = new VoiceStatus(); - channels[channel] = new MidiChannelImpl(channel, receiver, voiceStatuses[channel]); - } - } + setReceiver(receiver); } @NonNull @@ -196,12 +184,18 @@ public List getTransmitters() { } public void setReceiver(final Receiver receiver) { - // 16 channels - voiceStatuses = new VoiceStatus[16]; - channels = new MidiChannel[16]; - for (int channel = 0; channel < 16; channel++) { - voiceStatuses[channel] = new VoiceStatus(); - channels[channel] = new MidiChannelImpl(channel, receiver, voiceStatuses[channel]); + if (receiver == null) { + // empty + channels = new MidiChannel[0]; + voiceStatuses = new VoiceStatus[0]; + } else { + // 16 channels + voiceStatuses = new VoiceStatus[16]; + channels = new MidiChannel[16]; + for (int channel = 0; channel < 16; channel++) { + voiceStatuses[channel] = new VoiceStatus(); + channels[channel] = new MidiChannelImpl(channel, receiver, voiceStatuses[channel]); + } } } }