blob: 46d7e4df03ad9c21c4ab0f26c59d781a2b3f5a03 [file] [log] [blame]
// Copyright 2015 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.midi;
import android.media.midi.MidiDevice;
import android.media.midi.MidiDeviceInfo;
import org.jni_zero.CalledByNative;
import org.jni_zero.JNINamespace;
@JNINamespace("midi")
/** A class implementing midi::MidiDeviceAndroid functionality. */
class MidiDeviceAndroid {
/** The underlying device. */
private final MidiDevice mDevice;
/** The input ports in the device. */
private final MidiInputPortAndroid[] mInputPorts;
/** The output ports in the device. */
private final MidiOutputPortAndroid[] mOutputPorts;
/** True when the device is open. */
private boolean mIsOpen;
/**
* constructor
* @param device the underlying device
*/
MidiDeviceAndroid(MidiDevice device) {
mIsOpen = true;
mDevice = device;
// Note we use "input" and "output" in the Web MIDI manner.
mOutputPorts = new MidiOutputPortAndroid[getInfo().getInputPortCount()];
for (int i = 0; i < mOutputPorts.length; ++i) {
mOutputPorts[i] = new MidiOutputPortAndroid(device, i);
}
mInputPorts = new MidiInputPortAndroid[getInfo().getOutputPortCount()];
for (int i = 0; i < mInputPorts.length; ++i) {
mInputPorts[i] = new MidiInputPortAndroid(device, i);
}
}
/** Returns true when the device is open. */
boolean isOpen() {
return mIsOpen;
}
/** Closes the device. */
void close() {
mIsOpen = false;
for (MidiInputPortAndroid port : mInputPorts) {
port.close();
}
for (MidiOutputPortAndroid port : mOutputPorts) {
port.close();
}
}
/** Returns the underlying device. */
MidiDevice getDevice() {
return mDevice;
}
/** Returns the underlying device information. */
MidiDeviceInfo getInfo() {
return mDevice.getInfo();
}
/** Returns the manufacturer name. */
@CalledByNative
String getManufacturer() {
return getProperty(MidiDeviceInfo.PROPERTY_MANUFACTURER);
}
/** Returns the product name. */
@CalledByNative
String getProduct() {
String product = getProperty(MidiDeviceInfo.PROPERTY_PRODUCT);
// TODO(crbug.com/636455): Following code to use PROPERTY_NAME is a
// workaround for a BLE MIDI device issue that Android does not provide
// information for PROPERTY_MANUFACTURER, PROPERTY_PRODUCT, and
// PROPERTY_VERSION. Confirmed on Android M and N.
// See discussion at http://crbug.com/636455 and http://b/32259464.
if (product == null || product.isEmpty()) {
return getProperty(MidiDeviceInfo.PROPERTY_NAME);
}
return product;
}
/** Returns the version string. */
@CalledByNative
String getVersion() {
return getProperty(MidiDeviceInfo.PROPERTY_VERSION);
}
/** Returns the associated input ports. */
@CalledByNative
MidiInputPortAndroid[] getInputPorts() {
return mInputPorts;
}
/** Returns the associated output ports. */
@CalledByNative
MidiOutputPortAndroid[] getOutputPorts() {
return mOutputPorts;
}
private String getProperty(String name) {
return mDevice.getInfo().getProperties().getString(name);
}
}