amend f4c76f89d3a; fix blind coding typos
[ardour.git] / libs / backends / coreaudio / coremidi_io.h
index 312b9d171e0a1bf7db7abe7c96c1467c80afc1c5..b09261cbf9c51f70bd18d881c1b83f715802170f 100644 (file)
@@ -16,6 +16,9 @@
  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
 
+#ifndef __libbackend_coremidi_io_h__
+#define __libbackend_coremidi_io_h__
+
 #include <CoreServices/CoreServices.h>
 #include <CoreAudio/CoreAudio.h>
 #include <AudioUnit/AudioUnit.h>
 #include <boost/shared_ptr.hpp>
 #include "pbd/ringbuffer.h"
 
-typedef struct _CoreMIDIPacket { 
-       MIDITimeStamp timeStamp; 
-       UInt16 length; 
-       Byte data[256]; 
+namespace ARDOUR {
+
+typedef struct _CoreMIDIPacket {
+       MIDITimeStamp timeStamp;
+       UInt16 length;
+       Byte data[256];
 #if 0 // unused
        _CoreMIDIPacket (MIDITimeStamp t, Byte *d, UInt16 l)
                : timeStamp(t)
@@ -47,7 +52,7 @@ typedef struct _CoreMIDIPacket {
                }
        }
 #endif
-       _CoreMIDIPacket (const MIDIPacket *other) 
+       _CoreMIDIPacket (const MIDIPacket *other)
                : timeStamp(other->timeStamp)
                , length (other->length)
        {
@@ -64,40 +69,57 @@ public:
        CoreMidiIo (void);
        ~CoreMidiIo (void);
 
-       // TODO explicit start/stop, add/remove devices as needed.
-       void discover ();
+       void start ();
+       void stop ();
+
        void start_cycle ();
 
        int send_event (uint32_t, double, const uint8_t *, const size_t);
+       int send_events (uint32_t, double, const void *);
        size_t recv_event (uint32_t, double, uint64_t &, uint8_t *, size_t &);
 
        uint32_t n_midi_inputs (void) const { return _n_midi_in; }
        uint32_t n_midi_outputs (void) const { return _n_midi_out; }
+       std::string port_id (uint32_t, bool input);
+       std::string port_name (uint32_t, bool input);
 
        void notify_proc (const MIDINotification *message);
 
-       void setPortChangedCallback (void (changed_callback (void*)), void *arg) {
+       void set_enabled (bool yn = true) { _enabled = yn; }
+       bool enabled (void) const { return _active && _enabled; }
+
+       void set_port_changed_callback (void (changed_callback (void*)), void *arg) {
                _changed_callback = changed_callback;
                _changed_arg = arg;
        }
 
 private:
+       void discover ();
        void cleanup ();
 
-       MIDIClientRef     _midiClient;
-       MIDIEndpointRef * _inputEndPoints;
-       MIDIEndpointRef * _outputEndPoints;
-       MIDIPortRef *     _inputPorts;
-       MIDIPortRef *     _outputPorts;
-       CoreMIDIQueue *  _inputQueue;
+       MIDIClientRef     _midi_client;
+       MIDIEndpointRef * _input_endpoints;
+       MIDIEndpointRef * _output_endpoints;
+       MIDIPortRef     * _input_ports;
+       MIDIPortRef     * _output_ports;
+       CoreMIDIQueue   * _input_queue;
+
        RingBuffer<uint8_t> ** _rb;
 
-       uint32_t _n_midi_in;
-       uint32_t _n_midi_out;
+       uint32_t          _n_midi_in;
+       uint32_t          _n_midi_out;
 
-       MIDITimeStamp _time_at_cycle_start;
-       bool _active;
+       MIDITimeStamp     _time_at_cycle_start;
+       bool              _active; // internal deactivate during discovery etc
+       bool              _enabled; // temporary disable, e.g. during freewheeli
+       bool              _run; // general status
 
        void (* _changed_callback) (void*);
        void  * _changed_arg;
+
+       pthread_mutex_t _discovery_lock;
 };
+
+} // namespace
+
+#endif /* __libbackend_coremidi_io */