Home | History | Annotate | Download | only in midi
      1 /*
      2  * Copyright (C) 2017 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #ifndef ANDROID_MEDIA_MIDI_H_
     18 #define ANDROID_MEDIA_MIDI_H_
     19 
     20 #include <stdarg.h>
     21 #include <stdint.h>
     22 #include <sys/types.h>
     23 
     24 #include <utils/Errors.h>
     25 
     26 using android::status_t;
     27 
     28 #ifdef __cplusplus
     29 extern "C" {
     30 #endif
     31 
     32 struct AMIDI_Device;
     33 struct AMIDI_InputPort;
     34 struct AMIDI_OutputPort;
     35 
     36 #define AMIDI_INVALID_HANDLE NULL
     37 
     38 enum {
     39     AMIDI_OPCODE_DATA = 1,
     40     AMIDI_OPCODE_FLUSH = 2,
     41     AMIDI_PACKET_SIZE = 1024,  /* !!! Currently MidiPortImpl.MAX_PACKET_SIZE !!! */
     42     AMIDI_PACKET_OVERHEAD = 9,
     43     AMIDI_BUFFER_SIZE = AMIDI_PACKET_SIZE - AMIDI_PACKET_OVERHEAD
     44             /* !!! TBD, currently MidiPortImpl.MAX_PACKET_DATA_SIZE !!! */
     45 };
     46 
     47 typedef struct {
     48     uint32_t    opcode;
     49     uint8_t     buffer[AMIDI_BUFFER_SIZE];
     50     size_t      len;
     51     int64_t     timestamp;
     52 } AMIDI_Message;
     53 
     54 enum {
     55     AMIDI_DEVICE_TYPE_USB = 1,
     56     AMIDI_DEVICE_TYPE_VIRTUAL = 2,
     57     AMIDI_DEVICE_TYPE_BLUETOOTH = 3
     58 };
     59 
     60 typedef struct {
     61     int32_t type;
     62     int32_t uid;
     63     int32_t isPrivate;
     64     int32_t inputPortCount;
     65     int32_t outputPortCount;
     66 } AMIDI_DeviceInfo;
     67 
     68 /*
     69  * Device API
     70  */
     71 /*
     72  * Retrieves information for the native MIDI device.
     73  *
     74  * device           The Native API token for the device.
     75  * deviceInfoPtr    Receives the associated device info.
     76  *
     77  * Returns OK or a (negative) error code.
     78  */
     79 status_t AMIDI_getDeviceInfo(AMIDI_Device *device, AMIDI_DeviceInfo *deviceInfoPtr);
     80 
     81 /*
     82  * API for receiving data from the Output port of a device.
     83  */
     84 /*
     85  * Opens the output port.
     86  *
     87  * device           Identifies the device.
     88  * portNumber       Specifies the zero-based port index on the device to open.
     89  * outputPortPtr    Receives the native API port identifier of the opened port.
     90  *
     91  * Returns OK, or a (negative) error code.
     92  */
     93 status_t AMIDI_openOutputPort(AMIDI_Device *device, int portNumber,
     94         AMIDI_OutputPort **outputPortPtr);
     95 
     96 /*
     97  * Receives any pending MIDI messages (up to the specified maximum number of messages).
     98  *
     99  * outputPort   Identifies the port to receive messages from.
    100  * messages     Points to an array (size maxMessages) to receive the MIDI messages.
    101  * maxMessages  The number of messages allocated in the messages array.
    102  *
    103  * Returns the number of messages received, or a (negative) error code.
    104  */
    105 ssize_t AMIDI_receive(AMIDI_OutputPort *outputPort, AMIDI_Message *messages, ssize_t maxMessages);
    106 
    107 /*
    108  * Closes the output port.
    109  *
    110  * outputPort   The native API port identifier of the port.
    111  *
    112  * Returns OK, or a (negative) error code.
    113  */
    114 status_t AMIDI_closeOutputPort(AMIDI_OutputPort *outputPort);
    115 
    116 /*
    117  * API for sending data to the Input port of a device.
    118  */
    119 /*
    120  * Opens the input port.
    121  *
    122  * device           Identifies the device.
    123  * portNumber       Specifies the zero-based port index on the device to open.
    124  * inputPortPtr     Receives the native API port identifier of the opened port.
    125  *
    126  * Returns OK, or a (negative) error code.
    127  */
    128 status_t AMIDI_openInputPort(AMIDI_Device *device, int portNumber, AMIDI_InputPort **inputPortPtr);
    129 
    130 /*
    131  * Returns the maximum number of bytes that can be received in a single MIDI message.
    132  */
    133 ssize_t AMIDI_getMaxMessageSizeInBytes(AMIDI_InputPort *inputPort);
    134 
    135 /*
    136  * Sends data to the specified input port.
    137  *
    138  * inputPort    The native API identifier of the port to send data to.
    139  * buffer       Points to the array of bytes containing the data to send.
    140  * numBytes     Specifies the number of bytes to write.
    141  *
    142  * Returns  The number of bytes sent or a (negative) error code.
    143  */
    144 ssize_t AMIDI_send(AMIDI_InputPort *inputPort, uint8_t *buffer, ssize_t numBytes);
    145 
    146 /*
    147  * Sends data to the specified input port with a timestamp.
    148  *
    149  * inputPort    The native API identifier of the port to send data to.
    150  * buffer       Points to the array of bytes containing the data to send.
    151  * numBytes     Specifies the number of bytes to write.
    152  * timestamp    The time stamp to associate with the sent data.
    153  *
    154  * Returns  The number of bytes sent or a (negative) error code.
    155  */
    156 ssize_t AMIDI_sendWithTimestamp(AMIDI_InputPort *inputPort, uint8_t *buffer,
    157         ssize_t numBytes, int64_t timestamp);
    158 
    159 /*
    160  * Sends a message with a 'MIDI flush command code' to the specified port.
    161  *
    162  * inputPort    The native API identifier of the port to send the flush message to.
    163  *
    164  * Returns OK, or a (negative) error code.
    165  */
    166 status_t AMIDI_flush(AMIDI_InputPort *inputPort);
    167 
    168 /*
    169  * Closes the input port.
    170  *
    171  * inputPort   The native API port identifier of the port.
    172  *
    173  *
    174  * Returns OK, or a (negative) error code.
    175  */
    176 status_t AMIDI_closeInputPort(AMIDI_InputPort *inputPort);
    177 
    178 #ifdef __cplusplus
    179 }
    180 #endif
    181 
    182 #endif /* ANDROID_MEDIA_MIDI_H_ */
    183