diff options
author | Mike Lockwood <lockwood@google.com> | 2015-03-05 00:00:31 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2015-03-05 00:01:33 +0000 |
commit | c623ec973b5e8d1fd2ff4162d5de8701a6490121 (patch) | |
tree | d78b361229b131434f900b11b35e4df635c351b3 /services/usb | |
parent | ef7aa4fc1901d5413bfa9a05f0a6c4f4d2d6575e (diff) | |
parent | 11fd96d6ff25bc1d710448eab545fe09da55a5f5 (diff) | |
download | frameworks_base-c623ec973b5e8d1fd2ff4162d5de8701a6490121.zip frameworks_base-c623ec973b5e8d1fd2ff4162d5de8701a6490121.tar.gz frameworks_base-c623ec973b5e8d1fd2ff4162d5de8701a6490121.tar.bz2 |
Merge "MidiManager: Virtual MIDI devices are now implemented as Services"
Diffstat (limited to 'services/usb')
-rw-r--r-- | services/usb/java/com/android/server/usb/UsbMidiDevice.java | 69 |
1 files changed, 39 insertions, 30 deletions
diff --git a/services/usb/java/com/android/server/usb/UsbMidiDevice.java b/services/usb/java/com/android/server/usb/UsbMidiDevice.java index e17abc0..a6e9677 100644 --- a/services/usb/java/com/android/server/usb/UsbMidiDevice.java +++ b/services/usb/java/com/android/server/usb/UsbMidiDevice.java @@ -19,6 +19,7 @@ package com.android.server.usb; import android.content.Context; import android.media.midi.MidiDeviceInfo; import android.media.midi.MidiDeviceServer; +import android.media.midi.MidiDispatcher; import android.media.midi.MidiManager; import android.media.midi.MidiPort; import android.media.midi.MidiReceiver; @@ -30,6 +31,8 @@ import android.system.OsConstants; import android.system.StructPollfd; import android.util.Log; +import libcore.io.IoUtils; + import java.io.Closeable; import java.io.FileDescriptor; import java.io.FileInputStream; @@ -39,8 +42,9 @@ import java.io.IOException; public final class UsbMidiDevice implements Closeable { private static final String TAG = "UsbMidiDevice"; - private final MidiDeviceServer mServer; - private final MidiReceiver[] mOutputPortReceivers; + private MidiDeviceServer mServer; + + private final MidiReceiver[] mInputPortReceivers; // for polling multiple FileDescriptors for MIDI events private final StructPollfd[] mPollFDs; @@ -50,12 +54,6 @@ public final class UsbMidiDevice implements Closeable { private final FileOutputStream[] mOutputStreams; public static UsbMidiDevice create(Context context, Bundle properties, int card, int device) { - MidiManager midiManager = (MidiManager)context.getSystemService(Context.MIDI_SERVICE); - if (midiManager == null) { - Log.e(TAG, "No MidiManager in UsbMidiDevice.create()"); - return null; - } - // FIXME - support devices with different number of input and output ports int subDevices = nativeGetSubdeviceCount(card, device); if (subDevices <= 0) { @@ -70,19 +68,16 @@ public final class UsbMidiDevice implements Closeable { return null; } - MidiDeviceServer server = midiManager.createDeviceServer(subDevices, subDevices, properties, - false, MidiDeviceInfo.TYPE_USB); - if (server == null) { + UsbMidiDevice midiDevice = new UsbMidiDevice(fileDescriptors, fileDescriptors); + if (!midiDevice.register(context, properties)) { + IoUtils.closeQuietly(midiDevice); Log.e(TAG, "createDeviceServer failed"); return null; } - - return new UsbMidiDevice(server, fileDescriptors, fileDescriptors); + return midiDevice; } - private UsbMidiDevice(MidiDeviceServer server, FileDescriptor[] inputFiles, - FileDescriptor[] outputFiles) { - mServer = server; + private UsbMidiDevice(FileDescriptor[] inputFiles, FileDescriptor[] outputFiles) { int inputCount = inputFiles.length; int outputCount = outputFiles.length; @@ -102,26 +97,36 @@ public final class UsbMidiDevice implements Closeable { mOutputStreams[i] = new FileOutputStream(outputFiles[i]); } - mOutputPortReceivers = new MidiReceiver[outputCount]; - for (int port = 0; port < outputCount; port++) { - mOutputPortReceivers[port] = server.openOutputPortReceiver(port); - } - + mInputPortReceivers = new MidiReceiver[inputCount]; for (int port = 0; port < inputCount; port++) { - final int portNumberF = port; - MidiReceiver receiver = new MidiReceiver() { - + final int portF = port; + mInputPortReceivers[port] = new MidiReceiver() { @Override public void post(byte[] data, int offset, int count, long timestamp) throws IOException { // FIXME - timestamps are ignored, future posting not supported yet. - mOutputStreams[portNumberF].write(data, offset, count); + mOutputStreams[portF].write(data, offset, count); } }; - MidiSender sender = server.openInputPortSender(port); - sender.connect(receiver); } + } + private boolean register(Context context, Bundle properties) { + MidiManager midiManager = (MidiManager)context.getSystemService(Context.MIDI_SERVICE); + if (midiManager == null) { + Log.e(TAG, "No MidiManager in UsbMidiDevice.create()"); + return false; + } + + int outputCount = mOutputStreams.length; + mServer = midiManager.createDeviceServer(mInputPortReceivers, outputCount, + properties, MidiDeviceInfo.TYPE_USB); + if (mServer == null) { + return false; + } + final MidiReceiver[] outputReceivers = mServer.getOutputPortReceivers(); + + // FIXME can we only run this when we have a dispatcher that has listeners? new Thread() { @Override public void run() { @@ -137,8 +142,8 @@ public final class UsbMidiDevice implements Closeable { pfd.revents = 0; int count = mInputStreams[index].read(buffer); - mOutputPortReceivers[index].post(buffer, 0, count, - System.nanoTime()); + long timestamp = System.nanoTime(); + outputReceivers[index].post(buffer, 0, count, timestamp); } else if ((pfd.revents & (OsConstants.POLLERR | OsConstants.POLLHUP)) != 0) { done = true; @@ -155,11 +160,15 @@ public final class UsbMidiDevice implements Closeable { } } }.start(); + + return true; } @Override public void close() throws IOException { - mServer.close(); + if (mServer != null) { + mServer.close(); + } for (int i = 0; i < mInputStreams.length; i++) { mInputStreams[i].close(); |