From cf28d717837857f1d568343bf17cc0b36db62269 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Wed, 6 Jul 2016 22:34:10 -0400 Subject: [PATCH] push2: basic GUI dialog --- gtk2_ardour/icons/push2-small.png | Bin 0 -> 41186 bytes libs/surfaces/push2/push2.cc | 102 ++++++++++++++++++++++++++++++ libs/surfaces/push2/push2.h | 27 ++++++++ libs/surfaces/push2/wscript | 5 +- 4 files changed, 132 insertions(+), 2 deletions(-) create mode 100644 gtk2_ardour/icons/push2-small.png diff --git a/gtk2_ardour/icons/push2-small.png b/gtk2_ardour/icons/push2-small.png new file mode 100644 index 0000000000000000000000000000000000000000..eaa9a34c903e33b3e28ecb1a449caa2548eaabee GIT binary patch literal 41186 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�ZG)^xqacd7TU> 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 Wj(@|OrgDS;0000PortRegisteredOrUnregistered.connect (port_reg_connection, MISSING_INVALIDATOR, boost::bind (&Push2::port_registration_handler, this), this); + + /* Catch port connections and disconnections */ + ARDOUR::AudioEngine::instance()->PortConnectedOrDisconnected.connect (port_connection, MISSING_INVALIDATOR, boost::bind (&Push2::connection_handler, this, _1, _2, _3, _4, _5), this); + + /* ports might already be there */ + + port_registration_handler (); } Push2::~Push2 () @@ -107,6 +117,34 @@ Push2::~Push2 () stop (); } +void +Push2::port_registration_handler () +{ + if (_async_in->connected() && _async_out->connected()) { + /* don't waste cycles here */ + return; + } + + string input_port_name = X_("Ableton Push 2 MIDI 1 in"); + string output_port_name = X_("Ableton Push 2 MIDI 1 out"); + vector in; + vector out; + + AudioEngine::instance()->get_ports (string_compose (".*%1", input_port_name), DataType::MIDI, PortFlags (IsPhysical|IsOutput), in); + AudioEngine::instance()->get_ports (string_compose (".*%1", output_port_name), DataType::MIDI, PortFlags (IsPhysical|IsInput), out); + + if (!in.empty() && !out.empty()) { + cerr << "Push2: both ports found\n"; + cerr << "\tconnecting to " << in.front() << " + " << out.front() << endl; + if (!_async_in->connected()) { + AudioEngine::instance()->connect (_async_in->name(), in.front()); + } + if (!_async_out->connected()) { + AudioEngine::instance()->connect (_async_out->name(), out.front()); + } + } +} + int Push2::open () { @@ -1478,3 +1516,67 @@ Push2::pad_filter (MidiBuffer& in, MidiBuffer& out) const return matched; } + +bool +Push2::connection_handler (boost::weak_ptr, std::string name1, boost::weak_ptr, std::string name2, bool yn) +{ + DEBUG_TRACE (DEBUG::FaderPort, "FaderPort::connection_handler start\n"); + if (!_input_port || !_output_port) { + return false; + } + + string ni = ARDOUR::AudioEngine::instance()->make_port_name_non_relative (boost::shared_ptr(_async_in)->name()); + string no = ARDOUR::AudioEngine::instance()->make_port_name_non_relative (boost::shared_ptr(_async_out)->name()); + + if (ni == name1 || ni == name2) { + if (yn) { + connection_state |= InputConnected; + } else { + connection_state &= ~InputConnected; + } + } else if (no == name1 || no == name2) { + if (yn) { + connection_state |= OutputConnected; + } else { + connection_state &= ~OutputConnected; + } + } else { + DEBUG_TRACE (DEBUG::FaderPort, string_compose ("Connections between %1 and %2 changed, but I ignored it\n", name1, name2)); + /* not our ports */ + return false; + } + + if ((connection_state & (InputConnected|OutputConnected)) == (InputConnected|OutputConnected)) { + + /* XXX this is a horrible hack. Without a short sleep here, + something prevents the device wakeup messages from being + sent and/or the responses from being received. + */ + + g_usleep (100000); + DEBUG_TRACE (DEBUG::FaderPort, "device now connected for both input and output\n"); + // connected (); + + } else { + DEBUG_TRACE (DEBUG::FaderPort, "Device disconnected (input or output or both) or not yet fully connected\n"); + } + + ConnectionChange (); /* emit signal for our GUI */ + + DEBUG_TRACE (DEBUG::FaderPort, "FaderPort::connection_handler end\n"); + + return true; /* connection status changed */ +} + +boost::shared_ptr +Push2::output_port() +{ + return _async_out; +} + +boost::shared_ptr +Push2::input_port() +{ + return _async_in; +} + diff --git a/libs/surfaces/push2/push2.h b/libs/surfaces/push2/push2.h index dab96260c6..7e480495ad 100644 --- a/libs/surfaces/push2/push2.h +++ b/libs/surfaces/push2/push2.h @@ -74,10 +74,19 @@ class Push2 : public ARDOUR::ControlProtocol static bool probe (); static void* request_factory (uint32_t); + bool has_editor () const { return true; } + void* get_gui () const; + void tear_down_gui (); + int set_active (bool yn); XMLNode& get_state(); int set_state (const XMLNode & node, int version); + PBD::Signal0 ConnectionChange; + + boost::shared_ptr input_port(); + boost::shared_ptr output_port(); + private: libusb_device_handle *handle; uint8_t frame_header[16]; @@ -452,6 +461,24 @@ class Push2 : public ARDOUR::ControlProtocol bool pad_filter (ARDOUR::MidiBuffer& in, ARDOUR::MidiBuffer& out) const; boost::weak_ptr first_selected_stripable; + + PBD::ScopedConnection port_reg_connection; + void port_registration_handler (); + + enum ConnectionState { + InputConnected = 0x1, + OutputConnected = 0x2 + }; + + int connection_state; + bool connection_handler (boost::weak_ptr, std::string name1, boost::weak_ptr, std::string name2, bool yn); + PBD::ScopedConnection port_connection; + + /* GUI */ + + mutable void *gui; + void build_gui (); + }; diff --git a/libs/surfaces/push2/wscript b/libs/surfaces/push2/wscript index 36e9a644c4..2a76b10648 100644 --- a/libs/surfaces/push2/wscript +++ b/libs/surfaces/push2/wscript @@ -25,6 +25,7 @@ def build(bld): interface.cc midi_byte_array.cc leds.cc + gui.cc ''' obj.export_includes = ['.'] obj.defines = [ 'PACKAGE="ardour_push2"' ] @@ -33,8 +34,8 @@ def build(bld): obj.includes = [ '.', './push2'] obj.name = 'libardour_push2' obj.target = 'ardour_push2' - obj.uselib = 'CAIROMM PANGOMM USB' - obj.use = 'libardour libardour_cp libpbd libtimecode' + obj.uselib = 'CAIROMM PANGOMM USB GTKMM' + obj.use = 'libardour libardour_cp libgtkmm2ext libpbd libtimecode' obj.install_path = os.path.join(bld.env['LIBDIR'], 'surfaces') def shutdown():