push2: port registration, LED setup
[ardour.git] / libs / surfaces / push2 / push2.cc
index be25357e267cca82d8f79b2ed110462836e894b4..92e05cfee17f2b10e032caccdd00bab64bdbb4d1 100644 (file)
@@ -25,6 +25,9 @@
 #include "pbd/failed_constructor.h"
 
 #include "ardour/debug.h"
+#include "ardour/audioengine.h"
+#include "ardour/async_midi_port.h"
+#include "ardour/midiport_manager.h"
 
 #include "push2.h"
 
@@ -52,6 +55,7 @@ Push2::Push2 (Session& s)
        , device_buffer (0)
        , frame_buffer (Cairo::ImageSurface::create (Cairo::FORMAT_ARGB32, cols, rows))
 {
+       build_led_map ();
 }
 
 Push2::~Push2 ()
@@ -62,11 +66,15 @@ Push2::~Push2 ()
 int
 Push2::open ()
 {
+       int err;
+
        if ((handle = libusb_open_device_with_vid_pid (NULL, ABLETON, PUSH2)) == 0) {
                return -1;
        }
 
-       libusb_claim_interface (handle, 0x00);
+       if ((err = libusb_claim_interface (handle, 0x00))) {
+               return -1;
+       }
 
        device_frame_buffer[0] = new uint16_t[rows*pixels_per_row];
        device_frame_buffer[1] = new uint16_t[rows*pixels_per_row];
@@ -80,12 +88,44 @@ Push2::open ()
        frame_header[3] = 0x89;
        memset (&frame_header[4], 0, 12);
 
+       /* setup ports */
+
+       _async_in[0]  = AudioEngine::instance()->register_input_port (DataType::MIDI, X_("push2 in1"), true);
+       _async_out[0] = AudioEngine::instance()->register_output_port (DataType::MIDI, X_("push2 out1"), true);
+
+       if (_async_in[0] == 0 || _async_out[0] == 0) {
+               return -1;
+       }
+
+       _input_port[1] = boost::dynamic_pointer_cast<AsyncMIDIPort>(_async_in[1]).get();
+       _output_port[1] = boost::dynamic_pointer_cast<AsyncMIDIPort>(_async_out[1]).get();
+
+       _async_in[1]  = AudioEngine::instance()->register_input_port (DataType::MIDI, X_("push2 in2"), true);
+       _async_out[1] = AudioEngine::instance()->register_output_port (DataType::MIDI, X_("push2 out2"), true);
+
+       if (_async_in[1] == 0 || _async_out[1] == 0) {
+               return -1;
+       }
+
+       _input_port[1] = boost::dynamic_pointer_cast<AsyncMIDIPort>(_async_in[1]).get();
+       _output_port[1] = boost::dynamic_pointer_cast<AsyncMIDIPort>(_async_out[1]).get();
+
        return 0;
 }
 
 int
 Push2::close ()
 {
+       AudioEngine::instance()->unregister_port (_async_in[0]);
+       AudioEngine::instance()->unregister_port (_async_out[0]);
+       AudioEngine::instance()->unregister_port (_async_in[1]);
+       AudioEngine::instance()->unregister_port (_async_out[1]);
+
+       _async_in[0].reset ((ARDOUR::Port*) 0);
+       _async_out[0].reset ((ARDOUR::Port*) 0);
+       _async_in[1].reset ((ARDOUR::Port*) 0);
+       _async_out[1].reset ((ARDOUR::Port*) 0);
+
        vblank_connection.disconnect ();
 
        if (handle) {
@@ -303,3 +343,10 @@ Push2::set_active (bool yn)
 
        return 0;
 }
+
+void
+Push2::write (int port, const MidiByteArray& data)
+{
+       /* immediate delivery */
+       _output_port[port]->write (&data[0], data.size(), 0);
+}