| 
							- /*
 - Copyright (C) 2009 Devin Anderson
 - 
 - This program is free software; you can redistribute it and/or modify
 - it under the terms of the GNU Lesser General Public License as published by
 - the Free Software Foundation; either version 2.1 of the License, or
 - (at your option) any later version.
 - 
 - This program 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 Lesser General Public License for more details.
 - 
 - You should have received a copy of the GNU Lesser General Public License
 - along with this program; if not, write to the Free Software
 - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 - 
 - */
 - 
 - #ifndef __JackPhysicalMidiInput__
 - #define __JackPhysicalMidiInput__
 - 
 - #include "JackMidiPort.h"
 - #include "ringbuffer.h"
 - 
 - namespace Jack {
 - 
 -     class JackPhysicalMidiInput {
 - 
 -     private:
 - 
 -         size_t buffered_bytes;
 -         size_t expected_data_bytes;
 -         jack_ringbuffer_t *input_ring;
 -         JackMidiBuffer *port_buffer;
 -         jack_midi_data_t status_byte;
 -         size_t unbuffered_bytes;
 - 
 -         void
 -         Clear();
 - 
 -         void
 -         WriteBufferedEvent(jack_nframes_t);
 - 
 -         void
 -         WriteBufferedSysexEvent(jack_nframes_t);
 - 
 -         void
 -         WriteByteEvent(jack_nframes_t, jack_midi_data_t);
 - 
 -     protected:
 - 
 -         /**
 -          * Override to specify how to react when 1 or more bytes of a MIDI
 -          * message are lost because there wasn't enough room in the input
 -          * buffer.  The first argument is the amount of bytes that couldn't be
 -          * buffered, and the second argument is the total amount of bytes in
 -          * the MIDI message.  The default implementation calls 'jack_error'
 -          * with a basic error message.
 -          */
 - 
 -         virtual void
 -         HandleBufferFailure(size_t, size_t);
 - 
 -         /**
 -          * Override to specify how to react when a new status byte is received
 -          * before all of the data bytes in a message are received.  The
 -          * argument is the number of bytes being discarded.  The default
 -          * implementation calls 'jack_error' with a basic error message.
 -          */
 - 
 -         virtual void
 -         HandleIncompleteMessage(size_t);
 - 
 -         /**
 -          * Override to specify how to react when an invalid status byte (0xf4,
 -          * 0xf5, 0xfd) is received.  The argument contains the invalid status
 -          * byte.  The default implementation calls 'jack_error' with a basic
 -          * error message.
 -          */
 - 
 -         virtual void
 -         HandleInvalidStatusByte(jack_midi_data_t);
 - 
 -         /**
 -          * Override to specify how to react when a sysex end byte (0xf7) is
 -          * received without first receiving a sysex start byte (0xf0).  The
 -          * argument contains the amount of bytes that will be discarded.  The
 -          * default implementation calls 'jack_error' with a basic error
 -          * message.
 -          */
 - 
 -         virtual void
 -         HandleUnexpectedSysexEnd(size_t);
 - 
 -         /**
 -          * Override to specify how to react when a MIDI message can not be
 -          * written to the port buffer.  The argument specifies the length of
 -          * the MIDI message.  The default implementation calls 'jack_error'
 -          * with a basic error message.
 -          */
 - 
 -         virtual void
 -         HandleWriteFailure(size_t);
 - 
 -         /**
 -          * This method *must* be overridden to handle receiving MIDI bytes.
 -          * The first argument is a pointer to the memory location at which the
 -          * MIDI byte should be stored.  The second argument is the last frame
 -          * at which a MIDI byte was received, except at the beginning of the
 -          * period when the value is 0.  The third argument is the total number
 -          * of frames in the period.  The return value is the frame at which the
 -          * MIDI byte is received at, or the value of the third argument is no
 -          * more MIDI bytes can be received in this period.
 -          */
 - 
 -         virtual jack_nframes_t
 -         Receive(jack_midi_data_t *, jack_nframes_t, jack_nframes_t) = 0;
 - 
 -     public:
 - 
 -         JackPhysicalMidiInput(size_t buffer_size=1024);
 -         ~JackPhysicalMidiInput();
 - 
 -         /**
 -          * Called to process MIDI data during a period.
 -          */
 - 
 -         void
 -         Process(jack_nframes_t);
 - 
 -         /**
 -          * Set the MIDI buffer that will receive incoming messages.
 -          */
 - 
 -         inline void
 -         SetPortBuffer(JackMidiBuffer *port_buffer)
 -         {
 -             this->port_buffer = port_buffer;
 -         }
 - 
 -     };
 - 
 - }
 - 
 - #endif
 
 
  |