From dcd6dbf14b795af7b5ad2422c925114a46c0ecf1 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Sat, 2 Jun 2012 14:53:34 +0000 Subject: Persist track MIDNAM settings via a GUI property. Fix a couple of crashes with the MIDNAM code. git-svn-id: svn://localhost/ardour2/branches/3.0@12543 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/midi_region_view.cc | 8 ++++++++ gtk2_ardour/midi_time_axis.cc | 27 +++++++++++++++++++++------ gtk2_ardour/midi_time_axis.h | 3 +++ gtk2_ardour/patch_change_dialog.cc | 14 ++++++++++---- 4 files changed, 42 insertions(+), 10 deletions(-) diff --git a/gtk2_ardour/midi_region_view.cc b/gtk2_ardour/midi_region_view.cc index a455d98c7c..26b03b1a2f 100644 --- a/gtk2_ardour/midi_region_view.cc +++ b/gtk2_ardour/midi_region_view.cc @@ -113,6 +113,10 @@ MidiRegionView::MidiRegionView (ArdourCanvas::Group *parent, RouteTimeAxisView & _note_group->raise_to_top(); PublicEditor::DropDownKeys.connect (sigc::mem_fun (*this, &MidiRegionView::drop_down_keys)); + /* Look up MIDNAM details from our MidiTimeAxisView */ + MidiTimeAxisView& mtv = dynamic_cast (tv); + midi_patch_settings_changed (mtv.midi_patch_model (), mtv.midi_patch_custom_device_node ()); + Config->ParameterChanged.connect (*this, invalidator (*this), boost::bind (&MidiRegionView::parameter_changed, this, _1), gui_context()); connect_to_diskstream (); @@ -149,6 +153,10 @@ MidiRegionView::MidiRegionView (ArdourCanvas::Group *parent, RouteTimeAxisView & _note_group->raise_to_top(); PublicEditor::DropDownKeys.connect (sigc::mem_fun (*this, &MidiRegionView::drop_down_keys)); + /* Look up MIDNAM details from our MidiTimeAxisView */ + MidiTimeAxisView& mtv = dynamic_cast (tv); + midi_patch_settings_changed (mtv.midi_patch_model (), mtv.midi_patch_custom_device_node ()); + connect_to_diskstream (); SelectionCleared.connect (_selection_cleared_connection, invalidator (*this), boost::bind (&MidiRegionView::selection_cleared, this, _1), gui_context ()); diff --git a/gtk2_ardour/midi_time_axis.cc b/gtk2_ardour/midi_time_axis.cc index 4df22c7c96..7cebb806af 100644 --- a/gtk2_ardour/midi_time_axis.cc +++ b/gtk2_ardour/midi_time_axis.cc @@ -199,14 +199,14 @@ MidiTimeAxisView::set_route (boost::shared_ptr rt) _model_selector.append_text(m->c_str()); } + _model_selector.signal_changed().connect(sigc::mem_fun(*this, &MidiTimeAxisView::model_changed)); _custom_device_mode_selector.signal_changed().connect( sigc::mem_fun(*this, &MidiTimeAxisView::custom_device_mode_changed)); - // TODO: persist the choice - // this initializes the comboboxes and sends out the signal - _model_selector.set_active(0); + _model_selector.set_active_text (gui_property (X_("midnam-model-name"))); + _custom_device_mode_selector.set_active_text (gui_property (X_("midnam-custom-device-mode"))); midi_controls_hbox->pack_start(_channel_selector, true, false); if (!patch_manager.all_models().empty()) { @@ -317,12 +317,15 @@ MidiTimeAxisView::model_changed() } _custom_device_mode_selector.set_active(0); + + set_gui_property (X_("midnam-model-name"), midi_patch_model ()); } -void MidiTimeAxisView::custom_device_mode_changed() +void +MidiTimeAxisView::custom_device_mode_changed() { - _midi_patch_settings_changed.emit(_model_selector.get_active_text(), - _custom_device_mode_selector.get_active_text()); + _midi_patch_settings_changed.emit (midi_patch_model (), midi_patch_custom_device_node ()); + set_gui_property (X_("midnam-custom-device-mode"), midi_patch_custom_device_node ()); } MidiStreamView* @@ -1203,3 +1206,15 @@ MidiTimeAxisView::note_range_changed () set_gui_property ("note-range-min", (int) midi_view()->lowest_note ()); set_gui_property ("note-range-max", (int) midi_view()->highest_note ()); } + +string +MidiTimeAxisView::midi_patch_model () const +{ + return _model_selector.get_active_text (); +} + +string +MidiTimeAxisView::midi_patch_custom_device_node () const +{ + return _custom_device_mode_selector.get_active_text (); +} diff --git a/gtk2_ardour/midi_time_axis.h b/gtk2_ardour/midi_time_axis.h index 8207792f83..bc1dccfb78 100644 --- a/gtk2_ardour/midi_time_axis.h +++ b/gtk2_ardour/midi_time_axis.h @@ -102,6 +102,9 @@ class MidiTimeAxisView : public RouteTimeAxisView uint8_t get_channel_for_add () const; + std::string midi_patch_model () const; + std::string midi_patch_custom_device_node () const; + protected: void start_step_editing (); void stop_step_editing (); diff --git a/gtk2_ardour/patch_change_dialog.cc b/gtk2_ardour/patch_change_dialog.cc index 354cbfbf6a..c7b80a5480 100644 --- a/gtk2_ardour/patch_change_dialog.cc +++ b/gtk2_ardour/patch_change_dialog.cc @@ -171,7 +171,7 @@ PatchChangeDialog::set_active_bank_combo () boost::replace_all (n, "_", " "); MIDI::Name::PatchPrimaryKey const * key = (*i)->patch_primary_key (); - if (((key->msb << 7) | key->lsb) == _bank.get_value () - 1) { + if (key && ((key->msb << 7) | key->lsb) == _bank.get_value () - 1) { _current_patch_bank = *i; _ignore_signals = true; _bank_combo.set_active_text (n); @@ -210,15 +210,21 @@ PatchChangeDialog::bank_combo_changed () } } + if (_current_patch_bank == 0) { + return; + } + /* Reflect */ fill_patch_combo (); set_active_patch_combo (); MIDI::Name::PatchPrimaryKey const * key = _current_patch_bank->patch_primary_key (); - _ignore_signals = true; - _bank.set_value (((key->msb << 7) | key->lsb) + 1); - _ignore_signals = false; + if (key) { + _ignore_signals = true; + _bank.set_value (((key->msb << 7) | key->lsb) + 1); + _ignore_signals = false; + } } /** Fill the contents of the patch combo */ -- cgit v1.2.3