X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fardour_ui.cc;h=9c627dcb01a52491ae0a926cc12338c4b306a692;hb=cf52d6e4b40111eb04b244ec054055a4ec15dbe0;hp=32d14144fb576d2ca8db5a281377981ce6a79f2f;hpb=17ace643e4edbec1e5bd7b446d039f8c94beef75;p=ardour.git diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc index 32d14144fb..9c627dcb01 100644 --- a/gtk2_ardour/ardour_ui.cc +++ b/gtk2_ardour/ardour_ui.cc @@ -33,6 +33,11 @@ #include #endif +#ifdef __FreeBSD__ +#include +#include +#endif + #include #include #include @@ -44,6 +49,7 @@ #include #include +#include #include "pbd/error.h" #include "pbd/basename.h" @@ -85,6 +91,7 @@ #include "ardour/process_thread.h" #include "ardour/profile.h" #include "ardour/recent_sessions.h" +#include "ardour/record_enable_control.h" #include "ardour/session_directory.h" #include "ardour/session_route.h" #include "ardour/session_state_utils.h" @@ -92,6 +99,9 @@ #include "ardour/source_factory.h" #include "ardour/slave.h" #include "ardour/system_exec.h" +#include "ardour/track.h" +#include "ardour/vca_manager.h" +#include "ardour/utils.h" #include "LuaBridge/LuaBridge.h" @@ -167,7 +177,7 @@ typedef uint64_t microseconds_t; #include "add_video_dialog.h" #include "transcode_video_dialog.h" -#include "i18n.h" +#include "pbd/i18n.h" using namespace ARDOUR; using namespace ARDOUR_UI_UTILS; @@ -252,6 +262,7 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir) , video_timeline(0) , global_actions (X_("global")) , ignore_dual_punch (false) + , main_window_visibility (0) , editor (0) , mixer (0) , nsm (0) @@ -285,7 +296,7 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir) , speaker_config_window (X_("speaker-config"), _("Speaker Configuration")) , add_route_dialog (X_("add-routes"), _("Add Tracks/Busses")) , about (X_("about"), _("About")) - , location_ui (X_("locations"), _("Locations")) + , location_ui (X_("locations"), S_("Ranges|Locations")) , route_params (X_("inspector"), _("Tracks and Busses")) , audio_midi_setup (X_("audio-midi-setup"), _("Audio/MIDI Setup")) , export_video_dialog (X_("video-export"), _("Video Export Dialog")) @@ -322,10 +333,22 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir) _exit (0); } + + if (string (VERSIONSTRING).find (".pre") != string::npos) { + /* check this is not being run from ./ardev etc. */ + if (!running_from_source_tree ()) { + pre_release_dialog (); + } + } + if (theArdourUI == 0) { theArdourUI = this; } + /* track main window visibility */ + + main_window_visibility = new VisibilityTracker (_main_window); + /* stop libxml from spewing to stdout/stderr */ xmlSetGenericErrorFunc (this, libxml_generic_error_func); @@ -465,6 +488,9 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir) WM::Manager::instance().register_window (&audio_port_matrix); WM::Manager::instance().register_window (&midi_port_matrix); + /* do not retain position for add route dialog */ + add_route_dialog.set_state_mask (WindowProxy::Size); + /* Trigger setting up the color scheme and loading the GTK RC file */ UIConfiguration::instance().load_rc_file (false); @@ -477,6 +503,40 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir) attach_to_engine (); } +void +ARDOUR_UI::pre_release_dialog () +{ + ArdourDialog d (_("Pre-Release Warning"), true, false); + d.add_button (Gtk::Stock::OK, Gtk::RESPONSE_OK); + + Label* label = manage (new Label); + label->set_markup (string_compose (_("Welcome to this pre-release build of %1 %2\n\n\ +There are still several issues and bugs to be worked on,\n\ +as well as general workflow improvements, before this can be considered\n\ +release software. So, a few guidelines:\n\ +\n\ +1) Please do NOT use this software with the expectation that it is stable or reliable\n\ + though it may be so, depending on your workflow.\n\ +2) Please wait for a helpful writeup of new features.\n\ +3) Please do NOT use the forums at ardour.org to report issues.\n\ +4) Please DO use the bugtracker at http://tracker.ardour.org/ to report issues\n\ + making sure to note the product version number as 5.0-pre.\n\ +5) Please DO use the ardour-users mailing list to discuss ideas and pass on comments.\n\ +6) Please DO join us on IRC for real time discussions about %1 %2. You\n\ + can get there directly from within the program via the Help->Chat menu option.\n\ +\n\ +Full information on all the above can be found on the support page at\n\ +\n\ + http://ardour.org/support\n\ +"), PROGRAM_NAME, VERSIONSTRING)); + + d.get_vbox()->set_border_width (12); + d.get_vbox()->pack_start (*label, false, false, 12); + d.get_vbox()->show_all (); + + d.run (); +} + GlobalPortMatrixWindow* ARDOUR_UI::create_global_port_matrix (ARDOUR::DataType type) { @@ -683,6 +743,7 @@ ARDOUR_UI::~ARDOUR_UI () delete mixer; mixer = 0; delete nsm; nsm = 0; delete gui_object_state; gui_object_state = 0; + delete main_window_visibility; FastMeter::flush_pattern_cache (); PixFader::flush_pattern_cache (); } @@ -1563,7 +1624,7 @@ void ARDOUR_UI::count_recenabled_streams (Route& route) { Track* track = dynamic_cast(&route); - if (track && track->record_enabled()) { + if (track && track->rec_enable_control()->get_value()) { rec_enabled_streams += track->n_inputs().n_total(); } } @@ -1790,6 +1851,16 @@ ARDOUR_UI::open_session () } } +void +ARDOUR_UI::session_add_vca (const string& name_template, uint32_t n) +{ + if (!_session) { + return; + } + + _session->vca_manager().create_vca (n, name_template); +} + void ARDOUR_UI::session_add_mixed_track ( const ChanCount& input, @@ -1798,7 +1869,9 @@ ARDOUR_UI::session_add_mixed_track ( uint32_t how_many, const string& name_template, bool strict_io, - PluginInfoPtr instrument) + PluginInfoPtr instrument, + Plugin::PresetRecord* pset, + ARDOUR::PresentationInfo::order_t order) { list > tracks; @@ -1808,7 +1881,7 @@ ARDOUR_UI::session_add_mixed_track ( } try { - tracks = _session->new_midi_track (input, output, instrument, ARDOUR::Normal, route_group, how_many, name_template); + tracks = _session->new_midi_track (input, output, instrument, pset, route_group, how_many, name_template, order, ARDOUR::Normal); if (tracks.size() != how_many) { error << string_compose(P_("could not create %1 new mixed track", "could not create %1 new mixed tracks", how_many), how_many) << endmsg; @@ -1833,7 +1906,9 @@ ARDOUR_UI::session_add_midi_bus ( uint32_t how_many, const string& name_template, bool strict_io, - PluginInfoPtr instrument) + PluginInfoPtr instrument, + Plugin::PresetRecord* pset, + ARDOUR::PresentationInfo::order_t order) { RouteList routes; @@ -1843,7 +1918,8 @@ ARDOUR_UI::session_add_midi_bus ( } try { - routes = _session->new_midi_route (route_group, how_many, name_template, instrument); + + routes = _session->new_midi_route (route_group, how_many, name_template, instrument, pset, PresentationInfo::MidiBus, order); 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; } @@ -1868,15 +1944,17 @@ ARDOUR_UI::session_add_midi_route ( uint32_t how_many, const string& name_template, bool strict_io, - PluginInfoPtr instrument) + PluginInfoPtr instrument, + Plugin::PresetRecord* pset, + ARDOUR::PresentationInfo::order_t order) { 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, strict_io, instrument); + session_add_mixed_track (one_midi_channel, one_midi_channel, route_group, how_many, name_template, strict_io, instrument, pset, order); } else { - session_add_midi_bus (route_group, how_many, name_template, strict_io, instrument); + session_add_midi_bus (route_group, how_many, name_template, strict_io, instrument, pset, order); } } @@ -1889,8 +1967,8 @@ ARDOUR_UI::session_add_audio_route ( RouteGroup* route_group, uint32_t how_many, string const & name_template, - bool strict_io - ) + bool strict_io, + ARDOUR::PresentationInfo::order_t order) { list > tracks; RouteList routes; @@ -1902,7 +1980,7 @@ ARDOUR_UI::session_add_audio_route ( try { if (track) { - tracks = _session->new_audio_track (input_channels, output_channels, mode, route_group, how_many, name_template); + tracks = _session->new_audio_track (input_channels, output_channels, route_group, how_many, name_template, order, mode); if (tracks.size() != how_many) { error << string_compose (P_("could not create %1 new audio track", "could not create %1 new audio tracks", how_many), how_many) @@ -1911,7 +1989,7 @@ ARDOUR_UI::session_add_audio_route ( } else { - routes = _session->new_audio_route (input_channels, output_channels, route_group, how_many, name_template); + routes = _session->new_audio_route (input_channels, output_channels, route_group, how_many, name_template, PresentationInfo::AudioBus, order); if (routes.size() != how_many) { error << string_compose (P_("could not create %1 new audio bus", "could not create %1 new audio busses", how_many), how_many) @@ -2063,14 +2141,14 @@ ARDOUR_UI::trx_record_enable_all_tracks () boost::shared_ptr t = boost::dynamic_pointer_cast (*r); assert (t); - if (t->record_enabled()) { + if (t->rec_enable_control()->get_value()) { none_record_enabled = false; break; } } if (none_record_enabled) { - _session->set_record_enabled (rl, true, Session::rt_cleanup); + _session->set_controls (route_list_to_control_list (rl, &Stripable::rec_enable_control), 1.0, Controllable::NoGroup); } return none_record_enabled; @@ -2228,7 +2306,12 @@ ARDOUR_UI::toggle_roll (bool with_abort, bool roll_out_of_bounded_mode) if (affect_transport) { if (rolling) { _session->request_stop (with_abort, true); - } else { + + } else if (!with_abort) { /* with_abort == true means the + * command was intended to stop + * transport, not start. + */ + /* the only external sync condition we can be in here * would be Engine (JACK) sync, in which case we still * want to do this. @@ -2355,7 +2438,7 @@ ARDOUR_UI::transport_forward (int option) } void -ARDOUR_UI::toggle_record_enable (uint32_t rid) +ARDOUR_UI::toggle_record_enable (uint16_t rid) { if (!_session) { return; @@ -2363,12 +2446,12 @@ ARDOUR_UI::toggle_record_enable (uint32_t rid) boost::shared_ptr r; - if ((r = _session->route_by_remote_id (rid)) != 0) { + if ((r = _session->get_remote_nth_route (rid)) != 0) { boost::shared_ptr t; if ((t = boost::dynamic_pointer_cast(r)) != 0) { - t->set_record_enabled (!t->record_enabled(), Controllable::UseGroup); + t->rec_enable_control()->set_value (!t->rec_enable_control()->get_value(), Controllable::UseGroup); } } } @@ -3491,6 +3574,11 @@ ARDOUR_UI::build_session (const std::string& path, const std::string& snap_name, new_session->add_instant_xml (*n, false); } + n = Config->instant_xml (X_("Preferences")); + if (n) { + new_session->add_instant_xml (*n, false); + } + /* Put the playhead at 0 and scroll fully left */ n = new_session->instant_xml (X_("Editor")); if (n) { @@ -3880,15 +3968,15 @@ ARDOUR_UI::cleanup_peakfiles () } } -void -ARDOUR_UI::setup_order_hint (AddRouteDialog::InsertAt place) +PresentationInfo::order_t +ARDOUR_UI::translate_order (AddRouteDialog::InsertAt place) { - uint32_t order_hint = UINT32_MAX; - if (editor->get_selection().tracks.empty()) { - return; + return PresentationInfo::max_order; } + PresentationInfo::order_t order_hint = PresentationInfo::max_order; + /* we want the new routes to have their order keys set starting from the highest order key in the selection + 1 (if available). @@ -3897,42 +3985,21 @@ ARDOUR_UI::setup_order_hint (AddRouteDialog::InsertAt place) if (place == AddRouteDialog::AfterSelection) { RouteTimeAxisView *rtav = dynamic_cast (editor->get_selection().tracks.back()); if (rtav) { - order_hint = rtav->route()->order_key(); + order_hint = rtav->route()->presentation_info().order(); order_hint++; } } else if (place == AddRouteDialog::BeforeSelection) { RouteTimeAxisView *rtav = dynamic_cast (editor->get_selection().tracks.front()); if (rtav) { - order_hint = rtav->route()->order_key(); + order_hint = rtav->route()->presentation_info().order(); } } else if (place == AddRouteDialog::First) { order_hint = 0; } else { - /* leave order_hint at UINT32_MAX */ - } - - if (order_hint == UINT32_MAX) { - /** AddRouteDialog::Last or selection with first/last not a RouteTimeAxisView - * not setting an order hint will place new routes last. - */ - return; + /* leave order_hint at max_order */ } - _session->set_order_hint (order_hint); - - /* create a gap in the existing route order keys to accomodate new routes.*/ - boost::shared_ptr rd = _session->get_routes(); - for (RouteList::iterator ri = rd->begin(); ri != rd->end(); ++ri) { - boost::shared_ptr rt (*ri); - - if (rt->is_monitor()) { - continue; - } - - if (rt->order_key () >= order_hint) { - rt->set_order_key (rt->order_key () + add_route_dialog->count()); - } - } + return order_hint; } void @@ -3950,9 +4017,11 @@ ARDOUR_UI::start_duplicate_routes () } void -ARDOUR_UI::add_route (Gtk::Window* /* ignored */) +ARDOUR_UI::add_route () { - int count; + if (!add_route_dialog.get (false)) { + add_route_dialog->signal_response().connect (sigc::mem_fun (*this, &ARDOUR_UI::add_route_dialog_finished)); + } if (!_session) { return; @@ -3963,7 +4032,14 @@ ARDOUR_UI::add_route (Gtk::Window* /* ignored */) return; } - ResponseType r = (ResponseType) add_route_dialog->run (); + add_route_dialog->set_position (WIN_POS_MOUSE); + add_route_dialog->present(); +} + +void +ARDOUR_UI::add_route_dialog_finished (int r) +{ + int count; add_route_dialog->hide(); @@ -3979,7 +4055,7 @@ ARDOUR_UI::add_route (Gtk::Window* /* ignored */) return; } - setup_order_hint(add_route_dialog->insert_at()); + PresentationInfo::order_t order = translate_order (add_route_dialog->insert_at()); string template_path = add_route_dialog->track_template(); DisplaySuspender ds; @@ -4011,19 +4087,22 @@ 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, strict_io); + session_add_audio_track (input_chan.n_audio(), output_chan.n_audio(), add_route_dialog->mode(), route_group, count, name_template, strict_io, order); break; case AddRouteDialog::MidiTrack: - session_add_midi_track (route_group, count, name_template, strict_io, instrument); + session_add_midi_track (route_group, count, name_template, strict_io, instrument, 0, order); break; case AddRouteDialog::MixedTrack: - session_add_mixed_track (input_chan, output_chan, route_group, count, name_template, strict_io, instrument); + session_add_mixed_track (input_chan, output_chan, route_group, count, name_template, strict_io, instrument, 0, order); break; case AddRouteDialog::AudioBus: - session_add_audio_bus (input_chan.n_audio(), output_chan.n_audio(), route_group, count, name_template, strict_io); + session_add_audio_bus (input_chan.n_audio(), output_chan.n_audio(), route_group, count, name_template, strict_io, order); break; case AddRouteDialog::MidiBus: - session_add_midi_bus (route_group, count, name_template, strict_io, instrument); + session_add_midi_bus (route_group, count, name_template, strict_io, instrument, 0, order); + break; + case AddRouteDialog::VCAMaster: + session_add_vca (name_template, count); break; } } @@ -4470,6 +4549,24 @@ ARDOUR_UI::export_video (bool range) export_video_dialog->hide (); } +XMLNode* +ARDOUR_UI::preferences_settings () const +{ + XMLNode* node = 0; + + if (_session) { + node = _session->instant_xml(X_("Preferences")); + } else { + node = Config->instant_xml(X_("Preferences")); + } + + if (!node) { + node = new XMLNode (X_("Preferences")); + } + + return node; +} + XMLNode* ARDOUR_UI::mixer_settings () const { @@ -5111,7 +5208,7 @@ ARDOUR_UI::session_format_mismatch (std::string xml_path, std::string backup_pat MessageDialog msg (string_compose (_("%4This is a session from an older version of %3%5\n\n" "%3 has copied the old session file\n\n%6%1%7\n\nto\n\n%6%2%7\n\n" - "From now on, use the -2000 version with older versions of %3"), + "From now on, use the backup copy with older versions of %3"), xml_path, backup_path, PROGRAM_NAME, start_big, end_big, start_mono, end_mono), true); @@ -5300,16 +5397,16 @@ ARDOUR_UI::setup_toplevel_window (Gtk::Window& window, const string& name, void* if (window_icons.empty()) { Glib::RefPtr icon; - if ((icon = ::get_icon ("ardour_icon_16px")) != 0) { + if ((icon = ::get_icon (PROGRAM_NAME "-icon_16px")) != 0) { window_icons.push_back (icon); } - if ((icon = ::get_icon ("ardour_icon_22px")) != 0) { + if ((icon = ::get_icon (PROGRAM_NAME "-icon_22px")) != 0) { window_icons.push_back (icon); } - if ((icon = ::get_icon ("ardour_icon_32px")) != 0) { + if ((icon = ::get_icon (PROGRAM_NAME "-icon_32px")) != 0) { window_icons.push_back (icon); } - if ((icon = ::get_icon ("ardour_icon_48px")) != 0) { + if ((icon = ::get_icon (PROGRAM_NAME "-icon_48px")) != 0) { window_icons.push_back (icon); } } @@ -5564,12 +5661,6 @@ void ARDOUR_UI::cancel_solo () { if (_session) { - if (_session->soloing()) { - _session->set_solo (_session->get_routes(), false); - } else if (_session->listening()) { - _session->set_listen (_session->get_routes(), false); - } - - _session->clear_all_solo_state (_session->get_routes()); // safeguard, ideally this won't do anything, check the log-window + _session->cancel_all_solo (); } }