X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fardour_ui.cc;h=fe9a5c3713ee85b9aa4d8f8f9b574e9387146ad2;hb=569b0bbcb49a0b132603ab347af9fa59729cefc1;hp=09160074317b60cf2ae2c2a9b3f50fa2cdd2f110;hpb=8d81f121e5b68030eea5444c3ebad14d6a0bfa82;p=ardour.git diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc index 0916007431..fe9a5c3713 100644 --- a/gtk2_ardour/ardour_ui.cc +++ b/gtk2_ardour/ardour_ui.cc @@ -71,6 +71,7 @@ #include "ardour/ardour.h" #include "ardour/audio_backend.h" +#include "ardour/audio_track.h" #include "ardour/audioengine.h" #include "ardour/audiofilesource.h" #include "ardour/automation_watch.h" @@ -78,6 +79,7 @@ #include "ardour/filename_extensions.h" #include "ardour/filesystem_paths.h" #include "ardour/ltc_file_reader.h" +#include "ardour/midi_track.h" #include "ardour/port.h" #include "ardour/plugin_manager.h" #include "ardour/process_thread.h" @@ -663,16 +665,16 @@ ARDOUR_UI::~ARDOUR_UI () if (getenv ("ARDOUR_RUNNING_UNDER_VALGRIND")) { // don't bother at 'real' exit. the OS cleans up for us. - delete big_clock; - delete primary_clock; - delete secondary_clock; - delete _process_thread; - delete meterbridge; - delete luawindow; - delete editor; - delete mixer; - delete nsm; - delete gui_object_state; + delete big_clock; big_clock = 0; + delete primary_clock; primary_clock = 0; + delete secondary_clock; secondary_clock = 0; + delete _process_thread; _process_thread = 0; + delete meterbridge; meterbridge = 0; + delete luawindow; luawindow = 0; + delete editor; editor = 0; + delete mixer; mixer = 0; + delete nsm; nsm = 0; + delete gui_object_state; gui_object_state = 0; FastMeter::flush_pattern_cache (); PixFader::flush_pattern_cache (); } @@ -1776,10 +1778,15 @@ ARDOUR_UI::open_session () } } - void -ARDOUR_UI::session_add_mixed_track (const ChanCount& input, const ChanCount& output, RouteGroup* route_group, - uint32_t how_many, const string& name_template, PluginInfoPtr instrument) +ARDOUR_UI::session_add_mixed_track ( + const ChanCount& input, + const ChanCount& output, + RouteGroup* route_group, + uint32_t how_many, + const string& name_template, + bool strict_io, + PluginInfoPtr instrument) { list > tracks; @@ -1797,24 +1804,67 @@ ARDOUR_UI::session_add_mixed_track (const ChanCount& input, const ChanCount& out } catch (...) { - MessageDialog msg (_main_window, - string_compose (_("There are insufficient ports available\n\ -to create a new track or bus.\n\ -You should save %1, exit and\n\ -restart with more ports."), PROGRAM_NAME)); - msg.run (); + display_insufficient_ports_message (); + return; + } + + if (strict_io) { + for (list >::iterator i = tracks.begin(); i != tracks.end(); ++i) { + (*i)->set_strict_io (true); + } } } +void +ARDOUR_UI::session_add_midi_bus ( + RouteGroup* route_group, + uint32_t how_many, + const string& name_template, + bool strict_io, + PluginInfoPtr instrument) +{ + RouteList routes; + + if (_session == 0) { + warning << _("You cannot add a track without a session already loaded.") << endmsg; + return; + } + + try { + routes = _session->new_midi_route (route_group, how_many, name_template, instrument); + if (routes.size() != how_many) { + error << string_compose(P_("could not create %1 new Midi Bus", "could not create %1 new Midi Busses", how_many), how_many) << endmsg; + } + + } + catch (...) { + display_insufficient_ports_message (); + return; + } + + if (strict_io) { + for (RouteList::iterator i = routes.begin(); i != routes.end(); ++i) { + (*i)->set_strict_io (true); + } + } +} void -ARDOUR_UI::session_add_midi_route (bool disk, RouteGroup* route_group, uint32_t how_many, const string& name_template, PluginInfoPtr instrument) +ARDOUR_UI::session_add_midi_route ( + bool disk, + RouteGroup* route_group, + uint32_t how_many, + const string& name_template, + bool strict_io, + PluginInfoPtr instrument) { ChanCount one_midi_channel; one_midi_channel.set (DataType::MIDI, 1); if (disk) { - session_add_mixed_track (one_midi_channel, one_midi_channel, route_group, how_many, name_template, instrument); + session_add_mixed_track (one_midi_channel, one_midi_channel, route_group, how_many, name_template, strict_io, instrument); + } else { + session_add_midi_bus (route_group, how_many, name_template, strict_io, instrument); } } @@ -1826,7 +1876,8 @@ ARDOUR_UI::session_add_audio_route ( ARDOUR::TrackMode mode, RouteGroup* route_group, uint32_t how_many, - string const & name_template + string const & name_template, + bool strict_io ) { list > tracks; @@ -1858,14 +1909,30 @@ ARDOUR_UI::session_add_audio_route ( } catch (...) { - MessageDialog msg (_main_window, - string_compose (_("There are insufficient ports available\n\ + display_insufficient_ports_message (); + return; + } + + if (strict_io) { + for (list >::iterator i = tracks.begin(); i != tracks.end(); ++i) { + (*i)->set_strict_io (true); + } + for (RouteList::iterator i = routes.begin(); i != routes.end(); ++i) { + (*i)->set_strict_io (true); + } + } +} + +void +ARDOUR_UI::display_insufficient_ports_message () +{ + MessageDialog msg (_main_window, + string_compose (_("There are insufficient ports available\n\ to create a new track or bus.\n\ You should save %1, exit and\n\ restart with more ports."), PROGRAM_NAME)); - pop_back_splash (msg); - msg.run (); - } + pop_back_splash (msg); + msg.run (); } void @@ -3897,7 +3964,6 @@ ARDOUR_UI::add_route (Gtk::Window* /* ignored */) } setup_order_hint(add_route_dialog->insert_at()); - string template_path = add_route_dialog->track_template(); DisplaySuspender ds; @@ -3916,6 +3982,7 @@ ARDOUR_UI::add_route (Gtk::Window* /* ignored */) PluginInfoPtr instrument = add_route_dialog->requested_instrument (); RouteGroup* route_group = add_route_dialog->route_group (); AutoConnectOption oac = Config->get_output_auto_connect(); + bool strict_io = add_route_dialog->use_strict_io (); if (oac & AutoConnectMaster) { output_chan.set (DataType::AUDIO, (_session->master_out() ? _session->master_out()->n_inputs().n_audio() : input_chan.n_audio())); @@ -3928,16 +3995,19 @@ ARDOUR_UI::add_route (Gtk::Window* /* ignored */) switch (add_route_dialog->type_wanted()) { case AddRouteDialog::AudioTrack: - session_add_audio_track (input_chan.n_audio(), output_chan.n_audio(), add_route_dialog->mode(), route_group, count, name_template); + session_add_audio_track (input_chan.n_audio(), output_chan.n_audio(), add_route_dialog->mode(), route_group, count, name_template, strict_io); break; case AddRouteDialog::MidiTrack: - session_add_midi_track (route_group, count, name_template, instrument); + session_add_midi_track (route_group, count, name_template, strict_io, instrument); break; case AddRouteDialog::MixedTrack: - session_add_mixed_track (input_chan, output_chan, route_group, count, name_template, instrument); + session_add_mixed_track (input_chan, output_chan, route_group, count, name_template, strict_io, instrument); break; case AddRouteDialog::AudioBus: - session_add_audio_bus (input_chan.n_audio(), output_chan.n_audio(), route_group, count, name_template); + session_add_audio_bus (input_chan.n_audio(), output_chan.n_audio(), route_group, count, name_template, strict_io); + break; + case AddRouteDialog::MidiBus: + session_add_midi_bus (route_group, count, name_template, strict_io, instrument); break; } } @@ -3958,6 +4028,7 @@ ARDOUR_UI::add_lua_script () default: return; } + ss.hide(); std::string script = ""; @@ -3970,7 +4041,7 @@ ARDOUR_UI::add_lua_script () return; } - LuaScriptParamList lsp = LuaScripting::session_script_params (spi); + LuaScriptParamList lsp = LuaScriptParams::script_params (spi, "sess_params"); std::vector reg = _session->registered_lua_functions (); ScriptParameterDialog spd (_("Set Script Parameters"), spi, reg, lsp); @@ -5283,6 +5354,21 @@ ARDOUR_UI::key_event_handler (GdkEventKey* ev, Gtk::Window* event_window) return key_press_focus_accelerator_handler (*window, ev, bindings); } +static Gtkmm2ext::Bindings* +get_bindings_from_widget_heirarchy (GtkWidget* w) +{ + void* p; + + while (w) { + if ((p = g_object_get_data (G_OBJECT(w), "ardour-bindings")) != 0) { + break; + } + w = gtk_widget_get_parent (w); + } + + return reinterpret_cast (p); +} + bool ARDOUR_UI::key_press_focus_accelerator_handler (Gtk::Window& window, GdkEventKey* ev, Gtkmm2ext::Bindings* bindings) { @@ -5303,6 +5389,14 @@ ARDOUR_UI::key_press_focus_accelerator_handler (Gtk::Window& window, GdkEventKey */ special_handling_of_unmodified_accelerators = true; + + } else { + + Gtkmm2ext::Bindings* focus_bindings = get_bindings_from_widget_heirarchy (focus); + if (focus_bindings) { + bindings = focus_bindings; + DEBUG_TRACE (DEBUG::Accelerators, string_compose ("Switch bindings based on focus widget, now using %1\n", bindings->name())); + } } } @@ -5361,7 +5455,7 @@ ARDOUR_UI::key_press_focus_accelerator_handler (Gtk::Window& window, GdkEventKey if (bindings) { - DEBUG_TRACE (DEBUG::Accelerators, string_compose ("\tusing Ardour bindings %1 for this event\n", bindings)); + DEBUG_TRACE (DEBUG::Accelerators, string_compose ("\tusing Ardour bindings %1 @ %2 for this event\n", bindings->name(), bindings)); if (bindings->activate (k, Bindings::Press)) { DEBUG_TRACE (DEBUG::Accelerators, "\t\thandled\n"); @@ -5424,7 +5518,7 @@ ARDOUR_UI::key_press_focus_accelerator_handler (Gtk::Window& window, GdkEventKey void ARDOUR_UI::load_bindings () { - if ((global_bindings = Bindings::get_bindings ("global", global_actions)) == 0) { + if ((global_bindings = Bindings::get_bindings (X_("Global"), global_actions)) == 0) { error << _("Global keybindings are missing") << endmsg; } }