/* * Copyright (C) 2017 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef ANDROID_MEDIA_MIDI_H_ #define ANDROID_MEDIA_MIDI_H_ #include #include #include #include using android::status_t; #ifdef __cplusplus extern "C" { #endif struct AMIDI_Device; struct AMIDI_InputPort; struct AMIDI_OutputPort; #define AMIDI_INVALID_HANDLE NULL enum { AMIDI_OPCODE_DATA = 1, AMIDI_OPCODE_FLUSH = 2, AMIDI_PACKET_SIZE = 1024, /* !!! Currently MidiPortImpl.MAX_PACKET_SIZE !!! */ AMIDI_PACKET_OVERHEAD = 9, AMIDI_BUFFER_SIZE = AMIDI_PACKET_SIZE - AMIDI_PACKET_OVERHEAD /* !!! TBD, currently MidiPortImpl.MAX_PACKET_DATA_SIZE !!! */ }; typedef struct { uint32_t opcode; uint8_t buffer[AMIDI_BUFFER_SIZE]; size_t len; int64_t timestamp; } AMIDI_Message; enum { AMIDI_DEVICE_TYPE_USB = 1, AMIDI_DEVICE_TYPE_VIRTUAL = 2, AMIDI_DEVICE_TYPE_BLUETOOTH = 3 }; typedef struct { int32_t type; int32_t uid; int32_t isPrivate; int32_t inputPortCount; int32_t outputPortCount; } AMIDI_DeviceInfo; /* * Device API */ /* * Retrieves information for the native MIDI device. * * device The Native API token for the device. * deviceInfoPtr Receives the associated device info. * * Returns OK or a (negative) error code. */ status_t AMIDI_getDeviceInfo(AMIDI_Device *device, AMIDI_DeviceInfo *deviceInfoPtr); /* * API for receiving data from the Output port of a device. */ /* * Opens the output port. * * device Identifies the device. * portNumber Specifies the zero-based port index on the device to open. * outputPortPtr Receives the native API port identifier of the opened port. * * Returns OK, or a (negative) error code. */ status_t AMIDI_openOutputPort(AMIDI_Device *device, int portNumber, AMIDI_OutputPort **outputPortPtr); /* * Receives any pending MIDI messages (up to the specified maximum number of messages). * * outputPort Identifies the port to receive messages from. * messages Points to an array (size maxMessages) to receive the MIDI messages. * maxMessages The number of messages allocated in the messages array. * * Returns the number of messages received, or a (negative) error code. */ ssize_t AMIDI_receive(AMIDI_OutputPort *outputPort, AMIDI_Message *messages, ssize_t maxMessages); /* * Closes the output port. * * outputPort The native API port identifier of the port. * * Returns OK, or a (negative) error code. */ status_t AMIDI_closeOutputPort(AMIDI_OutputPort *outputPort); /* * API for sending data to the Input port of a device. */ /* * Opens the input port. * * device Identifies the device. * portNumber Specifies the zero-based port index on the device to open. * inputPortPtr Receives the native API port identifier of the opened port. * * Returns OK, or a (negative) error code. */ status_t AMIDI_openInputPort(AMIDI_Device *device, int portNumber, AMIDI_InputPort **inputPortPtr); /* * Returns the maximum number of bytes that can be received in a single MIDI message. */ ssize_t AMIDI_getMaxMessageSizeInBytes(AMIDI_InputPort *inputPort); /* * Sends data to the specified input port. * * inputPort The native API identifier of the port to send data to. * buffer Points to the array of bytes containing the data to send. * numBytes Specifies the number of bytes to write. * * Returns The number of bytes sent or a (negative) error code. */ ssize_t AMIDI_send(AMIDI_InputPort *inputPort, uint8_t *buffer, ssize_t numBytes); /* * Sends data to the specified input port with a timestamp. * * inputPort The native API identifier of the port to send data to. * buffer Points to the array of bytes containing the data to send. * numBytes Specifies the number of bytes to write. * timestamp The time stamp to associate with the sent data. * * Returns The number of bytes sent or a (negative) error code. */ ssize_t AMIDI_sendWithTimestamp(AMIDI_InputPort *inputPort, uint8_t *buffer, ssize_t numBytes, int64_t timestamp); /* * Sends a message with a 'MIDI flush command code' to the specified port. * * inputPort The native API identifier of the port to send the flush message to. * * Returns OK, or a (negative) error code. */ status_t AMIDI_flush(AMIDI_InputPort *inputPort); /* * Closes the input port. * * inputPort The native API port identifier of the port. * * * Returns OK, or a (negative) error code. */ status_t AMIDI_closeInputPort(AMIDI_InputPort *inputPort); #ifdef __cplusplus } #endif #endif /* ANDROID_MEDIA_MIDI_H_ */