diff options
Diffstat (limited to 'libs/surfaces/mackie/scripts/signals.rb')
-rw-r--r-- | libs/surfaces/mackie/scripts/signals.rb | 137 |
1 files changed, 137 insertions, 0 deletions
diff --git a/libs/surfaces/mackie/scripts/signals.rb b/libs/surfaces/mackie/scripts/signals.rb new file mode 100644 index 0000000000..8182e562a3 --- /dev/null +++ b/libs/surfaces/mackie/scripts/signals.rb @@ -0,0 +1,137 @@ +#~ /usr/bin/ruby +# Copyright (C) 2006,2007 John Anderson + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 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 General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +require 'erb' + +signals = %w{ +solo_changed +mute_changed +record_enable_changed +gain_changed +name_changed +panner_changed +} + +@signal_calls = { 'panner_changed' => 'panner()[0]->Changed' } + +def connection_call( x ) + if @signal_calls.include? x + @signal_calls[x] + else + x + end +end + +signals.each do |x| + puts <<EOF +void MackieControlProtocol::notify_#{x}( void *, ARDOUR::Route * route ) +{ + try + { + strip_from_route( route ).#{x.gsub( /_changed/, '' )}(); + } + catch( exception & e ) + { + cout << e.what() << endl; + } +} + +EOF +end + +class_def = <<EOF +#ifndef route_signal_h +#define route_signal_h + +#include <sigc++/sigc++.h> + +class MackieControlProtocol; + +namespace ARDOUR { + class Route; +} + +namespace Mackie +{ + +class Strip; + +/** + This class is intended to easily create and destroy the set of + connections from a route to a control surface strip. Instanting + it will connect the signals, and destructing it will disconnect + the signals. +*/ +class RouteSignal +{ +public: + RouteSignal( ARDOUR::Route & route, MackieControlProtocol & mcp, Strip & strip ) + : _route( route ), _mcp( mcp ), _strip( strip ) + { + connect(); + } + + ~RouteSignal() + { + disconnect(); + } + +private: + ARDOUR::Route & _route; + MackieControlProtocol & _mcp; + Strip & _strip; + +<% signals.each do |x| -%> + sigc::connection _<%= x %>_connection; +<% end -%> +}; + +} + +#endif +EOF + +erb = ERB.new( class_def, 0, ">-" ) +erb.run + +impl_def = <<EOF +#include "route_signal.h" + +#include <ardour/route.h> +#include <ardour/panner.h> + +#include "mackie_control_protocol.h" + +using namespace Mackie; + +void RouteSignal::connect() +{ +<% signals.each do |x| -%> + _<%=x%>_connection = _route.<%=connection_call(x)%>.connect( sigc::bind ( mem_fun ( _mcp, &MackieControlProtocol::notify_<%=x%> ), &_route ) ); +<% end -%> +} + +void RouteSignal::disconnect() +{ +<% signals.each do |x| -%> + _<%= x %>_connection.disconnect(); +<% end -%> +} +EOF + +erb = ERB.new( impl_def, 0, ">-" ) +erb.run |