Merge "USB MIDI: Create encoder per output port" into tm-dev
This commit is contained in:
@@ -84,7 +84,7 @@ public final class UsbDirectMidiDevice implements Closeable {
|
|||||||
private final Object mLock = new Object();
|
private final Object mLock = new Object();
|
||||||
private boolean mIsOpen;
|
private boolean mIsOpen;
|
||||||
|
|
||||||
private final UsbMidiPacketConverter mUsbMidiPacketConverter = new UsbMidiPacketConverter();
|
private UsbMidiPacketConverter mUsbMidiPacketConverter;
|
||||||
|
|
||||||
private final MidiDeviceServer.Callback mCallback = new MidiDeviceServer.Callback() {
|
private final MidiDeviceServer.Callback mCallback = new MidiDeviceServer.Callback() {
|
||||||
|
|
||||||
@@ -264,6 +264,11 @@ public final class UsbDirectMidiDevice implements Closeable {
|
|||||||
Log.d(TAG, "openLocked()");
|
Log.d(TAG, "openLocked()");
|
||||||
UsbManager manager = mContext.getSystemService(UsbManager.class);
|
UsbManager manager = mContext.getSystemService(UsbManager.class);
|
||||||
|
|
||||||
|
// Converting from raw MIDI to USB MIDI is not thread-safe.
|
||||||
|
// UsbMidiPacketConverter creates a converter from raw MIDI
|
||||||
|
// to USB MIDI for each USB output.
|
||||||
|
mUsbMidiPacketConverter = new UsbMidiPacketConverter(mNumOutputs);
|
||||||
|
|
||||||
mUsbDeviceConnections = new ArrayList<UsbDeviceConnection>(mUsbInterfaces.size());
|
mUsbDeviceConnections = new ArrayList<UsbDeviceConnection>(mUsbInterfaces.size());
|
||||||
mInputUsbEndpoints = new ArrayList<ArrayList<UsbEndpoint>>(mUsbInterfaces.size());
|
mInputUsbEndpoints = new ArrayList<ArrayList<UsbEndpoint>>(mUsbInterfaces.size());
|
||||||
mOutputUsbEndpoints = new ArrayList<ArrayList<UsbEndpoint>>(mUsbInterfaces.size());
|
mOutputUsbEndpoints = new ArrayList<ArrayList<UsbEndpoint>>(mUsbInterfaces.size());
|
||||||
@@ -415,7 +420,7 @@ public final class UsbDirectMidiDevice implements Closeable {
|
|||||||
} else {
|
} else {
|
||||||
convertedArray =
|
convertedArray =
|
||||||
mUsbMidiPacketConverter.rawMidiToUsbMidi(
|
mUsbMidiPacketConverter.rawMidiToUsbMidi(
|
||||||
event.data, event.count);
|
event.data, event.count, portFinal);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (DEBUG) {
|
if (DEBUG) {
|
||||||
@@ -518,6 +523,8 @@ public final class UsbDirectMidiDevice implements Closeable {
|
|||||||
mInputUsbEndpoints = null;
|
mInputUsbEndpoints = null;
|
||||||
mOutputUsbEndpoints = null;
|
mOutputUsbEndpoints = null;
|
||||||
|
|
||||||
|
mUsbMidiPacketConverter = null;
|
||||||
|
|
||||||
mIsOpen = false;
|
mIsOpen = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -74,8 +74,15 @@ public class UsbMidiPacketConverter {
|
|||||||
private static final byte SYSEX_START_EXCLUSIVE = (byte) 0xF0;
|
private static final byte SYSEX_START_EXCLUSIVE = (byte) 0xF0;
|
||||||
private static final byte SYSEX_END_EXCLUSIVE = (byte) 0xF7;
|
private static final byte SYSEX_END_EXCLUSIVE = (byte) 0xF7;
|
||||||
|
|
||||||
private UsbMidiEncoder mUsbMidiEncoder = new UsbMidiEncoder();
|
|
||||||
private UsbMidiDecoder mUsbMidiDecoder = new UsbMidiDecoder();
|
private UsbMidiDecoder mUsbMidiDecoder = new UsbMidiDecoder();
|
||||||
|
private UsbMidiEncoder[] mUsbMidiEncoders;
|
||||||
|
|
||||||
|
public UsbMidiPacketConverter(int numEncoders) {
|
||||||
|
mUsbMidiEncoders = new UsbMidiEncoder[numEncoders];
|
||||||
|
for (int i = 0; i < numEncoders; i++) {
|
||||||
|
mUsbMidiEncoders[i] = new UsbMidiEncoder();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Converts a USB MIDI array into a raw MIDI array.
|
* Converts a USB MIDI array into a raw MIDI array.
|
||||||
@@ -93,10 +100,11 @@ public class UsbMidiPacketConverter {
|
|||||||
*
|
*
|
||||||
* @param midiBytes the raw MIDI bytes to convert
|
* @param midiBytes the raw MIDI bytes to convert
|
||||||
* @param size the size of usbMidiBytes
|
* @param size the size of usbMidiBytes
|
||||||
|
* @param encoderId which encoder to use
|
||||||
* @return byte array of USB MIDI packets
|
* @return byte array of USB MIDI packets
|
||||||
*/
|
*/
|
||||||
public byte[] rawMidiToUsbMidi(byte[] midiBytes, int size) {
|
public byte[] rawMidiToUsbMidi(byte[] midiBytes, int size, int encoderId) {
|
||||||
return mUsbMidiEncoder.encode(midiBytes, size);
|
return mUsbMidiEncoders[encoderId].encode(midiBytes, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
private class UsbMidiDecoder {
|
private class UsbMidiDecoder {
|
||||||
|
|||||||
Reference in New Issue
Block a user