diff options
| author | Mike Lockwood <lockwood@google.com> | 2015-03-24 08:27:11 -0700 |
|---|---|---|
| committer | Mike Lockwood <lockwood@google.com> | 2015-04-09 11:49:51 -0700 |
| commit | f0a41d1c591193fbe02c9ddbaf24c79af4da9972 (patch) | |
| tree | ddb94c31f0fe87dae3c4413609a5b752c3a197d8 /media/java/android | |
| parent | b6f50d357bd3d4d296be6bb047f5ce93a79cbca1 (diff) | |
| download | frameworks_base-f0a41d1c591193fbe02c9ddbaf24c79af4da9972.zip frameworks_base-f0a41d1c591193fbe02c9ddbaf24c79af4da9972.tar.gz frameworks_base-f0a41d1c591193fbe02c9ddbaf24c79af4da9972.tar.bz2 | |
Add support for Bluetooth MIDI devices
The Bluetooth MIDI devices are handled in the BluetoothMidiService APK.
Apps wishing to connect to Bluetooth MIDI devices call MidiManager.openBluetoothDevice()
which binds to BluetoothMidiService in a similar way as virtual devices are implemented.
Change-Id: Ie3fbca757928fd7873a009f9bf9e0ce0be487da6
Diffstat (limited to 'media/java/android')
| -rw-r--r-- | media/java/android/media/midi/IMidiDeviceServer.aidl | 3 | ||||
| -rw-r--r-- | media/java/android/media/midi/MidiDeviceServer.java | 9 | ||||
| -rw-r--r-- | media/java/android/media/midi/MidiManager.java | 92 |
3 files changed, 103 insertions, 1 deletions
diff --git a/media/java/android/media/midi/IMidiDeviceServer.aidl b/media/java/android/media/midi/IMidiDeviceServer.aidl index 642078a..96d12fd 100644 --- a/media/java/android/media/midi/IMidiDeviceServer.aidl +++ b/media/java/android/media/midi/IMidiDeviceServer.aidl @@ -16,6 +16,7 @@ package android.media.midi; +import android.media.midi.MidiDeviceInfo; import android.os.ParcelFileDescriptor; /** @hide */ @@ -27,4 +28,6 @@ interface IMidiDeviceServer // connects the input port pfd to the specified output port void connectPorts(IBinder token, in ParcelFileDescriptor pfd, int outputPortNumber); + + MidiDeviceInfo getDeviceInfo(); } diff --git a/media/java/android/media/midi/MidiDeviceServer.java b/media/java/android/media/midi/MidiDeviceServer.java index bc85f92..a316a44 100644 --- a/media/java/android/media/midi/MidiDeviceServer.java +++ b/media/java/android/media/midi/MidiDeviceServer.java @@ -252,6 +252,11 @@ public final class MidiDeviceServer implements Closeable { mPortClients.put(token, client); } } + + @Override + public MidiDeviceInfo getDeviceInfo() { + return mDeviceInfo; + } }; /* package */ MidiDeviceServer(IMidiManager midiManager, MidiReceiver[] inputPortReceivers, @@ -279,6 +284,10 @@ public final class MidiDeviceServer implements Closeable { return mServer; } + public IBinder asBinder() { + return mServer.asBinder(); + } + /* package */ void setDeviceInfo(MidiDeviceInfo deviceInfo) { if (mDeviceInfo != null) { throw new IllegalStateException("setDeviceInfo should only be called once"); diff --git a/media/java/android/media/midi/MidiManager.java b/media/java/android/media/midi/MidiManager.java index d62b2dc..0ba1744 100644 --- a/media/java/android/media/midi/MidiManager.java +++ b/media/java/android/media/midi/MidiManager.java @@ -16,6 +16,7 @@ package android.media.midi; +import android.bluetooth.BluetoothDevice; import android.content.ComponentName; import android.content.Context; import android.content.Intent; @@ -42,6 +43,24 @@ import java.util.HashMap; public final class MidiManager { private static final String TAG = "MidiManager"; + /** + * Intent for starting BluetoothMidiService + * @hide + */ + public static final String BLUETOOTH_MIDI_SERVICE_INTENT = + "android.media.midi.BluetoothMidiService"; + + /** + * BluetoothMidiService package name + */ + private static final String BLUETOOTH_MIDI_SERVICE_PACKAGE = "com.android.bluetoothmidiservice"; + + /** + * BluetoothMidiService class name + */ + private static final String BLUETOOTH_MIDI_SERVICE_CLASS = + "com.android.bluetoothmidiservice.BluetoothMidiService"; + private final Context mContext; private final IMidiManager mService; private final IBinder mToken = new Binder(); @@ -145,6 +164,19 @@ public final class MidiManager { } /** + * Callback class used for receiving the results of {@link #openBluetoothDevice} + */ + abstract public static class BluetoothOpenCallback { + /** + * Called to respond to a {@link #openBluetoothDevice} request + * + * @param bluetoothDevice the {@link android.bluetooth.BluetoothDevice} to open + * @param device a {@link MidiDevice} for opened device, or null if opening failed + */ + abstract public void onDeviceOpened(BluetoothDevice bluetoothDevice, MidiDevice device); + } + + /** * @hide */ public MidiManager(Context context, IMidiManager service) { @@ -214,6 +246,19 @@ public final class MidiManager { } } + private void sendBluetoothDeviceResponse(final BluetoothDevice bluetoothDevice, + final MidiDevice device, final BluetoothOpenCallback callback, Handler handler) { + if (handler != null) { + handler.post(new Runnable() { + @Override public void run() { + callback.onDeviceOpened(bluetoothDevice, device); + } + }); + } else { + callback.onDeviceOpened(bluetoothDevice, device); + } + } + /** * Opens a MIDI device for reading and writing. * @@ -260,7 +305,7 @@ public final class MidiManager { // return immediately to avoid calling sendOpenDeviceResponse below return; } else { - Log.e(TAG, "Unable to bind service: " + intent); + Log.e(TAG, "Unable to bind service: " + intent); } } } else { @@ -272,6 +317,51 @@ public final class MidiManager { sendOpenDeviceResponse(deviceInfo, device, callback, handler); } + /** + * Opens a Bluetooth MIDI device for reading and writing. + * + * @param bluetoothDevice a {@link android.bluetooth.BluetoothDevice} to open as a MIDI device + * @param callback a {@link MidiManager.BluetoothOpenCallback} to be called to receive the + * result + * @param handler the {@link android.os.Handler Handler} that will be used for delivering + * the result. If handler is null, then the thread used for the + * callback is unspecified. + */ + public void openBluetoothDevice(final BluetoothDevice bluetoothDevice, + final BluetoothOpenCallback callback, final Handler handler) { + Intent intent = new Intent(BLUETOOTH_MIDI_SERVICE_INTENT); + intent.setComponent(new ComponentName(BLUETOOTH_MIDI_SERVICE_PACKAGE, + BLUETOOTH_MIDI_SERVICE_CLASS)); + intent.putExtra("device", bluetoothDevice); + if (!mContext.bindService(intent, + new ServiceConnection() { + @Override + public void onServiceConnected(ComponentName name, IBinder binder) { + IMidiDeviceServer server = + IMidiDeviceServer.Stub.asInterface(binder); + try { + // fetch MidiDeviceInfo from the server + MidiDeviceInfo deviceInfo = server.getDeviceInfo(); + MidiDevice device = new MidiDevice(deviceInfo, server, mContext, this); + sendBluetoothDeviceResponse(bluetoothDevice, device, callback, handler); + } catch (RemoteException e) { + Log.e(TAG, "remote exception in onServiceConnected"); + sendBluetoothDeviceResponse(bluetoothDevice, null, callback, handler); + } + } + + @Override + public void onServiceDisconnected(ComponentName name) { + // FIXME - anything to do here? + } + }, + Context.BIND_AUTO_CREATE)) + { + Log.e(TAG, "Unable to bind service: " + intent); + sendBluetoothDeviceResponse(bluetoothDevice, null, callback, handler); + } + } + /** @hide */ public MidiDeviceServer createDeviceServer(MidiReceiver[] inputPortReceivers, int numOutputPorts, String[] inputPortNames, String[] outputPortNames, |
