/*
* 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 <stdarg.h>
#include <stdint.h>
#include <sys/types.h>
#include <utils/Errors.h>
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_ */