mirror of
https://github.com/openjdk/jdk.git
synced 2026-03-02 12:10:14 +00:00
336 lines
9.6 KiB
C
336 lines
9.6 KiB
C
/*
|
|
* Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
|
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
|
*
|
|
* This code is free software; you can redistribute it and/or modify it
|
|
* under the terms of the GNU General Public License version 2 only, as
|
|
* published by the Free Software Foundation. Oracle designates this
|
|
* particular file as subject to the "Classpath" exception as provided
|
|
* by Oracle in the LICENSE file that accompanied this code.
|
|
*
|
|
* This code is distributed in the hope that it will be useful, but WITHOUT
|
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
* version 2 for more details (a copy is included in the LICENSE file that
|
|
* accompanied this code).
|
|
*
|
|
* You should have received a copy of the GNU General Public License version
|
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
*
|
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
|
* or visit www.oracle.com if you need additional information or have any
|
|
* questions.
|
|
*/
|
|
|
|
#ifndef PLATFORM_MIDI_INCLUDED
|
|
#define PLATFORM_MIDI_INCLUDED
|
|
|
|
|
|
#include "SoundDefs.h"
|
|
#include "Configure.h" // put flags for debug msgs etc. here
|
|
#include "Utilities.h"
|
|
|
|
|
|
/* do we need the queue ? */
|
|
#if (USE_PLATFORM_MIDI_IN == TRUE) || (USE_PLATFORM_MIDI_OUT == TRUE)
|
|
#if X_PLATFORM == X_WINDOWS || X_PLATFORM == X_MACOSX
|
|
#define USE_MIDI_QUEUE TRUE
|
|
#endif
|
|
#endif
|
|
|
|
/* *********************** MIDI TYPES (for all platforms) ******************************* */
|
|
|
|
/* return value for functions to denote successful completion */
|
|
#define MIDI_SUCCESS 0
|
|
/* code if function is not supported */
|
|
#define MIDI_NOT_SUPPORTED -11111
|
|
/* return code for invalid handle */
|
|
#define MIDI_INVALID_DEVICEID -11112
|
|
/* return code for invalid handle */
|
|
#define MIDI_INVALID_HANDLE -11113
|
|
/* return code for invalid argument */
|
|
#define MIDI_INVALID_ARGUMENT -11114
|
|
/* return code for out of memory */
|
|
#define MIDI_OUT_OF_MEMORY -11115
|
|
|
|
// MIDI message types
|
|
typedef enum {
|
|
SHORT_MESSAGE = 0,
|
|
LONG_MESSAGE = 1
|
|
} MidiMessageType;
|
|
|
|
// MIDI message object
|
|
typedef struct tag_MidiMessage {
|
|
INT64 timestamp; // in microseconds
|
|
INT32 locked; // TRUE when event is currently being read
|
|
MidiMessageType type;
|
|
union {
|
|
struct {
|
|
// platform-endianness packed message:
|
|
// status | data1<<8 | data2<<16
|
|
UINT32 packedMsg;
|
|
} s; // short message
|
|
struct {
|
|
UINT32 size;
|
|
// this buffer is read only. It must not be freed.
|
|
UBYTE* data;
|
|
INT32 index; // sysex buffer number
|
|
} l; // long message
|
|
} data;
|
|
} MidiMessage;
|
|
|
|
/* error handling. Implemented in PlatformMidi.c */
|
|
char* MIDI_IN_InternalGetErrorString(INT32 err);
|
|
char* MIDI_OUT_InternalGetErrorString(INT32 err);
|
|
|
|
|
|
#if USE_MIDI_QUEUE == TRUE
|
|
/*
|
|
* Native MIDI message circular buffer
|
|
*/
|
|
typedef struct tag_MidiQueue {
|
|
void* lock;
|
|
INT32 size;
|
|
INT32 capacity;
|
|
INT32 readIndex;
|
|
INT32 writeIndex;
|
|
MidiMessage queue[1];
|
|
} MidiMessageQueue;
|
|
#endif
|
|
|
|
// device handle, to be created and filled in MIDI_IN_OpenDevice() and MIDI_OUT_OpenDevice()
|
|
typedef struct tag_MidiDeviceHandle {
|
|
void* deviceHandle; // handle to the device
|
|
void* longBuffers; // contains platform-specific data for long buffers, e.g. list of MIDIHDR
|
|
void* platformData; // contains platform specific data, e.g. an Event object
|
|
INT32 isWaiting; // if TRUE, then waiting for new events
|
|
INT64 startTime; // start time
|
|
#if USE_MIDI_QUEUE == TRUE
|
|
MidiMessageQueue* queue; // may be NULL if no queue is used
|
|
#endif
|
|
} MidiDeviceHandle;
|
|
|
|
|
|
#if USE_MIDI_QUEUE == TRUE
|
|
|
|
/*
|
|
* Native Locking support
|
|
*/
|
|
void* MIDI_CreateLock();
|
|
void MIDI_DestroyLock(void* lock);
|
|
|
|
/* Blocks until this lock can be gotten.
|
|
* Nop if lock is NULL */
|
|
void MIDI_Lock(void* lock);
|
|
|
|
/* Releases this lock */
|
|
void MIDI_Unlock(void* lock);
|
|
|
|
MidiMessageQueue* MIDI_CreateQueue(int capacity);
|
|
void MIDI_DestroyQueue(MidiMessageQueue* queue);
|
|
// if overwrite is true, oldest messages will be overwritten when the queue is full
|
|
// returns true, if message has been added
|
|
int MIDI_QueueAddShort(MidiMessageQueue* queue, UINT32 packedMsg, INT64 timestamp, int overwrite);
|
|
int MIDI_QueueAddLong(MidiMessageQueue* queue, UBYTE* data, UINT32 size,
|
|
INT32 sysexIndex, INT64 timestamp, int overwrite);
|
|
|
|
// returns NULL if no messages in queue.
|
|
MidiMessage* MIDI_QueueRead(MidiMessageQueue* queue);
|
|
// message will be removed from queue.
|
|
void MIDI_QueueRemove(MidiMessageQueue* queue, INT32 onlyLocked);
|
|
void MIDI_QueueClear(MidiMessageQueue* queue);
|
|
|
|
#endif /* USE_MIDI_QUEUE */
|
|
|
|
|
|
/*
|
|
* Platform MIDI IN support.
|
|
* deviceId: device-by-number
|
|
* deviceHandle: native device handle
|
|
*/
|
|
|
|
#if USE_PLATFORM_MIDI_IN == TRUE
|
|
|
|
// number of messages to be buffered
|
|
#define MIDI_IN_MESSAGE_QUEUE_SIZE 64
|
|
// number of sysex to be buffered
|
|
#define MIDI_IN_LONG_QUEUE_SIZE 20
|
|
// maximum number of bytes in one sys ex message
|
|
#define MIDI_IN_LONG_MESSAGE_SIZE 1024
|
|
|
|
|
|
/*
|
|
* Return an error message for the error code
|
|
*/
|
|
char* MIDI_IN_GetErrorStr(INT32 err);
|
|
|
|
|
|
/*
|
|
* Get the number of MIDI IN devices on the system.
|
|
*/
|
|
INT32 MIDI_IN_GetNumDevices();
|
|
|
|
/*
|
|
* Get the name of the device with this id
|
|
* Returns MIDI_SUCCESS or an error code
|
|
*/
|
|
INT32 MIDI_IN_GetDeviceName(INT32 deviceID, char *name, UINT32 nameLength);
|
|
|
|
/*
|
|
* Get the vendor of the device with this id
|
|
* Returns MIDI_SUCCESS or an error code
|
|
*/
|
|
INT32 MIDI_IN_GetDeviceVendor(INT32 deviceID, char *name, UINT32 nameLength);
|
|
|
|
/*
|
|
* Get the description of the device with this id
|
|
* Returns MIDI_SUCCESS or an error code
|
|
*/
|
|
INT32 MIDI_IN_GetDeviceDescription(INT32 deviceID, char *name, UINT32 nameLength);
|
|
|
|
/*
|
|
* Get the version of the device with this id
|
|
* Returns MIDI_SUCCESS or an error code
|
|
*/
|
|
INT32 MIDI_IN_GetDeviceVersion(INT32 deviceID, char *name, UINT32 nameLength);
|
|
|
|
/*
|
|
* Open the device with this id.
|
|
* Returns a device handle in handle*.
|
|
* Returns MIDI_SUCCESS or an error code
|
|
*/
|
|
INT32 MIDI_IN_OpenDevice(INT32 deviceID, MidiDeviceHandle** handle);
|
|
|
|
/*
|
|
* Close the device handle.
|
|
* Returns MIDI_SUCCESS or an error code
|
|
*/
|
|
INT32 MIDI_IN_CloseDevice(MidiDeviceHandle* handle);
|
|
|
|
/*
|
|
* Start the device with this handle.
|
|
* Returns MIDI_SUCCESS or an error code
|
|
*/
|
|
INT32 MIDI_IN_StartDevice(MidiDeviceHandle* handle);
|
|
|
|
/*
|
|
* Stop the device with this handle.
|
|
* Returns MIDI_SUCCESS or an error code
|
|
*/
|
|
INT32 MIDI_IN_StopDevice(MidiDeviceHandle* handle);
|
|
|
|
/*
|
|
* Return the current time stamp in microseconds.
|
|
* If not supported, or problem occurred, returns -1
|
|
*/
|
|
INT64 MIDI_IN_GetTimeStamp(MidiDeviceHandle* handle);
|
|
|
|
/*
|
|
* Get the next message from the queue.
|
|
* This call blocks until the device is stopped
|
|
* or a message is received.
|
|
* The returned message is READ ONLY.
|
|
* The message will be returned into the message
|
|
* queue by calling MIDI_IN_ReleaseMessage.
|
|
*/
|
|
MidiMessage* MIDI_IN_GetMessage(MidiDeviceHandle* handle);
|
|
|
|
/*
|
|
* Put a message, which was taken
|
|
* out of the queue, back into the queue.
|
|
*/
|
|
void MIDI_IN_ReleaseMessage(MidiDeviceHandle* handle, MidiMessage* msg);
|
|
|
|
#endif // USE_PLATFORM_MIDI_IN
|
|
|
|
|
|
/*
|
|
* Platform MIDI OUT support.
|
|
* deviceId: device-by-number
|
|
* deviceHandle: native device handle
|
|
*/
|
|
|
|
#if USE_PLATFORM_MIDI_OUT == TRUE
|
|
|
|
// number of messages to be buffered
|
|
#define MIDI_OUT_MESSAGE_QUEUE_SIZE 32
|
|
// number of sysex to be buffered
|
|
#define MIDI_OUT_LONG_QUEUE_SIZE 16
|
|
// maximum number of bytes in one sys ex message
|
|
#define MIDI_OUT_LONG_MESSAGE_SIZE 1024
|
|
|
|
/*
|
|
* Return an error message for the error code
|
|
*/
|
|
char* MIDI_OUT_GetErrorStr(INT32 err);
|
|
|
|
|
|
/*
|
|
* Get the number of MIDI OUT devices on the system.
|
|
*/
|
|
INT32 MIDI_OUT_GetNumDevices();
|
|
|
|
/*
|
|
* Get the name of the device with this id
|
|
* Returns MIDI_SUCCESS or an error code
|
|
*/
|
|
INT32 MIDI_OUT_GetDeviceName(INT32 deviceID, char *name, UINT32 nameLength);
|
|
|
|
/*
|
|
* Get the vendor of the device with this id
|
|
* Returns MIDI_SUCCESS or an error code
|
|
*/
|
|
INT32 MIDI_OUT_GetDeviceVendor(INT32 deviceID, char *name, UINT32 nameLength);
|
|
|
|
/*
|
|
* Get the description of the device with this id
|
|
* Returns MIDI_SUCCESS or an error code
|
|
*/
|
|
INT32 MIDI_OUT_GetDeviceDescription(INT32 deviceID, char *name, UINT32 nameLength);
|
|
|
|
/*
|
|
* Get the version of the device with this id
|
|
* Returns MIDI_SUCCESS or an error code
|
|
*/
|
|
INT32 MIDI_OUT_GetDeviceVersion(INT32 deviceID, char *name, UINT32 nameLength);
|
|
|
|
/*
|
|
* Open the device with this id.
|
|
* Returns a device handle in handle*.
|
|
* Returns MIDI_SUCCESS or an error code
|
|
*/
|
|
INT32 MIDI_OUT_OpenDevice(INT32 deviceID, MidiDeviceHandle** handle);
|
|
|
|
/*
|
|
* Close the device handle.
|
|
* Returns MIDI_SUCCESS or an error code
|
|
*/
|
|
INT32 MIDI_OUT_CloseDevice(MidiDeviceHandle* handle);
|
|
|
|
/*
|
|
* Return the current time stamp in microseconds (the time since the device
|
|
* was opened).
|
|
* If not supported, or problem occurred, returns -1
|
|
*/
|
|
INT64 MIDI_OUT_GetTimeStamp(MidiDeviceHandle* handle);
|
|
|
|
/*
|
|
* Send a short message to the hardware.
|
|
* packedMsg: (status | data1<<8 | data2<<16) in platform-endianness
|
|
* Timestamp is in microseconds.
|
|
* Returns MIDI_SUCCESS or an error code
|
|
*/
|
|
INT32 MIDI_OUT_SendShortMessage(MidiDeviceHandle* handle, UINT32 packedMsg, UINT32 timestamp);
|
|
|
|
/*
|
|
* Send a long message to the hardware. Timestamp is in microseconds.
|
|
* This blocks until a slot to send a message is free.
|
|
* Returns MIDI_SUCCESS or an error code
|
|
*/
|
|
INT32 MIDI_OUT_SendLongMessage(MidiDeviceHandle* handle, UBYTE* data, UINT32 size, UINT32 timestamp);
|
|
|
|
#endif // USE_PLATFORM_MIDI_OUT
|
|
|
|
#endif // PLATFORM_MIDI_INCLUDED
|