| @@ -179,9 +179,9 @@ public class JuceDemo extends Activity | |||||
| return address; | return address; | ||||
| } | } | ||||
| public boolean isBluetoothDevicePaired (String address) | |||||
| public int getBluetoothDeviceStatus (String address) | |||||
| { | { | ||||
| return false; | |||||
| return 0; | |||||
| } | } | ||||
| public void startStopScan (boolean shouldStart) | public void startStopScan (boolean shouldStart) | ||||
| @@ -194,9 +194,9 @@ public class MidiTest extends Activity | |||||
| return btDevice.getName(); | return btDevice.getName(); | ||||
| } | } | ||||
| public boolean isBluetoothDevicePaired (String address) | |||||
| public int getBluetoothDeviceStatus (String address) | |||||
| { | { | ||||
| return getAndroidMidiDeviceManager().isBluetoothDevicePaired (address); | |||||
| return getAndroidMidiDeviceManager().getBluetoothDeviceStatus (address); | |||||
| } | } | ||||
| public void startStopScan (boolean shouldStart) | public void startStopScan (boolean shouldStart) | ||||
| @@ -487,7 +487,78 @@ public class MidiTest extends Activity | |||||
| //============================================================================== | //============================================================================== | ||||
| public class MidiDeviceManager extends MidiManager.DeviceCallback implements MidiManager.OnDeviceOpenedListener | public class MidiDeviceManager extends MidiManager.DeviceCallback implements MidiManager.OnDeviceOpenedListener | ||||
| { | { | ||||
| //============================================================================== | |||||
| private class MidiDeviceOpenTask extends java.util.TimerTask | |||||
| { | |||||
| public MidiDeviceOpenTask (MidiDeviceManager deviceManager, MidiDevice device) | |||||
| { | |||||
| owner = deviceManager; | |||||
| midiDevice = device; | |||||
| } | |||||
| @Override | |||||
| public boolean cancel() | |||||
| { | |||||
| synchronized (MidiDeviceOpenTask.class) | |||||
| { | |||||
| owner = null; | |||||
| boolean retval = super.cancel(); | |||||
| if (midiDevice != null) | |||||
| { | |||||
| try | |||||
| { | |||||
| midiDevice.close(); | |||||
| } | |||||
| catch (IOException e) | |||||
| {} | |||||
| midiDevice = null; | |||||
| } | |||||
| return retval; | |||||
| } | |||||
| } | |||||
| public String getBluetoothAddress() | |||||
| { | |||||
| synchronized (MidiDeviceOpenTask.class) | |||||
| { | |||||
| if (midiDevice != null) | |||||
| { | |||||
| MidiDeviceInfo info = midiDevice.getInfo(); | |||||
| if (info.getType() == MidiDeviceInfo.TYPE_BLUETOOTH) | |||||
| { | |||||
| BluetoothDevice btDevice = (BluetoothDevice) info.getProperties().get (info.PROPERTY_BLUETOOTH_DEVICE); | |||||
| if (btDevice != null) | |||||
| return btDevice.getAddress(); | |||||
| } | |||||
| } | |||||
| } | |||||
| return ""; | |||||
| } | |||||
| public int getID() | |||||
| { | |||||
| return midiDevice.getInfo().getId(); | |||||
| } | |||||
| @Override | |||||
| public void run() | |||||
| { | |||||
| synchronized (MidiDeviceOpenTask.class) | |||||
| { | |||||
| if (owner != null && midiDevice != null) | |||||
| owner.onDeviceOpenedDelayed (midiDevice); | |||||
| } | |||||
| } | |||||
| private MidiDeviceManager owner; | |||||
| private MidiDevice midiDevice; | |||||
| } | |||||
| //============================================================================== | |||||
| public MidiDeviceManager() | public MidiDeviceManager() | ||||
| { | { | ||||
| manager = (MidiManager) getSystemService (MIDI_SERVICE); | manager = (MidiManager) getSystemService (MIDI_SERVICE); | ||||
| @@ -500,6 +571,8 @@ public class MidiTest extends Activity | |||||
| openPorts = new HashMap<MidiPortPath, WeakReference<JuceMidiPort>> (); | openPorts = new HashMap<MidiPortPath, WeakReference<JuceMidiPort>> (); | ||||
| midiDevices = new ArrayList<MidiDevice>(); | midiDevices = new ArrayList<MidiDevice>(); | ||||
| openTasks = new HashMap<Integer, MidiDeviceOpenTask>(); | |||||
| btDevicesPairing = new HashSet<String>(); | |||||
| MidiDeviceInfo[] foundDevices = manager.getDevices(); | MidiDeviceInfo[] foundDevices = manager.getDevices(); | ||||
| for (MidiDeviceInfo info : foundDevices) | for (MidiDeviceInfo info : foundDevices) | ||||
| @@ -512,6 +585,16 @@ public class MidiTest extends Activity | |||||
| { | { | ||||
| manager.unregisterDeviceCallback (this); | manager.unregisterDeviceCallback (this); | ||||
| synchronized (MidiDeviceManager.class) | |||||
| { | |||||
| btDevicesPairing.clear(); | |||||
| for (Integer deviceID : openTasks.keySet()) | |||||
| openTasks.get (deviceID).cancel(); | |||||
| openTasks = null; | |||||
| } | |||||
| for (MidiPortPath key : openPorts.keySet()) | for (MidiPortPath key : openPorts.keySet()) | ||||
| openPorts.get (key).get().close(); | openPorts.get (key).get().close(); | ||||
| @@ -606,21 +689,62 @@ public class MidiTest extends Activity | |||||
| return openMidiPortWithJuceIndex (index, 0, false); | return openMidiPortWithJuceIndex (index, 0, false); | ||||
| } | } | ||||
| public boolean isBluetoothDevicePaired (String address) | |||||
| /* 0: unpaired, 1: paired, 2: pairing */ | |||||
| public int getBluetoothDeviceStatus (String address) | |||||
| { | { | ||||
| return (findMidiDeviceForBluetoothAddress (address) != null); | |||||
| synchronized (MidiDeviceManager.class) | |||||
| { | |||||
| if (! address.isEmpty()) | |||||
| { | |||||
| if (findMidiDeviceForBluetoothAddress (address) != null) | |||||
| return 1; | |||||
| if (btDevicesPairing.contains (address)) | |||||
| return 2; | |||||
| if (findOpenTaskForBluetoothAddress (address) != null) | |||||
| return 2; | |||||
| } | |||||
| } | |||||
| return 0; | |||||
| } | } | ||||
| public boolean pairBluetoothDevice (BluetoothDevice btDevice) | public boolean pairBluetoothDevice (BluetoothDevice btDevice) | ||||
| { | { | ||||
| manager.openBluetoothDevice(btDevice, this, null); | |||||
| String btAddress = btDevice.getAddress(); | |||||
| if (btAddress.isEmpty()) | |||||
| return false; | |||||
| synchronized (MidiDeviceManager.class) | |||||
| { | |||||
| if (getBluetoothDeviceStatus (btAddress) != 0) | |||||
| return false; | |||||
| btDevicesPairing.add (btDevice.getAddress()); | |||||
| manager.openBluetoothDevice(btDevice, this, null); | |||||
| } | |||||
| return true; | return true; | ||||
| } | } | ||||
| public void unpairBluetoothDevice (String address) | public void unpairBluetoothDevice (String address) | ||||
| { | { | ||||
| if (address.isEmpty()) | |||||
| return; | |||||
| synchronized (MidiDeviceManager.class) | synchronized (MidiDeviceManager.class) | ||||
| { | { | ||||
| btDevicesPairing.remove (address); | |||||
| MidiDeviceOpenTask openTask = findOpenTaskForBluetoothAddress (address); | |||||
| if (openTask != null) | |||||
| { | |||||
| int deviceID = openTask.getID(); | |||||
| openTask.cancel(); | |||||
| openTasks.remove (deviceID); | |||||
| } | |||||
| MidiDevice midiDevice = findMidiDeviceForBluetoothAddress (address); | MidiDevice midiDevice = findMidiDeviceForBluetoothAddress (address); | ||||
| if (midiDevice != null) | if (midiDevice != null) | ||||
| { | { | ||||
| @@ -653,6 +777,18 @@ public class MidiTest extends Activity | |||||
| return null; | return null; | ||||
| } | } | ||||
| private MidiDeviceOpenTask findOpenTaskForBluetoothAddress (String address) | |||||
| { | |||||
| for (Integer deviceID : openTasks.keySet()) | |||||
| { | |||||
| MidiDeviceOpenTask openTask = openTasks.get (deviceID); | |||||
| if (openTask.getBluetoothAddress().equals (address)) | |||||
| return openTask; | |||||
| } | |||||
| return null; | |||||
| } | |||||
| public void removePort (MidiPortPath path) | public void removePort (MidiPortPath path) | ||||
| { | { | ||||
| openPorts.remove (path); | openPorts.remove (path); | ||||
| @@ -719,9 +855,68 @@ public class MidiTest extends Activity | |||||
| { | { | ||||
| synchronized (MidiDeviceManager.class) | synchronized (MidiDeviceManager.class) | ||||
| { | { | ||||
| // make sure it's not already there | |||||
| if (! midiDevices.contains(theDevice)) | |||||
| midiDevices.add (theDevice); | |||||
| MidiDeviceInfo info = theDevice.getInfo(); | |||||
| int deviceID = info.getId(); | |||||
| if (! openTasks.containsKey (deviceID)) | |||||
| { | |||||
| if (info.getType() == MidiDeviceInfo.TYPE_BLUETOOTH) | |||||
| { | |||||
| BluetoothDevice btDevice = (BluetoothDevice) info.getProperties().get (info.PROPERTY_BLUETOOTH_DEVICE); | |||||
| if (btDevice != null) | |||||
| { | |||||
| String btAddress = btDevice.getAddress(); | |||||
| if (btDevicesPairing.contains (btAddress)) | |||||
| { | |||||
| btDevicesPairing.remove (btAddress); | |||||
| } | |||||
| else | |||||
| { | |||||
| // unpair was called in the mean time | |||||
| try | |||||
| { | |||||
| theDevice.close(); | |||||
| } | |||||
| catch (IOException e) | |||||
| {} | |||||
| return; | |||||
| } | |||||
| } | |||||
| } | |||||
| MidiDeviceOpenTask openTask = new MidiDeviceOpenTask (this, theDevice); | |||||
| openTasks.put (deviceID, openTask); | |||||
| new java.util.Timer().schedule (openTask, 3000); | |||||
| } | |||||
| } | |||||
| } | |||||
| public void onDeviceOpenedDelayed (MidiDevice theDevice) | |||||
| { | |||||
| synchronized (MidiDeviceManager.class) | |||||
| { | |||||
| int deviceID = theDevice.getInfo().getId(); | |||||
| if (openTasks.containsKey (deviceID)) | |||||
| { | |||||
| if (! midiDevices.contains(theDevice)) | |||||
| { | |||||
| openTasks.remove (deviceID); | |||||
| midiDevices.add (theDevice); | |||||
| } | |||||
| } | |||||
| else | |||||
| { | |||||
| // unpair was called in the mean time | |||||
| try | |||||
| { | |||||
| theDevice.close(); | |||||
| } | |||||
| catch (IOException e) | |||||
| {} | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| @@ -808,6 +1003,8 @@ public class MidiTest extends Activity | |||||
| } | } | ||||
| private MidiManager manager; | private MidiManager manager; | ||||
| private HashSet<String> btDevicesPairing; | |||||
| private HashMap<Integer, MidiDeviceOpenTask> openTasks; | |||||
| private ArrayList<MidiDevice> midiDevices; | private ArrayList<MidiDevice> midiDevices; | ||||
| private MidiDeviceInfo[] deviceInfos; | private MidiDeviceInfo[] deviceInfos; | ||||
| private HashMap<MidiPortPath, WeakReference<JuceMidiPort>> openPorts; | private HashMap<MidiPortPath, WeakReference<JuceMidiPort>> openPorts; | ||||
| @@ -179,9 +179,9 @@ public class JUCENetworkGraphicsDemo extends Activity | |||||
| return address; | return address; | ||||
| } | } | ||||
| public boolean isBluetoothDevicePaired (String address) | |||||
| public int getBluetoothDeviceStatus (String address) | |||||
| { | { | ||||
| return false; | |||||
| return 0; | |||||
| } | } | ||||
| public void startStopScan (boolean shouldStart) | public void startStopScan (boolean shouldStart) | ||||
| @@ -179,9 +179,9 @@ public class OSCReceiver extends Activity | |||||
| return address; | return address; | ||||
| } | } | ||||
| public boolean isBluetoothDevicePaired (String address) | |||||
| public int getBluetoothDeviceStatus (String address) | |||||
| { | { | ||||
| return false; | |||||
| return 0; | |||||
| } | } | ||||
| public void startStopScan (boolean shouldStart) | public void startStopScan (boolean shouldStart) | ||||
| @@ -179,9 +179,9 @@ public class OSCSender extends Activity | |||||
| return address; | return address; | ||||
| } | } | ||||
| public boolean isBluetoothDevicePaired (String address) | |||||
| public int getBluetoothDeviceStatus (String address) | |||||
| { | { | ||||
| return false; | |||||
| return 0; | |||||
| } | } | ||||
| public void startStopScan (boolean shouldStart) | public void startStopScan (boolean shouldStart) | ||||
| @@ -194,9 +194,9 @@ public class JuceDemoPlugin extends Activity | |||||
| return btDevice.getName(); | return btDevice.getName(); | ||||
| } | } | ||||
| public boolean isBluetoothDevicePaired (String address) | |||||
| public int getBluetoothDeviceStatus (String address) | |||||
| { | { | ||||
| return getAndroidMidiDeviceManager().isBluetoothDevicePaired (address); | |||||
| return getAndroidMidiDeviceManager().getBluetoothDeviceStatus (address); | |||||
| } | } | ||||
| public void startStopScan (boolean shouldStart) | public void startStopScan (boolean shouldStart) | ||||
| @@ -487,7 +487,78 @@ public class JuceDemoPlugin extends Activity | |||||
| //============================================================================== | //============================================================================== | ||||
| public class MidiDeviceManager extends MidiManager.DeviceCallback implements MidiManager.OnDeviceOpenedListener | public class MidiDeviceManager extends MidiManager.DeviceCallback implements MidiManager.OnDeviceOpenedListener | ||||
| { | { | ||||
| //============================================================================== | |||||
| private class MidiDeviceOpenTask extends java.util.TimerTask | |||||
| { | |||||
| public MidiDeviceOpenTask (MidiDeviceManager deviceManager, MidiDevice device) | |||||
| { | |||||
| owner = deviceManager; | |||||
| midiDevice = device; | |||||
| } | |||||
| @Override | |||||
| public boolean cancel() | |||||
| { | |||||
| synchronized (MidiDeviceOpenTask.class) | |||||
| { | |||||
| owner = null; | |||||
| boolean retval = super.cancel(); | |||||
| if (midiDevice != null) | |||||
| { | |||||
| try | |||||
| { | |||||
| midiDevice.close(); | |||||
| } | |||||
| catch (IOException e) | |||||
| {} | |||||
| midiDevice = null; | |||||
| } | |||||
| return retval; | |||||
| } | |||||
| } | |||||
| public String getBluetoothAddress() | |||||
| { | |||||
| synchronized (MidiDeviceOpenTask.class) | |||||
| { | |||||
| if (midiDevice != null) | |||||
| { | |||||
| MidiDeviceInfo info = midiDevice.getInfo(); | |||||
| if (info.getType() == MidiDeviceInfo.TYPE_BLUETOOTH) | |||||
| { | |||||
| BluetoothDevice btDevice = (BluetoothDevice) info.getProperties().get (info.PROPERTY_BLUETOOTH_DEVICE); | |||||
| if (btDevice != null) | |||||
| return btDevice.getAddress(); | |||||
| } | |||||
| } | |||||
| } | |||||
| return ""; | |||||
| } | |||||
| public int getID() | |||||
| { | |||||
| return midiDevice.getInfo().getId(); | |||||
| } | |||||
| @Override | |||||
| public void run() | |||||
| { | |||||
| synchronized (MidiDeviceOpenTask.class) | |||||
| { | |||||
| if (owner != null && midiDevice != null) | |||||
| owner.onDeviceOpenedDelayed (midiDevice); | |||||
| } | |||||
| } | |||||
| private MidiDeviceManager owner; | |||||
| private MidiDevice midiDevice; | |||||
| } | |||||
| //============================================================================== | |||||
| public MidiDeviceManager() | public MidiDeviceManager() | ||||
| { | { | ||||
| manager = (MidiManager) getSystemService (MIDI_SERVICE); | manager = (MidiManager) getSystemService (MIDI_SERVICE); | ||||
| @@ -500,6 +571,8 @@ public class JuceDemoPlugin extends Activity | |||||
| openPorts = new HashMap<MidiPortPath, WeakReference<JuceMidiPort>> (); | openPorts = new HashMap<MidiPortPath, WeakReference<JuceMidiPort>> (); | ||||
| midiDevices = new ArrayList<MidiDevice>(); | midiDevices = new ArrayList<MidiDevice>(); | ||||
| openTasks = new HashMap<Integer, MidiDeviceOpenTask>(); | |||||
| btDevicesPairing = new HashSet<String>(); | |||||
| MidiDeviceInfo[] foundDevices = manager.getDevices(); | MidiDeviceInfo[] foundDevices = manager.getDevices(); | ||||
| for (MidiDeviceInfo info : foundDevices) | for (MidiDeviceInfo info : foundDevices) | ||||
| @@ -512,6 +585,16 @@ public class JuceDemoPlugin extends Activity | |||||
| { | { | ||||
| manager.unregisterDeviceCallback (this); | manager.unregisterDeviceCallback (this); | ||||
| synchronized (MidiDeviceManager.class) | |||||
| { | |||||
| btDevicesPairing.clear(); | |||||
| for (Integer deviceID : openTasks.keySet()) | |||||
| openTasks.get (deviceID).cancel(); | |||||
| openTasks = null; | |||||
| } | |||||
| for (MidiPortPath key : openPorts.keySet()) | for (MidiPortPath key : openPorts.keySet()) | ||||
| openPorts.get (key).get().close(); | openPorts.get (key).get().close(); | ||||
| @@ -606,21 +689,62 @@ public class JuceDemoPlugin extends Activity | |||||
| return openMidiPortWithJuceIndex (index, 0, false); | return openMidiPortWithJuceIndex (index, 0, false); | ||||
| } | } | ||||
| public boolean isBluetoothDevicePaired (String address) | |||||
| /* 0: unpaired, 1: paired, 2: pairing */ | |||||
| public int getBluetoothDeviceStatus (String address) | |||||
| { | { | ||||
| return (findMidiDeviceForBluetoothAddress (address) != null); | |||||
| synchronized (MidiDeviceManager.class) | |||||
| { | |||||
| if (! address.isEmpty()) | |||||
| { | |||||
| if (findMidiDeviceForBluetoothAddress (address) != null) | |||||
| return 1; | |||||
| if (btDevicesPairing.contains (address)) | |||||
| return 2; | |||||
| if (findOpenTaskForBluetoothAddress (address) != null) | |||||
| return 2; | |||||
| } | |||||
| } | |||||
| return 0; | |||||
| } | } | ||||
| public boolean pairBluetoothDevice (BluetoothDevice btDevice) | public boolean pairBluetoothDevice (BluetoothDevice btDevice) | ||||
| { | { | ||||
| manager.openBluetoothDevice(btDevice, this, null); | |||||
| String btAddress = btDevice.getAddress(); | |||||
| if (btAddress.isEmpty()) | |||||
| return false; | |||||
| synchronized (MidiDeviceManager.class) | |||||
| { | |||||
| if (getBluetoothDeviceStatus (btAddress) != 0) | |||||
| return false; | |||||
| btDevicesPairing.add (btDevice.getAddress()); | |||||
| manager.openBluetoothDevice(btDevice, this, null); | |||||
| } | |||||
| return true; | return true; | ||||
| } | } | ||||
| public void unpairBluetoothDevice (String address) | public void unpairBluetoothDevice (String address) | ||||
| { | { | ||||
| if (address.isEmpty()) | |||||
| return; | |||||
| synchronized (MidiDeviceManager.class) | synchronized (MidiDeviceManager.class) | ||||
| { | { | ||||
| btDevicesPairing.remove (address); | |||||
| MidiDeviceOpenTask openTask = findOpenTaskForBluetoothAddress (address); | |||||
| if (openTask != null) | |||||
| { | |||||
| int deviceID = openTask.getID(); | |||||
| openTask.cancel(); | |||||
| openTasks.remove (deviceID); | |||||
| } | |||||
| MidiDevice midiDevice = findMidiDeviceForBluetoothAddress (address); | MidiDevice midiDevice = findMidiDeviceForBluetoothAddress (address); | ||||
| if (midiDevice != null) | if (midiDevice != null) | ||||
| { | { | ||||
| @@ -653,6 +777,18 @@ public class JuceDemoPlugin extends Activity | |||||
| return null; | return null; | ||||
| } | } | ||||
| private MidiDeviceOpenTask findOpenTaskForBluetoothAddress (String address) | |||||
| { | |||||
| for (Integer deviceID : openTasks.keySet()) | |||||
| { | |||||
| MidiDeviceOpenTask openTask = openTasks.get (deviceID); | |||||
| if (openTask.getBluetoothAddress().equals (address)) | |||||
| return openTask; | |||||
| } | |||||
| return null; | |||||
| } | |||||
| public void removePort (MidiPortPath path) | public void removePort (MidiPortPath path) | ||||
| { | { | ||||
| openPorts.remove (path); | openPorts.remove (path); | ||||
| @@ -719,9 +855,68 @@ public class JuceDemoPlugin extends Activity | |||||
| { | { | ||||
| synchronized (MidiDeviceManager.class) | synchronized (MidiDeviceManager.class) | ||||
| { | { | ||||
| // make sure it's not already there | |||||
| if (! midiDevices.contains(theDevice)) | |||||
| midiDevices.add (theDevice); | |||||
| MidiDeviceInfo info = theDevice.getInfo(); | |||||
| int deviceID = info.getId(); | |||||
| if (! openTasks.containsKey (deviceID)) | |||||
| { | |||||
| if (info.getType() == MidiDeviceInfo.TYPE_BLUETOOTH) | |||||
| { | |||||
| BluetoothDevice btDevice = (BluetoothDevice) info.getProperties().get (info.PROPERTY_BLUETOOTH_DEVICE); | |||||
| if (btDevice != null) | |||||
| { | |||||
| String btAddress = btDevice.getAddress(); | |||||
| if (btDevicesPairing.contains (btAddress)) | |||||
| { | |||||
| btDevicesPairing.remove (btAddress); | |||||
| } | |||||
| else | |||||
| { | |||||
| // unpair was called in the mean time | |||||
| try | |||||
| { | |||||
| theDevice.close(); | |||||
| } | |||||
| catch (IOException e) | |||||
| {} | |||||
| return; | |||||
| } | |||||
| } | |||||
| } | |||||
| MidiDeviceOpenTask openTask = new MidiDeviceOpenTask (this, theDevice); | |||||
| openTasks.put (deviceID, openTask); | |||||
| new java.util.Timer().schedule (openTask, 3000); | |||||
| } | |||||
| } | |||||
| } | |||||
| public void onDeviceOpenedDelayed (MidiDevice theDevice) | |||||
| { | |||||
| synchronized (MidiDeviceManager.class) | |||||
| { | |||||
| int deviceID = theDevice.getInfo().getId(); | |||||
| if (openTasks.containsKey (deviceID)) | |||||
| { | |||||
| if (! midiDevices.contains(theDevice)) | |||||
| { | |||||
| openTasks.remove (deviceID); | |||||
| midiDevices.add (theDevice); | |||||
| } | |||||
| } | |||||
| else | |||||
| { | |||||
| // unpair was called in the mean time | |||||
| try | |||||
| { | |||||
| theDevice.close(); | |||||
| } | |||||
| catch (IOException e) | |||||
| {} | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| @@ -808,6 +1003,8 @@ public class JuceDemoPlugin extends Activity | |||||
| } | } | ||||
| private MidiManager manager; | private MidiManager manager; | ||||
| private HashSet<String> btDevicesPairing; | |||||
| private HashMap<Integer, MidiDeviceOpenTask> openTasks; | |||||
| private ArrayList<MidiDevice> midiDevices; | private ArrayList<MidiDevice> midiDevices; | ||||
| private MidiDeviceInfo[] deviceInfos; | private MidiDeviceInfo[] deviceInfos; | ||||
| private HashMap<MidiPortPath, WeakReference<JuceMidiPort>> openPorts; | private HashMap<MidiPortPath, WeakReference<JuceMidiPort>> openPorts; | ||||
| @@ -194,9 +194,9 @@ public class AudioPerformanceTest extends Activity | |||||
| return btDevice.getName(); | return btDevice.getName(); | ||||
| } | } | ||||
| public boolean isBluetoothDevicePaired (String address) | |||||
| public int getBluetoothDeviceStatus (String address) | |||||
| { | { | ||||
| return getAndroidMidiDeviceManager().isBluetoothDevicePaired (address); | |||||
| return getAndroidMidiDeviceManager().getBluetoothDeviceStatus (address); | |||||
| } | } | ||||
| public void startStopScan (boolean shouldStart) | public void startStopScan (boolean shouldStart) | ||||
| @@ -487,7 +487,78 @@ public class AudioPerformanceTest extends Activity | |||||
| //============================================================================== | //============================================================================== | ||||
| public class MidiDeviceManager extends MidiManager.DeviceCallback implements MidiManager.OnDeviceOpenedListener | public class MidiDeviceManager extends MidiManager.DeviceCallback implements MidiManager.OnDeviceOpenedListener | ||||
| { | { | ||||
| //============================================================================== | |||||
| private class MidiDeviceOpenTask extends java.util.TimerTask | |||||
| { | |||||
| public MidiDeviceOpenTask (MidiDeviceManager deviceManager, MidiDevice device) | |||||
| { | |||||
| owner = deviceManager; | |||||
| midiDevice = device; | |||||
| } | |||||
| @Override | |||||
| public boolean cancel() | |||||
| { | |||||
| synchronized (MidiDeviceOpenTask.class) | |||||
| { | |||||
| owner = null; | |||||
| boolean retval = super.cancel(); | |||||
| if (midiDevice != null) | |||||
| { | |||||
| try | |||||
| { | |||||
| midiDevice.close(); | |||||
| } | |||||
| catch (IOException e) | |||||
| {} | |||||
| midiDevice = null; | |||||
| } | |||||
| return retval; | |||||
| } | |||||
| } | |||||
| public String getBluetoothAddress() | |||||
| { | |||||
| synchronized (MidiDeviceOpenTask.class) | |||||
| { | |||||
| if (midiDevice != null) | |||||
| { | |||||
| MidiDeviceInfo info = midiDevice.getInfo(); | |||||
| if (info.getType() == MidiDeviceInfo.TYPE_BLUETOOTH) | |||||
| { | |||||
| BluetoothDevice btDevice = (BluetoothDevice) info.getProperties().get (info.PROPERTY_BLUETOOTH_DEVICE); | |||||
| if (btDevice != null) | |||||
| return btDevice.getAddress(); | |||||
| } | |||||
| } | |||||
| } | |||||
| return ""; | |||||
| } | |||||
| public int getID() | |||||
| { | |||||
| return midiDevice.getInfo().getId(); | |||||
| } | |||||
| @Override | |||||
| public void run() | |||||
| { | |||||
| synchronized (MidiDeviceOpenTask.class) | |||||
| { | |||||
| if (owner != null && midiDevice != null) | |||||
| owner.onDeviceOpenedDelayed (midiDevice); | |||||
| } | |||||
| } | |||||
| private MidiDeviceManager owner; | |||||
| private MidiDevice midiDevice; | |||||
| } | |||||
| //============================================================================== | |||||
| public MidiDeviceManager() | public MidiDeviceManager() | ||||
| { | { | ||||
| manager = (MidiManager) getSystemService (MIDI_SERVICE); | manager = (MidiManager) getSystemService (MIDI_SERVICE); | ||||
| @@ -500,6 +571,8 @@ public class AudioPerformanceTest extends Activity | |||||
| openPorts = new HashMap<MidiPortPath, WeakReference<JuceMidiPort>> (); | openPorts = new HashMap<MidiPortPath, WeakReference<JuceMidiPort>> (); | ||||
| midiDevices = new ArrayList<MidiDevice>(); | midiDevices = new ArrayList<MidiDevice>(); | ||||
| openTasks = new HashMap<Integer, MidiDeviceOpenTask>(); | |||||
| btDevicesPairing = new HashSet<String>(); | |||||
| MidiDeviceInfo[] foundDevices = manager.getDevices(); | MidiDeviceInfo[] foundDevices = manager.getDevices(); | ||||
| for (MidiDeviceInfo info : foundDevices) | for (MidiDeviceInfo info : foundDevices) | ||||
| @@ -512,6 +585,16 @@ public class AudioPerformanceTest extends Activity | |||||
| { | { | ||||
| manager.unregisterDeviceCallback (this); | manager.unregisterDeviceCallback (this); | ||||
| synchronized (MidiDeviceManager.class) | |||||
| { | |||||
| btDevicesPairing.clear(); | |||||
| for (Integer deviceID : openTasks.keySet()) | |||||
| openTasks.get (deviceID).cancel(); | |||||
| openTasks = null; | |||||
| } | |||||
| for (MidiPortPath key : openPorts.keySet()) | for (MidiPortPath key : openPorts.keySet()) | ||||
| openPorts.get (key).get().close(); | openPorts.get (key).get().close(); | ||||
| @@ -606,21 +689,62 @@ public class AudioPerformanceTest extends Activity | |||||
| return openMidiPortWithJuceIndex (index, 0, false); | return openMidiPortWithJuceIndex (index, 0, false); | ||||
| } | } | ||||
| public boolean isBluetoothDevicePaired (String address) | |||||
| /* 0: unpaired, 1: paired, 2: pairing */ | |||||
| public int getBluetoothDeviceStatus (String address) | |||||
| { | { | ||||
| return (findMidiDeviceForBluetoothAddress (address) != null); | |||||
| synchronized (MidiDeviceManager.class) | |||||
| { | |||||
| if (! address.isEmpty()) | |||||
| { | |||||
| if (findMidiDeviceForBluetoothAddress (address) != null) | |||||
| return 1; | |||||
| if (btDevicesPairing.contains (address)) | |||||
| return 2; | |||||
| if (findOpenTaskForBluetoothAddress (address) != null) | |||||
| return 2; | |||||
| } | |||||
| } | |||||
| return 0; | |||||
| } | } | ||||
| public boolean pairBluetoothDevice (BluetoothDevice btDevice) | public boolean pairBluetoothDevice (BluetoothDevice btDevice) | ||||
| { | { | ||||
| manager.openBluetoothDevice(btDevice, this, null); | |||||
| String btAddress = btDevice.getAddress(); | |||||
| if (btAddress.isEmpty()) | |||||
| return false; | |||||
| synchronized (MidiDeviceManager.class) | |||||
| { | |||||
| if (getBluetoothDeviceStatus (btAddress) != 0) | |||||
| return false; | |||||
| btDevicesPairing.add (btDevice.getAddress()); | |||||
| manager.openBluetoothDevice(btDevice, this, null); | |||||
| } | |||||
| return true; | return true; | ||||
| } | } | ||||
| public void unpairBluetoothDevice (String address) | public void unpairBluetoothDevice (String address) | ||||
| { | { | ||||
| if (address.isEmpty()) | |||||
| return; | |||||
| synchronized (MidiDeviceManager.class) | synchronized (MidiDeviceManager.class) | ||||
| { | { | ||||
| btDevicesPairing.remove (address); | |||||
| MidiDeviceOpenTask openTask = findOpenTaskForBluetoothAddress (address); | |||||
| if (openTask != null) | |||||
| { | |||||
| int deviceID = openTask.getID(); | |||||
| openTask.cancel(); | |||||
| openTasks.remove (deviceID); | |||||
| } | |||||
| MidiDevice midiDevice = findMidiDeviceForBluetoothAddress (address); | MidiDevice midiDevice = findMidiDeviceForBluetoothAddress (address); | ||||
| if (midiDevice != null) | if (midiDevice != null) | ||||
| { | { | ||||
| @@ -653,6 +777,18 @@ public class AudioPerformanceTest extends Activity | |||||
| return null; | return null; | ||||
| } | } | ||||
| private MidiDeviceOpenTask findOpenTaskForBluetoothAddress (String address) | |||||
| { | |||||
| for (Integer deviceID : openTasks.keySet()) | |||||
| { | |||||
| MidiDeviceOpenTask openTask = openTasks.get (deviceID); | |||||
| if (openTask.getBluetoothAddress().equals (address)) | |||||
| return openTask; | |||||
| } | |||||
| return null; | |||||
| } | |||||
| public void removePort (MidiPortPath path) | public void removePort (MidiPortPath path) | ||||
| { | { | ||||
| openPorts.remove (path); | openPorts.remove (path); | ||||
| @@ -719,9 +855,68 @@ public class AudioPerformanceTest extends Activity | |||||
| { | { | ||||
| synchronized (MidiDeviceManager.class) | synchronized (MidiDeviceManager.class) | ||||
| { | { | ||||
| // make sure it's not already there | |||||
| if (! midiDevices.contains(theDevice)) | |||||
| midiDevices.add (theDevice); | |||||
| MidiDeviceInfo info = theDevice.getInfo(); | |||||
| int deviceID = info.getId(); | |||||
| if (! openTasks.containsKey (deviceID)) | |||||
| { | |||||
| if (info.getType() == MidiDeviceInfo.TYPE_BLUETOOTH) | |||||
| { | |||||
| BluetoothDevice btDevice = (BluetoothDevice) info.getProperties().get (info.PROPERTY_BLUETOOTH_DEVICE); | |||||
| if (btDevice != null) | |||||
| { | |||||
| String btAddress = btDevice.getAddress(); | |||||
| if (btDevicesPairing.contains (btAddress)) | |||||
| { | |||||
| btDevicesPairing.remove (btAddress); | |||||
| } | |||||
| else | |||||
| { | |||||
| // unpair was called in the mean time | |||||
| try | |||||
| { | |||||
| theDevice.close(); | |||||
| } | |||||
| catch (IOException e) | |||||
| {} | |||||
| return; | |||||
| } | |||||
| } | |||||
| } | |||||
| MidiDeviceOpenTask openTask = new MidiDeviceOpenTask (this, theDevice); | |||||
| openTasks.put (deviceID, openTask); | |||||
| new java.util.Timer().schedule (openTask, 3000); | |||||
| } | |||||
| } | |||||
| } | |||||
| public void onDeviceOpenedDelayed (MidiDevice theDevice) | |||||
| { | |||||
| synchronized (MidiDeviceManager.class) | |||||
| { | |||||
| int deviceID = theDevice.getInfo().getId(); | |||||
| if (openTasks.containsKey (deviceID)) | |||||
| { | |||||
| if (! midiDevices.contains(theDevice)) | |||||
| { | |||||
| openTasks.remove (deviceID); | |||||
| midiDevices.add (theDevice); | |||||
| } | |||||
| } | |||||
| else | |||||
| { | |||||
| // unpair was called in the mean time | |||||
| try | |||||
| { | |||||
| theDevice.close(); | |||||
| } | |||||
| catch (IOException e) | |||||
| {} | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| @@ -808,6 +1003,8 @@ public class AudioPerformanceTest extends Activity | |||||
| } | } | ||||
| private MidiManager manager; | private MidiManager manager; | ||||
| private HashSet<String> btDevicesPairing; | |||||
| private HashMap<Integer, MidiDeviceOpenTask> openTasks; | |||||
| private ArrayList<MidiDevice> midiDevices; | private ArrayList<MidiDevice> midiDevices; | ||||
| private MidiDeviceInfo[] deviceInfos; | private MidiDeviceInfo[] deviceInfos; | ||||
| private HashMap<MidiPortPath, WeakReference<JuceMidiPort>> openPorts; | private HashMap<MidiPortPath, WeakReference<JuceMidiPort>> openPorts; | ||||
| @@ -28,7 +28,7 @@ | |||||
| METHOD (pairBluetoothMidiDevice, "pairBluetoothMidiDevice", "(Ljava/lang/String;)Z") \ | METHOD (pairBluetoothMidiDevice, "pairBluetoothMidiDevice", "(Ljava/lang/String;)Z") \ | ||||
| METHOD (unpairBluetoothMidiDevice, "unpairBluetoothMidiDevice", "(Ljava/lang/String;)V") \ | METHOD (unpairBluetoothMidiDevice, "unpairBluetoothMidiDevice", "(Ljava/lang/String;)V") \ | ||||
| METHOD (getHumanReadableStringForBluetoothAddress, "getHumanReadableStringForBluetoothAddress", "(Ljava/lang/String;)Ljava/lang/String;") \ | METHOD (getHumanReadableStringForBluetoothAddress, "getHumanReadableStringForBluetoothAddress", "(Ljava/lang/String;)Ljava/lang/String;") \ | ||||
| METHOD (isBluetoothDevicePaired, "isBluetoothDevicePaired", "(Ljava/lang/String;)Z") \ | |||||
| METHOD (getBluetoothDeviceStatus, "getBluetoothDeviceStatus", "(Ljava/lang/String;)I") \ | |||||
| METHOD (startStopScan, "startStopScan", "(Z)V") | METHOD (startStopScan, "startStopScan", "(Z)V") | ||||
| DECLARE_JNI_CLASS (AndroidBluetoothManager, JUCE_ANDROID_ACTIVITY_CLASSPATH "$BluetoothManager"); | DECLARE_JNI_CLASS (AndroidBluetoothManager, JUCE_ANDROID_ACTIVITY_CLASSPATH "$BluetoothManager"); | ||||
| @@ -121,17 +121,24 @@ struct AndroidBluetoothMidiInterface | |||||
| } | } | ||||
| //============================================================================== | //============================================================================== | ||||
| static bool isBluetoothDevicePaired (const String& address) | |||||
| enum PairStatus | |||||
| { | |||||
| unpaired = 0, | |||||
| paired = 1, | |||||
| pairing = 2 | |||||
| }; | |||||
| static PairStatus isBluetoothDevicePaired (const String& address) | |||||
| { | { | ||||
| JNIEnv* env = getEnv(); | JNIEnv* env = getEnv(); | ||||
| LocalRef<jobject> btManager (android.activity.callObjectMethod (JuceAppActivity.getAndroidBluetoothManager)); | LocalRef<jobject> btManager (android.activity.callObjectMethod (JuceAppActivity.getAndroidBluetoothManager)); | ||||
| if (btManager.get() == nullptr) | if (btManager.get() == nullptr) | ||||
| return false; | |||||
| return unpaired; | |||||
| return env->CallBooleanMethod (btManager.get(), AndroidBluetoothManager.isBluetoothDevicePaired, | |||||
| javaString (address).get()); | |||||
| return static_cast<PairStatus> (env->CallIntMethod (btManager.get(), AndroidBluetoothManager.getBluetoothDeviceStatus, | |||||
| javaString (address).get())); | |||||
| } | } | ||||
| }; | }; | ||||
| @@ -350,9 +357,19 @@ private: | |||||
| address != bluetoothAddresses.end(); ++address) | address != bluetoothAddresses.end(); ++address) | ||||
| { | { | ||||
| String name = AndroidBluetoothMidiInterface::getHumanReadableStringForBluetoothAddress (*address); | String name = AndroidBluetoothMidiInterface::getHumanReadableStringForBluetoothAddress (*address); | ||||
| DeviceStatus status = AndroidBluetoothMidiInterface::isBluetoothDevicePaired (*address) | |||||
| ? AndroidBluetoothMidiDevice::connected | |||||
| : AndroidBluetoothMidiDevice::disconnected; | |||||
| DeviceStatus status; | |||||
| switch (AndroidBluetoothMidiInterface::isBluetoothDevicePaired (*address)) | |||||
| { | |||||
| case AndroidBluetoothMidiInterface::pairing: | |||||
| status = AndroidBluetoothMidiDevice::connecting; | |||||
| break; | |||||
| case AndroidBluetoothMidiInterface::paired: | |||||
| status = AndroidBluetoothMidiDevice::connected; | |||||
| break; | |||||
| default: | |||||
| status = AndroidBluetoothMidiDevice::disconnected; | |||||
| } | |||||
| newDevices.add (AndroidBluetoothMidiDevice (name, *address, status)); | newDevices.add (AndroidBluetoothMidiDevice (name, *address, status)); | ||||
| } | } | ||||
| @@ -16,9 +16,9 @@ | |||||
| return btDevice.getName(); | return btDevice.getName(); | ||||
| } | } | ||||
| public boolean isBluetoothDevicePaired (String address) | |||||
| public int getBluetoothDeviceStatus (String address) | |||||
| { | { | ||||
| return getAndroidMidiDeviceManager().isBluetoothDevicePaired (address); | |||||
| return getAndroidMidiDeviceManager().getBluetoothDeviceStatus (address); | |||||
| } | } | ||||
| public void startStopScan (boolean shouldStart) | public void startStopScan (boolean shouldStart) | ||||
| @@ -309,7 +309,78 @@ | |||||
| //============================================================================== | //============================================================================== | ||||
| public class MidiDeviceManager extends MidiManager.DeviceCallback implements MidiManager.OnDeviceOpenedListener | public class MidiDeviceManager extends MidiManager.DeviceCallback implements MidiManager.OnDeviceOpenedListener | ||||
| { | { | ||||
| //============================================================================== | |||||
| private class MidiDeviceOpenTask extends java.util.TimerTask | |||||
| { | |||||
| public MidiDeviceOpenTask (MidiDeviceManager deviceManager, MidiDevice device) | |||||
| { | |||||
| owner = deviceManager; | |||||
| midiDevice = device; | |||||
| } | |||||
| @Override | |||||
| public boolean cancel() | |||||
| { | |||||
| synchronized (MidiDeviceOpenTask.class) | |||||
| { | |||||
| owner = null; | |||||
| boolean retval = super.cancel(); | |||||
| if (midiDevice != null) | |||||
| { | |||||
| try | |||||
| { | |||||
| midiDevice.close(); | |||||
| } | |||||
| catch (IOException e) | |||||
| {} | |||||
| midiDevice = null; | |||||
| } | |||||
| return retval; | |||||
| } | |||||
| } | |||||
| public String getBluetoothAddress() | |||||
| { | |||||
| synchronized (MidiDeviceOpenTask.class) | |||||
| { | |||||
| if (midiDevice != null) | |||||
| { | |||||
| MidiDeviceInfo info = midiDevice.getInfo(); | |||||
| if (info.getType() == MidiDeviceInfo.TYPE_BLUETOOTH) | |||||
| { | |||||
| BluetoothDevice btDevice = (BluetoothDevice) info.getProperties().get (info.PROPERTY_BLUETOOTH_DEVICE); | |||||
| if (btDevice != null) | |||||
| return btDevice.getAddress(); | |||||
| } | |||||
| } | |||||
| } | |||||
| return ""; | |||||
| } | |||||
| public int getID() | |||||
| { | |||||
| return midiDevice.getInfo().getId(); | |||||
| } | |||||
| @Override | |||||
| public void run() | |||||
| { | |||||
| synchronized (MidiDeviceOpenTask.class) | |||||
| { | |||||
| if (owner != null && midiDevice != null) | |||||
| owner.onDeviceOpenedDelayed (midiDevice); | |||||
| } | |||||
| } | |||||
| private MidiDeviceManager owner; | |||||
| private MidiDevice midiDevice; | |||||
| } | |||||
| //============================================================================== | |||||
| public MidiDeviceManager() | public MidiDeviceManager() | ||||
| { | { | ||||
| manager = (MidiManager) getSystemService (MIDI_SERVICE); | manager = (MidiManager) getSystemService (MIDI_SERVICE); | ||||
| @@ -322,6 +393,8 @@ | |||||
| openPorts = new HashMap<MidiPortPath, WeakReference<JuceMidiPort>> (); | openPorts = new HashMap<MidiPortPath, WeakReference<JuceMidiPort>> (); | ||||
| midiDevices = new ArrayList<MidiDevice>(); | midiDevices = new ArrayList<MidiDevice>(); | ||||
| openTasks = new HashMap<Integer, MidiDeviceOpenTask>(); | |||||
| btDevicesPairing = new HashSet<String>(); | |||||
| MidiDeviceInfo[] foundDevices = manager.getDevices(); | MidiDeviceInfo[] foundDevices = manager.getDevices(); | ||||
| for (MidiDeviceInfo info : foundDevices) | for (MidiDeviceInfo info : foundDevices) | ||||
| @@ -334,6 +407,16 @@ | |||||
| { | { | ||||
| manager.unregisterDeviceCallback (this); | manager.unregisterDeviceCallback (this); | ||||
| synchronized (MidiDeviceManager.class) | |||||
| { | |||||
| btDevicesPairing.clear(); | |||||
| for (Integer deviceID : openTasks.keySet()) | |||||
| openTasks.get (deviceID).cancel(); | |||||
| openTasks = null; | |||||
| } | |||||
| for (MidiPortPath key : openPorts.keySet()) | for (MidiPortPath key : openPorts.keySet()) | ||||
| openPorts.get (key).get().close(); | openPorts.get (key).get().close(); | ||||
| @@ -428,21 +511,62 @@ | |||||
| return openMidiPortWithJuceIndex (index, 0, false); | return openMidiPortWithJuceIndex (index, 0, false); | ||||
| } | } | ||||
| public boolean isBluetoothDevicePaired (String address) | |||||
| /* 0: unpaired, 1: paired, 2: pairing */ | |||||
| public int getBluetoothDeviceStatus (String address) | |||||
| { | { | ||||
| return (findMidiDeviceForBluetoothAddress (address) != null); | |||||
| synchronized (MidiDeviceManager.class) | |||||
| { | |||||
| if (! address.isEmpty()) | |||||
| { | |||||
| if (findMidiDeviceForBluetoothAddress (address) != null) | |||||
| return 1; | |||||
| if (btDevicesPairing.contains (address)) | |||||
| return 2; | |||||
| if (findOpenTaskForBluetoothAddress (address) != null) | |||||
| return 2; | |||||
| } | |||||
| } | |||||
| return 0; | |||||
| } | } | ||||
| public boolean pairBluetoothDevice (BluetoothDevice btDevice) | public boolean pairBluetoothDevice (BluetoothDevice btDevice) | ||||
| { | { | ||||
| manager.openBluetoothDevice(btDevice, this, null); | |||||
| String btAddress = btDevice.getAddress(); | |||||
| if (btAddress.isEmpty()) | |||||
| return false; | |||||
| synchronized (MidiDeviceManager.class) | |||||
| { | |||||
| if (getBluetoothDeviceStatus (btAddress) != 0) | |||||
| return false; | |||||
| btDevicesPairing.add (btDevice.getAddress()); | |||||
| manager.openBluetoothDevice(btDevice, this, null); | |||||
| } | |||||
| return true; | return true; | ||||
| } | } | ||||
| public void unpairBluetoothDevice (String address) | public void unpairBluetoothDevice (String address) | ||||
| { | { | ||||
| if (address.isEmpty()) | |||||
| return; | |||||
| synchronized (MidiDeviceManager.class) | synchronized (MidiDeviceManager.class) | ||||
| { | { | ||||
| btDevicesPairing.remove (address); | |||||
| MidiDeviceOpenTask openTask = findOpenTaskForBluetoothAddress (address); | |||||
| if (openTask != null) | |||||
| { | |||||
| int deviceID = openTask.getID(); | |||||
| openTask.cancel(); | |||||
| openTasks.remove (deviceID); | |||||
| } | |||||
| MidiDevice midiDevice = findMidiDeviceForBluetoothAddress (address); | MidiDevice midiDevice = findMidiDeviceForBluetoothAddress (address); | ||||
| if (midiDevice != null) | if (midiDevice != null) | ||||
| { | { | ||||
| @@ -475,6 +599,18 @@ | |||||
| return null; | return null; | ||||
| } | } | ||||
| private MidiDeviceOpenTask findOpenTaskForBluetoothAddress (String address) | |||||
| { | |||||
| for (Integer deviceID : openTasks.keySet()) | |||||
| { | |||||
| MidiDeviceOpenTask openTask = openTasks.get (deviceID); | |||||
| if (openTask.getBluetoothAddress().equals (address)) | |||||
| return openTask; | |||||
| } | |||||
| return null; | |||||
| } | |||||
| public void removePort (MidiPortPath path) | public void removePort (MidiPortPath path) | ||||
| { | { | ||||
| openPorts.remove (path); | openPorts.remove (path); | ||||
| @@ -541,9 +677,68 @@ | |||||
| { | { | ||||
| synchronized (MidiDeviceManager.class) | synchronized (MidiDeviceManager.class) | ||||
| { | { | ||||
| // make sure it's not already there | |||||
| if (! midiDevices.contains(theDevice)) | |||||
| midiDevices.add (theDevice); | |||||
| MidiDeviceInfo info = theDevice.getInfo(); | |||||
| int deviceID = info.getId(); | |||||
| if (! openTasks.containsKey (deviceID)) | |||||
| { | |||||
| if (info.getType() == MidiDeviceInfo.TYPE_BLUETOOTH) | |||||
| { | |||||
| BluetoothDevice btDevice = (BluetoothDevice) info.getProperties().get (info.PROPERTY_BLUETOOTH_DEVICE); | |||||
| if (btDevice != null) | |||||
| { | |||||
| String btAddress = btDevice.getAddress(); | |||||
| if (btDevicesPairing.contains (btAddress)) | |||||
| { | |||||
| btDevicesPairing.remove (btAddress); | |||||
| } | |||||
| else | |||||
| { | |||||
| // unpair was called in the mean time | |||||
| try | |||||
| { | |||||
| theDevice.close(); | |||||
| } | |||||
| catch (IOException e) | |||||
| {} | |||||
| return; | |||||
| } | |||||
| } | |||||
| } | |||||
| MidiDeviceOpenTask openTask = new MidiDeviceOpenTask (this, theDevice); | |||||
| openTasks.put (deviceID, openTask); | |||||
| new java.util.Timer().schedule (openTask, 3000); | |||||
| } | |||||
| } | |||||
| } | |||||
| public void onDeviceOpenedDelayed (MidiDevice theDevice) | |||||
| { | |||||
| synchronized (MidiDeviceManager.class) | |||||
| { | |||||
| int deviceID = theDevice.getInfo().getId(); | |||||
| if (openTasks.containsKey (deviceID)) | |||||
| { | |||||
| if (! midiDevices.contains(theDevice)) | |||||
| { | |||||
| openTasks.remove (deviceID); | |||||
| midiDevices.add (theDevice); | |||||
| } | |||||
| } | |||||
| else | |||||
| { | |||||
| // unpair was called in the mean time | |||||
| try | |||||
| { | |||||
| theDevice.close(); | |||||
| } | |||||
| catch (IOException e) | |||||
| {} | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| @@ -630,6 +825,8 @@ | |||||
| } | } | ||||
| private MidiManager manager; | private MidiManager manager; | ||||
| private HashSet<String> btDevicesPairing; | |||||
| private HashMap<Integer, MidiDeviceOpenTask> openTasks; | |||||
| private ArrayList<MidiDevice> midiDevices; | private ArrayList<MidiDevice> midiDevices; | ||||
| private MidiDeviceInfo[] deviceInfos; | private MidiDeviceInfo[] deviceInfos; | ||||
| private HashMap<MidiPortPath, WeakReference<JuceMidiPort>> openPorts; | private HashMap<MidiPortPath, WeakReference<JuceMidiPort>> openPorts; | ||||
| @@ -16,9 +16,9 @@ | |||||
| return address; | return address; | ||||
| } | } | ||||
| public boolean isBluetoothDevicePaired (String address) | |||||
| public int getBluetoothDeviceStatus (String address) | |||||
| { | { | ||||
| return false; | |||||
| return 0; | |||||
| } | } | ||||
| public void startStopScan (boolean shouldStart) | public void startStopScan (boolean shouldStart) | ||||