/*
= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
This file is part of the JUCE library .
Copyright ( c ) 2015 - ROLI Ltd .
Permission is granted to use this software under the terms of either :
a ) the GPL v2 ( or any later version )
b ) the Affero GPL v3
Details of these licenses can be found at : www . gnu . org / licenses
JUCE 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 for more details .
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
To release a closed - source product which uses JUCE , commercial licenses are
available : visit www . juce . com for more information .
= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
*/
# ifndef JUCE_MIDIINPUT_H_INCLUDED
# define JUCE_MIDIINPUT_H_INCLUDED
class MidiInput ;
//==============================================================================
/**
Receives incoming messages from a physical MIDI input device .
This class is overridden to handle incoming midi messages . See the MidiInput
class for more details .
@ see MidiInput
*/
class JUCE_API MidiInputCallback
{
public :
/** Destructor. */
virtual ~ MidiInputCallback ( ) { }
/** Receives an incoming message.
A MidiInput object will call this method when a midi event arrives . It ' ll be
called on a high - priority system thread , so avoid doing anything time - consuming
in here , and avoid making any UI calls . You might find the MidiBuffer class helpful
for queueing incoming messages for use later .
@ param source the MidiInput object that generated the message
@ param message the incoming message . The message ' s timestamp is set to a value
equivalent to ( Time : : getMillisecondCounter ( ) / 1000.0 ) to specify the
time when the message arrived .
*/
virtual void handleIncomingMidiMessage ( MidiInput * source ,
const MidiMessage & message ) = 0 ;
/** Notification sent each time a packet of a multi-packet sysex message arrives.
If a long sysex message is broken up into multiple packets , this callback is made
for each packet that arrives until the message is finished , at which point
the normal handleIncomingMidiMessage ( ) callback will be made with the entire
message .
The message passed in will contain the start of a sysex , but won ' t be finished
with the terminating 0xf7 byte .
*/
virtual void handlePartialSysexMessage ( MidiInput * source ,
const uint8 * messageData ,
int numBytesSoFar ,
double timestamp )
{
// (this bit is just to avoid compiler warnings about unused variables)
( void ) source ; ( void ) messageData ; ( void ) numBytesSoFar ; ( void ) timestamp ;
}
} ;
//==============================================================================
/**
Represents a midi input device .
To create one of these , use the static getDevices ( ) method to find out what inputs are
available , and then use the openDevice ( ) method to try to open one .
@ see MidiOutput
*/
class JUCE_API MidiInput
{
public :
//==============================================================================
/** Returns a list of the available midi input devices.
You can open one of the devices by passing its index into the
openDevice ( ) method .
@ see getDefaultDeviceIndex , openDevice
*/
static StringArray getDevices ( ) ;
/** Returns the index of the default midi input device to use.
This refers to the index in the list returned by getDevices ( ) .
*/
static int getDefaultDeviceIndex ( ) ;
/** Tries to open one of the midi input devices.
This will return a MidiInput object if it manages to open it . You can then
call start ( ) and stop ( ) on this device , and delete it when no longer needed .
If the device can ' t be opened , this will return a null pointer .
@ param deviceIndex the index of a device from the list returned by getDevices ( )
@ param callback the object that will receive the midi messages from this device .
@ see MidiInputCallback , getDevices
*/
static MidiInput * openDevice ( int deviceIndex ,
MidiInputCallback * callback ) ;
# if JUCE_LINUX || JUCE_MAC || JUCE_IOS || DOXYGEN
/** This will try to create a new midi input device (Not available on Windows).
This will attempt to create a new midi input device with the specified name ,
for other apps to connect to .
Returns nullptr if a device can ' t be created .
@ param deviceName the name to use for the new device
@ param callback the object that will receive the midi messages from this device .
*/
static MidiInput * createNewDevice ( const String & deviceName ,
MidiInputCallback * callback ) ;
# endif
//==============================================================================
/** Destructor. */
~ MidiInput ( ) ;
/** Returns the name of this device. */
const String & getName ( ) const noexcept { return name ; }
/** Allows you to set a custom name for the device, in case you don't like the name
it was given when created .
*/
void setName ( const String & newName ) noexcept { name = newName ; }
//==============================================================================
/** Starts the device running.
After calling this , the device will start sending midi messages to the
MidiInputCallback object that was specified when the openDevice ( ) method
was called .
@ see stop
*/
void start ( ) ;
/** Stops the device running.
@ see start
*/
void stop ( ) ;
private :
//==============================================================================
String name ;
void * internal ;
// The input objects are created with the openDevice() method.
explicit MidiInput ( const String & ) ;
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR ( MidiInput )
} ;
# endif // JUCE_MIDIINPUT_H_INCLUDED