1 /* 2 * Copyright (C) 2018 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 * @addtogroup Midi 18 * @{ 19 */ 20 21 /** 22 * @file AMidi.h 23 */ 24 25 #ifndef ANDROID_MEDIA_AMIDI_H_ 26 #define ANDROID_MEDIA_AMIDI_H_ 27 28 #include <stdarg.h> 29 #include <stdint.h> 30 #include <sys/types.h> 31 32 #include <jni.h> 33 34 #include <media/NdkMediaError.h> 35 36 #ifdef __cplusplus 37 extern "C" { 38 #endif 39 40 typedef struct AMidiDevice AMidiDevice; 41 typedef struct AMidiInputPort AMidiInputPort; 42 typedef struct AMidiOutputPort AMidiOutputPort; 43 44 #define AMIDI_API __attribute__((visibility("default"))) 45 46 /* 47 * Message Op Codes. Used to parse MIDI data packets 48 */ 49 enum { 50 AMIDI_OPCODE_DATA = 1, /* The MIDI packet contains normal MIDI data */ 51 AMIDI_OPCODE_FLUSH = 2, /* The MIDI packet contains just a MIDI FLUSH command. */ 52 /* Forces the send of any pending MIDI data. */ 53 }; 54 55 /* 56 * Type IDs for various MIDI devices. 57 */ 58 enum { 59 AMIDI_DEVICE_TYPE_USB = 1, /* A MIDI device connected to the Android USB port */ 60 AMIDI_DEVICE_TYPE_VIRTUAL = 2, /* A software object implementing MidiDeviceService */ 61 AMIDI_DEVICE_TYPE_BLUETOOTH = 3 /* A MIDI device connected via BlueTooth */ 62 }; 63 64 /* 65 * Device API 66 */ 67 /** 68 * Connects a native Midi Device object to the associated Java MidiDevice object. Use this 69 * AMidiDevice to access the rest of the native MIDI API. Use AMidiDevice_release() to 70 * disconnect from the Java object when not being used any more. 71 * 72 * @param env Points to the Java Environment. 73 * @param midiDeviceObj The Java MidiDevice Object. 74 * @param outDevicePtrPtr Points to the pointer to receive the AMidiDevice 75 * 76 * @return AMEDIA_OK on success, or a negative error value: 77 * @see AMEDIA_ERROR_INVALID_OBJECT - the midiDeviceObj 78 * is null or already connected to a native AMidiDevice 79 * @see AMEDIA_ERROR_UNKNOWN - an unknown error occurred. 80 */ 81 media_status_t AMIDI_API AMidiDevice_fromJava( 82 JNIEnv *env, jobject midiDeviceObj, AMidiDevice **outDevicePtrPtr) __INTRODUCED_IN(29); 83 84 /** 85 * Disconnects the native Midi Device Object from the associated Java MidiDevice object. 86 * 87 * @param midiDevice Points to the native AMIDI_MidiDevice. 88 * 89 * @return AMEDIA_OK on success, 90 * or a negative error value: 91 * @see AMEDIA_ERROR_INVALID_PARAMETER - the device parameter is NULL. 92 * @see AMEDIA_ERROR_INVALID_OBJECT - the device is not consistent with the associated Java MidiDevice. 93 * @see AMEDIA_ERROR_INVALID_OBJECT - the JNI interface initialization to the associated java MidiDevice failed. 94 * @see AMEDIA_ERROR_UNKNOWN - couldn't retrieve the device info. 95 */ 96 media_status_t AMIDI_API AMidiDevice_release(const AMidiDevice *midiDevice) __INTRODUCED_IN(29); 97 98 /** 99 * Gets the MIDI device type. 100 * 101 * @param device Specifies the MIDI device. 102 * 103 * @return The identifier of the MIDI device type: 104 * AMIDI_DEVICE_TYPE_USB 105 * AMIDI_DEVICE_TYPE_VIRTUAL 106 * AMIDI_DEVICE_TYPE_BLUETOOTH 107 * or a negative error value: 108 * @see AMEDIA_ERROR_INVALID_PARAMETER - the device parameter is NULL. 109 * @see AMEDIA_ERROR_UNKNOWN - Unknown error. 110 */ 111 int32_t AMIDI_API AMidiDevice_getType(const AMidiDevice *device) __INTRODUCED_IN(29); 112 113 /** 114 * Gets the number of input (sending) ports available on the specified MIDI device. 115 * 116 * @param device Specifies the MIDI device. 117 * 118 * @return If successful, returns the number of MIDI input (sending) ports available on the 119 * device. If an error occurs, returns a negative value indicating the error: 120 * @see AMEDIA_ERROR_INVALID_PARAMETER - the device parameter is NULL. 121 * @see AMEDIA_ERROR_UNKNOWN - couldn't retrieve the device info. 122 */ 123 ssize_t AMIDI_API AMidiDevice_getNumInputPorts(const AMidiDevice *device) __INTRODUCED_IN(29); 124 125 /** 126 * Gets the number of output (receiving) ports available on the specified MIDI device. 127 * 128 * @param device Specifies the MIDI device. 129 * 130 * @return If successful, returns the number of MIDI output (receiving) ports available on the 131 * device. If an error occurs, returns a negative value indicating the error: 132 * @see AMEDIA_ERROR_INVALID_PARAMETER - the device parameter is NULL. 133 * @see AMEDIA_ERROR_UNKNOWN - couldn't retrieve the device info. 134 */ 135 ssize_t AMIDI_API AMidiDevice_getNumOutputPorts(const AMidiDevice *device) __INTRODUCED_IN(29); 136 137 /* 138 * API for receiving data from the Output port of a device. 139 */ 140 /** 141 * Opens the output port so that the client can receive data from it. The port remains open and 142 * valid until AMidiOutputPort_close() is called for the returned AMidiOutputPort. 143 * 144 * @param device Specifies the MIDI device. 145 * @param portNumber Specifies the zero-based port index on the device to open. This value ranges 146 * between 0 and one less than the number of output ports reported by the 147 * AMidiDevice_getNumOutputPorts function. 148 * @param outOutputPortPtr Receives the native API port identifier of the opened port. 149 * 150 * @return AMEDIA_OK, or a negative error code: 151 * @see AMEDIA_ERROR_UNKNOWN - Unknown Error. 152 */ 153 media_status_t AMIDI_API AMidiOutputPort_open(const AMidiDevice *device, int32_t portNumber, 154 AMidiOutputPort **outOutputPortPtr) __INTRODUCED_IN(29); 155 156 /** 157 * Closes the output port. 158 * 159 * @param outputPort The native API port identifier of the port. 160 */ 161 void AMIDI_API AMidiOutputPort_close(const AMidiOutputPort *outputPort) __INTRODUCED_IN(29); 162 163 /** 164 * Receives the next pending MIDI message. To retrieve all pending messages, the client should 165 * repeatedly call this method until it returns 0. 166 * 167 * Note that this is a non-blocking call. If there are no Midi messages are available, the function 168 * returns 0 immediately (for 0 messages received). 169 * 170 * @param outputPort Identifies the port to receive messages from. 171 * @param opcodePtr Receives the message Op Code. 172 * @param buffer Points to the buffer to receive the message data bytes. 173 * @param maxBytes Specifies the size of the buffer pointed to by the buffer parameter. 174 * @param numBytesReceivedPtr On exit, receives the actual number of bytes stored in buffer. 175 * @param outTimestampPtr If non-NULL, receives the timestamp associated with the message. 176 * (the current value of the running Java Virtual Machine's high-resolution time source, 177 * in nanoseconds) 178 * @return the number of messages received (either 0 or 1), or a negative error code: 179 * @see AMEDIA_ERROR_UNKNOWN - Unknown Error. 180 */ 181 ssize_t AMIDI_API AMidiOutputPort_receive(const AMidiOutputPort *outputPort, int32_t *opcodePtr, 182 uint8_t *buffer, size_t maxBytes, size_t* numBytesReceivedPtr, int64_t *outTimestampPtr) __INTRODUCED_IN(29); 183 184 /* 185 * API for sending data to the Input port of a device. 186 */ 187 /** 188 * Opens the input port so that the client can send data to it. The port remains open and 189 * valid until AMidiInputPort_close() is called for the returned AMidiInputPort. 190 * 191 * @param device Specifies the MIDI device. 192 * @param portNumber Specifies the zero-based port index on the device to open. This value ranges 193 * between 0 and one less than the number of input ports reported by the 194 * AMidiDevice_getNumInputPorts() function.. 195 * @param outInputPortPtr Receives the native API port identifier of the opened port. 196 * 197 * @return AMEDIA_OK, or a negative error code: 198 * @see AMEDIA_ERROR_UNKNOWN - Unknown Error. 199 */ 200 media_status_t AMIDI_API AMidiInputPort_open(const AMidiDevice *device, int32_t portNumber, 201 AMidiInputPort **outInputPortPtr) __INTRODUCED_IN(29); 202 203 /** 204 * Sends data to the specified input port. 205 * 206 * @param inputPort The identifier of the port to send data to. 207 * @param buffer Points to the array of bytes containing the data to send. 208 * @param numBytes Specifies the number of bytes to write. 209 * 210 * @return The number of bytes sent, which could be less than specified or a negative error code: 211 * @see AMEDIA_ERROR_INVALID_PARAMETER - The specified port was NULL, the specified buffer was NULL. 212 */ 213 ssize_t AMIDI_API AMidiInputPort_send(const AMidiInputPort *inputPort, const uint8_t *buffer, 214 size_t numBytes) __INTRODUCED_IN(29); 215 216 /** 217 * Sends data to the specified input port with a timestamp. 218 * 219 * @param inputPort The identifier of the port to send data to. 220 * @param buffer Points to the array of bytes containing the data to send. 221 * @param numBytes Specifies the number of bytes to write. 222 * @param timestamp The CLOCK_MONOTONIC time in nanoseconds to associate with the sent data. 223 * 224 * @return The number of bytes sent, which could be less than specified or a negative error code: 225 * @see AMEDIA_ERROR_INVALID_PARAMETER - The specified port was NULL, the specified buffer was NULL. 226 */ 227 ssize_t AMIDI_API AMidiInputPort_sendWithTimestamp(const AMidiInputPort *inputPort, 228 const uint8_t *buffer, size_t numBytes, int64_t timestamp) __INTRODUCED_IN(29); 229 230 /** 231 * Sends a message with a 'MIDI flush command code' to the specified port. This should cause 232 * a receiver to discard any pending MIDI data it may have accumulated and not processed. 233 * 234 * @param inputPort The identifier of the port to send the flush command to. 235 * 236 * @returns @see AMEDIA_OK if successful, otherwise a negative error code: 237 * @see AMEDIA_ERROR_INVALID_PARAMETER - The specified port was NULL 238 * @see AMEDIA_ERROR_UNSUPPORTED - The FLUSH command couldn't 239 * be sent. 240 */ 241 media_status_t AMIDI_API AMidiInputPort_sendFlush(const AMidiInputPort *inputPort) __INTRODUCED_IN(29); 242 243 /** 244 * Closes the input port. 245 * 246 * @param inputPort Identifies the input (sending) port to close. 247 */ 248 void AMIDI_API AMidiInputPort_close(const AMidiInputPort *inputPort) __INTRODUCED_IN(29); 249 250 #ifdef __cplusplus 251 } 252 #endif 253 254 #endif /* ANDROID_MEDIA_AMIDI_H_ */ 255 /** 256 @} 257 */ 258