chromium/media/midi/java/src/org/chromium/midi/MidiOutputPortAndroid.java

// 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.MidiInputPort;

import org.jni_zero.CalledByNative;
import org.jni_zero.JNINamespace;

import org.chromium.base.Log;

import java.io.IOException;

/** A class implementing midi::MidiOutputPortAndroid functionality. */
// Note "OutputPort" is named in the Web MIDI manner. It corresponds to MidiInputPort class in the
// Android API.
@JNINamespace("midi")
class MidiOutputPortAndroid {
    /** The underlying port. */
    private MidiInputPort mPort;

    /** The device this port belongs to. */
    private final MidiDevice mDevice;

    /** The index of the port in the associated device. */
    private final int mIndex;

    private static final String TAG = "midi";

    /**
     * constructor
     * @param device The device this port belongs to.
     * @param index The index of the port in the associated device.
     */
    MidiOutputPortAndroid(MidiDevice device, int index) {
        mDevice = device;
        mIndex = index;
    }

    /**
     * Opens this port.
     * @return true when the operation succeeds or the port is already open.
     */
    @CalledByNative
    boolean open() {
        if (mPort != null) {
            return true;
        }
        mPort = mDevice.openInputPort(mIndex);
        return mPort != null;
    }

    /** Sends the data to the underlying output port. */
    @CalledByNative
    void send(byte[] bs) {
        if (mPort == null) {
            return;
        }
        try {
            mPort.send(bs, 0, bs.length);
        } catch (IOException e) {
            // We can do nothing here. Just ignore the error.
            Log.e(TAG, "MidiOutputPortAndroid.send: " + e);
        }
    }

    /** Closes the port. */
    @CalledByNative
    void close() {
        if (mPort == null) {
            return;
        }
        try {
            mPort.close();
        } catch (IOException e) {
            // We can do nothing here. Just ignore the error.
        }
        mPort = null;
    }
}