summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2011-06-28 16:55:41 +0000
committerPaul Davis <paul@linuxaudiosystems.com>2011-06-28 16:55:41 +0000
commit84be4eafc5228eacfed02f78489fa82d401c2947 (patch)
tree4dab87b4691919375ab3a867a011b5caf9ce2e59
parent4388556923da8b174fdbea445ea20a8eb72189c6 (diff)
basic infrastructure for enabling/disabling MIDI input to a given track
git-svn-id: svn://localhost/ardour2/branches/3.0@9772 d708f5d6-7413-0410-9779-e7cbd77b26cf
-rw-r--r--gtk2_ardour/ardour3_widget_list.rc2
-rw-r--r--gtk2_ardour/icons/midi_socket_small.pngbin0 -> 751 bytes
-rw-r--r--gtk2_ardour/mixer_strip.cc54
-rw-r--r--gtk2_ardour/mixer_strip.h5
-rw-r--r--icons/midi_socket.svg78
-rw-r--r--libs/ardour/ardour/midi_port.h8
-rw-r--r--libs/ardour/ardour/midi_track.h4
-rw-r--r--libs/ardour/midi_diskstream.cc4
-rw-r--r--libs/ardour/midi_port.cc71
-rw-r--r--libs/ardour/midi_track.cc43
10 files changed, 232 insertions, 37 deletions
diff --git a/gtk2_ardour/ardour3_widget_list.rc b/gtk2_ardour/ardour3_widget_list.rc
index e85532515d..68bd29dfeb 100644
--- a/gtk2_ardour/ardour3_widget_list.rc
+++ b/gtk2_ardour/ardour3_widget_list.rc
@@ -399,7 +399,7 @@ widget "*TimeInfoSelectionLabel" style:highest "very_small_bright_when_active"
widget "*TimeInfoPunchTitle" style:highest "very_small_bright_when_active"
widget "*TimeInfoPunchLabel" style:highest "very_small_bright_when_active"
widget "*TimeInfoPunchButton" style:highest "punch_button"
-
widget "*RouteNameEditorEntry" style:highest "text_cell_entry"
widget "*RegionNameEditorEntry" style:highest "text_cell_entry"
+widget "*MixerMidiInputEnableButton" style:highest "mouse_mode_button"
diff --git a/gtk2_ardour/icons/midi_socket_small.png b/gtk2_ardour/icons/midi_socket_small.png
new file mode 100644
index 0000000000..2ed5039a8c
--- /dev/null
+++ b/gtk2_ardour/icons/midi_socket_small.png
Binary files differ
diff --git a/gtk2_ardour/mixer_strip.cc b/gtk2_ardour/mixer_strip.cc
index 39f8b4580d..4211e30953 100644
--- a/gtk2_ardour/mixer_strip.cc
+++ b/gtk2_ardour/mixer_strip.cc
@@ -40,6 +40,7 @@
#include "ardour/route.h"
#include "ardour/route_group.h"
#include "ardour/audio_track.h"
+#include "ardour/midi_track.h"
#include "ardour/pannable.h"
#include "ardour/panner.h"
#include "ardour/panner_shell.h"
@@ -89,6 +90,7 @@ MixerStrip::MixerStrip (Mixer_UI& mx, Session* sess, bool in_mixer)
, middle_button_table (1, 2)
, bottom_button_table (1, 2)
, meter_point_label (_("pre"))
+ , midi_input_enable_button (0)
{
init ();
@@ -113,6 +115,7 @@ MixerStrip::MixerStrip (Mixer_UI& mx, Session* sess, boost::shared_ptr<Route> rt
, middle_button_table (1, 2)
, bottom_button_table (1, 2)
, meter_point_label (_("pre"))
+ , midi_input_enable_button (0)
{
init ();
set_route (rt);
@@ -153,8 +156,7 @@ MixerStrip::init ()
input_button.add (input_label);
input_button.set_name ("MixerIOButton");
input_label.set_name ("MixerIOButtonLabel");
-
- Gtkmm2ext::set_size_request_to_display_given_text (input_button, longest_label.c_str(), 4, 4);
+ input_button_box.pack_start (input_button, true, true);
output_label.set_text (_("Output"));
ARDOUR_UI::instance()->set_tip (&output_button, _("Button 1 to choose outputs from a port matrix, button 3 to select inputs from a menu"), "");
@@ -227,7 +229,7 @@ MixerStrip::init ()
button_table.set_spacings (0);
button_table.attach (name_button, 0, 1, 0, 1);
- button_table.attach (input_button, 0, 1, 1, 2);
+ button_table.attach (input_button_box, 0, 1, 1, 2);
button_table.attach (_invert_button_box, 0, 1, 2, 3);
middle_button_table.set_homogeneous (true);
@@ -399,6 +401,26 @@ MixerStrip::set_route (boost::shared_ptr<Route> rt)
global_vpacker.pack_start (*spacer, false, false);
}
+ if (is_midi_track()) {
+ if (midi_input_enable_button == 0) {
+ Image* img = manage (new Image (get_icon (X_("midi_socket_small"))));
+ midi_input_enable_button = manage (new ToggleButton);
+ midi_input_enable_button->set_name ("MixerMidiInputEnableButton");
+ midi_input_enable_button->set_image (*img);
+ midi_input_enable_button->signal_toggled().connect (sigc::mem_fun (*this, &MixerStrip::midi_input_toggled));
+ ARDOUR_UI::instance()->set_tip (midi_input_enable_button, _("Enable/Disable MIDI input"));
+ }
+ /* get current state */
+ midi_input_status_changed ();
+ input_button_box.pack_start (*midi_input_enable_button, false, false);
+ } else {
+ if (midi_input_enable_button) {
+ /* removal from the container will delete it */
+ input_button_box.remove (*midi_input_enable_button);
+ midi_input_enable_button = 0;
+ }
+ }
+
if (is_audio_track()) {
boost::shared_ptr<AudioTrack> at = audio_track();
at->FreezeChange.connect (route_connections, invalidator (*this), boost::bind (&MixerStrip::map_frozen, this), gui_context());
@@ -486,8 +508,7 @@ MixerStrip::set_route (boost::shared_ptr<Route> rt)
meter_point_label.show();
diskstream_button.show();
diskstream_label.show();
- input_button.show();
- input_label.show();
+ input_button_box.show_all();
output_button.show();
output_label.show();
name_label.show();
@@ -1891,3 +1912,26 @@ MixerStrip::hide_things ()
{
processor_box.hide_things ();
}
+
+void
+MixerStrip::midi_input_toggled ()
+{
+ boost::shared_ptr<MidiTrack> mt = midi_track ();
+
+ if (!mt) {
+ return;
+ }
+
+ mt->set_input_active (midi_input_enable_button->get_active());
+}
+
+void
+MixerStrip::midi_input_status_changed ()
+{
+ if (midi_input_enable_button) {
+ boost::shared_ptr<MidiTrack> mt = midi_track ();
+ assert (mt);
+ cerr << "track input active? " << mt->input_active() << endl;
+ midi_input_enable_button->set_active (mt->input_active ());
+ }
+}
diff --git a/gtk2_ardour/mixer_strip.h b/gtk2_ardour/mixer_strip.h
index a24df01696..fa101513b9 100644
--- a/gtk2_ardour/mixer_strip.h
+++ b/gtk2_ardour/mixer_strip.h
@@ -178,12 +178,17 @@ class MixerStrip : public RouteUI, public Gtk::EventBox
Gtk::Label diskstream_label;
Gtk::Button input_button;
+ Gtk::ToggleButton* midi_input_enable_button;
+ Gtk::HBox input_button_box;
Gtk::Label input_label;
Gtk::Button output_button;
Gtk::Label output_label;
std::string longest_label;
+ void midi_input_status_changed ();
+ void midi_input_toggled ();
+
gint mark_update_safe ();
guint32 mode_switch_in_progress;
diff --git a/icons/midi_socket.svg b/icons/midi_socket.svg
new file mode 100644
index 0000000000..1c59b2044d
--- /dev/null
+++ b/icons/midi_socket.svg
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.0"
+ width="454.99899"
+ height="455"
+ viewBox="-9.302 -9.782 454.999 455"
+ id="Layer_1"
+ xml:space="preserve"
+ inkscape:version="0.47 r22583"
+ sodipodi:docname="DIN-5c_Diagram.svg"
+ inkscape:export-filename="/tmp/DIN-5c_Diagram.png"
+ inkscape:export-xdpi="4.48"
+ inkscape:export-ydpi="4.48"><metadata
+ id="metadata13"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1298"
+ inkscape:window-height="879"
+ id="namedview11"
+ showgrid="false"
+ inkscape:zoom="0.51868132"
+ inkscape:cx="-144.59796"
+ inkscape:cy="223.64407"
+ inkscape:window-x="435"
+ inkscape:window-y="77"
+ inkscape:window-maximized="0"
+ inkscape:current-layer="Layer_1" /><defs
+ id="defs4733"><inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 227.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="454.99899 : 227.5 : 1"
+ inkscape:persp3d-origin="227.4995 : 151.66667 : 1"
+ id="perspective15" /></defs>
+<path
+ style="fill:#ffffff;stroke:#000000;stroke-width:5;fill-opacity:1"
+ d="M 227 28.5 C 117.377 28.5 28.5 117.376 28.5 227 C 28.5 336.631 117.377 425.5 227 425.5 C 336.626 425.5 425.5 336.631 425.5 227 C 425.5 117.376 336.628 28.5 227 28.5 z M 227 45.125 C 327.447 45.125 408.873 126.557 408.875 227 C 408.875 314.806 346.64 388.073 263.875 405.125 C 261.386 386.958 245.838 372.9375 227 372.9375 C 208.148 372.9375 192.617 386.959 190.125 405.125 C 107.363 388.079 45.125 314.806 45.125 227 C 45.125 126.557 126.552 45.125 227 45.125 z "
+ transform="translate(-9.302,-9.7820035)"
+ id="path4718" />
+
+<path
+ d="M 103.738,283.004 C 110.684,295.034 126.065,299.151 138.093,292.206 C 150.125,285.26 154.245,269.882 147.3,257.853 C 140.359,245.83 124.979,241.705 112.946,248.651 C 100.918,255.597 96.796,270.982 103.738,283.004 z "
+ style="fill:#ffffff;stroke:#000000;stroke-width:5;fill-opacity:1"
+ id="path4722" />
+<path
+ d="M 147.298,176.572 C 154.244,164.542 150.119,149.163 138.091,142.219 C 126.059,135.272 110.683,139.394 103.737,151.422 C 96.796,163.445 100.913,178.827 112.944,185.774 C 124.974,192.718 140.356,188.595 147.298,176.572 z "
+ style="fill:#ffffff;stroke:#000000;stroke-width:5;fill-opacity:1"
+ id="path4724" />
+<path
+ d="M 217.693,135.931 C 231.584,135.931 242.84,124.669 242.84,110.781 C 242.84,96.886 231.582,85.632 217.693,85.632 C 203.81,85.632 192.547,96.889 192.547,110.781 C 192.548,124.67 203.81,135.931 217.693,135.931 z "
+ style="fill:#ffffff;stroke:#000000;stroke-width:5;fill-opacity:1"
+ id="path4726" />
+<path
+ d="M 288.086,176.571 C 295.032,188.601 310.413,192.718 322.44,185.774 C 334.473,178.827 338.591,163.45 331.646,151.421 C 324.705,139.398 309.325,135.273 297.293,142.219 C 285.266,149.165 281.145,164.549 288.086,176.571 z "
+ style="fill:#ffffff;stroke:#000000;stroke-width:5;fill-opacity:1"
+ id="path4728" />
+<path
+ d="M 331.646,283.005 C 338.592,270.975 334.467,255.597 322.438,248.651 C 310.406,241.705 295.029,245.826 288.084,257.854 C 281.143,269.876 285.26,285.259 297.292,292.206 C 309.321,299.151 324.705,295.029 331.646,283.005 z "
+ style="fill:#ffffff;stroke:#000000;stroke-width:5;fill-opacity:1"
+ id="path4730" />
+</svg> \ No newline at end of file
diff --git a/libs/ardour/ardour/midi_port.h b/libs/ardour/ardour/midi_port.h
index 69e17ca08e..a4d2f53806 100644
--- a/libs/ardour/ardour/midi_port.h
+++ b/libs/ardour/ardour/midi_port.h
@@ -46,6 +46,9 @@ class MidiPort : public Port {
void realtime_locate ();
void reset ();
+ bool input_active() const { return _input_active; }
+ void set_input_active (bool yn);
+
Buffer& get_buffer (pframes_t nframes) {
return get_midi_buffer (nframes);
}
@@ -59,8 +62,9 @@ class MidiPort : public Port {
private:
MidiBuffer* _buffer;
- bool _has_been_mixed_down;
- bool _resolve_required;
+ bool _has_been_mixed_down;
+ bool _resolve_required;
+ bool _input_active;
void resolve_notes (void* jack_buffer, MidiBuffer::TimeType when);
};
diff --git a/libs/ardour/ardour/midi_track.h b/libs/ardour/ardour/midi_track.h
index 6bb959a9a5..5ceeefd307 100644
--- a/libs/ardour/ardour/midi_track.h
+++ b/libs/ardour/ardour/midi_track.h
@@ -105,6 +105,10 @@ public:
PBD::Signal2<void, boost::shared_ptr<MidiBuffer>, boost::weak_ptr<MidiSource> > DataRecorded;
+ void set_input_active (bool);
+ bool input_active () const;
+ PBD::Signal0<void> InputActiveChanged;
+
protected:
XMLNode& state (bool full);
diff --git a/libs/ardour/midi_diskstream.cc b/libs/ardour/midi_diskstream.cc
index 1c34ff9c03..e3eef62107 100644
--- a/libs/ardour/midi_diskstream.cc
+++ b/libs/ardour/midi_diskstream.cc
@@ -532,6 +532,10 @@ MidiDiskstream::process (framepos_t transport_frame, pframes_t nframes, bool can
}
if (buf.size() != 0) {
+ /* XXX this needs fixing - realtime new() call for
+ every time we get MIDI data in a process callback!
+ */
+
/* Make a copy of this data and emit it for the GUI to see */
boost::shared_ptr<MidiBuffer> copy (new MidiBuffer (buf.capacity ()));
for (MidiBuffer::iterator i = buf.begin(); i != buf.end(); ++i) {
diff --git a/libs/ardour/midi_port.cc b/libs/ardour/midi_port.cc
index a8bff5bfa7..c27332fce1 100644
--- a/libs/ardour/midi_port.cc
+++ b/libs/ardour/midi_port.cc
@@ -30,6 +30,7 @@ MidiPort::MidiPort (const std::string& name, Flags flags)
: Port (name, DataType::MIDI, flags)
, _has_been_mixed_down (false)
, _resolve_required (false)
+ , _input_active (true)
{
_buffer = new MidiBuffer (AudioEngine::instance()->raw_buffer_size (DataType::MIDI));
}
@@ -62,36 +63,42 @@ MidiPort::get_midi_buffer (pframes_t nframes)
if (receives_input ()) {
- void* jack_buffer = jack_port_get_buffer (_jack_port, nframes);
- const pframes_t event_count = jack_midi_get_event_count (jack_buffer);
-
- assert (event_count < _buffer->capacity());
-
- /* suck all relevant MIDI events from the JACK MIDI port buffer
- into our MidiBuffer
- */
-
- for (pframes_t i = 0; i < event_count; ++i) {
-
- jack_midi_event_t ev;
-
- jack_midi_event_get (&ev, jack_buffer, i);
-
- if (ev.buffer[0] == 0xfe) {
- /* throw away active sensing */
- continue;
- }
-
- /* check that the event is in the acceptable time range */
+ if (_input_active) {
+
+ void* jack_buffer = jack_port_get_buffer (_jack_port, nframes);
+ const pframes_t event_count = jack_midi_get_event_count (jack_buffer);
+
+ assert (event_count < _buffer->capacity());
+
+ /* suck all relevant MIDI events from the JACK MIDI port buffer
+ into our MidiBuffer
+ */
+
+ for (pframes_t i = 0; i < event_count; ++i) {
+
+ jack_midi_event_t ev;
+
+ jack_midi_event_get (&ev, jack_buffer, i);
+
+ if (ev.buffer[0] == 0xfe) {
+ /* throw away active sensing */
+ continue;
+ }
+
+ /* check that the event is in the acceptable time range */
+
+ if ((ev.time >= (_global_port_buffer_offset + _port_buffer_offset)) &&
+ (ev.time < (_global_port_buffer_offset + _port_buffer_offset + nframes))) {
+ _buffer->push_back (ev);
+ } else {
+ cerr << "Dropping incoming MIDI at time " << ev.time << "; offset="
+ << _global_port_buffer_offset << " limit="
+ << (_global_port_buffer_offset + _port_buffer_offset + nframes) << "\n";
+ }
+ }
- if ((ev.time >= (_global_port_buffer_offset + _port_buffer_offset)) &&
- (ev.time < (_global_port_buffer_offset + _port_buffer_offset + nframes))) {
- _buffer->push_back (ev);
- } else {
- cerr << "Dropping incoming MIDI at time " << ev.time << "; offset="
- << _global_port_buffer_offset << " limit="
- << (_global_port_buffer_offset + _port_buffer_offset + nframes) << "\n";
- }
+ } else {
+ _buffer->silence (nframes);
}
} else {
@@ -205,3 +212,9 @@ MidiPort::reset ()
delete _buffer;
_buffer = new MidiBuffer (AudioEngine::instance()->raw_buffer_size (DataType::MIDI));
}
+
+void
+MidiPort::set_input_active (bool yn)
+{
+ _input_active = yn;
+}
diff --git a/libs/ardour/midi_track.cc b/libs/ardour/midi_track.cc
index 52a0cac27e..2dcee645a9 100644
--- a/libs/ardour/midi_track.cc
+++ b/libs/ardour/midi_track.cc
@@ -676,3 +676,46 @@ MidiTrack::send_silence () const
{
return false;
}
+
+void
+MidiTrack::set_input_active (bool yn)
+{
+ bool changed = false;
+
+ if (!_input) {
+ return;
+ }
+
+ PortSet& ports (_input->ports());
+
+ for (PortSet::iterator p = ports.begin(DataType::MIDI); p != ports.end(DataType::MIDI); ++p) {
+ MidiPort* mp = dynamic_cast<MidiPort*> (&*p);
+ if (yn != mp->input_active()) {
+ mp->set_input_active (yn);
+ changed = true;
+ }
+ }
+
+ if (changed) {
+ InputActiveChanged (); /* EMIT SIGNAL */
+ }
+}
+
+bool
+MidiTrack::input_active () const
+{
+ if (!_input) {
+ cerr << " no input\n";
+ return false;
+ }
+
+ if (_input->ports().count().n_midi() == 0) {
+ cerr << "no input MIDI ports, " << _input->ports().count() << endl;
+ return false;
+ }
+
+ PortSet::iterator p = _input->ports().begin(DataType::MIDI);
+ MidiPort* mp = dynamic_cast<MidiPort*> (&*p);
+ cerr << "first port is active: " << mp->input_active() << endl;
+ return mp->input_active ();
+}