package com.netthreads.network.osc.router.service; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.sound.midi.MidiDevice; import javax.sound.midi.MidiUnavailableException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.inject.Inject; import com.google.inject.Singleton; /** * Cache of MIDI devices and status.. * */ @Singleton public class MIDIDeviceCacheImpl implements MIDIDeviceCache { private Logger logger = LoggerFactory.getLogger(MIDIDeviceCacheImpl.class); private final Map<String, MidiDevice> cache; private final Map<String, Boolean> selected; private final MIDIManager midiService; /** * Create cache and inject service. * * @param midiService */ @Inject public MIDIDeviceCacheImpl(MIDIManager midiService) { this.midiService = midiService; cache = new HashMap<String, MidiDevice>(); selected = new HashMap<String, Boolean>(); reload(); } /** * Return device from cache. * */ @Override public MidiDevice get(String name) { return cache.get(name); } /** * Add device to cache. * */ @Override public void put(String name, MidiDevice device) { cache.put(name, device); } /** * Set device selection state. */ @Override public void select(String name, boolean state) { if (cache.get(name) != null) { selected.put(name, state); } } /** * Open all selected devices. * */ @Override public void openAll() { Collection<String> names = cache.keySet(); for (String name : names) { Boolean state = selected.get(name); if (state != null && state.booleanValue()) { openDevice(name); } } } /** * Open Device. * * @param name * The device name. */ @Override public boolean openDevice(String name) { boolean status = false; MidiDevice midiDevice = cache.get(name); if (midiDevice != null) { try { if (!midiDevice.isOpen()) { midiDevice.open(); } status = true; } catch (MidiUnavailableException e) { // Error. logger.error(e.getLocalizedMessage()); } } return status; } /** * Open Device. * * @param name * The device name. */ @Override public void closeDevice(String name) { MidiDevice midiDevice = cache.get(name); if (midiDevice != null) { if (midiDevice.isOpen()) { midiDevice.close(); } } } /** * Close all open devices. * */ @Override public void closeAll() { Collection<MidiDevice> devices = cache.values(); for (MidiDevice midiDevice : devices) { if (midiDevice.isOpen()) { midiDevice.close(); } } } /** * Reload cache. * */ @Override public void reload() { // Ensure you close any open device. closeAll(); // Now reload. List<MidiDevice> devices = midiService.getDevices(); for (MidiDevice device : devices) { cache.put(device.getDeviceInfo().getName(), device); } } /** * Return cache values. * * The list of values. */ public Collection<MidiDevice> getValues() { return cache.values(); } /** * Return device names. * * The list of names. */ public String[] getNames() { Object[] items = cache.keySet().toArray(); String[] names = new String[items.length]; return cache.keySet().toArray(names); } }