• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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