13
0
livetrax/libs/surfaces/mackie/scripts/signals.rb

138 lines
2.6 KiB
Ruby
Raw Normal View History

#~ /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