rough-in for faderport protocol backend
This commit is contained in:
parent
bfe92c5b4f
commit
2f1cdd3ffe
|
@ -11,7 +11,7 @@ libs=$TOP/@LIBS@
|
||||||
#
|
#
|
||||||
|
|
||||||
export ARDOUR_PATH=$TOP/gtk2_ardour/icons:$TOP/gtk2_ardour/pixmaps:$TOP/build/gtk2_ardour:$TOP/gtk2_ardour:.
|
export ARDOUR_PATH=$TOP/gtk2_ardour/icons:$TOP/gtk2_ardour/pixmaps:$TOP/build/gtk2_ardour:$TOP/gtk2_ardour:.
|
||||||
export ARDOUR_SURFACES_PATH=$libs/surfaces/osc:$libs/surfaces/generic_midi:$libs/surfaces/tranzport:$libs/surfaces/powermate:$libs/surfaces/mackie:$libs/surfaces/wiimote
|
export ARDOUR_SURFACES_PATH=$libs/surfaces/osc:$libs/surfaces/faderport:$libs/surfaces/generic_midi:$libs/surfaces/tranzport:$libs/surfaces/powermate:$libs/surfaces/mackie:$libs/surfaces/wiimote
|
||||||
export ARDOUR_PANNER_PATH=$libs/panners
|
export ARDOUR_PANNER_PATH=$libs/panners
|
||||||
export ARDOUR_DATA_PATH=$TOP:$TOP/build:$TOP/gtk2_ardour:$TOP/build/gtk2_ardour:.
|
export ARDOUR_DATA_PATH=$TOP:$TOP/build:$TOP/gtk2_ardour:$TOP/build/gtk2_ardour:.
|
||||||
export ARDOUR_MIDIMAPS_PATH=$TOP/midi_maps:.
|
export ARDOUR_MIDIMAPS_PATH=$TOP/midi_maps:.
|
||||||
|
|
71
libs/surfaces/faderport/faderport_interface.cc
Normal file
71
libs/surfaces/faderport/faderport_interface.cc
Normal file
|
@ -0,0 +1,71 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2012 Paul Davis
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <pbd/failed_constructor.h>
|
||||||
|
|
||||||
|
#include "control_protocol/control_protocol.h"
|
||||||
|
#include "faderport_midi_protocol.h"
|
||||||
|
|
||||||
|
using namespace ARDOUR;
|
||||||
|
|
||||||
|
static ControlProtocol*
|
||||||
|
new_faderport_midi_protocol (ControlProtocolDescriptor* /*descriptor*/, Session* s)
|
||||||
|
{
|
||||||
|
FaderportMidiControlProtocol* fmcp;
|
||||||
|
|
||||||
|
try {
|
||||||
|
fmcp = new FaderportMidiControlProtocol (*s);
|
||||||
|
} catch (failed_constructor& err) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fmcp->set_active (true)) {
|
||||||
|
delete fmcp;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return fmcp;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
delete_faderport_midi_protocol (ControlProtocolDescriptor* /*descriptor*/, ControlProtocol* cp)
|
||||||
|
{
|
||||||
|
delete cp;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
probe_faderport_midi_protocol (ControlProtocolDescriptor* /*descriptor*/)
|
||||||
|
{
|
||||||
|
return FaderportMidiControlProtocol::probe ();
|
||||||
|
}
|
||||||
|
|
||||||
|
static ControlProtocolDescriptor faderport_midi_descriptor = {
|
||||||
|
/*name : */ "Faderport",
|
||||||
|
/*id : */ "uri://ardour.org/surfaces/faderport:0",
|
||||||
|
/*ptr : */ 0,
|
||||||
|
/*module : */ 0,
|
||||||
|
/*mandatory : */ 0,
|
||||||
|
/*supports_feedback : */ true,
|
||||||
|
/*probe : */ probe_faderport_midi_protocol,
|
||||||
|
/*initialize : */ new_faderport_midi_protocol,
|
||||||
|
/*destroy : */ delete_faderport_midi_protocol
|
||||||
|
};
|
||||||
|
|
||||||
|
extern "C" ARDOURSURFACE_API ControlProtocolDescriptor* protocol_descriptor () { printf("HERE ********************************\n"); return &faderport_midi_descriptor; }
|
||||||
|
|
270
libs/surfaces/faderport/faderport_midi_protocol.cc
Normal file
270
libs/surfaces/faderport/faderport_midi_protocol.cc
Normal file
|
@ -0,0 +1,270 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2006 Paul Davis
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include <sstream>
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
|
#include <glibmm/fileutils.h>
|
||||||
|
#include <glibmm/miscutils.h>
|
||||||
|
|
||||||
|
#include "pbd/controllable_descriptor.h"
|
||||||
|
#include "pbd/error.h"
|
||||||
|
#include "pbd/failed_constructor.h"
|
||||||
|
#include "pbd/file_utils.h"
|
||||||
|
#include "pbd/xml++.h"
|
||||||
|
#include "pbd/compose.h"
|
||||||
|
|
||||||
|
#include "midi++/port.h"
|
||||||
|
|
||||||
|
#include "ardour/audioengine.h"
|
||||||
|
#include "ardour/filesystem_paths.h"
|
||||||
|
#include "ardour/session.h"
|
||||||
|
#include "ardour/route.h"
|
||||||
|
#include "ardour/midi_ui.h"
|
||||||
|
#include "ardour/midi_port.h"
|
||||||
|
#include "ardour/rc_configuration.h"
|
||||||
|
#include "ardour/midiport_manager.h"
|
||||||
|
#include "ardour/debug.h"
|
||||||
|
#include "ardour/async_midi_port.h"
|
||||||
|
|
||||||
|
#include "faderport_midi_protocol.h"
|
||||||
|
|
||||||
|
using namespace ARDOUR;
|
||||||
|
using namespace PBD;
|
||||||
|
using namespace Glib;
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
#include "i18n.h"
|
||||||
|
|
||||||
|
#define midi_ui_context() MidiControlUI::instance() /* a UICallback-derived object that specifies the event loop for signal handling */
|
||||||
|
|
||||||
|
FaderportMidiControlProtocol::FaderportMidiControlProtocol (Session& s)
|
||||||
|
: ControlProtocol (s, _("Faderport"))
|
||||||
|
, _motorised (true)
|
||||||
|
, _threshold (10)
|
||||||
|
, gui (0)
|
||||||
|
{
|
||||||
|
_async_in = AudioEngine::instance()->register_input_port (DataType::MIDI, "Faderport Recv", true);
|
||||||
|
_async_out = AudioEngine::instance()->register_output_port (DataType::MIDI, "Faderport Send", true);
|
||||||
|
|
||||||
|
if (_async_in == 0 || _async_out == 0) {
|
||||||
|
throw failed_constructor();
|
||||||
|
}
|
||||||
|
|
||||||
|
_input_port = boost::dynamic_pointer_cast<AsyncMIDIPort>(_async_in).get();
|
||||||
|
_output_port = boost::dynamic_pointer_cast<AsyncMIDIPort>(_async_out).get();
|
||||||
|
|
||||||
|
do_feedback = false;
|
||||||
|
_feedback_interval = 10 * 1000; // microseconds
|
||||||
|
last_feedback_time = 0;
|
||||||
|
native_counter = 0;
|
||||||
|
|
||||||
|
_current_bank = 0;
|
||||||
|
_bank_size = 0;
|
||||||
|
|
||||||
|
//NOTE TO PAUL:
|
||||||
|
// "midi_receiver" and "midi_input_handler"
|
||||||
|
// were 2 different approaches to try to capture MIDI data; neither seems to work as expected.
|
||||||
|
|
||||||
|
|
||||||
|
//not sure if this should do anything
|
||||||
|
(*_input_port).parser()->any.connect_same_thread (midi_recv_connection, boost::bind (&FaderportMidiControlProtocol::midi_receiver, this, _1, _2, _3));
|
||||||
|
|
||||||
|
//this is raw port acces (?)
|
||||||
|
// _input_port->xthread().set_receive_handler (sigc::bind (sigc::mem_fun (this, &FaderportMidiControlProtocol::midi_input_handler), _input_port));
|
||||||
|
|
||||||
|
Session::SendFeedback.connect_same_thread (*this, boost::bind (&FaderportMidiControlProtocol::send_feedback, this));
|
||||||
|
//Session::SendFeedback.connect (*this, MISSING_INVALIDATOR, boost::bind (&FaderportMidiControlProtocol::send_feedback, this), midi_ui_context());;
|
||||||
|
|
||||||
|
/* this one is cross-thread */
|
||||||
|
|
||||||
|
//Route::RemoteControlIDChange.connect (*this, MISSING_INVALIDATOR, boost::bind (&FaderportMidiControlProtocol::reset_controllables, this), midi_ui_context());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
FaderportMidiControlProtocol::~FaderportMidiControlProtocol ()
|
||||||
|
{
|
||||||
|
if (_input_port) {
|
||||||
|
DEBUG_TRACE (DEBUG::GenericMidi, string_compose ("unregistering input port %1\n", _async_in->name()));
|
||||||
|
AudioEngine::instance()->unregister_port (_async_in);
|
||||||
|
_async_in.reset ((ARDOUR::Port*) 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_output_port) {
|
||||||
|
// _output_port->drain (10000); //ToDo: is this necessary? It hangs the shutdown, for me
|
||||||
|
DEBUG_TRACE (DEBUG::GenericMidi, string_compose ("unregistering output port %1\n", _async_out->name()));
|
||||||
|
AudioEngine::instance()->unregister_port (_async_out);
|
||||||
|
_async_out.reset ((ARDOUR::Port*) 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
tear_down_gui ();
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
FaderportMidiControlProtocol::midi_receiver (MIDI::Parser &p, MIDI::byte *, size_t)
|
||||||
|
{
|
||||||
|
//NOTE: this never did anything
|
||||||
|
// printf("got some midi\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
FaderportMidiControlProtocol::set_active (bool /*yn*/)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
FaderportMidiControlProtocol::set_feedback_interval (microseconds_t ms)
|
||||||
|
{
|
||||||
|
_feedback_interval = ms;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
FaderportMidiControlProtocol::send_feedback ()
|
||||||
|
{
|
||||||
|
/* This is executed in RT "process" context", so no blocking calls
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (!do_feedback) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
microseconds_t now = get_microseconds ();
|
||||||
|
|
||||||
|
if (last_feedback_time != 0) {
|
||||||
|
if ((now - last_feedback_time) < _feedback_interval) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//occasionally tell the Faderport to go into "Native" mode
|
||||||
|
//ToDo: trigger this on MIDI port connection ?
|
||||||
|
native_counter++;
|
||||||
|
if (native_counter > 10) {
|
||||||
|
native_counter = 0;
|
||||||
|
MIDI::byte midibuf[64];
|
||||||
|
MIDI::byte *buf = midibuf;
|
||||||
|
*buf++ = (0x91);
|
||||||
|
*buf++ = (0x00);
|
||||||
|
*buf++ = (0x64);
|
||||||
|
_output_port->write (buf, 3, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
last_feedback_time = now;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
FaderportMidiControlProtocol::midi_input_handler (Glib::IOCondition ioc, ARDOUR::AsyncMIDIPort* port)
|
||||||
|
{
|
||||||
|
DEBUG_TRACE (DEBUG::MidiIO, string_compose ("something happend on %1\n", ((ARDOUR::Port*)port)->name()));
|
||||||
|
|
||||||
|
if (ioc & ~IO_IN) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ioc & IO_IN) {
|
||||||
|
|
||||||
|
AsyncMIDIPort* asp = dynamic_cast<AsyncMIDIPort*> (port);
|
||||||
|
if (asp) {
|
||||||
|
asp->clear ();
|
||||||
|
}
|
||||||
|
|
||||||
|
DEBUG_TRACE (DEBUG::MidiIO, string_compose ("data available on %1\n", ((ARDOUR::Port*)port)->name()));
|
||||||
|
// framepos_t now = _session.engine().sample_time();
|
||||||
|
// port->parse (now);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
XMLNode&
|
||||||
|
FaderportMidiControlProtocol::get_state ()
|
||||||
|
{
|
||||||
|
XMLNode& node (ControlProtocol::get_state());
|
||||||
|
char buf[32];
|
||||||
|
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
FaderportMidiControlProtocol::set_state (const XMLNode& node, int version)
|
||||||
|
{
|
||||||
|
XMLNodeList nlist;
|
||||||
|
XMLNodeConstIterator niter;
|
||||||
|
const XMLProperty* prop;
|
||||||
|
|
||||||
|
if (ControlProtocol::set_state (node, version)) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
FaderportMidiControlProtocol::set_feedback (bool yn)
|
||||||
|
{
|
||||||
|
do_feedback = yn;
|
||||||
|
last_feedback_time = 0;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
FaderportMidiControlProtocol::get_feedback () const
|
||||||
|
{
|
||||||
|
return do_feedback;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
FaderportMidiControlProtocol::set_current_bank (uint32_t b)
|
||||||
|
{
|
||||||
|
_current_bank = b;
|
||||||
|
// reset_controllables ();
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
FaderportMidiControlProtocol::next_bank ()
|
||||||
|
{
|
||||||
|
_current_bank++;
|
||||||
|
// reset_controllables ();
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
FaderportMidiControlProtocol::prev_bank()
|
||||||
|
{
|
||||||
|
if (_current_bank) {
|
||||||
|
_current_bank--;
|
||||||
|
// reset_controllables ();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
FaderportMidiControlProtocol::set_motorised (bool m)
|
||||||
|
{
|
||||||
|
_motorised = m;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
FaderportMidiControlProtocol::set_threshold (int t)
|
||||||
|
{
|
||||||
|
_threshold = t;
|
||||||
|
}
|
132
libs/surfaces/faderport/faderport_midi_protocol.h
Normal file
132
libs/surfaces/faderport/faderport_midi_protocol.h
Normal file
|
@ -0,0 +1,132 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2006 Paul Davis
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef ardour_generic_midi_control_protocol_h
|
||||||
|
#define ardour_generic_midi_control_protocol_h
|
||||||
|
|
||||||
|
#include <list>
|
||||||
|
#include <glibmm/threads.h>
|
||||||
|
|
||||||
|
#include "ardour/types.h"
|
||||||
|
|
||||||
|
#include "control_protocol/control_protocol.h"
|
||||||
|
|
||||||
|
namespace PBD {
|
||||||
|
class Controllable;
|
||||||
|
class ControllableDescriptor;
|
||||||
|
}
|
||||||
|
|
||||||
|
#include <midi++/types.h>
|
||||||
|
|
||||||
|
//#include "pbd/signals.h"
|
||||||
|
|
||||||
|
|
||||||
|
//#include "midi_byte_array.h"
|
||||||
|
#include "types.h"
|
||||||
|
|
||||||
|
#include "glibmm/main.h"
|
||||||
|
|
||||||
|
namespace MIDI {
|
||||||
|
class Parser;
|
||||||
|
class Port;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
namespace ARDOUR {
|
||||||
|
class AsyncMIDIPort;
|
||||||
|
class Port;
|
||||||
|
class Session;
|
||||||
|
class MidiPort;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class MIDIControllable;
|
||||||
|
class MIDIFunction;
|
||||||
|
class MIDIAction;
|
||||||
|
|
||||||
|
class FaderportMidiControlProtocol : public ARDOUR::ControlProtocol {
|
||||||
|
public:
|
||||||
|
FaderportMidiControlProtocol (ARDOUR::Session&);
|
||||||
|
virtual ~FaderportMidiControlProtocol();
|
||||||
|
|
||||||
|
int set_active (bool yn);
|
||||||
|
static bool probe() { return true; } //do SysEx device check here?
|
||||||
|
|
||||||
|
void set_feedback_interval (ARDOUR::microseconds_t);
|
||||||
|
|
||||||
|
int set_feedback (bool yn);
|
||||||
|
bool get_feedback () const;
|
||||||
|
|
||||||
|
XMLNode& get_state ();
|
||||||
|
int set_state (const XMLNode&, int version);
|
||||||
|
|
||||||
|
bool has_editor () const { return true; }
|
||||||
|
void* get_gui () const;
|
||||||
|
void tear_down_gui ();
|
||||||
|
|
||||||
|
void set_current_bank (uint32_t);
|
||||||
|
void next_bank ();
|
||||||
|
void prev_bank ();
|
||||||
|
|
||||||
|
void set_motorised (bool);
|
||||||
|
|
||||||
|
bool motorised () const {
|
||||||
|
return _motorised;
|
||||||
|
}
|
||||||
|
|
||||||
|
void set_threshold (int);
|
||||||
|
|
||||||
|
int threshold () const {
|
||||||
|
return _threshold;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
MIDI::Port* _input_port;
|
||||||
|
MIDI::Port* _output_port;
|
||||||
|
boost::shared_ptr<ARDOUR::Port> _async_in;
|
||||||
|
boost::shared_ptr<ARDOUR::Port> _async_out;
|
||||||
|
|
||||||
|
ARDOUR::microseconds_t _feedback_interval;
|
||||||
|
ARDOUR::microseconds_t last_feedback_time;
|
||||||
|
int native_counter;
|
||||||
|
|
||||||
|
bool do_feedback;
|
||||||
|
void send_feedback ();
|
||||||
|
|
||||||
|
PBD::ScopedConnection midi_recv_connection;
|
||||||
|
void midi_receiver (MIDI::Parser &p, MIDI::byte *, size_t);
|
||||||
|
|
||||||
|
bool midi_input_handler (Glib::IOCondition ioc, ARDOUR::AsyncMIDIPort* port);
|
||||||
|
|
||||||
|
std::string _current_binding;
|
||||||
|
uint32_t _bank_size;
|
||||||
|
uint32_t _current_bank;
|
||||||
|
/** true if this surface is motorised. If it is, we assume
|
||||||
|
that the surface's controls are never out of sync with
|
||||||
|
Ardour's state, so we don't have to take steps to avoid
|
||||||
|
values jumping around when things are not in sync.
|
||||||
|
*/
|
||||||
|
bool _motorised;
|
||||||
|
int _threshold;
|
||||||
|
|
||||||
|
mutable void *gui;
|
||||||
|
void build_gui ();
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* ardour_generic_midi_control_protocol_h */
|
133
libs/surfaces/faderport/fmcp_gui.cc
Normal file
133
libs/surfaces/faderport/fmcp_gui.cc
Normal file
|
@ -0,0 +1,133 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2009-2012 Paul Davis
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include <list>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#include <gtkmm/comboboxtext.h>
|
||||||
|
#include <gtkmm/label.h>
|
||||||
|
#include <gtkmm/box.h>
|
||||||
|
#include <gtkmm/adjustment.h>
|
||||||
|
#include <gtkmm/spinbutton.h>
|
||||||
|
#include <gtkmm/table.h>
|
||||||
|
|
||||||
|
#include "gtkmm2ext/gtk_ui.h"
|
||||||
|
#include "gtkmm2ext/utils.h"
|
||||||
|
|
||||||
|
#include "faderport_midi_protocol.h"
|
||||||
|
|
||||||
|
#include "i18n.h"
|
||||||
|
|
||||||
|
class GMCPGUI : public Gtk::VBox
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
GMCPGUI (FaderportMidiControlProtocol&);
|
||||||
|
~GMCPGUI ();
|
||||||
|
|
||||||
|
private:
|
||||||
|
FaderportMidiControlProtocol& cp;
|
||||||
|
Gtk::ComboBoxText map_combo;
|
||||||
|
Gtk::Adjustment bank_adjustment;
|
||||||
|
Gtk::SpinButton bank_spinner;
|
||||||
|
Gtk::CheckButton motorised_button;
|
||||||
|
Gtk::Adjustment threshold_adjustment;
|
||||||
|
Gtk::SpinButton threshold_spinner;
|
||||||
|
|
||||||
|
void binding_changed ();
|
||||||
|
void bank_changed ();
|
||||||
|
void motorised_changed ();
|
||||||
|
void threshold_changed ();
|
||||||
|
};
|
||||||
|
|
||||||
|
using namespace PBD;
|
||||||
|
using namespace ARDOUR;
|
||||||
|
using namespace std;
|
||||||
|
using namespace Gtk;
|
||||||
|
using namespace Gtkmm2ext;
|
||||||
|
|
||||||
|
void*
|
||||||
|
FaderportMidiControlProtocol::get_gui () const
|
||||||
|
{
|
||||||
|
if (!gui) {
|
||||||
|
const_cast<FaderportMidiControlProtocol*>(this)->build_gui ();
|
||||||
|
}
|
||||||
|
static_cast<Gtk::VBox*>(gui)->show_all();
|
||||||
|
return gui;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
FaderportMidiControlProtocol::tear_down_gui ()
|
||||||
|
{
|
||||||
|
if (gui) {
|
||||||
|
Gtk::Widget *w = static_cast<Gtk::VBox*>(gui)->get_parent();
|
||||||
|
if (w) {
|
||||||
|
w->hide();
|
||||||
|
delete w;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
delete (GMCPGUI*) gui;
|
||||||
|
gui = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
FaderportMidiControlProtocol::build_gui ()
|
||||||
|
{
|
||||||
|
gui = (void*) new GMCPGUI (*this);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*--------------------*/
|
||||||
|
|
||||||
|
GMCPGUI::GMCPGUI (FaderportMidiControlProtocol& p)
|
||||||
|
: cp (p)
|
||||||
|
, bank_adjustment (1, 1, 100, 1, 10)
|
||||||
|
, bank_spinner (bank_adjustment)
|
||||||
|
, motorised_button ("Motorised")
|
||||||
|
, threshold_adjustment (p.threshold(), 1, 127, 1, 10)
|
||||||
|
, threshold_spinner (threshold_adjustment)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
GMCPGUI::~GMCPGUI ()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
GMCPGUI::bank_changed ()
|
||||||
|
{
|
||||||
|
// int new_bank = bank_adjustment.get_value() - 1;
|
||||||
|
// cp.set_current_bank (new_bank);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
GMCPGUI::binding_changed ()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
GMCPGUI::motorised_changed ()
|
||||||
|
{
|
||||||
|
// cp.set_motorised (motorised_button.get_active ());
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
GMCPGUI::threshold_changed ()
|
||||||
|
{
|
||||||
|
// cp.set_threshold (threshold_adjustment.get_value());
|
||||||
|
}
|
16
libs/surfaces/faderport/i18n.h
Normal file
16
libs/surfaces/faderport/i18n.h
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
#ifndef __i18n_h__
|
||||||
|
#define __i18n_h__
|
||||||
|
|
||||||
|
#include "pbd/compose.h"
|
||||||
|
#include "pbd/convert.h"
|
||||||
|
#include "gettext.h"
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#define _(Text) dgettext (PACKAGE,Text)
|
||||||
|
#define N_(Text) gettext_noop (Text)
|
||||||
|
#define X_(Text) Text
|
||||||
|
#define I18N(Array) PBD::internationalize (PACKAGE, Array)
|
||||||
|
|
||||||
|
#endif // __i18n_h__
|
33
libs/surfaces/faderport/wscript
Normal file
33
libs/surfaces/faderport/wscript
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
from waflib.extras import autowaf as autowaf
|
||||||
|
import os
|
||||||
|
|
||||||
|
# Mandatory variables
|
||||||
|
top = '.'
|
||||||
|
out = 'build'
|
||||||
|
|
||||||
|
def options(opt):
|
||||||
|
autowaf.set_options(opt)
|
||||||
|
|
||||||
|
def configure(conf):
|
||||||
|
autowaf.configure(conf)
|
||||||
|
|
||||||
|
def build(bld):
|
||||||
|
obj = bld(features = 'cxx cxxshlib')
|
||||||
|
obj.source = '''
|
||||||
|
faderport_midi_protocol.cc
|
||||||
|
fmcp_gui.cc
|
||||||
|
faderport_interface.cc
|
||||||
|
'''
|
||||||
|
obj.export_includes = ['.']
|
||||||
|
obj.defines = [ 'PACKAGE="ardour_faderport"' ]
|
||||||
|
obj.defines += [ 'ARDOURSURFACE_DLL_EXPORTS' ]
|
||||||
|
obj.includes = [ '.', './faderport']
|
||||||
|
obj.name = 'libardour_faderport'
|
||||||
|
obj.target = 'ardour_faderport'
|
||||||
|
obj.uselib = 'GTKMM GTK GDK'
|
||||||
|
obj.use = 'libardour libardour_cp libgtkmm2ext libpbd'
|
||||||
|
obj.install_path = os.path.join(bld.env['LIBDIR'], 'surfaces')
|
||||||
|
|
||||||
|
def shutdown():
|
||||||
|
autowaf.shutdown()
|
|
@ -21,6 +21,7 @@ out = 'build'
|
||||||
|
|
||||||
children = [
|
children = [
|
||||||
'control_protocol',
|
'control_protocol',
|
||||||
|
'faderport',
|
||||||
'generic_midi',
|
'generic_midi',
|
||||||
'mackie',
|
'mackie',
|
||||||
]
|
]
|
||||||
|
@ -67,6 +68,7 @@ def configure(conf):
|
||||||
def build(bld):
|
def build(bld):
|
||||||
bld.recurse('control_protocol')
|
bld.recurse('control_protocol')
|
||||||
bld.recurse('generic_midi')
|
bld.recurse('generic_midi')
|
||||||
|
bld.recurse('faderport')
|
||||||
bld.recurse('mackie')
|
bld.recurse('mackie')
|
||||||
|
|
||||||
if bld.is_defined ('HAVE_LO'):
|
if bld.is_defined ('HAVE_LO'):
|
||||||
|
|
Loading…
Reference in New Issue
Block a user