From 914ba475de48f72e57bb6ac8a81888ad71cea7fa Mon Sep 17 00:00:00 2001 From: nick_m Date: Wed, 18 Sep 2013 02:02:31 +1000 Subject: actually load new state after creating a session. --- libs/ardour/session.cc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc index 746732f76e..b2b98e7b8c 100644 --- a/libs/ardour/session.cc +++ b/libs/ardour/session.cc @@ -276,6 +276,10 @@ Session::Session (AudioEngine &eng, throw failed_constructor (); } + if (load_state (_current_snapshot_name)) { + throw failed_constructor (); + } + } else { if (load_state (_current_snapshot_name)) { -- cgit v1.2.3 From 20fa19e69e176aa3c0a1ed8e6688acec0799daad Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Tue, 17 Sep 2013 22:25:21 -0400 Subject: more excision of "JACK" from labels, menu items, etc. NOTE: users will lose the sample rate/latency display in the status bar display. Not yet sure what to do about this --- gtk2_ardour/ardour_ui.cc | 67 +++++++++-------------------------------- gtk2_ardour/ardour_ui.h | 2 -- gtk2_ardour/ardour_ui_ed.cc | 56 +--------------------------------- gtk2_ardour/keyeditor.cc | 2 -- gtk2_ardour/main.cc | 11 +------ gtk2_ardour/mixer_strip.cc | 4 +-- gtk2_ardour/processor_box.cc | 2 +- gtk2_ardour/rc_option_editor.cc | 6 ++-- 8 files changed, 21 insertions(+), 129 deletions(-) diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc index eccd37fec2..74e2768b41 100644 --- a/gtk2_ardour/ardour_ui.cc +++ b/gtk2_ardour/ardour_ui.cc @@ -399,61 +399,19 @@ ARDOUR_UI::engine_stopped () void ARDOUR_UI::engine_running () { + cerr << "ENGINE RUNNING\n"; + if (first_time_engine_run) { post_engine(); first_time_engine_run = false; + } else { + cerr << "AGAIN...\n"; } - ActionManager::set_sensitive (ActionManager::engine_sensitive_actions, true); - ActionManager::set_sensitive (ActionManager::engine_opposite_sensitive_actions, false); - - Glib::RefPtr action; - const char* action_name = 0; - - switch (AudioEngine::instance()->samples_per_cycle()) { - case 32: - action_name = X_("JACKLatency32"); - break; - case 64: - action_name = X_("JACKLatency64"); - break; - case 128: - action_name = X_("JACKLatency128"); - break; - case 512: - action_name = X_("JACKLatency512"); - break; - case 1024: - action_name = X_("JACKLatency1024"); - break; - case 2048: - action_name = X_("JACKLatency2048"); - break; - case 4096: - action_name = X_("JACKLatency4096"); - break; - case 8192: - action_name = X_("JACKLatency8192"); - break; - default: - /* XXX can we do anything useful ? */ - break; - } - - if (action_name) { - - action = ActionManager::get_action (X_("JACK"), action_name); - - if (action) { - Glib::RefPtr ract = Glib::RefPtr::cast_dynamic (action); - ract->set_active (); - } - - update_disk_space (); - update_cpu_load (); - update_sample_rate (AudioEngine::instance()->sample_rate()); - update_timecode_format (); - } + update_disk_space (); + update_cpu_load (); + update_sample_rate (AudioEngine::instance()->sample_rate()); + update_timecode_format (); } void @@ -481,13 +439,13 @@ ARDOUR_UI::engine_halted (const char* reason, bool free_reason) */ if (strlen (reason)) { - msgstr = string_compose (_("The audio backend (JACK) was shutdown because:\n\n%1"), reason); + msgstr = string_compose (_("The audio backend was shutdown because:\n\n%1"), reason); } else { msgstr = string_compose (_("\ -JACK has either been shutdown or it\n\ +`The audio backend has either been shutdown or it\n\ disconnected %1 because %1\n\ was not fast enough. Try to restart\n\ -JACK, reconnect and save the session."), PROGRAM_NAME); +the audio backend and save the session."), PROGRAM_NAME); } MessageDialog msg (*editor, msgstr); @@ -1126,6 +1084,8 @@ ARDOUR_UI::update_sample_rate (framecnt_t) { char buf[64]; + cerr << "USR\n"; + ENSURE_GUI_THREAD (*this, &ARDOUR_UI::update_sample_rate, ignored) if (!AudioEngine::instance()->connected()) { @@ -1152,6 +1112,7 @@ ARDOUR_UI::update_sample_rate (framecnt_t) } } } + cerr << "SRL = " << buf << endl; sample_rate_label.set_markup (buf); } diff --git a/gtk2_ardour/ardour_ui.h b/gtk2_ardour/ardour_ui.h index c84a279320..ea03c8590f 100644 --- a/gtk2_ardour/ardour_ui.h +++ b/gtk2_ardour/ardour_ui.h @@ -670,8 +670,6 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr int pending_state_dialog (); int sr_mismatch_dialog (ARDOUR::framecnt_t, ARDOUR::framecnt_t); - void set_engine_buffer_size (ARDOUR::pframes_t); - Gtk::MenuItem* jack_disconnect_item; Gtk::MenuItem* jack_reconnect_item; Gtk::Menu* jack_bufsize_menu; diff --git a/gtk2_ardour/ardour_ui_ed.cc b/gtk2_ardour/ardour_ui_ed.cc index b64498fb33..96bbd8c4e3 100644 --- a/gtk2_ardour/ardour_ui_ed.cc +++ b/gtk2_ardour/ardour_ui_ed.cc @@ -396,60 +396,6 @@ ARDOUR_UI::install_actions () ActionManager::add_action_group (midi_actions); } -void -ARDOUR_UI::set_engine_buffer_size (pframes_t nframes) -{ - Glib::RefPtr action; - const char* action_name = 0; - - switch (nframes) { - case 32: - action_name = X_("EngineLatency32"); - break; - case 64: - action_name = X_("EngineLatency64"); - break; - case 128: - action_name = X_("EngineLatency128"); - break; - case 256: - action_name = X_("EngineLatency256"); - break; - case 512: - action_name = X_("EngineLatency512"); - break; - case 1024: - action_name = X_("EngineLatency1024"); - break; - case 2048: - action_name = X_("EngineLatency2048"); - break; - case 4096: - action_name = X_("EngineLatency4096"); - break; - case 8192: - action_name = X_("EngineLatency8192"); - break; - default: - /* XXX can we do anything useful ? */ - break; - } - - if (action_name) { - - action = ActionManager::get_action (X_("JACK"), action_name); - - if (action) { - Glib::RefPtr ract = Glib::RefPtr::cast_dynamic (action); - - if (ract && ract->get_active()) { - AudioEngine::instance()->request_buffer_size (nframes); - update_sample_rate (0); - } - } - } -} - void ARDOUR_UI::build_menu_bar () { @@ -528,7 +474,7 @@ ARDOUR_UI::build_menu_bar () _status_bar_visibility.add (&disk_space_label, X_("Disk"), _("Disk Space"), disk_space); _status_bar_visibility.add (&cpu_load_label, X_("DSP"), _("DSP"), true); _status_bar_visibility.add (&buffer_load_label, X_("Buffers"), _("Buffers"), true); - _status_bar_visibility.add (&sample_rate_label, X_("JACK"), _("JACK Sampling Rate and Latency"), true); + _status_bar_visibility.add (&sample_rate_label, X_("Audio"), _("Audio"), true); _status_bar_visibility.add (&timecode_format_label, X_("TCFormat"), _("Timecode Format"), true); _status_bar_visibility.add (&format_label, X_("Format"), _("File Format"), true); diff --git a/gtk2_ardour/keyeditor.cc b/gtk2_ardour/keyeditor.cc index 07042a1cdf..f23e246958 100644 --- a/gtk2_ardour/keyeditor.cc +++ b/gtk2_ardour/keyeditor.cc @@ -250,8 +250,6 @@ KeyEditor::populate () //kinda kludgy way to avoid displaying menu items as mappable if ( parts[1] == _("Main_menu") ) continue; - if ( parts[1] == _("JACK") ) - continue; if ( parts[1] == _("redirectmenu") ) continue; if ( parts[1] == _("Editor_menus") ) diff --git a/gtk2_ardour/main.cc b/gtk2_ardour/main.cc index c8f8d76a98..a7497f96fb 100644 --- a/gtk2_ardour/main.cc +++ b/gtk2_ardour/main.cc @@ -36,8 +36,6 @@ #include "pbd/boost_debug.h" #endif -#include - #include "ardour/revision.h" #include "ardour/version.h" #include "ardour/ardour.h" @@ -80,17 +78,10 @@ static const char* localedir = LOCALEDIR; void gui_jack_error () { - MessageDialog win (string_compose (_("%1 could not connect to JACK."), PROGRAM_NAME), + MessageDialog win (string_compose (_("%1 could not connect to the audio backend."), PROGRAM_NAME), false, Gtk::MESSAGE_INFO, Gtk::BUTTONS_NONE); - win.set_secondary_text(string_compose (_("There are several possible reasons:\n\ -\n\ -1) JACK is not running.\n\ -2) JACK is running as another user, perhaps root.\n\ -3) There is already another client called \"%1\".\n\ -\n\ -Please consider the possibilities, and perhaps (re)start JACK."), PROGRAM_NAME)); win.add_button (Stock::QUIT, RESPONSE_CLOSE); win.set_default_response (RESPONSE_CLOSE); diff --git a/gtk2_ardour/mixer_strip.cc b/gtk2_ardour/mixer_strip.cc index d77023d201..50594378de 100644 --- a/gtk2_ardour/mixer_strip.cc +++ b/gtk2_ardour/mixer_strip.cc @@ -698,7 +698,7 @@ MixerStrip::output_press (GdkEventButton *ev) { using namespace Menu_Helpers; if (!_session->engine().connected()) { - MessageDialog msg (_("Not connected to JACK - no I/O changes are possible")); + MessageDialog msg (_("Not connected to audio engine - no I/O changes are possible")); msg.run (); return true; } @@ -826,7 +826,7 @@ MixerStrip::input_press (GdkEventButton *ev) citems.clear(); if (!_session->engine().connected()) { - MessageDialog msg (_("Not connected to JACK - no I/O changes are possible")); + MessageDialog msg (_("Not connected to audio engine - no I/O changes are possible")); msg.run (); return true; } diff --git a/gtk2_ardour/processor_box.cc b/gtk2_ardour/processor_box.cc index d475e28605..17f548c0e3 100644 --- a/gtk2_ardour/processor_box.cc +++ b/gtk2_ardour/processor_box.cc @@ -2151,7 +2151,7 @@ ProcessorBox::get_editor_window (boost::shared_ptr processor, bool us } else if ((port_insert = boost::dynamic_pointer_cast (processor)) != 0) { if (!_session->engine().connected()) { - MessageDialog msg ( _("Not connected to JACK - no I/O changes are possible")); + MessageDialog msg ( _("Not connected to audio engine - no I/O changes are possible")); msg.run (); return 0; } diff --git a/gtk2_ardour/rc_option_editor.cc b/gtk2_ardour/rc_option_editor.cc index ed9ffda4ef..f9336cee31 100644 --- a/gtk2_ardour/rc_option_editor.cc +++ b/gtk2_ardour/rc_option_editor.cc @@ -1146,7 +1146,7 @@ RCOptionEditor::RCOptionEditor () tsf = new BoolOption ( "seamless-loop", - _("Do seamless looping (not possible when slaved to MTC, JACK etc)"), + _("Do seamless looping (not possible when slaved to MTC, LTC etc)"), sigc::mem_fun (*_rc_config, &RCConfiguration::get_seamless_loop), sigc::mem_fun (*_rc_config, &RCConfiguration::set_seamless_loop) ); @@ -1464,12 +1464,10 @@ RCOptionEditor::RCOptionEditor () sigc::mem_fun (*_rc_config, &RCConfiguration::set_monitoring_model) ); -#ifndef __APPLE__ - /* no JACK monitoring on CoreAudio */ if (AudioEngine::instance()->port_engine().can_monitor_input()) { mm->add (HardwareMonitoring, _("via Audio Driver")); } -#endif + mm->add (SoftwareMonitoring, _("ardour")); mm->add (ExternalMonitoring, _("audio hardware")); -- cgit v1.2.3 From 57d24608e7e92f1f97332fc87921218c4f9fc8ec Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Thu, 19 Sep 2013 15:03:20 -0400 Subject: show a different audio/MIDI option screen if JACK is already running. try to fix problem with using AudioBackend::() functions before anything has been set. --- gtk2_ardour/ardour_ui.cc | 10 +- gtk2_ardour/engine_dialog.cc | 741 +++++++++++++++++++++----------- gtk2_ardour/engine_dialog.h | 21 +- libs/backends/jack/jack_audiobackend.cc | 1 + 4 files changed, 498 insertions(+), 275 deletions(-) diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc index 74e2768b41..f22b48bd3a 100644 --- a/gtk2_ardour/ardour_ui.cc +++ b/gtk2_ardour/ardour_ui.cc @@ -399,14 +399,10 @@ ARDOUR_UI::engine_stopped () void ARDOUR_UI::engine_running () { - cerr << "ENGINE RUNNING\n"; - if (first_time_engine_run) { post_engine(); first_time_engine_run = false; - } else { - cerr << "AGAIN...\n"; - } + } update_disk_space (); update_cpu_load (); @@ -1084,8 +1080,6 @@ ARDOUR_UI::update_sample_rate (framecnt_t) { char buf[64]; - cerr << "USR\n"; - ENSURE_GUI_THREAD (*this, &ARDOUR_UI::update_sample_rate, ignored) if (!AudioEngine::instance()->connected()) { @@ -1112,8 +1106,6 @@ ARDOUR_UI::update_sample_rate (framecnt_t) } } } - cerr << "SRL = " << buf << endl; - sample_rate_label.set_markup (buf); } diff --git a/gtk2_ardour/engine_dialog.cc b/gtk2_ardour/engine_dialog.cc index 65fa7227a7..135e2869ee 100644 --- a/gtk2_ardour/engine_dialog.cc +++ b/gtk2_ardour/engine_dialog.cc @@ -78,20 +78,146 @@ EngineControl::EngineControl () , aj_button (_("Start MIDI ALSA/JACK bridge")) , ignore_changes (0) , _desired_sample_rate (0) + , no_push (true) { - if (!ARDOUR::AudioEngine::instance()->setup_required()) { - _have_control = false; - } else { - _have_control = true; - } + using namespace Notebook_Helpers; + vector strings; + Label* label; + AttachOptions xopt = AttachOptions (FILL|EXPAND); + int row; set_name (X_("AudioMIDISetup")); - build_notebook (); + /* the backend combo is the one thing that is ALWAYS visible + */ + + vector backends = ARDOUR::AudioEngine::instance()->available_backends(); + for (vector::const_iterator b = backends.begin(); b != backends.end(); ++b) { + strings.push_back ((*b)->name); + } + + set_popdown_strings (backend_combo, strings); + backend_combo.set_active_text (strings.front()); + backend_combo.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::backend_changed)); + + /* setup basic packing characteristics for the table used on the main + * tab of the notebook + */ + + basic_packer.set_spacings (6); + basic_packer.set_border_width (12); + basic_packer.set_homogeneous (true); + + /* pack it in */ + + basic_hbox.pack_start (basic_packer, false, false); + + /* latency tab */ + + /* latency measurement tab */ + + lm_title.set_markup (string_compose ("%1", _("Latency Measurement Tool"))); + + row = 0; + lm_table.set_row_spacings (12); + + lm_table.attach (lm_title, 0, 2, row, row+1, xopt, (AttachOptions) 0); + row++; + + Gtk::Label* preamble; + + preamble = manage (new Label); + preamble->set_width_chars (60); + preamble->set_line_wrap (true); + preamble->set_markup (_("Turn down the volume on your hardware to a very low level.")); + + lm_table.attach (*preamble, 0, 2, row, row+1, AttachOptions(FILL|EXPAND), (AttachOptions) 0); + row++; + + preamble = manage (new Label); + preamble->set_width_chars (60); + preamble->set_line_wrap (true); + preamble->set_markup (_("Select two channels below and connect them using a cable or (less ideally) a speaker and microphone.")); + + lm_table.attach (*preamble, 0, 2, row, row+1, AttachOptions(FILL|EXPAND), (AttachOptions) 0); + row++; + + label = manage (new Label (_("Output channel"))); + lm_table.attach (*label, 0, 1, row, row+1, xopt, (AttachOptions) 0); + + Gtk::Alignment* misc_align = manage (new Alignment (0.0, 0.5)); + misc_align->add (lm_output_channel_combo); + lm_table.attach (*misc_align, 1, 2, row, row+1, xopt, (AttachOptions) 0); + ++row; + + label = manage (new Label (_("Input channel"))); + lm_table.attach (*label, 0, 1, row, row+1, xopt, (AttachOptions) 0); + + misc_align = manage (new Alignment (0.0, 0.5)); + misc_align->add (lm_input_channel_combo); + lm_table.attach (*misc_align, 1, 2, row, row+1, FILL, (AttachOptions) 0); + ++row; + + xopt = AttachOptions(0); + + lm_measure_button.add (lm_start_stop_label); + + lm_measure_button.signal_toggled().connect (sigc::mem_fun (*this, &EngineControl::latency_button_toggled)); + lm_use_button.signal_clicked().connect (sigc::mem_fun (*this, &EngineControl::use_latency_button_clicked)); + lm_use_button.set_sensitive (false); + + preamble = manage (new Label); + preamble->set_width_chars (60); + preamble->set_line_wrap (true); + preamble->set_markup (_("Once the channels are connected, click the \"Measure latency\" button.")); + lm_table.attach (*preamble, 0, 2, row, row+1, AttachOptions(FILL|EXPAND), (AttachOptions) 0); + row++; + + lm_table.attach (lm_measure_button, 0, 2, row, row+1, xopt, (AttachOptions) 0); + ++row; + lm_table.attach (lm_results, 0, 2, row, row+1, AttachOptions(FILL|EXPAND), (AttachOptions) 0); + ++row; + + + preamble = manage (new Label); + preamble->set_width_chars (60); + preamble->set_line_wrap (true); + preamble->set_markup (_("When satisfied with the results, click the \"Use results\" button.")); + lm_table.attach (*preamble, 0, 2, row, row+1, AttachOptions(FILL|EXPAND), (AttachOptions) 0); + row++; + + lm_table.attach (lm_use_button, 0, 2, row, row+1, xopt, (AttachOptions) 0); + ++row; + + lm_results.set_markup ("No measurement results yet"); + + lm_vbox.set_border_width (12); + lm_vbox.pack_start (lm_table, false, false); + + /* pack it all up */ + + notebook.pages().push_back (TabElem (basic_vbox, _("Audio"))); + notebook.pages().push_back (TabElem (midi_vbox, _("MIDI"))); + notebook.pages().push_back (TabElem (lm_vbox, _("Latency"))); + notebook.set_border_width (12); + + notebook.set_tab_pos (POS_RIGHT); + notebook.show_all (); + + notebook.set_name ("SettingsNotebook"); + + /* packup the notebook */ get_vbox()->set_border_width (12); get_vbox()->pack_start (notebook); + /* need a special function to print "all available channels" when the + * channel counts hit zero. + */ + + input_channels.signal_output().connect (sigc::bind (sigc::ptr_fun (&EngineControl::print_channel_count), &input_channels)); + output_channels.signal_output().connect (sigc::bind (sigc::ptr_fun (&EngineControl::print_channel_count), &output_channels)); + control_app_button.signal_clicked().connect (mem_fun (*this, &EngineControl::control_app_button_clicked)); manage_control_app_sensitivity (); @@ -103,12 +229,31 @@ EngineControl::EngineControl () XMLNode* audio_setup = ARDOUR::Config->extra_xml ("AudioMIDISetup"); - /* push a change as if we altered the backend */ + ARDOUR::AudioEngine::instance()->Running.connect (running_connection, MISSING_INVALIDATOR, boost::bind (&EngineControl::engine_running, this), gui_context()); + ARDOUR::AudioEngine::instance()->Stopped.connect (stopped_connection, MISSING_INVALIDATOR, boost::bind (&EngineControl::engine_stopped, this), gui_context()); + ARDOUR::AudioEngine::instance()->Halted.connect (stopped_connection, MISSING_INVALIDATOR, boost::bind (&EngineControl::engine_stopped, this), gui_context()); + backend_changed (); if (audio_setup) { set_state (*audio_setup); - } + } + + /* Connect to signals */ + + driver_combo.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::driver_changed)); + sample_rate_combo.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::sample_rate_changed)); + buffer_size_combo.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::buffer_size_changed)); + device_combo.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::device_changed)); + + input_latency.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::parameter_changed)); + output_latency.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::parameter_changed)); + input_channels.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::parameter_changed)); + output_channels.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::parameter_changed)); + + notebook.signal_switch_page().connect (sigc::mem_fun (*this, &EngineControl::on_switch_page)); + + no_push = false; } void @@ -139,36 +284,58 @@ EngineControl::on_response (int response_id) void EngineControl::build_notebook () { - using namespace Notebook_Helpers; Label* label; - vector strings; - int row = 0; + AttachOptions xopt = AttachOptions (FILL|EXPAND); - vector backends = ARDOUR::AudioEngine::instance()->available_backends(); - for (vector::const_iterator b = backends.begin(); b != backends.end(); ++b) { - strings.push_back ((*b)->name); + /* clear the table */ + + Gtkmm2ext::container_clear (basic_vbox); + Gtkmm2ext::container_clear (basic_packer); + + label = manage (left_aligned_label (_("Audio System:"))); + basic_packer.attach (*label, 0, 1, 0, 1, xopt, (AttachOptions) 0); + basic_packer.attach (backend_combo, 1, 2, 0, 1, xopt, (AttachOptions) 0); + + if (_have_control) { + build_full_control_notebook (); + } else { + build_no_control_notebook (); } - set_popdown_strings (backend_combo, strings); - backend_combo.set_active_text (strings.front()); + basic_vbox.pack_start (basic_hbox, false, false); - basic_packer.set_spacings (6); - basic_packer.set_border_width (12); - basic_packer.set_homogeneous (true); + if (_have_control) { + Gtk::HBox* hpacker = manage (new HBox); + hpacker->set_border_width (12); + hpacker->pack_start (control_app_button, false, false); + hpacker->show (); + control_app_button.show(); + basic_vbox.pack_start (*hpacker); + } - row = 0; + basic_vbox.show_all (); +} + +void +EngineControl::build_full_control_notebook () +{ + boost::shared_ptr backend = ARDOUR::AudioEngine::instance()->current_backend(); + assert (backend); + using namespace Notebook_Helpers; + Label* label; + vector strings; AttachOptions xopt = AttachOptions (FILL|EXPAND); + int row = 1; // row zero == backend combo - label = manage (left_aligned_label (_("Audio System:"))); - basic_packer.attach (*label, 0, 1, row, row + 1, xopt, (AttachOptions) 0); - basic_packer.attach (backend_combo, 1, 2, row, row + 1, xopt, (AttachOptions) 0); - row++; + /* start packing it up */ - label = manage (left_aligned_label (_("Driver:"))); - basic_packer.attach (*label, 0, 1, row, row + 1, xopt, (AttachOptions) 0); - basic_packer.attach (driver_combo, 1, 2, row, row + 1, xopt, (AttachOptions) 0); - row++; + if (backend->requires_driver_selection()) { + label = manage (left_aligned_label (_("Driver:"))); + basic_packer.attach (*label, 0, 1, row, row + 1, xopt, (AttachOptions) 0); + basic_packer.attach (driver_combo, 1, 2, row, row + 1, xopt, (AttachOptions) 0); + row++; + } label = manage (left_aligned_label (_("Device:"))); basic_packer.attach (*label, 0, 1, row, row + 1, xopt, (AttachOptions) 0); @@ -236,126 +403,46 @@ EngineControl::build_notebook () basic_packer.attach (*label, 2, 3, row, row+1, xopt, (AttachOptions) 0); ++row; - basic_hbox.pack_start (basic_packer, false, false); - basic_vbox.pack_start (basic_hbox, false, false); - - Gtk::HBox* hpacker = manage (new HBox); - hpacker->set_border_width (12); - hpacker->pack_start (control_app_button, false, false); - hpacker->show (); - control_app_button.show(); - basic_vbox.pack_start (*hpacker); - - /* latency measurement tab */ - - lm_title.set_markup (string_compose ("%1", _("Latency Measurement Tool"))); - - row = 0; - lm_table.set_row_spacings (12); - - lm_table.attach (lm_title, 0, 2, row, row+1, xopt, (AttachOptions) 0); - row++; - - Gtk::Label* preamble; - - preamble = manage (new Label); - preamble->set_width_chars (60); - preamble->set_line_wrap (true); - preamble->set_markup (_("Turn down the volume on your hardware to a very low level.")); +} - lm_table.attach (*preamble, 0, 2, row, row+1, AttachOptions(FILL|EXPAND), (AttachOptions) 0); - row++; +void +EngineControl::build_no_control_notebook () +{ + boost::shared_ptr backend = ARDOUR::AudioEngine::instance()->current_backend(); + assert (backend); - preamble = manage (new Label); - preamble->set_width_chars (60); - preamble->set_line_wrap (true); - preamble->set_markup (_("Select two channels below and connect them using a cable or (less ideally) a speaker and microphone.")); + using namespace Notebook_Helpers; + Label* label; + vector strings; + AttachOptions xopt = AttachOptions (FILL|EXPAND); + int row = 1; // row zero == backend combo + const string msg = string_compose (_("The %1 audio backend was configured and started externally.\nThis limits your control over it."), backend->name()); - lm_table.attach (*preamble, 0, 2, row, row+1, AttachOptions(FILL|EXPAND), (AttachOptions) 0); + label = manage (new Label); + label->set_markup (string_compose ("%1", msg)); + basic_packer.attach (*label, 0, 2, row, row + 1, xopt, (AttachOptions) 0); row++; - label = manage (new Label (_("Output channel"))); - lm_table.attach (*label, 0, 1, row, row+1, xopt, (AttachOptions) 0); - - Gtk::Alignment* misc_align = manage (new Alignment (0.0, 0.5)); - misc_align->add (lm_output_channel_combo); - lm_table.attach (*misc_align, 1, 2, row, row+1, xopt, (AttachOptions) 0); - ++row; - - label = manage (new Label (_("Input channel"))); - lm_table.attach (*label, 0, 1, row, row+1, xopt, (AttachOptions) 0); - - misc_align = manage (new Alignment (0.0, 0.5)); - misc_align->add (lm_input_channel_combo); - lm_table.attach (*misc_align, 1, 2, row, row+1, FILL, (AttachOptions) 0); - ++row; - - xopt = AttachOptions(0); - - lm_measure_button.add (lm_start_stop_label); - - lm_measure_button.signal_toggled().connect (sigc::mem_fun (*this, &EngineControl::latency_button_toggled)); - lm_use_button.signal_clicked().connect (sigc::mem_fun (*this, &EngineControl::use_latency_button_clicked)); - lm_use_button.set_sensitive (false); - - - preamble = manage (new Label); - preamble->set_width_chars (60); - preamble->set_line_wrap (true); - preamble->set_markup (_("Once the channels are connected, click the \"Measure latency\" button.")); - lm_table.attach (*preamble, 0, 2, row, row+1, AttachOptions(FILL|EXPAND), (AttachOptions) 0); - row++; + if (backend->can_change_sample_rate_when_running()) { + label = manage (left_aligned_label (_("Sample rate:"))); + basic_packer.attach (*label, 0, 1, row, row + 1, xopt, (AttachOptions) 0); + basic_packer.attach (sample_rate_combo, 1, 2, row, row + 1, xopt, (AttachOptions) 0); + row++; + } - lm_table.attach (lm_measure_button, 0, 2, row, row+1, xopt, (AttachOptions) 0); - ++row; - lm_table.attach (lm_results, 0, 2, row, row+1, AttachOptions(FILL|EXPAND), (AttachOptions) 0); - ++row; + if (backend->can_change_buffer_size_when_running()) { + label = manage (left_aligned_label (_("Buffer size:"))); + basic_packer.attach (*label, 0, 1, row, row + 1, xopt, (AttachOptions) 0); + basic_packer.attach (buffer_size_combo, 1, 2, row, row + 1, xopt, (AttachOptions) 0); + buffer_size_duration_label.set_alignment (0.0); /* left-align */ + basic_packer.attach (buffer_size_duration_label, 2, 3, row, row+1, xopt, (AttachOptions) 0); + row++; + } + connect_disconnect_button.signal_clicked().connect (sigc::mem_fun (*this, &EngineControl::connect_disconnect_click)); - preamble = manage (new Label); - preamble->set_width_chars (60); - preamble->set_line_wrap (true); - preamble->set_markup (_("When satisfied with the results, click the \"Use results\" button.")); - lm_table.attach (*preamble, 0, 2, row, row+1, AttachOptions(FILL|EXPAND), (AttachOptions) 0); + basic_packer.attach (connect_disconnect_button, 0, 2, row, row+1, FILL, AttachOptions (0)); row++; - - lm_table.attach (lm_use_button, 0, 2, row, row+1, xopt, (AttachOptions) 0); - ++row; - - lm_results.set_markup ("No measurement results yet"); - - lm_vbox.set_border_width (12); - lm_vbox.pack_start (lm_table, false, false); - - /* pack it all up */ - - notebook.pages().push_back (TabElem (basic_vbox, _("Audio"))); - notebook.pages().push_back (TabElem (midi_vbox, _("MIDI"))); - notebook.pages().push_back (TabElem (lm_vbox, _("Latency"))); - notebook.set_border_width (12); - - notebook.set_tab_pos (POS_RIGHT); - notebook.show_all (); - - notebook.set_name ("SettingsNotebook"); - - /* Connect to signals */ - - backend_combo.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::backend_changed)); - driver_combo.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::driver_changed)); - sample_rate_combo.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::sample_rate_changed)); - buffer_size_combo.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::buffer_size_changed)); - device_combo.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::device_changed)); - - input_latency.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::parameter_changed)); - output_latency.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::parameter_changed)); - input_channels.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::parameter_changed)); - output_channels.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::parameter_changed)); - - input_channels.signal_output().connect (sigc::bind (sigc::ptr_fun (&EngineControl::print_channel_count), &input_channels)); - output_channels.signal_output().connect (sigc::bind (sigc::ptr_fun (&EngineControl::print_channel_count), &output_channels)); - - notebook.signal_switch_page().connect (sigc::mem_fun (*this, &EngineControl::on_switch_page)); } EngineControl::~EngineControl () @@ -470,6 +557,11 @@ EngineControl::refresh_midi_display () } } +void +EngineControl::update_sensitivity () +{ +} + void EngineControl::backend_changed () { @@ -485,16 +577,29 @@ EngineControl::backend_changed () return; } + _have_control = ARDOUR::AudioEngine::instance()->setup_required (); + + build_notebook (); setup_midi_tab_for_backend (); if (backend->requires_driver_selection()) { vector drivers = backend->enumerate_drivers(); - driver_combo.set_sensitive (true); - set_popdown_strings (driver_combo, drivers); - driver_combo.set_active_text (drivers.front()); - driver_changed (); + + if (!drivers.empty()) { + { + PBD::Unwinder protect_ignore_changes (ignore_changes, ignore_changes + 1); + set_popdown_strings (driver_combo, drivers); + driver_combo.set_active_text (drivers.front()); + } + + driver_changed (); + } + } else { driver_combo.set_sensitive (false); + /* this will change the device text which will cause a call to + * device changed which will set up parameters + */ list_devices (); } @@ -540,33 +645,33 @@ EngineControl::list_devices () available_devices.push_back (i->name); } - ignore_changes++; - set_popdown_strings (device_combo, available_devices); - ignore_changes--; - if (!available_devices.empty()) { - sample_rate_combo.set_sensitive (true); - buffer_size_combo.set_sensitive (true); - input_latency.set_sensitive (true); - output_latency.set_sensitive (true); - input_channels.set_sensitive (true); - output_channels.set_sensitive (true); + + update_sensitivity (); - /* changing the text in the combo will trigger device_changed() - which should populate the parameter controls - */ - - device_combo.set_active_text (available_devices.front()); + { + PBD::Unwinder protect_ignore_changes (ignore_changes, ignore_changes + 1); + set_popdown_strings (device_combo, available_devices); + device_combo.set_active_text (available_devices.front()); + } + + device_changed (); + + ok_button->set_sensitive (true); + apply_button->set_sensitive (true); + } else { - sample_rate_combo.set_sensitive (true); - buffer_size_combo.set_sensitive (true); - input_latency.set_sensitive (true); - output_latency.set_sensitive (true); - input_channels.set_sensitive (true); - output_channels.set_sensitive (true); + sample_rate_combo.set_sensitive (false); + buffer_size_combo.set_sensitive (false); + input_latency.set_sensitive (false); + output_latency.set_sensitive (false); + input_channels.set_sensitive (false); + output_channels.set_sensitive (false); + ok_button->set_sensitive (false); + apply_button->set_sensitive (false); } } - + void EngineControl::driver_changed () { @@ -595,59 +700,95 @@ EngineControl::device_changed () string device_name = device_combo.get_active_text (); vector s; - /* don't allow programmatic change to sample_rate_combo to cause a - recursive call to this method. - */ - - ignore_changes++; + { + PBD::Unwinder protect_ignore_changes (ignore_changes, ignore_changes + 1); - /* sample rates */ - - string desired; + /* don't allow programmatic change to combos to cause a + recursive call to this method. + */ + + /* sample rates */ + + string desired; + + vector sr; - vector sr = backend->available_sample_rates (device_name); - for (vector::const_iterator x = sr.begin(); x != sr.end(); ++x) { - s.push_back (rate_as_string (*x)); - if (*x == _desired_sample_rate) { - desired = s.back(); + if (_have_control) { + sr = backend->available_sample_rates (device_name); + } else { + + sr.push_back (8000.0f); + sr.push_back (16000.0f); + sr.push_back (32000.0f); + sr.push_back (44100.0f); + sr.push_back (48000.0f); + sr.push_back (88200.0f); + sr.push_back (96000.0f); + sr.push_back (192000.0f); + sr.push_back (384000.0f); } - } - if (!s.empty()) { - set_popdown_strings (sample_rate_combo, s); - - if (desired.empty()) { - sample_rate_combo.set_active_text (s.front()); + for (vector::const_iterator x = sr.begin(); x != sr.end(); ++x) { + s.push_back (rate_as_string (*x)); + if (*x == _desired_sample_rate) { + desired = s.back(); + } + } + + if (!s.empty()) { + sample_rate_combo.set_sensitive (true); + set_popdown_strings (sample_rate_combo, s); + + if (desired.empty()) { + sample_rate_combo.set_active_text (s.front()); + } else { + sample_rate_combo.set_active_text (desired); + } + } else { - sample_rate_combo.set_active_text (desired); + sample_rate_combo.set_sensitive (false); } - } else { - /* hmm ... how to tell the user about the fact that we have no - * available sample rates. - */ - } - - vector bs = backend->available_buffer_sizes(device_name); - s.clear (); - for (vector::const_iterator x = bs.begin(); x != bs.end(); ++x) { - s.push_back (bufsize_as_string (*x)); - } + /* buffer sizes */ + + vector bs; + + if (_have_control) { + bs = backend->available_buffer_sizes(device_name); + } else if (backend->can_change_buffer_size_when_running()) { + bs.push_back (8); + bs.push_back (16); + bs.push_back (32); + bs.push_back (64); + bs.push_back (128); + bs.push_back (256); + bs.push_back (512); + bs.push_back (1024); + bs.push_back (2048); + bs.push_back (4096); + bs.push_back (8192); + } + s.clear (); + for (vector::const_iterator x = bs.begin(); x != bs.end(); ++x) { + s.push_back (bufsize_as_string (*x)); + } + + if (!s.empty()) { + buffer_size_combo.set_sensitive (true); + set_popdown_strings (buffer_size_combo, s); + + buffer_size_combo.set_active_text (s.front()); + show_buffer_duration (); + } else { + buffer_size_combo.set_sensitive (false); + } - if (!s.empty()) { - set_popdown_strings (buffer_size_combo, s); - buffer_size_combo.set_active_text (s.front()); - show_buffer_duration (); - } else { - /* hmm ... how to tell the user about the fact that we have no - * available buffer sizes. + /* XXX theoretically need to set min + max channel counts here */ + + manage_control_app_sensitivity (); } - manage_control_app_sensitivity (); - - ignore_changes--; - /* pick up any saved state for this device */ maybe_display_saved_state (); @@ -774,6 +915,10 @@ EngineControl::get_saved_state_for_currently_displayed_backend_and_device () EngineControl::State* EngineControl::save_state () { + if (!_have_control) { + return 0; + } + bool existing = true; State* state = get_saved_state_for_currently_displayed_backend_and_device (); @@ -808,10 +953,15 @@ EngineControl::store_state (State& state) void EngineControl::maybe_display_saved_state () { + if (!_have_control) { + return; + } + State* state = get_saved_state_for_currently_displayed_backend_and_device (); if (state) { - ignore_changes++; + PBD::Unwinder protect_ignore_changes (ignore_changes, ignore_changes + 1); + if (!_desired_sample_rate) { sample_rate_combo.set_active_text (rate_as_string (state->sample_rate)); } @@ -822,7 +972,6 @@ EngineControl::maybe_display_saved_state () show_buffer_duration (); input_latency.set_value (state->input_latency); output_latency.set_value (state->output_latency); - ignore_changes--; } } @@ -952,6 +1101,7 @@ EngineControl::set_state (const XMLNode& root) /* now see if there was an active state and switch the setup to it */ for (StateList::const_iterator i = states.begin(); i != states.end(); ++i) { + if ((*i).active) { ignore_changes++; backend_combo.set_active_text ((*i).backend); @@ -971,6 +1121,10 @@ EngineControl::set_state (const XMLNode& root) int EngineControl::push_state_to_backend (bool start) { + if (no_push) { + return 0; + } + boost::shared_ptr backend = ARDOUR::AudioEngine::instance()->current_backend(); if (!backend) { @@ -992,47 +1146,60 @@ EngineControl::push_state_to_backend (bool start) uint32_t ichan = get_input_channels (); if (_have_control) { - - /* we can control the backend */ - if (backend->requires_driver_selection()) { - if (get_driver() != backend->driver_name()) { - change_driver = true; + if (started_at_least_once) { + + /* we can control the backend */ + + if (backend->requires_driver_selection()) { + if (get_driver() != backend->driver_name()) { + change_driver = true; + } } - } + + if (get_device_name() != backend->device_name()) { + change_device = true; + } + + if (get_rate() != backend->sample_rate()) { + change_rate = true; + } + + if (get_buffer_size() != backend->buffer_size()) { + change_bufsize = true; + } + + /* zero-requested channels means "all available" */ - if (get_device_name() != backend->device_name()) { - change_device = true; - } + if (ichan == 0) { + ichan = backend->input_channels(); + } + + if (ochan == 0) { + ochan = backend->output_channels(); + } + + if (ichan != backend->input_channels()) { + change_channels = true; + } + + if (ochan != backend->output_channels()) { + change_channels = true; + } - if (get_rate() != backend->sample_rate()) { + if (get_input_latency() != backend->systemic_input_latency() || + get_output_latency() != backend->systemic_output_latency()) { + change_latency = true; + } + } else { + /* backend never started, so we have to force a group + of settings. + */ + change_driver = true; + change_device = true; change_rate = true; - } - - if (get_buffer_size() != backend->buffer_size()) { change_bufsize = true; - } - - /* zero-requested channels means "all available" */ - - if (ichan == 0) { - ichan = backend->input_channels(); - } - - if (ochan == 0) { - ochan = backend->output_channels(); - } - - if (ichan != backend->input_channels()) { - change_channels = true; - } - - if (ochan != backend->output_channels()) { change_channels = true; - } - - if (get_input_latency() != backend->systemic_input_latency() || - get_output_latency() != backend->systemic_output_latency()) { change_latency = true; } @@ -1175,26 +1342,28 @@ EngineControl::post_push () * necessary */ - State* state = get_saved_state_for_currently_displayed_backend_and_device (); - - if (!state) { - state = save_state (); - assert (state); - } - - /* all off */ - - for (StateList::iterator i = states.begin(); i != states.end(); ++i) { - (*i).active = false; + if (_have_control) { + State* state = get_saved_state_for_currently_displayed_backend_and_device (); + + if (!state) { + state = save_state (); + assert (state); + } + + /* all off */ + + for (StateList::iterator i = states.begin(); i != states.end(); ++i) { + (*i).active = false; + } + + /* mark this one active (to be used next time the dialog is + * shown) + */ + + state->active = true; + + manage_control_app_sensitivity (); } - - /* mark this one active (to be used next time the dialog is - * shown) - */ - - state->active = true; - - manage_control_app_sensitivity (); /* schedule a redisplay of MIDI ports */ @@ -1482,3 +1651,51 @@ EngineControl::on_delete_event (GdkEventAny* ev) return ArdourDialog::on_delete_event (ev); } +void +EngineControl::engine_running () +{ + boost::shared_ptr backend = ARDOUR::AudioEngine::instance()->current_backend(); + assert (backend); + + buffer_size_combo.set_active_text (bufsize_as_string (backend->buffer_size())); + sample_rate_combo.set_active_text (rate_as_string (backend->sample_rate())); + + if (backend->can_change_buffer_size_when_running()) { + buffer_size_combo.set_sensitive (true); + } else { + buffer_size_combo.set_sensitive (false); + } + + if (backend->can_change_sample_rate_when_running()) { + sample_rate_combo.set_sensitive (true); + } else { + sample_rate_combo.set_sensitive (false); + } + + connect_disconnect_button.set_label (string_compose (_("Disconnect from %1"), backend->name())); + + started_at_least_once = true; +} + +void +EngineControl::engine_stopped () +{ + boost::shared_ptr backend = ARDOUR::AudioEngine::instance()->current_backend(); + assert (backend); + + buffer_size_combo.set_sensitive (false); + connect_disconnect_button.set_label (string_compose (_("Connect to %1"), backend->name())); + + sample_rate_combo.set_sensitive (true); + buffer_size_combo.set_sensitive (true); +} + +void +EngineControl::connect_disconnect_click() +{ + if (ARDOUR::AudioEngine::instance()->running()) { + ARDOUR_UI::instance()->disconnect_from_engine (); + } else { + ARDOUR_UI::instance()->reconnect_to_engine (); + } +} diff --git a/gtk2_ardour/engine_dialog.h b/gtk2_ardour/engine_dialog.h index fcbdfe4cb8..59924e0f0a 100644 --- a/gtk2_ardour/engine_dialog.h +++ b/gtk2_ardour/engine_dialog.h @@ -75,8 +75,11 @@ class EngineControl : public ArdourDialog, public PBD::ScopedConnectionList { Gtk::Adjustment ports_adjustment; Gtk::SpinButton ports_spinner; + Gtk::Label have_control_text; Gtk::Button control_app_button; + Gtk::Button connect_disconnect_button; + /* latency measurement */ Gtk::ComboBoxText lm_output_channel_combo; @@ -106,9 +109,9 @@ class EngineControl : public ArdourDialog, public PBD::ScopedConnectionList { uint32_t ignore_changes; uint32_t _desired_sample_rate; - - static bool engine_running (); - + bool no_push; + bool started_at_least_once; + void driver_changed (); void backend_changed (); void sample_rate_changed (); @@ -174,6 +177,8 @@ class EngineControl : public ArdourDialog, public PBD::ScopedConnectionList { static bool print_channel_count (Gtk::SpinButton*); void build_notebook (); + void build_full_control_notebook (); + void build_no_control_notebook (); void on_response (int); void control_app_button_clicked (); @@ -181,6 +186,7 @@ class EngineControl : public ArdourDialog, public PBD::ScopedConnectionList { void manage_control_app_sensitivity (); int push_state_to_backend (bool start); void post_push (); + void update_sensitivity (); /* latency measurement */ void latency_button_toggled (); @@ -190,9 +196,16 @@ class EngineControl : public ArdourDialog, public PBD::ScopedConnectionList { void disable_latency_tab (); void start_latency_detection (); void end_latency_detection (); - + void on_switch_page (GtkNotebookPage*, guint page_num); bool on_delete_event (GdkEventAny*); + + void engine_running (); + void engine_stopped (); + PBD::ScopedConnection running_connection; + PBD::ScopedConnection stopped_connection; + + void connect_disconnect_click (); }; #endif /* __gtk2_ardour_engine_dialog_h__ */ diff --git a/libs/backends/jack/jack_audiobackend.cc b/libs/backends/jack/jack_audiobackend.cc index 1e7cb9d8d5..d4e2f310d3 100644 --- a/libs/backends/jack/jack_audiobackend.cc +++ b/libs/backends/jack/jack_audiobackend.cc @@ -960,6 +960,7 @@ JACKAudioBackend::disconnected (const char* why) engine.halted_callback (why); /* EMIT SIGNAL */ } } + float JACKAudioBackend::cpu_load() const { -- cgit v1.2.3 From 3f56abe099cd6978fbf2e1778debd74e771c95cd Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Thu, 19 Sep 2013 16:17:47 -0400 Subject: missing initialization --- gtk2_ardour/engine_dialog.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/gtk2_ardour/engine_dialog.cc b/gtk2_ardour/engine_dialog.cc index 135e2869ee..fa0ebe0240 100644 --- a/gtk2_ardour/engine_dialog.cc +++ b/gtk2_ardour/engine_dialog.cc @@ -79,6 +79,7 @@ EngineControl::EngineControl () , ignore_changes (0) , _desired_sample_rate (0) , no_push (true) + , started_at_least_once (false) { using namespace Notebook_Helpers; vector strings; -- cgit v1.2.3 From d2ca0665bf63188b2004338d5238122f3714b89a Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Thu, 19 Sep 2013 16:48:05 -0400 Subject: reallow changing bufsize AND sample rate when we are in control, because this is cool --- gtk2_ardour/engine_dialog.cc | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/gtk2_ardour/engine_dialog.cc b/gtk2_ardour/engine_dialog.cc index fa0ebe0240..b10cc626b6 100644 --- a/gtk2_ardour/engine_dialog.cc +++ b/gtk2_ardour/engine_dialog.cc @@ -1661,17 +1661,8 @@ EngineControl::engine_running () buffer_size_combo.set_active_text (bufsize_as_string (backend->buffer_size())); sample_rate_combo.set_active_text (rate_as_string (backend->sample_rate())); - if (backend->can_change_buffer_size_when_running()) { - buffer_size_combo.set_sensitive (true); - } else { - buffer_size_combo.set_sensitive (false); - } - - if (backend->can_change_sample_rate_when_running()) { - sample_rate_combo.set_sensitive (true); - } else { - sample_rate_combo.set_sensitive (false); - } + buffer_size_combo.set_sensitive (true); + sample_rate_combo.set_sensitive (true); connect_disconnect_button.set_label (string_compose (_("Disconnect from %1"), backend->name())); -- cgit v1.2.3 From 960a47330a5d3e534e6275f42efc07585a2075e1 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Thu, 19 Sep 2013 17:34:23 -0400 Subject: switch from JACK_Slave to Engine_Slave --- gtk2_ardour/ardour_ui.cc | 4 +- gtk2_ardour/ardour_ui_options.cc | 4 +- gtk2_ardour/audio_clock.cc | 2 +- gtk2_ardour/editor_ops.cc | 2 +- gtk2_ardour/session_option_editor.cc | 2 +- gtk2_ardour/video_monitor.cc | 2 +- libs/ardour/ardour/rc_configuration_vars.h | 2 +- libs/ardour/ardour/session.h | 2 +- libs/ardour/ardour/slave.h | 6 +-- libs/ardour/ardour/types.h | 2 +- libs/ardour/engine_slave.cc | 79 ++++++++++++++++++++++++++++++ libs/ardour/enums.cc | 2 +- libs/ardour/globals.cc | 6 ++- libs/ardour/jack_slave.cc | 79 ------------------------------ libs/ardour/session.cc | 4 +- libs/ardour/session_time.cc | 2 +- libs/ardour/session_transport.cc | 30 ++++++------ libs/ardour/utils.cc | 9 ++-- libs/ardour/wscript | 2 +- 19 files changed, 124 insertions(+), 117 deletions(-) create mode 100644 libs/ardour/engine_slave.cc delete mode 100644 libs/ardour/jack_slave.cc diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc index f22b48bd3a..f599442bc4 100644 --- a/gtk2_ardour/ardour_ui.cc +++ b/gtk2_ardour/ardour_ui.cc @@ -1809,7 +1809,7 @@ ARDOUR_UI::transport_roll () #if 0 if (_session->config.get_external_sync()) { switch (Config->get_sync_source()) { - case JACK: + case Engine: break; default: /* transport controlled by the master */ @@ -1859,7 +1859,7 @@ ARDOUR_UI::toggle_roll (bool with_abort, bool roll_out_of_bounded_mode) if (_session->config.get_external_sync()) { switch (Config->get_sync_source()) { - case JACK: + case Engine: break; default: /* transport controlled by the master */ diff --git a/gtk2_ardour/ardour_ui_options.cc b/gtk2_ardour/ardour_ui_options.cc index 6b2c9da6fa..618169d2e8 100644 --- a/gtk2_ardour/ardour_ui_options.cc +++ b/gtk2_ardour/ardour_ui_options.cc @@ -60,7 +60,7 @@ ARDOUR_UI::toggle_external_sync() { if (_session) { if (_session->config.get_video_pullup() != 0.0f) { - if (Config->get_sync_source() == JACK) { + if (Config->get_sync_source() == Engine) { MessageDialog msg ( _("It is not possible to use JACK as the the sync source\n\ when the pull up/down setting is non-zero.")); @@ -465,7 +465,7 @@ ARDOUR_UI::synchronize_sync_source_and_video_pullup () act->set_sensitive (true); } else { /* can't sync to JACK if video pullup != 0.0 */ - if (Config->get_sync_source() == JACK) { + if (Config->get_sync_source() == Engine) { act->set_sensitive (false); } else { act->set_sensitive (true); diff --git a/gtk2_ardour/audio_clock.cc b/gtk2_ardour/audio_clock.cc index c658160e14..6680e95b15 100644 --- a/gtk2_ardour/audio_clock.cc +++ b/gtk2_ardour/audio_clock.cc @@ -996,7 +996,7 @@ AudioClock::set_slave_info () Slave* slave = _session->slave(); switch (sync_src) { - case JACK: + case Engine: _left_layout->set_markup (string_compose ("" TXTSPAN "%2", INFO_FONT_SIZE, sync_source_to_string(sync_src, true))); _right_layout->set_text (""); diff --git a/gtk2_ardour/editor_ops.cc b/gtk2_ardour/editor_ops.cc index 93a53dd1d3..6ada12220a 100644 --- a/gtk2_ardour/editor_ops.cc +++ b/gtk2_ardour/editor_ops.cc @@ -2108,7 +2108,7 @@ Editor::transition_to_rolling (bool fwd) if (_session->config.get_external_sync()) { switch (Config->get_sync_source()) { - case JACK: + case Engine: break; default: /* transport controlled by the master */ diff --git a/gtk2_ardour/session_option_editor.cc b/gtk2_ardour/session_option_editor.cc index 1815db1056..60f575fb16 100644 --- a/gtk2_ardour/session_option_editor.cc +++ b/gtk2_ardour/session_option_editor.cc @@ -334,7 +334,7 @@ SessionOptionEditor::parameter_changed (std::string const & p) { OptionEditor::parameter_changed (p); if (p == "external-sync") { - if (Config->get_sync_source() == JACK) { + if (Config->get_sync_source() == Engine) { _vpu->set_sensitive(!_session_config->get_external_sync()); } else { _vpu->set_sensitive(true); diff --git a/gtk2_ardour/video_monitor.cc b/gtk2_ardour/video_monitor.cc index 2c265365fa..b1e3c87d22 100644 --- a/gtk2_ardour/video_monitor.cc +++ b/gtk2_ardour/video_monitor.cc @@ -554,7 +554,7 @@ VideoMonitor::xjadeo_sync_setup () bool my_manual_seek = true; if (_session->config.get_external_sync()) { - if (ARDOUR::Config->get_sync_source() == ARDOUR::JACK) + if (ARDOUR::Config->get_sync_source() == ARDOUR::Engine) my_manual_seek = false; } diff --git a/libs/ardour/ardour/rc_configuration_vars.h b/libs/ardour/ardour/rc_configuration_vars.h index e05efbd510..3c11304fdb 100644 --- a/libs/ardour/ardour/rc_configuration_vars.h +++ b/libs/ardour/ardour/rc_configuration_vars.h @@ -51,7 +51,7 @@ CONFIG_VARIABLE (int, mtc_qf_speed_tolerance, "mtc-qf-speed-tolerance", 5) CONFIG_VARIABLE (bool, timecode_sync_frame_rate, "timecode-sync-frame-rate", true) CONFIG_VARIABLE (bool, timecode_source_is_synced, "timecode-source-is-synced", true) CONFIG_VARIABLE (bool, timecode_source_2997, "timecode-source-2997", false) -CONFIG_VARIABLE (SyncSource, sync_source, "sync-source", JACK) +CONFIG_VARIABLE (SyncSource, sync_source, "sync-source", Engine) CONFIG_VARIABLE (std::string, ltc_source_port, "ltc-source-port", "system:capture_1") CONFIG_VARIABLE (bool, send_ltc, "send-ltc", false) CONFIG_VARIABLE (bool, ltc_send_continuously, "ltc-send-continuously", true) diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h index 7337e2d1ea..ae5339796c 100644 --- a/libs/ardour/ardour/session.h +++ b/libs/ardour/ardour/session.h @@ -509,7 +509,7 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi static PBD::Signal1 EndTimeChanged; void request_sync_source (Slave*); - bool synced_to_jack() const { return config.get_external_sync() && Config->get_sync_source() == JACK; } + bool synced_to_engine() const { return config.get_external_sync() && Config->get_sync_source() == Engine; } double transport_speed() const { return _transport_speed; } bool transport_stopped() const { return _transport_speed == 0.0f; } diff --git a/libs/ardour/ardour/slave.h b/libs/ardour/ardour/slave.h index c60acb1df7..a0b7b878e4 100644 --- a/libs/ardour/ardour/slave.h +++ b/libs/ardour/ardour/slave.h @@ -486,11 +486,11 @@ class MIDIClock_Slave : public Slave { bool _starting; }; -class JACK_Slave : public Slave +class Engine_Slave : public Slave { public: - JACK_Slave (AudioEngine&); - ~JACK_Slave (); + Engine_Slave (AudioEngine&); + ~Engine_Slave (); bool speed_and_position (double& speed, framepos_t& pos); diff --git a/libs/ardour/ardour/types.h b/libs/ardour/ardour/types.h index f2319d7669..658c64788e 100644 --- a/libs/ardour/ardour/types.h +++ b/libs/ardour/ardour/types.h @@ -489,7 +489,7 @@ namespace ARDOUR { }; enum SyncSource { - JACK, + Engine, MTC, MIDIClock, LTC diff --git a/libs/ardour/engine_slave.cc b/libs/ardour/engine_slave.cc new file mode 100644 index 0000000000..eb55c9ba54 --- /dev/null +++ b/libs/ardour/engine_slave.cc @@ -0,0 +1,79 @@ +/* + Copyright (C) 2004 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 +#include + +#include "ardour/audioengine.h" +#include "ardour/slave.h" + +using namespace std; +using namespace ARDOUR; + +Engine_Slave::Engine_Slave (AudioEngine& e) + : engine (e) +{ + double x; + framepos_t p; + /* call this to initialize things */ + speed_and_position (x, p); +} + +Engine_Slave::~Engine_Slave () +{ +} + +bool +Engine_Slave::locked() const +{ + return true; +} + +bool +Engine_Slave::ok() const +{ + return true; +} + +bool +Engine_Slave::speed_and_position (double& sp, framepos_t& position) +{ + switch (engine.transport_state()) { + case TransportStopped: + speed = 0; + _starting = false; + break; + case TransportRolling: + speed = 1.0; + _starting = false; + break; + case TransportLooping: + speed = 1.0; + _starting = false; + break; + case TransportStarting: + _starting = true; + // don't adjust speed here, just leave it as it was + break; + } + + sp = speed; + position = engine.transport_frame(); + return true; +} diff --git a/libs/ardour/enums.cc b/libs/ardour/enums.cc index bab0e8ed15..8fec499c35 100644 --- a/libs/ardour/enums.cc +++ b/libs/ardour/enums.cc @@ -335,7 +335,7 @@ setup_enum_writer () REGISTER (_PluginType); REGISTER_ENUM (MTC); - REGISTER_ENUM (JACK); + REGISTER_ENUM (Engine); REGISTER_ENUM (MIDIClock); REGISTER_ENUM (LTC); REGISTER (_SyncSource); diff --git a/libs/ardour/globals.cc b/libs/ardour/globals.cc index aac7709f90..459f6f0e51 100644 --- a/libs/ardour/globals.cc +++ b/libs/ardour/globals.cc @@ -530,7 +530,11 @@ ARDOUR::get_available_sync_options () { vector ret; - ret.push_back (JACK); + boost::shared_ptr backend = AudioEngine::instance()->current_backend(); + if (backend && backend->name() == "JACK") { + ret.push_back (Engine); + } + ret.push_back (MTC); ret.push_back (MIDIClock); ret.push_back (LTC); diff --git a/libs/ardour/jack_slave.cc b/libs/ardour/jack_slave.cc deleted file mode 100644 index 4b2f3b1860..0000000000 --- a/libs/ardour/jack_slave.cc +++ /dev/null @@ -1,79 +0,0 @@ -/* - Copyright (C) 2004 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 -#include - -#include "ardour/audioengine.h" -#include "ardour/slave.h" - -using namespace std; -using namespace ARDOUR; - -JACK_Slave::JACK_Slave (AudioEngine& e) - : engine (e) -{ - double x; - framepos_t p; - /* call this to initialize things */ - speed_and_position (x, p); -} - -JACK_Slave::~JACK_Slave () -{ -} - -bool -JACK_Slave::locked() const -{ - return true; -} - -bool -JACK_Slave::ok() const -{ - return true; -} - -bool -JACK_Slave::speed_and_position (double& sp, framepos_t& position) -{ - switch (engine.transport_state()) { - case TransportStopped: - speed = 0; - _starting = false; - break; - case TransportRolling: - speed = 1.0; - _starting = false; - break; - case TransportLooping: - speed = 1.0; - _starting = false; - break; - case TransportStarting: - _starting = true; - // don't adjust speed here, just leave it as it was - break; - } - - sp = speed; - position = engine.transport_frame(); - return true; -} diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc index 746732f76e..4be52a7584 100644 --- a/libs/ardour/session.cc +++ b/libs/ardour/session.cc @@ -393,7 +393,7 @@ Session::immediately_post_engine () _engine.Running.connect_same_thread (*this, boost::bind (&Session::initialize_latencies, this)); - if (synced_to_jack()) { + if (synced_to_engine()) { _engine.transport_stop (); } @@ -1406,7 +1406,7 @@ Session::audible_frame () const offset = current_block_size; } - if (synced_to_jack()) { + if (synced_to_engine()) { tf = _engine.transport_frame(); } else { tf = _transport_frame; diff --git a/libs/ardour/session_time.cc b/libs/ardour/session_time.cc index 0f2186c09b..e35910f2df 100644 --- a/libs/ardour/session_time.cc +++ b/libs/ardour/session_time.cc @@ -182,7 +182,7 @@ Session::timecode_time (Timecode::Time &t) int Session::backend_sync_callback (TransportState state, framepos_t pos) { - bool slave = synced_to_jack(); + bool slave = synced_to_engine(); switch (state) { case TransportStopped: diff --git a/libs/ardour/session_transport.cc b/libs/ardour/session_transport.cc index ab6d68fd67..38ad521235 100644 --- a/libs/ardour/session_transport.cc +++ b/libs/ardour/session_transport.cc @@ -86,7 +86,7 @@ Session::request_sync_source (Slave* new_slave) seamless = Config->get_seamless_loop (); - if (dynamic_cast(new_slave)) { + if (dynamic_cast(new_slave)) { /* JACK cannot support seamless looping at present */ Config->set_seamless_loop (false); } else { @@ -514,13 +514,13 @@ Session::non_realtime_stop (bool abort, int on_entry, bool& finished) if (auto_return_enabled || (ptw & PostTransportLocate) || (_requested_return_frame >= 0) || - synced_to_jack()) { + synced_to_engine()) { if (pending_locate_flush) { flush_all_inserts (); } - if ((auto_return_enabled || synced_to_jack() || _requested_return_frame >= 0) && + if ((auto_return_enabled || synced_to_engine() || _requested_return_frame >= 0) && !(ptw & PostTransportLocate)) { /* no explicit locate queued */ @@ -543,7 +543,7 @@ Session::non_realtime_stop (bool abort, int on_entry, bool& finished) /* don't try to handle loop play when synced to JACK */ - if (!synced_to_jack()) { + if (!synced_to_engine()) { Location *location = _locations->auto_loop_location(); @@ -734,7 +734,7 @@ Session::set_play_loop (bool yn) return; } - if (yn && Config->get_seamless_loop() && synced_to_jack()) { + if (yn && Config->get_seamless_loop() && synced_to_engine()) { warning << string_compose ( _("Seamless looping cannot be supported while %1 is using JACK transport.\n" "Recommend changing the configured options"), PROGRAM_NAME) @@ -811,7 +811,7 @@ Session::flush_all_inserts () void Session::start_locate (framepos_t target_frame, bool with_roll, bool with_flush, bool with_loop, bool force) { - if (synced_to_jack()) { + if (synced_to_engine()) { double sp; framepos_t pos; @@ -926,7 +926,7 @@ Session::locate (framepos_t target_frame, bool with_roll, bool with_flush, bool bool transport_was_stopped = !transport_rolling(); - if (transport_was_stopped && (!auto_play_legal || !config.get_auto_play()) && !with_roll && !(synced_to_jack() && play_loop)) { + if (transport_was_stopped && (!auto_play_legal || !config.get_auto_play()) && !with_roll && !(synced_to_engine() && play_loop)) { realtime_stop (false, true); // XXX paul - check if the 2nd arg is really correct transport_was_stopped = true; } else { @@ -1067,7 +1067,7 @@ Session::set_transport_speed (double speed, bool abort, bool clear_state, bool a set_track_monitor_input_status (true); } - if (synced_to_jack ()) { + if (synced_to_engine ()) { if (clear_state) { /* do this here because our response to the slave won't take care of it. @@ -1090,7 +1090,7 @@ Session::set_transport_speed (double speed, bool abort, bool clear_state, bool a set_track_monitor_input_status (false); } - if (synced_to_jack()) { + if (synced_to_engine()) { _engine.transport_start (); } else { start_transport (); @@ -1100,7 +1100,7 @@ Session::set_transport_speed (double speed, bool abort, bool clear_state, bool a /* not zero, not 1.0 ... varispeed */ - if ((synced_to_jack()) && speed != 0.0 && speed != 1.0) { + if ((synced_to_engine()) && speed != 0.0 && speed != 1.0) { warning << string_compose ( _("Global varispeed cannot be supported while %1 is connected to JACK transport control"), PROGRAM_NAME) @@ -1429,8 +1429,8 @@ Session::switch_to_sync_source (SyncSource src) } break; - case JACK: - if (_slave && dynamic_cast(_slave)) { + case Engine: + if (_slave && dynamic_cast(_slave)) { return; } @@ -1438,7 +1438,7 @@ Session::switch_to_sync_source (SyncSource src) return; } - new_slave = new JACK_Slave (*AudioEngine::instance()); + new_slave = new Engine_Slave (*AudioEngine::instance()); break; default: @@ -1632,9 +1632,9 @@ bool Session::maybe_stop (framepos_t limit) { if ((_transport_speed > 0.0f && _transport_frame >= limit) || (_transport_speed < 0.0f && _transport_frame == 0)) { - if (synced_to_jack () && config.get_jack_time_master ()) { + if (synced_to_engine () && config.get_jack_time_master ()) { _engine.transport_stop (); - } else if (!synced_to_jack ()) { + } else if (!synced_to_engine ()) { stop_transport (); } return true; diff --git a/libs/ardour/utils.cc b/libs/ardour/utils.cc index e7b7648149..0c98461974 100644 --- a/libs/ardour/utils.cc +++ b/libs/ardour/utils.cc @@ -395,12 +395,12 @@ string_to_sync_source (string str) } if (str == _("JACK")) { - return JACK; + return Engine; } fatal << string_compose (_("programming error: unknown sync source string \"%1\""), str) << endmsg; /*NOTREACHED*/ - return JACK; + return Engine; } /** @param sh Return a short version of the string */ @@ -408,7 +408,10 @@ const char* sync_source_to_string (SyncSource src, bool sh) { switch (src) { - case JACK: + case Engine: + /* no other backends offer sync for now ... deal with this if we + * ever have to. + */ return _("JACK"); case MTC: diff --git a/libs/ardour/wscript b/libs/ardour/wscript index d367b2101e..474a9c58c6 100644 --- a/libs/ardour/wscript +++ b/libs/ardour/wscript @@ -69,6 +69,7 @@ libardour_sources = [ 'diskstream.cc', 'element_import_handler.cc', 'element_importer.cc', + 'engine_slave.cc', 'enums.cc', 'event_type_map.cc', 'export_channel.cc', @@ -103,7 +104,6 @@ libardour_sources = [ 'interpolation.cc', 'io.cc', 'io_processor.cc', - 'jack_slave.cc', 'kmeterdsp.cc', 'ladspa_plugin.cc', 'location.cc', -- cgit v1.2.3 From bab9184f7c648b8c6607e4c5890e25129e187619 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Fri, 20 Sep 2013 14:17:59 -0400 Subject: changes to integrate new/recent/browse in new session dialog. Probably some errors/mistakes in here and no doubt some improvements to be done. --- gtk2_ardour/startup.cc | 383 +++++++++++++++++++++++-------------------------- gtk2_ardour/startup.h | 16 +-- 2 files changed, 182 insertions(+), 217 deletions(-) diff --git a/gtk2_ardour/startup.cc b/gtk2_ardour/startup.cc index 266a7e2a27..36f399224f 100644 --- a/gtk2_ardour/startup.cc +++ b/gtk2_ardour/startup.cc @@ -70,8 +70,6 @@ ArdourStartup::ArdourStartup (bool require_new, const std::string& session_name, , config_modified (false) , new_only (require_new) , default_dir_chooser (0) - , ic_new_session_button (_("Create a new session")) - , ic_existing_session_button (_("Open an existing session")) , monitor_via_hardware_button (string_compose (_("Use an external mixer or the hardware mixer of your audio interface.\n" "%1 will play NO role in monitoring"), PROGRAM_NAME)) , monitor_via_ardour_button (string_compose (_("Ask %1 to play back material as it is being recorded"), PROGRAM_NAME)) @@ -84,7 +82,7 @@ ArdourStartup::ArdourStartup (bool require_new, const std::string& session_name, , new_user_page_index (-1) , default_folder_page_index (-1) , monitoring_page_index (-1) - , session_page_index (-1) + , new_session_page_index (-1) , initial_choice_index (-1) , final_page_index (-1) , session_options_page_index (-1) @@ -137,27 +135,19 @@ ArdourStartup::ArdourStartup (bool require_new, const std::string& session_name, setup_first_time_config_page (); setup_monitoring_choice_page (); setup_monitor_section_choice_page (); - - ic_new_session_button.set_active (true); // always create new session on first run - - } else { - - setup_initial_choice_page (); - } - - setup_session_page (); - setup_more_options_page (); - - if (new_user) { setup_final_page (); - } + setup_new_session_page (); - if (new_only) { - ic_vbox.hide (); } else { - ic_vbox.show (); + + if (!new_only) { + setup_initial_choice_page (); + } + setup_new_session_page (); } + setup_more_options_page (); + if (!template_name.empty()) { use_template_button.set_active (false); load_template_override = template_name; @@ -232,10 +222,6 @@ ArdourStartup::session_template_name () return Glib::build_filename (the_path, load_template_override + ARDOUR::template_suffix); } - if (ic_existing_session_button.get_active()) { - return string(); - } - if (use_template_button.get_active()) { TreeModel::iterator iter = template_chooser.get_active (); TreeModel::Row row = (*iter); @@ -254,26 +240,24 @@ ArdourStartup::session_name (bool& should_be_new) return _provided_session_name; } - if (ic_new_session_button.get_active()) { - should_be_new = true; - string val = new_name_entry.get_text (); - strip_whitespace_edges (val); - return val; - } else if (_existing_session_chooser_used) { + /* Try recent session selection */ + + TreeIter iter = recent_session_display.get_selection()->get_selected(); + + if (iter) { + should_be_new = false; + return (*iter)[recent_session_columns.visible_name]; + } + + if (_existing_session_chooser_used) { /* existing session chosen from file chooser */ should_be_new = false; return existing_session_chooser.get_filename (); } else { - /* existing session chosen from recent list */ - should_be_new = false; - - TreeIter iter = recent_session_display.get_selection()->get_selected(); - - if (iter) { - return (*iter)[recent_session_columns.visible_name]; - } - - return ""; + should_be_new = true; + string val = new_name_entry.get_text (); + strip_whitespace_edges (val); + return val; } } @@ -284,20 +268,20 @@ ArdourStartup::session_folder () return _provided_session_path; } - if (ic_new_session_button.get_active()) { - std::string legal_session_folder_name = legalize_for_path (new_name_entry.get_text()); - return Glib::build_filename (new_folder_chooser.get_current_folder(), legal_session_folder_name); - } else if (_existing_session_chooser_used) { + /* Try recent session selection */ + + TreeIter iter = recent_session_display.get_selection()->get_selected(); + + if (iter) { + return (*iter)[recent_session_columns.fullpath]; + } + + if (_existing_session_chooser_used) { /* existing session chosen from file chooser */ return existing_session_chooser.get_current_folder (); } else { - /* existing session chosen from recent list */ - TreeIter iter = recent_session_display.get_selection()->get_selected(); - - if (iter) { - return (*iter)[recent_session_columns.fullpath]; - } - return ""; + std::string legal_session_folder_name = legalize_for_path (new_name_entry.get_text()); + return Glib::build_filename (new_folder_chooser.get_current_folder(), legal_session_folder_name); } } @@ -511,17 +495,32 @@ ArdourStartup::setup_initial_choice_page () ic_vbox.set_spacing (6); ic_vbox.set_border_width (24); - RadioButton::Group g (ic_new_session_button.get_group()); - ic_existing_session_button.set_group (g); + /* append the page early because the recent session display will cause + calls to set_page_complete() on this page. + */ + + initial_choice_index = append_page (ic_vbox); + set_page_title (ic_vbox, string_compose("%1 %2", PROGRAM_NAME, VERSIONSTRING)); + set_page_header_image (ic_vbox, icon_pixbuf); + HBox* centering_hbox = manage (new HBox); VBox* centering_vbox = manage (new VBox); centering_vbox->set_spacing (6); + Label* new_label = manage (new Label); + new_label->set_markup (string_compose ("%1", _("Create a new session"))); + new_label->set_alignment (0, 0.5); + + ic_new_session_button.set_label (_("Configure the new session ...")); + ic_new_session_button.signal_clicked().connect (sigc::mem_fun (*this, &ArdourStartup::new_session_button_clicked)); + + centering_vbox->pack_start (*new_label, false, false, 12); centering_vbox->pack_start (ic_new_session_button, false, true); - centering_vbox->pack_start (ic_existing_session_button, false, true); - + + /* Possible update message */ + if (ARDOUR_UI::instance()->announce_string() != "" ) { Gtk::Frame *info_frame = manage(new Gtk::Frame); @@ -548,22 +547,75 @@ ArdourStartup::setup_initial_choice_page () info_box->pack_start (*updates_button, false, false); } + + ARDOUR::RecentSessions rs; + ARDOUR::read_recent_sessions (rs); - ic_new_session_button.signal_button_press_event().connect(sigc::mem_fun(*this, &ArdourStartup::initial_button_clicked), false); - ic_new_session_button.signal_activate().connect(sigc::mem_fun(*this, &ArdourStartup::initial_button_activated), false); + if (!rs.empty()) { - ic_existing_session_button.signal_button_press_event().connect(sigc::mem_fun(*this, &ArdourStartup::initial_button_clicked), false); - ic_existing_session_button.signal_activate().connect(sigc::mem_fun(*this, &ArdourStartup::initial_button_activated), false); + /* recent session scroller */ - centering_hbox->pack_start (*centering_vbox, true, true); + Label* load_label = manage (new Label); + load_label->set_markup (string_compose ("%1", _("Load a recent session"))); + load_label->set_alignment (0, 0.5); - ic_vbox.pack_start (*centering_hbox, true, true); + centering_vbox->pack_start (*load_label, false, false, 12); - ic_vbox.show_all (); + recent_session_model = TreeStore::create (recent_session_columns); + redisplay_recent_sessions (); - initial_choice_index = append_page (ic_vbox); - set_page_title (ic_vbox, string_compose("%1 %2", PROGRAM_NAME, VERSIONSTRING)); - set_page_header_image (ic_vbox, icon_pixbuf); + recent_session_display.set_model (recent_session_model); + recent_session_display.append_column (_("Recent Sessions"), recent_session_columns.visible_name); + recent_session_display.set_headers_visible (false); + recent_session_display.get_selection()->set_mode (SELECTION_SINGLE); + + recent_session_display.get_selection()->signal_changed().connect (sigc::mem_fun (*this, &ArdourStartup::recent_session_row_selected)); + + recent_scroller.add (recent_session_display); + recent_scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC); + recent_scroller.set_shadow_type (Gtk::SHADOW_IN); + + recent_session_display.show(); + + recent_scroller.show(); + recent_session_display.signal_row_activated().connect (sigc::mem_fun (*this, &ArdourStartup::recent_row_activated)); + + int cnt = redisplay_recent_sessions (); + if (cnt > 4) { + recent_scroller.set_size_request (-1, 300); + } + + centering_vbox->pack_start (recent_scroller, false, true); + } + + /* Browse button */ + + existing_session_chooser.set_title (_("Select session file")); + existing_session_chooser.signal_file_set().connect (sigc::mem_fun (*this, &ArdourStartup::existing_session_selected)); + existing_session_chooser.set_current_folder(poor_mans_glob (Config->get_default_session_parent_dir())); + + FileFilter session_filter; + session_filter.add_pattern ("*.ardour"); + session_filter.set_name (string_compose (_("%1 sessions"), PROGRAM_NAME)); + existing_session_chooser.add_filter (session_filter); + existing_session_chooser.set_filter (session_filter); + +#ifdef GTKOSX + existing_session_chooser.add_shortcut_folder ("/Volumes"); +#endif + + Label* browse_label = manage (new Label); + browse_label->set_markup (string_compose ("%1", _("Browse for other sessions"))); + browse_label->set_alignment (0, 0.5); + + centering_vbox->pack_start (*browse_label, false, false, 12); + centering_vbox->pack_start (existing_session_chooser, false, false); + + /* pack it all up */ + + centering_hbox->pack_start (*centering_vbox, true, true); + ic_vbox.pack_start (*centering_hbox, true, true); + ic_vbox.show_all (); /* user could just click on "Forward" if default * choice is correct. @@ -572,35 +624,33 @@ ArdourStartup::setup_initial_choice_page () set_page_complete (ic_vbox, true); } -bool -ArdourStartup::initial_button_clicked (GdkEventButton* ev) -{ - if (ev->type == GDK_2BUTTON_PRESS && session_page_index != -1) { - set_current_page(session_page_index); - } - - return false; -} - void -ArdourStartup::initial_button_activated () +ArdourStartup::session_selected () { - if (session_page_index != -1) { - set_current_page(session_page_index); + /* HACK HACK HACK ... change the "Apply" button label + to say "Open" + */ + + Gtk::Widget* tl = ic_vbox.get_toplevel(); + Gtk::Window* win; + if ((win = dynamic_cast(tl)) != 0) { + /* ::get_default_widget() is not wrapped in gtkmm */ + Gtk::Widget* def = wrap (gtk_window_get_default_widget (win->gobj())); + Gtk::Button* button; + if ((button = dynamic_cast(def)) != 0) { + if (more_new_session_options_button.get_active()) { + button->set_label (_("Next")); + } else { + button->set_label (_("Open")); + } + } } } void -ArdourStartup::setup_session_page () +ArdourStartup::new_session_button_clicked () { - session_vbox.set_border_width (24); - - session_vbox.pack_start (session_hbox, true, true); - session_vbox.show_all (); - - session_page_index = append_page (session_vbox); - /* initial setting */ - set_page_type (session_vbox, ASSISTANT_PAGE_CONFIRM); + set_current_page (new_session_page_index); } void @@ -621,6 +671,24 @@ ArdourStartup::on_cancel () gtk_main_quit (); } +void +ArdourStartup::on_prepare (Gtk::Widget* page) +{ + if (page == &session_new_vbox) { + + /* if the user already defined a name by using the recent + * session list or browsing to an existing session + * then we are done. + */ + + bool expect_new_ignored; + + if (!session_name (expect_new_ignored).empty()) { + on_apply (); + } + } +} + bool ArdourStartup::on_delete_event (GdkEventAny*) { @@ -662,41 +730,6 @@ ArdourStartup::on_apply () gtk_main_quit (); } -void -ArdourStartup::on_prepare (Gtk::Widget* page) -{ - if (page == &session_vbox) { - - if (ic_new_session_button.get_active()) { - /* new session requested */ - setup_new_session_page (); - } else { - /* existing session requested */ - setup_existing_session_page (); - - } - - /* HACK HACK HACK ... change the "Apply" button label - to say "Open" - */ - - Gtk::Widget* tl = session_vbox.get_toplevel(); - Gtk::Window* win; - if ((win = dynamic_cast(tl)) != 0) { - /* ::get_default_widget() is not wrapped in gtkmm */ - Gtk::Widget* def = wrap (gtk_window_get_default_widget (win->gobj())); - Gtk::Button* button; - if ((button = dynamic_cast(def)) != 0) { - if (more_new_session_options_button.get_active()) { - button->set_label (_("Forward")); - }else{ - button->set_label (_("Open")); - } - } - } - } -} - void ArdourStartup::populate_session_templates () { @@ -719,10 +752,7 @@ ArdourStartup::populate_session_templates () void ArdourStartup::setup_new_session_page () { - if (!session_hbox.get_children().empty()) { - session_hbox.remove (**session_hbox.get_children().begin()); - } - + session_new_vbox.set_border_width (12); session_new_vbox.set_spacing (18); if (session_new_vbox.get_children().empty()) { @@ -742,7 +772,7 @@ ArdourStartup::setup_new_session_page () if (!ARDOUR_COMMAND_LINE::session_name.empty()) { new_name_entry.set_text (Glib::path_get_basename (ARDOUR_COMMAND_LINE::session_name)); /* name provided - they can move right along */ - set_page_complete (session_vbox, true); + set_page_complete (session_new_vbox, true); } new_name_entry.signal_changed().connect (sigc::mem_fun (*this, &ArdourStartup::new_name_changed)); @@ -882,23 +912,26 @@ ArdourStartup::setup_new_session_page () } session_new_vbox.show_all (); - session_hbox.pack_start (session_new_vbox, true, true); - set_page_title (session_vbox, _("New Session")); - set_page_type (session_vbox, ASSISTANT_PAGE_CONFIRM); + + new_session_page_index = append_page (session_new_vbox); + set_page_type (session_new_vbox, ASSISTANT_PAGE_CONTENT); + set_page_title (session_new_vbox, _("New Session")); if (more_new_session_options_button.get_active()) { - set_page_type (session_vbox, ASSISTANT_PAGE_CONTENT); + set_page_type (session_new_vbox, ASSISTANT_PAGE_CONTENT); + } else { + set_page_type (session_new_vbox, ASSISTANT_PAGE_CONFIRM); } - session_hbox.show_all(); } void ArdourStartup::new_name_changed () { if (!new_name_entry.get_text().empty()) { - set_page_complete (session_vbox, true); + session_selected (); + set_page_complete (session_new_vbox, true); } else { - set_page_complete (session_vbox, false); + set_page_complete (session_new_vbox, false); } } @@ -996,87 +1029,22 @@ void ArdourStartup::recent_session_row_selected () { if (recent_session_display.get_selection()->count_selected_rows() > 0) { - set_page_complete (session_vbox, true); + set_page_complete (ic_vbox, true); + session_selected (); } else { - set_page_complete (session_vbox, false); + set_page_complete (ic_vbox, false); } } -void -ArdourStartup::setup_existing_session_page () -{ - recent_session_model = TreeStore::create (recent_session_columns); - redisplay_recent_sessions (); - - if (!session_hbox.get_children().empty()) { - session_hbox.remove (**session_hbox.get_children().begin()); - } - - if (session_existing_vbox.get_children().empty()) { - - recent_session_display.set_model (recent_session_model); - recent_session_display.append_column (_("Recent Sessions"), recent_session_columns.visible_name); - recent_session_display.set_headers_visible (false); - recent_session_display.get_selection()->set_mode (SELECTION_BROWSE); - - recent_session_display.get_selection()->signal_changed().connect (sigc::mem_fun (*this, &ArdourStartup::recent_session_row_selected)); - - recent_scroller.add (recent_session_display); - recent_scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC); - recent_scroller.set_shadow_type (Gtk::SHADOW_IN); - - recent_session_display.show(); - - recent_scroller.show(); - int cnt = redisplay_recent_sessions (); - recent_session_display.signal_row_activated().connect (sigc::mem_fun (*this, &ArdourStartup::recent_row_activated)); - - if (cnt > 4) { - recent_scroller.set_size_request (-1, 300); - } - - session_existing_vbox.set_spacing (8); - session_existing_vbox.pack_start (recent_scroller, true, true); - - existing_session_chooser.set_title (_("Select session file")); - existing_session_chooser.signal_file_set().connect (sigc::mem_fun (*this, &ArdourStartup::existing_session_selected)); - existing_session_chooser.set_current_folder(poor_mans_glob (Config->get_default_session_parent_dir())); - - FileFilter session_filter; - session_filter.add_pattern ("*.ardour"); - session_filter.set_name (string_compose (_("%1 sessions"), PROGRAM_NAME)); - existing_session_chooser.add_filter (session_filter); - existing_session_chooser.set_filter (session_filter); - -#ifdef GTKOSX - existing_session_chooser.add_shortcut_folder ("/Volumes"); -#endif - - HBox* hbox = manage (new HBox); - hbox->set_spacing (4); - hbox->pack_start (*manage (new Label (_("Browse:"))), PACK_SHRINK); - hbox->pack_start (existing_session_chooser); - session_existing_vbox.pack_start (*hbox, false, false); - hbox->show_all (); - } - - session_existing_vbox.show_all (); - session_hbox.pack_start (session_existing_vbox, true, true); - - set_page_title (session_vbox, _("Select a session")); - set_page_type (session_vbox, ASSISTANT_PAGE_CONFIRM); - session_hbox.show_all(); -} - void ArdourStartup::more_new_session_options_button_clicked () { if (more_new_session_options_button.get_active()) { more_options_vbox.show_all (); set_page_type (more_options_vbox, ASSISTANT_PAGE_CONFIRM); - set_page_type (session_vbox, ASSISTANT_PAGE_CONTENT); + set_page_type (session_new_vbox, ASSISTANT_PAGE_CONTENT); } else { - set_page_type (session_vbox, ASSISTANT_PAGE_CONFIRM); + set_page_type (session_new_vbox, ASSISTANT_PAGE_CONFIRM); more_options_vbox.hide (); } } @@ -1385,19 +1353,21 @@ ArdourStartup::move_along_now () { gint cur = get_current_page (); - if (cur == session_page_index) { + if (cur == new_session_page_index) { if (more_new_session_options_button.get_active()) { set_current_page (session_options_page_index); } else { on_apply (); } + } else { + on_apply (); } } void ArdourStartup::recent_row_activated (const Gtk::TreePath&, Gtk::TreeViewColumn*) { - set_page_complete (session_vbox, true); + set_page_complete (ic_vbox, true); move_along_now (); } @@ -1406,7 +1376,8 @@ ArdourStartup::existing_session_selected () { _existing_session_chooser_used = true; - set_page_complete (session_vbox, true); + session_selected (); + set_page_complete (ic_vbox, true); move_along_now (); } diff --git a/gtk2_ardour/startup.h b/gtk2_ardour/startup.h index 4dcc3a9fb2..7ddb3830a4 100644 --- a/gtk2_ardour/startup.h +++ b/gtk2_ardour/startup.h @@ -90,7 +90,7 @@ class ArdourStartup : public Gtk::Assistant { void on_apply (); void on_cancel (); bool on_delete_event (GdkEventAny*); - void on_prepare (Gtk::Widget*); + void on_prepare (Gtk::Widget*); static ArdourStartup *the_startup; @@ -113,10 +113,8 @@ class ArdourStartup : public Gtk::Assistant { void setup_initial_choice_page (); Gtk::VBox ic_vbox; - Gtk::RadioButton ic_new_session_button; - Gtk::RadioButton ic_existing_session_button; - bool initial_button_clicked(GdkEventButton*); - void initial_button_activated(); + Gtk::Button ic_new_session_button; + void new_session_button_clicked (); /* monitoring choices */ @@ -134,11 +132,6 @@ class ArdourStartup : public Gtk::Assistant { Gtk::RadioButton no_monitor_section_button; void setup_monitor_section_choice_page (); - /* session page (could be new or existing) */ - - void setup_session_page (); - Gtk::VBox session_vbox; - Gtk::HBox session_hbox; /* recent sessions */ @@ -171,6 +164,7 @@ class ArdourStartup : public Gtk::Assistant { void recent_row_activated (const Gtk::TreePath& path, Gtk::TreeViewColumn* col); void existing_session_selected (); + void session_selected (); /* new sessions */ @@ -278,7 +272,7 @@ class ArdourStartup : public Gtk::Assistant { gint default_folder_page_index; gint monitoring_page_index; gint monitor_section_page_index; - gint session_page_index; + gint new_session_page_index; gint initial_choice_index; gint final_page_index; gint session_options_page_index; -- cgit v1.2.3 From b188033bf752bfd32557f9b7078738a20b59d09b Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Fri, 20 Sep 2013 14:30:50 -0400 Subject: rather hacky fix for the change of the SyncSource > JACK enum to SyncSource > Engine This is needed in order to get ardour started if ardour.rc names "JACK" as the sync source --- libs/ardour/ardour/types.h | 3 ++- libs/ardour/enums.cc | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/libs/ardour/ardour/types.h b/libs/ardour/ardour/types.h index 658c64788e..ca3f1acc19 100644 --- a/libs/ardour/ardour/types.h +++ b/libs/ardour/ardour/types.h @@ -489,7 +489,8 @@ namespace ARDOUR { }; enum SyncSource { - Engine, + Engine = 0, + JACK = 0, MTC, MIDIClock, LTC diff --git a/libs/ardour/enums.cc b/libs/ardour/enums.cc index 8fec499c35..3898a0e881 100644 --- a/libs/ardour/enums.cc +++ b/libs/ardour/enums.cc @@ -336,6 +336,7 @@ setup_enum_writer () REGISTER_ENUM (MTC); REGISTER_ENUM (Engine); + REGISTER_ENUM (JACK); REGISTER_ENUM (MIDIClock); REGISTER_ENUM (LTC); REGISTER (_SyncSource); -- cgit v1.2.3 From 53bd17d938887766eb56833205131b68d7e5cb1d Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Fri, 20 Sep 2013 16:05:54 -0400 Subject: move advanced new session options into an expander, change some wording --- gtk2_ardour/startup.cc | 56 +++++++------------------------------------------- gtk2_ardour/startup.h | 5 +++-- 2 files changed, 10 insertions(+), 51 deletions(-) diff --git a/gtk2_ardour/startup.cc b/gtk2_ardour/startup.cc index 36f399224f..52aa680f12 100644 --- a/gtk2_ardour/startup.cc +++ b/gtk2_ardour/startup.cc @@ -74,7 +74,7 @@ ArdourStartup::ArdourStartup (bool require_new, const std::string& session_name, "%1 will play NO role in monitoring"), PROGRAM_NAME)) , monitor_via_ardour_button (string_compose (_("Ask %1 to play back material as it is being recorded"), PROGRAM_NAME)) , new_folder_chooser (FILE_CHOOSER_ACTION_SELECT_FOLDER) - , more_new_session_options_button (_("I'd like more options for this session")) + , more_new_session_options_button (_("Advanced options ...")) , _output_limit_count_adj (1, 0, 100, 1, 10, 0) , _input_limit_count_adj (1, 0, 100, 1, 10, 0) , _master_bus_channel_count_adj (2, 0, 100, 1, 10, 0) @@ -146,8 +146,6 @@ ArdourStartup::ArdourStartup (bool require_new, const std::string& session_name, setup_new_session_page (); } - setup_more_options_page (); - if (!template_name.empty()) { use_template_button.set_active (false); load_template_override = template_name; @@ -638,11 +636,7 @@ ArdourStartup::session_selected () Gtk::Widget* def = wrap (gtk_window_get_default_widget (win->gobj())); Gtk::Button* button; if ((button = dynamic_cast(def)) != 0) { - if (more_new_session_options_button.get_active()) { - button->set_label (_("Next")); - } else { - button->set_label (_("Open")); - } + button->set_label (_("Open")); } } } @@ -832,11 +826,6 @@ ArdourStartup::setup_new_session_page () vbox2->set_spacing (6); - label3->set_markup (_("Options")); - label3->set_alignment (0.0, 0.0); - - vbox2->pack_start (*label3, false, true); - VBox *vbox3 = manage (new VBox); vbox3->set_spacing (6); @@ -899,8 +888,8 @@ ArdourStartup::setup_new_session_page () hbox5->set_spacing (6); hbox5->pack_start (more_new_session_options_button, false, false); - more_new_session_options_button.show (); - more_new_session_options_button.signal_clicked().connect (sigc::mem_fun (*this, &ArdourStartup::more_new_session_options_button_clicked)); + setup_more_options_box (); + more_new_session_options_button.add (more_options_vbox); vbox3->pack_start (*hbox5, false, false); hbox3->pack_start (*vbox3, true, true, 8); @@ -917,11 +906,7 @@ ArdourStartup::setup_new_session_page () set_page_type (session_new_vbox, ASSISTANT_PAGE_CONTENT); set_page_title (session_new_vbox, _("New Session")); - if (more_new_session_options_button.get_active()) { - set_page_type (session_new_vbox, ASSISTANT_PAGE_CONTENT); - } else { - set_page_type (session_new_vbox, ASSISTANT_PAGE_CONFIRM); - } + set_page_type (session_new_vbox, ASSISTANT_PAGE_CONFIRM); } void @@ -1037,20 +1022,7 @@ ArdourStartup::recent_session_row_selected () } void -ArdourStartup::more_new_session_options_button_clicked () -{ - if (more_new_session_options_button.get_active()) { - more_options_vbox.show_all (); - set_page_type (more_options_vbox, ASSISTANT_PAGE_CONFIRM); - set_page_type (session_new_vbox, ASSISTANT_PAGE_CONTENT); - } else { - set_page_type (session_new_vbox, ASSISTANT_PAGE_CONFIRM); - more_options_vbox.hide (); - } -} - -void -ArdourStartup::setup_more_options_page () +ArdourStartup::setup_more_options_box () { more_options_vbox.set_border_width (24); @@ -1234,10 +1206,6 @@ ArdourStartup::setup_more_options_page () * doesn't resize. */ more_options_vbox.show_all (); - - session_options_page_index = append_page (more_options_vbox); - set_page_title (more_options_vbox, _("Advanced Session Options")); - set_page_complete (more_options_vbox, true); } bool @@ -1351,17 +1319,7 @@ ArdourStartup::master_bus_button_clicked () void ArdourStartup::move_along_now () { - gint cur = get_current_page (); - - if (cur == new_session_page_index) { - if (more_new_session_options_button.get_active()) { - set_current_page (session_options_page_index); - } else { - on_apply (); - } - } else { - on_apply (); - } + on_apply (); } void diff --git a/gtk2_ardour/startup.h b/gtk2_ardour/startup.h index 7ddb3830a4..2703ac7638 100644 --- a/gtk2_ardour/startup.h +++ b/gtk2_ardour/startup.h @@ -26,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -189,7 +190,7 @@ class ArdourStartup : public Gtk::Assistant { Gtk::VBox session_new_vbox; Gtk::VBox session_existing_vbox; - Gtk::CheckButton more_new_session_options_button; + Gtk::Expander more_new_session_options_button; Gtk::RadioButtonGroup session_template_group; Gtk::RadioButton use_session_as_template_button; Gtk::RadioButton use_template_button; @@ -254,7 +255,7 @@ class ArdourStartup : public Gtk::Assistant { void limit_inputs_clicked (); void limit_outputs_clicked (); void master_bus_button_clicked (); - void setup_more_options_page (); + void setup_more_options_box (); /* final page */ -- cgit v1.2.3 From 3e5c1e3fc15629b1d986e9b4c03c7c12c8d63b68 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Fri, 20 Sep 2013 16:16:30 -0400 Subject: Revert "actually load new state after creating a session." This reverts commit 914ba475de48f72e57bb6ac8a81888ad71cea7fa. Unclear why I applied this or what it was supposed to do. A new session has no state. --- libs/ardour/session.cc | 4 ---- 1 file changed, 4 deletions(-) diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc index ccb3b6bb38..4be52a7584 100644 --- a/libs/ardour/session.cc +++ b/libs/ardour/session.cc @@ -276,10 +276,6 @@ Session::Session (AudioEngine &eng, throw failed_constructor (); } - if (load_state (_current_snapshot_name)) { - throw failed_constructor (); - } - } else { if (load_state (_current_snapshot_name)) { -- cgit v1.2.3 From 461f94a3a177b87044b0dac7e38e21a06903813c Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Fri, 20 Sep 2013 16:45:04 -0400 Subject: if new session button clicked, clear any selection in recent sessions and mark browser unused --- gtk2_ardour/startup.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/gtk2_ardour/startup.cc b/gtk2_ardour/startup.cc index 52aa680f12..b0cbcef4a2 100644 --- a/gtk2_ardour/startup.cc +++ b/gtk2_ardour/startup.cc @@ -644,6 +644,8 @@ ArdourStartup::session_selected () void ArdourStartup::new_session_button_clicked () { + _existing_session_chooser_used = false; + recent_session_display.get_selection()->unselect_all (); set_current_page (new_session_page_index); } -- cgit v1.2.3 From f7586f3a0d3492a15cae901bb209f6a983e7db0a Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Sat, 21 Sep 2013 12:50:45 -0400 Subject: likely fix for creating new sessions from templates --- libs/ardour/session.cc | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc index 4be52a7584..d45375fe0d 100644 --- a/libs/ardour/session.cc +++ b/libs/ardour/session.cc @@ -276,6 +276,21 @@ Session::Session (AudioEngine &eng, throw failed_constructor (); } + /* if a mix template was provided, then ::create() will + * have copied it into the session and we need to load it + * so that we have the state ready for ::set_state() + * after the engine is started. + * + * Note that we do NOT try to get the sample rate from + * the template at this time, though doing so would + * be easy if we decided this was an appropriate part + * of a template. + */ + + if (!mix_template.empty() && load_state (_current_snapshot_name)) { + throw failed_constructor (); + } + } else { if (load_state (_current_snapshot_name)) { -- cgit v1.2.3 From 2577bf55c9d3a12d6438308bdc342a4b1736e8ed Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Sat, 21 Sep 2013 12:51:30 -0400 Subject: reset the visibility of the template selector stuff every time the startup/NSD gets mapped, so that it is always current --- gtk2_ardour/startup.cc | 255 ++++++++++++++++++++++++++----------------------- gtk2_ardour/startup.h | 1 + 2 files changed, 135 insertions(+), 121 deletions(-) diff --git a/gtk2_ardour/startup.cc b/gtk2_ardour/startup.cc index b0cbcef4a2..6c68f69fad 100644 --- a/gtk2_ardour/startup.cc +++ b/gtk2_ardour/startup.cc @@ -751,157 +751,152 @@ ArdourStartup::setup_new_session_page () session_new_vbox.set_border_width (12); session_new_vbox.set_spacing (18); - if (session_new_vbox.get_children().empty()) { - VBox *vbox1 = manage (new VBox); - HBox* hbox1 = manage (new HBox); - Label* label1 = manage (new Label); + VBox *vbox1 = manage (new VBox); + HBox* hbox1 = manage (new HBox); + Label* label1 = manage (new Label); - vbox1->set_spacing (6); + vbox1->set_spacing (6); - hbox1->set_spacing (6); - hbox1->pack_start (*label1, false, false); - hbox1->pack_start (new_name_entry, true, true); + hbox1->set_spacing (6); + hbox1->pack_start (*label1, false, false); + hbox1->pack_start (new_name_entry, true, true); - label1->set_text (_("Session name:")); + label1->set_text (_("Session name:")); - if (!ARDOUR_COMMAND_LINE::session_name.empty()) { - new_name_entry.set_text (Glib::path_get_basename (ARDOUR_COMMAND_LINE::session_name)); - /* name provided - they can move right along */ - set_page_complete (session_new_vbox, true); - } + if (!ARDOUR_COMMAND_LINE::session_name.empty()) { + new_name_entry.set_text (Glib::path_get_basename (ARDOUR_COMMAND_LINE::session_name)); + /* name provided - they can move right along */ + set_page_complete (session_new_vbox, true); + } - new_name_entry.signal_changed().connect (sigc::mem_fun (*this, &ArdourStartup::new_name_changed)); - new_name_entry.signal_activate().connect (sigc::mem_fun (*this, &ArdourStartup::move_along_now)); + new_name_entry.signal_changed().connect (sigc::mem_fun (*this, &ArdourStartup::new_name_changed)); + new_name_entry.signal_activate().connect (sigc::mem_fun (*this, &ArdourStartup::move_along_now)); - vbox1->pack_start (*hbox1, true, true); + vbox1->pack_start (*hbox1, true, true); - /* --- */ + /* --- */ - HBox* hbox2 = manage (new HBox); - Label* label2 = manage (new Label); + HBox* hbox2 = manage (new HBox); + Label* label2 = manage (new Label); - hbox2->set_spacing (6); - hbox2->pack_start (*label2, false, false); - hbox2->pack_start (new_folder_chooser, true, true); + hbox2->set_spacing (6); + hbox2->pack_start (*label2, false, false); + hbox2->pack_start (new_folder_chooser, true, true); - label2->set_text (_("Create session folder in:")); + label2->set_text (_("Create session folder in:")); - if (!ARDOUR_COMMAND_LINE::session_name.empty()) { - new_folder_chooser.set_current_folder (poor_mans_glob (Glib::path_get_dirname (ARDOUR_COMMAND_LINE::session_name))); - } else if (ARDOUR_UI::instance()->session_loaded) { - // point the new session file chooser at the parent directory of the current session - string session_parent_dir = Glib::path_get_dirname(ARDOUR_UI::instance()->the_session()->path()); - string::size_type last_dir_sep = session_parent_dir.rfind(G_DIR_SEPARATOR); - session_parent_dir = session_parent_dir.substr(0, last_dir_sep); - new_folder_chooser.set_current_folder (session_parent_dir); - string default_session_folder = poor_mans_glob (Config->get_default_session_parent_dir()); + if (!ARDOUR_COMMAND_LINE::session_name.empty()) { + new_folder_chooser.set_current_folder (poor_mans_glob (Glib::path_get_dirname (ARDOUR_COMMAND_LINE::session_name))); + } else if (ARDOUR_UI::instance()->session_loaded) { + // point the new session file chooser at the parent directory of the current session + string session_parent_dir = Glib::path_get_dirname(ARDOUR_UI::instance()->the_session()->path()); + string::size_type last_dir_sep = session_parent_dir.rfind(G_DIR_SEPARATOR); + session_parent_dir = session_parent_dir.substr(0, last_dir_sep); + new_folder_chooser.set_current_folder (session_parent_dir); + string default_session_folder = poor_mans_glob (Config->get_default_session_parent_dir()); - try { - /* add_shortcut_folder throws an exception if the folder being added already has a shortcut */ - new_folder_chooser.add_shortcut_folder (default_session_folder); - } - catch (Glib::Error & e) { - std::cerr << "new_folder_chooser.add_shortcut_folder (" << default_session_folder << ") threw Glib::Error " << e.what() << std::endl; - } - } else { - new_folder_chooser.set_current_folder (poor_mans_glob (Config->get_default_session_parent_dir())); + try { + /* add_shortcut_folder throws an exception if the folder being added already has a shortcut */ + new_folder_chooser.add_shortcut_folder (default_session_folder); } - new_folder_chooser.show (); - new_folder_chooser.set_title (_("Select folder for session")); + catch (Glib::Error & e) { + std::cerr << "new_folder_chooser.add_shortcut_folder (" << default_session_folder << ") threw Glib::Error " << e.what() << std::endl; + } + } else { + new_folder_chooser.set_current_folder (poor_mans_glob (Config->get_default_session_parent_dir())); + } + new_folder_chooser.show (); + new_folder_chooser.set_title (_("Select folder for session")); #ifdef __APPLE__ - new_folder_chooser.add_shortcut_folder ("/Volumes"); + new_folder_chooser.add_shortcut_folder ("/Volumes"); #endif - vbox1->pack_start (*hbox2, false, false); + vbox1->pack_start (*hbox2, false, false); - session_new_vbox.pack_start (*vbox1, false, false); - - /* --- */ - - VBox *vbox2 = manage (new VBox); - HBox* hbox3 = manage (new HBox); - Label* label3 = manage (new Label); - template_model = ListStore::create (session_template_columns); - populate_session_templates (); - - vbox2->set_spacing (6); - - VBox *vbox3 = manage (new VBox); - - vbox3->set_spacing (6); - - if (!template_model->children().empty()) { + session_new_vbox.pack_start (*vbox1, false, false); - HBox* hbox4a = manage (new HBox); - use_template_button.set_label (_("Use this template")); + /* --- */ - TreeModel::Row row = *template_model->prepend (); - row[session_template_columns.name] = (_("no template")); - row[session_template_columns.path] = string(); + VBox *vbox2 = manage (new VBox); + HBox* hbox3 = manage (new HBox); + template_model = ListStore::create (session_template_columns); - hbox4a->set_spacing (6); - hbox4a->pack_start (use_template_button, false, false); - hbox4a->pack_start (template_chooser, true, true); - - template_chooser.set_model (template_model); - - Gtk::CellRendererText* text_renderer = Gtk::manage (new Gtk::CellRendererText); - text_renderer->property_editable() = false; - - template_chooser.pack_start (*text_renderer); - template_chooser.add_attribute (text_renderer->property_text(), session_template_columns.name); - template_chooser.set_active (0); - - use_template_button.show(); - template_chooser.show (); - - vbox3->pack_start (*hbox4a, false, false); - } - - /* --- */ - - if (!new_user) { - session_template_chooser.set_current_folder (poor_mans_glob (Config->get_default_session_parent_dir())); - - HBox* hbox4b = manage (new HBox); - use_session_as_template_button.set_label (_("Use an existing session as a template:")); - - hbox4b->set_spacing (6); - hbox4b->pack_start (use_session_as_template_button, false, false); - hbox4b->pack_start (session_template_chooser, true, true); - - use_session_as_template_button.show (); - session_template_chooser.show (); - - Gtk::FileFilter* session_filter = manage (new (Gtk::FileFilter)); - session_filter->add_pattern (X_("*.ardour")); - session_template_chooser.set_filter (*session_filter); - session_template_chooser.set_title (_("Select template")); - - vbox3->pack_start (*hbox4b, false, false); - } + vbox2->set_spacing (6); - /* --- */ + VBox *vbox3 = manage (new VBox); - HBox* hbox5 = manage (new HBox); + vbox3->set_spacing (6); - hbox5->set_spacing (6); - hbox5->pack_start (more_new_session_options_button, false, false); + /* we may want to hide this and show it at various + times depending on the existence of templates. + */ + template_chooser.set_no_show_all (true); + use_template_button.set_no_show_all (true); - setup_more_options_box (); - more_new_session_options_button.add (more_options_vbox); + HBox* hbox4a = manage (new HBox); + use_template_button.set_label (_("Use this template")); + + TreeModel::Row row = *template_model->prepend (); + row[session_template_columns.name] = (_("no template")); + row[session_template_columns.path] = string(); + + hbox4a->set_spacing (6); + hbox4a->pack_start (use_template_button, false, false); + hbox4a->pack_start (template_chooser, true, true); + + template_chooser.set_model (template_model); + + Gtk::CellRendererText* text_renderer = Gtk::manage (new Gtk::CellRendererText); + text_renderer->property_editable() = false; + + template_chooser.pack_start (*text_renderer); + template_chooser.add_attribute (text_renderer->property_text(), session_template_columns.name); + template_chooser.set_active (0); - vbox3->pack_start (*hbox5, false, false); - hbox3->pack_start (*vbox3, true, true, 8); - vbox2->pack_start (*hbox3, false, false); + vbox3->pack_start (*hbox4a, false, false); - /* --- */ + /* --- */ - session_new_vbox.pack_start (*vbox2, false, false); + if (!new_user) { + session_template_chooser.set_current_folder (poor_mans_glob (Config->get_default_session_parent_dir())); + + HBox* hbox4b = manage (new HBox); + use_session_as_template_button.set_label (_("Use an existing session as a template:")); + + hbox4b->set_spacing (6); + hbox4b->pack_start (use_session_as_template_button, false, false); + hbox4b->pack_start (session_template_chooser, true, true); + + use_session_as_template_button.show (); + session_template_chooser.show (); + + Gtk::FileFilter* session_filter = manage (new (Gtk::FileFilter)); + session_filter->add_pattern (X_("*.ardour")); + session_template_chooser.set_filter (*session_filter); + session_template_chooser.set_title (_("Select template")); + + vbox3->pack_start (*hbox4b, false, false); } - + + /* --- */ + + HBox* hbox5 = manage (new HBox); + + hbox5->set_spacing (6); + hbox5->pack_start (more_new_session_options_button, false, false); + + setup_more_options_box (); + more_new_session_options_button.add (more_options_vbox); + + vbox3->pack_start (*hbox5, false, false); + hbox3->pack_start (*vbox3, true, true, 8); + vbox2->pack_start (*hbox3, false, false); + + /* --- */ + + session_new_vbox.pack_start (*vbox2, false, false); session_new_vbox.show_all (); new_session_page_index = append_page (session_new_vbox); @@ -1372,3 +1367,21 @@ ArdourStartup::info_scroller_update() return true; } + +void +ArdourStartup::on_map () +{ + Gtk::Assistant::on_map (); + + redisplay_recent_sessions (); + populate_session_templates (); + + if (!template_model->children().empty()) { + use_template_button.show(); + template_chooser.show (); + } else { + use_template_button.hide(); + template_chooser.hide (); + } +} + diff --git a/gtk2_ardour/startup.h b/gtk2_ardour/startup.h index 2703ac7638..fce2bdb2db 100644 --- a/gtk2_ardour/startup.h +++ b/gtk2_ardour/startup.h @@ -92,6 +92,7 @@ class ArdourStartup : public Gtk::Assistant { void on_cancel (); bool on_delete_event (GdkEventAny*); void on_prepare (Gtk::Widget*); + void on_map (); static ArdourStartup *the_startup; -- cgit v1.2.3 From 482a90cccfe458c354b39e60856909eb863010f2 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Sat, 21 Sep 2013 13:14:33 -0400 Subject: apply same always-check-display to recent sessions scroller in new session dialog It turns out that we always create a new ArdourStartup right now, so this and the previous commit are not actually necessary, but they do pave the way for keeping the dialog around instead --- gtk2_ardour/startup.cc | 67 +++++++++++++++++++++++++------------------------- gtk2_ardour/startup.h | 1 + 2 files changed, 35 insertions(+), 33 deletions(-) diff --git a/gtk2_ardour/startup.cc b/gtk2_ardour/startup.cc index 6c68f69fad..ed6d3b020e 100644 --- a/gtk2_ardour/startup.cc +++ b/gtk2_ardour/startup.cc @@ -546,45 +546,32 @@ ArdourStartup::setup_initial_choice_page () info_box->pack_start (*updates_button, false, false); } - ARDOUR::RecentSessions rs; - ARDOUR::read_recent_sessions (rs); - - if (!rs.empty()) { - - /* recent session scroller */ - - Label* load_label = manage (new Label); - load_label->set_markup (string_compose ("%1", _("Load a recent session"))); - load_label->set_alignment (0, 0.5); + /* recent session scroller */ - centering_vbox->pack_start (*load_label, false, false, 12); - - recent_session_model = TreeStore::create (recent_session_columns); - redisplay_recent_sessions (); - - recent_session_display.set_model (recent_session_model); - recent_session_display.append_column (_("Recent Sessions"), recent_session_columns.visible_name); - recent_session_display.set_headers_visible (false); - recent_session_display.get_selection()->set_mode (SELECTION_SINGLE); + recent_label.set_no_show_all (true); + recent_scroller.set_no_show_all (true); - recent_session_display.get_selection()->signal_changed().connect (sigc::mem_fun (*this, &ArdourStartup::recent_session_row_selected)); + recent_label.set_markup (string_compose ("%1", _("Load a recent session"))); + recent_label.set_alignment (0, 0.5); - recent_scroller.add (recent_session_display); - recent_scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC); - recent_scroller.set_shadow_type (Gtk::SHADOW_IN); + recent_session_model = TreeStore::create (recent_session_columns); - recent_session_display.show(); + recent_session_display.set_model (recent_session_model); + recent_session_display.append_column (_("Recent Sessions"), recent_session_columns.visible_name); + recent_session_display.set_headers_visible (false); + recent_session_display.get_selection()->set_mode (SELECTION_SINGLE); - recent_scroller.show(); - recent_session_display.signal_row_activated().connect (sigc::mem_fun (*this, &ArdourStartup::recent_row_activated)); + recent_session_display.get_selection()->signal_changed().connect (sigc::mem_fun (*this, &ArdourStartup::recent_session_row_selected)); - int cnt = redisplay_recent_sessions (); - if (cnt > 4) { - recent_scroller.set_size_request (-1, 300); - } + recent_scroller.add (recent_session_display); + recent_scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC); + recent_scroller.set_shadow_type (Gtk::SHADOW_IN); - centering_vbox->pack_start (recent_scroller, false, true); - } + recent_session_display.show(); + recent_session_display.signal_row_activated().connect (sigc::mem_fun (*this, &ArdourStartup::recent_row_activated)); + + centering_vbox->pack_start (recent_label, false, false, 12); + centering_vbox->pack_start (recent_scroller, false, true); /* Browse button */ @@ -1373,7 +1360,6 @@ ArdourStartup::on_map () { Gtk::Assistant::on_map (); - redisplay_recent_sessions (); populate_session_templates (); if (!template_model->children().empty()) { @@ -1383,5 +1369,20 @@ ArdourStartup::on_map () use_template_button.hide(); template_chooser.hide (); } + + if (recent_session_model) { + int cnt = redisplay_recent_sessions (); + if (cnt > 0) { + recent_scroller.show(); + recent_label.show (); + + if (cnt > 4) { + recent_scroller.set_size_request (-1, 300); + } + } else { + recent_scroller.hide(); + recent_label.hide (); + } + } } diff --git a/gtk2_ardour/startup.h b/gtk2_ardour/startup.h index fce2bdb2db..45d11190f9 100644 --- a/gtk2_ardour/startup.h +++ b/gtk2_ardour/startup.h @@ -160,6 +160,7 @@ class ArdourStartup : public Gtk::Assistant { Gtk::TreeView recent_session_display; Glib::RefPtr recent_session_model; Gtk::ScrolledWindow recent_scroller; + Gtk::Label recent_label; Gtk::FileChooserButton existing_session_chooser; int redisplay_recent_sessions (); void recent_session_row_selected (); -- cgit v1.2.3 From e33b29d672a2bcad9fad4b797ba53dff1587c911 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Sat, 21 Sep 2013 13:22:06 -0400 Subject: make sure the template selector has an item visible if there are any --- gtk2_ardour/startup.cc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/gtk2_ardour/startup.cc b/gtk2_ardour/startup.cc index ed6d3b020e..5d9e174249 100644 --- a/gtk2_ardour/startup.cc +++ b/gtk2_ardour/startup.cc @@ -730,6 +730,11 @@ ArdourStartup::populate_session_templates () row[session_template_columns.name] = (*x).name; row[session_template_columns.path] = (*x).path; } + + if (!templates.empty()) { + /* select first row */ + template_chooser.set_active (0); + } } void -- cgit v1.2.3 From 04d66a9e3ad2585b4bdd9ea3a022582ec2b9d428 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Sat, 21 Sep 2013 13:56:59 -0400 Subject: remove use-session-as-template option from new session dialog and fix ability to not use a template Note: using a template is still not actually working ... --- gtk2_ardour/startup.cc | 37 +++++-------------------------------- gtk2_ardour/startup.h | 5 +---- 2 files changed, 6 insertions(+), 36 deletions(-) diff --git a/gtk2_ardour/startup.cc b/gtk2_ardour/startup.cc index 5d9e174249..ff16d7c1e8 100644 --- a/gtk2_ardour/startup.cc +++ b/gtk2_ardour/startup.cc @@ -96,9 +96,6 @@ ArdourStartup::ArdourStartup (bool require_new, const std::string& session_name, if (need_session_info || new_user) { - use_template_button.set_group (session_template_group); - use_session_as_template_button.set_group (session_template_group); - set_keep_above (true); set_position (WIN_POS_CENTER); set_border_width (12); @@ -207,9 +204,9 @@ ArdourStartup::use_session_template () if (use_template_button.get_active()) { return template_chooser.get_active_row_number() > 0; - } else { - return !session_template_chooser.get_filename().empty(); - } + } + + return false; } std::string @@ -225,10 +222,9 @@ ArdourStartup::session_template_name () TreeModel::Row row = (*iter); string s = row[session_template_columns.path]; return s; - } else { - return session_template_chooser.get_filename(); + } - } + return string(); } std::string @@ -849,29 +845,6 @@ ArdourStartup::setup_new_session_page () vbox3->pack_start (*hbox4a, false, false); - /* --- */ - - if (!new_user) { - session_template_chooser.set_current_folder (poor_mans_glob (Config->get_default_session_parent_dir())); - - HBox* hbox4b = manage (new HBox); - use_session_as_template_button.set_label (_("Use an existing session as a template:")); - - hbox4b->set_spacing (6); - hbox4b->pack_start (use_session_as_template_button, false, false); - hbox4b->pack_start (session_template_chooser, true, true); - - use_session_as_template_button.show (); - session_template_chooser.show (); - - Gtk::FileFilter* session_filter = manage (new (Gtk::FileFilter)); - session_filter->add_pattern (X_("*.ardour")); - session_template_chooser.set_filter (*session_filter); - session_template_chooser.set_title (_("Select template")); - - vbox3->pack_start (*hbox4b, false, false); - } - /* --- */ HBox* hbox5 = manage (new HBox); diff --git a/gtk2_ardour/startup.h b/gtk2_ardour/startup.h index 45d11190f9..361d00e9e1 100644 --- a/gtk2_ardour/startup.h +++ b/gtk2_ardour/startup.h @@ -174,7 +174,6 @@ class ArdourStartup : public Gtk::Assistant { void setup_new_session_page (); Gtk::Entry new_name_entry; Gtk::FileChooserButton new_folder_chooser; - Gtk::FileChooserButton session_template_chooser; struct SessionTemplateColumns : public Gtk::TreeModel::ColumnRecord { SessionTemplateColumns () { @@ -193,9 +192,7 @@ class ArdourStartup : public Gtk::Assistant { Gtk::VBox session_new_vbox; Gtk::VBox session_existing_vbox; Gtk::Expander more_new_session_options_button; - Gtk::RadioButtonGroup session_template_group; - Gtk::RadioButton use_session_as_template_button; - Gtk::RadioButton use_template_button; + Gtk::CheckButton use_template_button; std::string load_template_override; void more_new_session_options_button_clicked(); -- cgit v1.2.3 From 20f28c82ecec7725b0fb98dfe0539c0710328678 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Sun, 22 Sep 2013 11:19:34 -0400 Subject: make session creation from a template work again --- gtk2_ardour/startup.cc | 3 +-- libs/ardour/session_state.cc | 7 ++++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/gtk2_ardour/startup.cc b/gtk2_ardour/startup.cc index ff16d7c1e8..06befae7f5 100644 --- a/gtk2_ardour/startup.cc +++ b/gtk2_ardour/startup.cc @@ -203,9 +203,8 @@ ArdourStartup::use_session_template () } if (use_template_button.get_active()) { - return template_chooser.get_active_row_number() > 0; + return true; } - return false; } diff --git a/libs/ardour/session_state.cc b/libs/ardour/session_state.cc index c33fd91b5d..049cb5b5ee 100644 --- a/libs/ardour/session_state.cc +++ b/libs/ardour/session_state.cc @@ -493,9 +493,10 @@ Session::create (const string& session_template, BusProfile* bus_profile) ifstream in(in_path.c_str()); if (in) { - string out_path = _path; - out_path += _name; - out_path += statefile_suffix; + /* no need to call legalize_for_path() since the string + * in session_template is already a legal path name + */ + string out_path = Glib::build_filename (_session_dir->root_path(), _name + statefile_suffix); ofstream out(out_path.c_str()); -- cgit v1.2.3 From f1aa5839c0f35ef0ffbe1c739eafbe316025bf8a Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Sun, 22 Sep 2013 19:22:56 -0400 Subject: use WindowManager/WMProxy to correctly manage the audio/MIDI setup window --- gtk2_ardour/ardour_ui.cc | 37 ++++--------------------------------- gtk2_ardour/ardour_ui.h | 3 +-- gtk2_ardour/ardour_ui_ed.cc | 3 +-- 3 files changed, 6 insertions(+), 37 deletions(-) diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc index f599442bc4..133b61c17f 100644 --- a/gtk2_ardour/ardour_ui.cc +++ b/gtk2_ardour/ardour_ui.cc @@ -191,6 +191,7 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir) , about (X_("about"), _("About")) , location_ui (X_("locations"), _("Locations")) , route_params (X_("inspector"), _("Tracks and Busses")) + , audio_midi_setup (X_("audio-midi-setup"), _("Audio/MIDI Setup")) , session_option_editor (X_("session-options-editor"), _("Properties"), boost::bind (&ARDOUR_UI::create_session_option_editor, this)) , add_video_dialog (X_("add-video"), _("Add Tracks/Busses"), boost::bind (&ARDOUR_UI::create_add_video_dialog, this)) , bundle_manager (X_("bundle-manager"), _("Bundle Manager"), boost::bind (&ARDOUR_UI::create_bundle_manager, this)) @@ -202,7 +203,6 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir) , _status_bar_visibility (X_("status-bar")) , _feedback_exists (false) - , _audio_midi_setup (0) { Gtkmm2ext::init(localedir); @@ -213,7 +213,6 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir) } ui_config = new UIConfiguration(); - _audio_midi_setup = new EngineControl; editor = 0; mixer = 0; @@ -348,6 +347,7 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir) WM::Manager::instance().register_window (&add_route_dialog); WM::Manager::instance().register_window (&add_video_dialog); WM::Manager::instance().register_window (&route_params); + WM::Manager::instance().register_window (&audio_midi_setup); WM::Manager::instance().register_window (&bundle_manager); WM::Manager::instance().register_window (&location_ui); WM::Manager::instance().register_window (&big_clock_window); @@ -4077,41 +4077,12 @@ ARDOUR_UI::reset_route_peak_display (Route* route) } } -void -ARDOUR_UI::toggle_audio_midi_setup () -{ - Glib::RefPtr act = ActionManager::get_action (X_("Common"), X_("toggle-audio-midi-setup")); - if (!act) { - return; - } - - Glib::RefPtr tact = Glib::RefPtr::cast_dynamic (act); - - if (tact->get_active()) { - launch_audio_midi_setup (); - } else { - _audio_midi_setup->hide (); - } -} - -void -ARDOUR_UI::launch_audio_midi_setup () -{ - if (!_audio_midi_setup) { - _audio_midi_setup = new EngineControl (); - } - - _audio_midi_setup->present (); -} - int ARDOUR_UI::do_audio_midi_setup (uint32_t desired_sample_rate) { - launch_audio_midi_setup (); - - _audio_midi_setup->set_desired_sample_rate (desired_sample_rate); + audio_midi_setup->set_desired_sample_rate (desired_sample_rate); - switch (_audio_midi_setup->run()) { + switch (audio_midi_setup->run()) { case Gtk::RESPONSE_OK: return 0; case Gtk::RESPONSE_APPLY: diff --git a/gtk2_ardour/ardour_ui.h b/gtk2_ardour/ardour_ui.h index ea03c8590f..47d0f4f4e8 100644 --- a/gtk2_ardour/ardour_ui.h +++ b/gtk2_ardour/ardour_ui.h @@ -603,6 +603,7 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr WM::Proxy about; WM::Proxy location_ui; WM::Proxy route_params; + WM::Proxy audio_midi_setup; /* Windows/Dialogs that require a creator method */ @@ -747,8 +748,6 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr std::string _announce_string; void check_announcements (); - EngineControl* _audio_midi_setup; - void launch_audio_midi_setup (); int do_audio_midi_setup (uint32_t); }; diff --git a/gtk2_ardour/ardour_ui_ed.cc b/gtk2_ardour/ardour_ui_ed.cc index 96bbd8c4e3..251fc8f6fc 100644 --- a/gtk2_ardour/ardour_ui_ed.cc +++ b/gtk2_ardour/ardour_ui_ed.cc @@ -197,7 +197,6 @@ ARDOUR_UI::install_actions () ActionManager::register_toggle_action (common_actions, X_("toggle-mixer"), S_("Window|Mixer"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_mixer_window)); ActionManager::register_action (common_actions, X_("toggle-editor-mixer"), _("Toggle Editor+Mixer"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_editor_mixer)); ActionManager::register_toggle_action (common_actions, X_("toggle-meterbridge"), S_("Window|Meterbridge"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_meterbridge)); - ActionManager::register_toggle_action (common_actions, X_("toggle-audio-midi-setup"), S_("Window|Audio/MIDI Setup"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_audio_midi_setup)); act = ActionManager::register_action (common_actions, X_("NewMIDITracer"), _("MIDI Tracer"), sigc::mem_fun(*this, &ARDOUR_UI::new_midi_tracer_window)); ActionManager::session_sensitive_actions.push_back (act); @@ -560,7 +559,7 @@ ARDOUR_UI::save_ardour_state () window_node->add_child_nocopy (*tearoff_node); Config->add_extra_xml (*window_node); - Config->add_extra_xml (_audio_midi_setup->get_state()); + Config->add_extra_xml (audio_midi_setup->get_state()); Config->save_state(); -- cgit v1.2.3 From c72748508bf8c9f8ce189f834d3c3114ef27952d Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Mon, 23 Sep 2013 13:33:28 -0400 Subject: the output of git describe --tags is not subject to localization, so we do not need LANG= in the environment when it runs --- wscript | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wscript b/wscript index b3902c1b49..fded3e1652 100644 --- a/wscript +++ b/wscript @@ -67,7 +67,7 @@ def fetch_gcc_version (CC): return version def fetch_git_revision (): - cmd = "LANG= git describe --tags HEAD" + cmd = "git describe --tags HEAD" output = subprocess.Popen(cmd, shell=True, stderr=subprocess.STDOUT, stdout=subprocess.PIPE).communicate()[0].splitlines() rev = output[0].decode('utf-8') return rev -- cgit v1.2.3 From b362ff220cbd1a17f1b6621b624d3801101fad3e Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Mon, 23 Sep 2013 14:41:52 -0400 Subject: major rearrangement of startup/session loading code first-time user code remains in ArdourStartup session selection/setup moved to SessionDialog many other cleanups, logic improvements, and so forth to the overall session loading process. Not 100% finished yet. --- gtk2_ardour/ardour_ui.cc | 123 ++--- gtk2_ardour/ardour_ui.h | 11 +- gtk2_ardour/engine_dialog.cc | 1 + gtk2_ardour/session_dialog.cc | 997 ++++++++++++++++++++++++++++++++++++++++ gtk2_ardour/session_dialog.h | 231 ++++++++++ gtk2_ardour/small-splash.png | Bin 0 -> 26238 bytes gtk2_ardour/startup.cc | 1013 ++--------------------------------------- gtk2_ardour/startup.h | 173 +------ gtk2_ardour/utils.cc | 2 +- gtk2_ardour/wscript | 1 + 10 files changed, 1353 insertions(+), 1199 deletions(-) create mode 100644 gtk2_ardour/session_dialog.cc create mode 100644 gtk2_ardour/session_dialog.h create mode 100644 gtk2_ardour/small-splash.png diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc index 133b61c17f..129b77f0a4 100644 --- a/gtk2_ardour/ardour_ui.cc +++ b/gtk2_ardour/ardour_ui.cc @@ -109,6 +109,7 @@ typedef uint64_t microseconds_t; #include "rc_option_editor.h" #include "route_time_axis.h" #include "route_params_ui.h" +#include "session_dialog.h" #include "session_metadata_dialog.h" #include "session_option_editor.h" #include "shuttle_control.h" @@ -156,7 +157,6 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir) /* start of private members */ - , _startup (0) , nsm (0) , _was_dirty (false) , _mixer_on_top (false) @@ -775,10 +775,33 @@ ARDOUR_UI::startup () delete nsm; nsm = 0; } - } - else if (get_session_parameters (true, ARDOUR_COMMAND_LINE::new_session, ARDOUR_COMMAND_LINE::load_template)) { - exit (1); + } else { + + if (ArdourStartup::required()) { + ArdourStartup s; + s.present (); + main().run(); + s.hide (); + switch (s.response ()) { + case Gtk::RESPONSE_REJECT: + exit (1); + default: + break; + } + } + + /* we need to create this early because it may need to set the + * audio backend end up. + */ + + audio_midi_setup.get (true); + + /* go get a session */ + + if (get_session_parameters (true, ARDOUR_COMMAND_LINE::new_session, ARDOUR_COMMAND_LINE::load_template)) { + exit (1); + } } use_config (); @@ -2431,7 +2454,7 @@ ARDOUR_UI::ask_about_loading_existing_session (const std::string& session_path) } int -ARDOUR_UI::build_session_from_nsd (const std::string& session_path, const std::string& session_name) +ARDOUR_UI::build_session_from_dialog (SessionDialog& sd, const std::string& session_path, const std::string& session_name) { BusProfile bus_profile; @@ -2447,13 +2470,13 @@ ARDOUR_UI::build_session_from_nsd (const std::string& session_path, const std::s /* get settings from advanced section of NSD */ - if (_startup->create_master_bus()) { - bus_profile.master_out_channels = (uint32_t) _startup->master_channel_count(); + if (sd.create_master_bus()) { + bus_profile.master_out_channels = (uint32_t) sd.master_channel_count(); } else { bus_profile.master_out_channels = 0; } - if (_startup->connect_inputs()) { + if (sd.connect_inputs()) { bus_profile.input_ac = AutoConnectPhysical; } else { bus_profile.input_ac = AutoConnectOption (0); @@ -2461,16 +2484,16 @@ ARDOUR_UI::build_session_from_nsd (const std::string& session_path, const std::s bus_profile.output_ac = AutoConnectOption (0); - if (_startup->connect_outputs ()) { - if (_startup->connect_outs_to_master()) { + if (sd.connect_outputs ()) { + if (sd.connect_outs_to_master()) { bus_profile.output_ac = AutoConnectMaster; - } else if (_startup->connect_outs_to_physical()) { + } else if (sd.connect_outs_to_physical()) { bus_profile.output_ac = AutoConnectPhysical; } } - bus_profile.requested_physical_in = (uint32_t) _startup->input_limit_count(); - bus_profile.requested_physical_out = (uint32_t) _startup->output_limit_count(); + bus_profile.requested_physical_in = (uint32_t) sd.input_limit_count(); + bus_profile.requested_physical_out = (uint32_t) sd.output_limit_count(); } if (build_session (session_path, session_name, bus_profile)) { @@ -2529,6 +2552,8 @@ ARDOUR_UI::get_session_parameters (bool quit_on_cancel, bool should_be_new, stri template_name = load_template; } + SessionDialog session_dialog (should_be_new, session_name, session_path, load_template); + while (ret != 0) { if (!ARDOUR_COMMAND_LINE::session_name.empty()) { @@ -2553,31 +2578,28 @@ ARDOUR_UI::get_session_parameters (bool quit_on_cancel, bool should_be_new, stri session_name = ""; } - delete _startup; - _startup = new ArdourStartup (should_be_new, session_name, session_path, load_template); - - if (!_startup->ready_without_display()) { - _startup->present (); - main().run(); - _startup->hide (); - } - - switch (_startup->response()) { - case RESPONSE_OK: - break; - default: - if (quit_on_cancel) { - exit (1); - } else { - return ret; + if (should_be_new || session_name.empty()) { + /* need the dialog to get info from user */ + + switch (session_dialog.run()) { + case RESPONSE_ACCEPT: + break; + default: + if (quit_on_cancel) { + exit (1); + } else { + return ret; + } } + + session_dialog.hide (); } /* if we run the startup dialog again, offer more than just "new session" */ should_be_new = false; - session_name = _startup->session_name (likely_new); + session_name = session_dialog.session_name (likely_new); if (nsm) { likely_new = true; @@ -2595,8 +2617,8 @@ ARDOUR_UI::get_session_parameters (bool quit_on_cancel, bool should_be_new, stri continue; } - if (_startup->use_session_template()) { - template_name = _startup->session_template_name(); + if (session_dialog.use_session_template()) { + template_name = session_dialog.session_template_name(); _session_is_new = true; } @@ -2613,12 +2635,12 @@ ARDOUR_UI::get_session_parameters (bool quit_on_cancel, bool should_be_new, stri } else { - session_path = _startup->session_folder(); + session_path = session_dialog.session_folder(); char illegal = Session::session_name_is_legal (session_name); if (illegal) { - MessageDialog msg (*_startup, + MessageDialog msg (session_dialog, string_compose (_("To ensure compatibility with various systems\n" "session names may not contain a '%1' character"), illegal)); @@ -2645,12 +2667,7 @@ ARDOUR_UI::get_session_parameters (bool quit_on_cancel, bool should_be_new, stri } else { if (!likely_new) { - if (_startup) { - pop_back_splash (*_startup); - } else { - hide_splash (); - } - + pop_back_splash (session_dialog); MessageDialog msg (string_compose (_("There is no existing session at \"%1\""), session_path)); msg.run (); ARDOUR_COMMAND_LINE::session_name = ""; // cancel that @@ -2659,8 +2676,8 @@ ARDOUR_UI::get_session_parameters (bool quit_on_cancel, bool should_be_new, stri char illegal = Session::session_name_is_legal(session_name); if (illegal) { - pop_back_splash (*_startup); - MessageDialog msg (*_startup, string_compose(_("To ensure compatibility with various systems\n" + pop_back_splash (session_dialog); + MessageDialog msg (session_dialog, string_compose(_("To ensure compatibility with various systems\n" "session names may not contain a '%1' character"), illegal)); msg.run (); ARDOUR_COMMAND_LINE::session_name = ""; // cancel that @@ -2672,7 +2689,9 @@ ARDOUR_UI::get_session_parameters (bool quit_on_cancel, bool should_be_new, stri if (likely_new && template_name.empty()) { - ret = build_session_from_nsd (session_path, session_name); + cerr << "building a session from dialog\n"; + + ret = build_session_from_dialog (session_dialog, session_path, session_name); } else { @@ -2779,22 +2798,12 @@ ARDOUR_UI::load_session (const std::string& path, const std::string& snap_name, Gtk::MESSAGE_INFO, BUTTONS_OK); + msg.set_keep_above (true); msg.set_title (_("Loading Error")); - msg.set_secondary_text (_("Click the Refresh button to try again.")); - msg.add_button (Stock::REFRESH, 1); msg.set_position (Gtk::WIN_POS_CENTER); pop_back_splash (msg); msg.present (); - - int response = msg.run (); - - switch (response) { - case 1: - break; - default: - exit (1); - } - + (void) msg.run (); msg.hide (); goto out; @@ -4080,6 +4089,8 @@ ARDOUR_UI::reset_route_peak_display (Route* route) int ARDOUR_UI::do_audio_midi_setup (uint32_t desired_sample_rate) { + cerr << "Do AMS\n"; + audio_midi_setup->set_desired_sample_rate (desired_sample_rate); switch (audio_midi_setup->run()) { diff --git a/gtk2_ardour/ardour_ui.h b/gtk2_ardour/ardour_ui.h index 47d0f4f4e8..191df0d31d 100644 --- a/gtk2_ardour/ardour_ui.h +++ b/gtk2_ardour/ardour_ui.h @@ -83,7 +83,6 @@ class AddRouteDialog; class AddVideoDialog; class VideoTimeLine; class SystemExec; -class ArdourStartup; class ArdourKeyboard; class AudioClock; class BigClockWindow; @@ -98,6 +97,7 @@ class Mixer_UI; class PublicEditor; class RCOptionEditor; class RouteParams_UI; +class SessionDialog; class SessionOptionEditor; class ShuttleControl; class Splash; @@ -153,7 +153,7 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr bool get_smart_mode () const; int get_session_parameters (bool quit_on_cancel, bool should_be_new = false, std::string load_template = ""); - int build_session_from_nsd (const std::string& session_name, const std::string& session_path); + int build_session_from_dialog (SessionDialog&, const std::string& session_name, const std::string& session_path); bool ask_about_loading_existing_session (const std::string& session_path); /// @return true if session was successfully unloaded. @@ -312,11 +312,10 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr void toggle_session_options_window (); private: - ArdourStartup* _startup; - Gtk::Tooltips _tooltips; + Gtk::Tooltips _tooltips; NSM_Client *nsm; - bool _was_dirty; - bool _mixer_on_top; + bool _was_dirty; + bool _mixer_on_top; bool first_time_engine_run; void goto_editor_window (); diff --git a/gtk2_ardour/engine_dialog.cc b/gtk2_ardour/engine_dialog.cc index b10cc626b6..79bda1bcc5 100644 --- a/gtk2_ardour/engine_dialog.cc +++ b/gtk2_ardour/engine_dialog.cc @@ -234,6 +234,7 @@ EngineControl::EngineControl () ARDOUR::AudioEngine::instance()->Stopped.connect (stopped_connection, MISSING_INVALIDATOR, boost::bind (&EngineControl::engine_stopped, this), gui_context()); ARDOUR::AudioEngine::instance()->Halted.connect (stopped_connection, MISSING_INVALIDATOR, boost::bind (&EngineControl::engine_stopped, this), gui_context()); + cerr << "AMS about to change backend\n"; backend_changed (); if (audio_setup) { diff --git a/gtk2_ardour/session_dialog.cc b/gtk2_ardour/session_dialog.cc new file mode 100644 index 0000000000..481b587b71 --- /dev/null +++ b/gtk2_ardour/session_dialog.cc @@ -0,0 +1,997 @@ +/* + Copyright (C) 2013 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. + +*/ + +#ifdef WAF_BUILD +#include "gtk2ardour-config.h" +#endif + +#include +#include + +#include + +#include "pbd/failed_constructor.h" +#include "pbd/file_utils.h" +#include "pbd/replace_all.h" +#include "pbd/whitespace.h" +#include "pbd/stacktrace.h" +#include "pbd/openuri.h" + +#include "ardour/audioengine.h" +#include "ardour/filesystem_paths.h" +#include "ardour/recent_sessions.h" +#include "ardour/session.h" +#include "ardour/session_state_utils.h" +#include "ardour/template_utils.h" +#include "ardour/filename_extensions.h" + +#include "ardour_ui.h" +#include "session_dialog.h" +#include "opts.h" +#include "engine_dialog.h" +#include "i18n.h" +#include "utils.h" + +using namespace std; +using namespace Gtk; +using namespace Gdk; +using namespace Glib; +using namespace PBD; +using namespace ARDOUR; + +static string poor_mans_glob (string path) +{ + string copy = path; + replace_all (copy, "~", Glib::get_home_dir()); + return copy; +} + +SessionDialog::SessionDialog (bool require_new, const std::string& session_name, const std::string& session_path, const std::string& template_name) + : ArdourDialog (_("Session Setup")) + , new_only (require_new) + , _provided_session_name (session_name) + , _provided_session_path (session_path) + , new_folder_chooser (FILE_CHOOSER_ACTION_SELECT_FOLDER) + , more_new_session_options_button (_("Advanced options ...")) + , _output_limit_count_adj (1, 0, 100, 1, 10, 0) + , _input_limit_count_adj (1, 0, 100, 1, 10, 0) + , _master_bus_channel_count_adj (2, 0, 100, 1, 10, 0) + , _existing_session_chooser_used (false) +{ + if (!session_name.empty() && !require_new) { + response (RESPONSE_OK); + return; + } + + set_keep_above (true); + set_position (WIN_POS_CENTER); + + string image_path; + + if (find_file_in_search_path (ardour_data_search_path(), "small-splash.png", image_path)) { + Gtk::Image* image; + if ((image = manage (new Gtk::Image (image_path))) != 0) { + get_vbox()->pack_start (*image, false, false); + } + } + + setup_new_session_page (); + + if (!new_only) { + setup_initial_choice_box (); + get_vbox()->pack_start (ic_vbox, true, true); + } else { + get_vbox()->pack_start (session_new_vbox, true, true); + } + + if (!template_name.empty()) { + use_template_button.set_active (false); + load_template_override = template_name; + } + + get_vbox()->show_all (); + + cancel_button = add_button (Stock::QUIT, RESPONSE_CANCEL); + back_button = add_button (Stock::GO_BACK, RESPONSE_NO); + open_button = add_button (Stock::OPEN, RESPONSE_ACCEPT); + + back_button->signal_button_press_event().connect (sigc::mem_fun (*this, &SessionDialog::back_button_pressed), false); + + open_button->set_sensitive (false); + back_button->set_sensitive (false); + + /* fill data models and how/hide accordingly */ + + populate_session_templates (); + + if (!template_model->children().empty()) { + use_template_button.show(); + template_chooser.show (); + } else { + use_template_button.hide(); + template_chooser.hide (); + } + + if (recent_session_model) { + int cnt = redisplay_recent_sessions (); + if (cnt > 0) { + recent_scroller.show(); + recent_label.show (); + + if (cnt > 4) { + recent_scroller.set_size_request (-1, 300); + } + } else { + recent_scroller.hide(); + recent_label.hide (); + } + } +} + +SessionDialog::~SessionDialog() +{ +} + +bool +SessionDialog::use_session_template () +{ + if (!load_template_override.empty()) { + return true; + } + + if (use_template_button.get_active()) { + return true; + } + + return false; +} + +std::string +SessionDialog::session_template_name () +{ + if (!load_template_override.empty()) { + string the_path (ARDOUR::user_template_directory()); + return Glib::build_filename (the_path, load_template_override + ARDOUR::template_suffix); + } + + if (use_template_button.get_active()) { + TreeModel::iterator iter = template_chooser.get_active (); + TreeModel::Row row = (*iter); + string s = row[session_template_columns.path]; + return s; + } + + return string(); +} + +std::string +SessionDialog::session_name (bool& should_be_new) +{ + if (!_provided_session_name.empty() && !new_only) { + return _provided_session_name; + } + + /* Try recent session selection */ + + TreeIter iter = recent_session_display.get_selection()->get_selected(); + + if (iter) { + should_be_new = false; + return (*iter)[recent_session_columns.visible_name]; + } + + if (_existing_session_chooser_used) { + /* existing session chosen from file chooser */ + should_be_new = false; + return existing_session_chooser.get_filename (); + } else { + should_be_new = true; + string val = new_name_entry.get_text (); + strip_whitespace_edges (val); + return val; + } +} + +std::string +SessionDialog::session_folder () +{ + if (!_provided_session_path.empty() && !new_only) { + return _provided_session_path; + } + + /* Try recent session selection */ + + TreeIter iter = recent_session_display.get_selection()->get_selected(); + + if (iter) { + return (*iter)[recent_session_columns.fullpath]; + } + + if (_existing_session_chooser_used) { + /* existing session chosen from file chooser */ + return existing_session_chooser.get_current_folder (); + } else { + std::string legal_session_folder_name = legalize_for_path (new_name_entry.get_text()); + return Glib::build_filename (new_folder_chooser.get_current_folder(), legal_session_folder_name); + } +} + +void +SessionDialog::setup_initial_choice_box () +{ + ic_vbox.set_spacing (6); + ic_vbox.set_border_width (24); + + HBox* centering_hbox = manage (new HBox); + VBox* centering_vbox = manage (new VBox); + + centering_vbox->set_spacing (6); + + Label* new_label = manage (new Label); + new_label->set_markup (string_compose ("%1", _("Create a new session"))); + + ic_new_session_button.add (*new_label); + ic_new_session_button.signal_clicked().connect (sigc::mem_fun (*this, &SessionDialog::new_session_button_clicked)); + + centering_vbox->pack_start (ic_new_session_button, false, true); + + /* Possible update message */ + + if (ARDOUR_UI::instance()->announce_string() != "" ) { + + Gtk::Frame *info_frame = manage(new Gtk::Frame); + info_frame->set_shadow_type(SHADOW_ETCHED_OUT); + centering_vbox->pack_start (*info_frame, false, false, 20); + + Box *info_box = manage (new VBox); + info_box->set_border_width (12); + info_box->set_spacing (6); + info_box->set_name("mixbus_info_box"); + + info_box->pack_start (info_scroller_label, false, false); + + info_frame->add (*info_box); + info_frame->show_all(); + + info_scroller_count = 0; + info_scroller_connection = Glib::signal_timeout().connect (mem_fun(*this, &SessionDialog::info_scroller_update), 50); + + Gtk::Button *updates_button = manage (new Gtk::Button (_("Check the website for more..."))); + + updates_button->signal_clicked().connect (mem_fun(*this, &SessionDialog::updates_button_clicked) ); + ARDOUR_UI::instance()->tooltips().set_tip (*updates_button, _("Click to open the program website in your web browser")); + + info_box->pack_start (*updates_button, false, false); + } + + /* recent session scroller */ + + recent_label.set_no_show_all (true); + recent_scroller.set_no_show_all (true); + + recent_label.set_markup (string_compose ("%1", _("... or load a recent session"))); + recent_label.set_alignment (0, 0.5); + + recent_session_model = TreeStore::create (recent_session_columns); + + recent_session_display.set_model (recent_session_model); + recent_session_display.append_column (_("Recent Sessions"), recent_session_columns.visible_name); + recent_session_display.set_headers_visible (false); + recent_session_display.get_selection()->set_mode (SELECTION_SINGLE); + + recent_session_display.get_selection()->signal_changed().connect (sigc::mem_fun (*this, &SessionDialog::recent_session_row_selected)); + + recent_scroller.add (recent_session_display); + recent_scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC); + recent_scroller.set_shadow_type (Gtk::SHADOW_IN); + + recent_session_display.show(); + recent_session_display.signal_row_activated().connect (sigc::mem_fun (*this, &SessionDialog::recent_row_activated)); + + centering_vbox->pack_start (recent_label, false, false, 12); + centering_vbox->pack_start (recent_scroller, false, true); + + /* Browse button */ + + existing_session_chooser.set_title (_("Select session file")); + existing_session_chooser.signal_file_set().connect (sigc::mem_fun (*this, &SessionDialog::existing_session_selected)); + existing_session_chooser.set_current_folder(poor_mans_glob (Config->get_default_session_parent_dir())); + + FileFilter session_filter; + session_filter.add_pattern ("*.ardour"); + session_filter.set_name (string_compose (_("%1 sessions"), PROGRAM_NAME)); + existing_session_chooser.add_filter (session_filter); + existing_session_chooser.set_filter (session_filter); + +#ifdef GTKOSX + existing_session_chooser.add_shortcut_folder ("/Volumes"); +#endif + + Label* browse_label = manage (new Label); + browse_label->set_markup (string_compose ("%1", _("... or browse for existing sessions"))); + browse_label->set_alignment (0, 0.5); + + centering_vbox->pack_start (*browse_label, false, false, 12); + centering_vbox->pack_start (existing_session_chooser, false, false); + + /* pack it all up */ + + centering_hbox->pack_start (*centering_vbox, true, true); + ic_vbox.pack_start (*centering_hbox, true, true); + ic_vbox.show_all (); +} + +void +SessionDialog::session_selected () +{ + /* HACK HACK HACK ... change the "Apply" button label + to say "Open" + */ + + Gtk::Widget* tl = ic_vbox.get_toplevel(); + Gtk::Window* win; + if ((win = dynamic_cast(tl)) != 0) { + /* ::get_default_widget() is not wrapped in gtkmm */ + Gtk::Widget* def = wrap (gtk_window_get_default_widget (win->gobj())); + Gtk::Button* button; + if ((button = dynamic_cast(def)) != 0) { + button->set_label (_("Open")); + } + } +} + +void +SessionDialog::new_session_button_clicked () +{ + _existing_session_chooser_used = false; + recent_session_display.get_selection()->unselect_all (); + + get_vbox()->remove (ic_vbox); + get_vbox()->pack_start (session_new_vbox, true, true); + back_button->set_sensitive (true); + new_name_entry.grab_focus (); +} + +bool +SessionDialog::back_button_pressed (GdkEventButton*) +{ + get_vbox()->remove (session_new_vbox); + back_button->set_sensitive (false); + get_vbox()->pack_start (ic_vbox); + + return true; +} + +void +SessionDialog::populate_session_templates () +{ + vector templates; + + find_session_templates (templates); + + template_model->clear (); + + for (vector::iterator x = templates.begin(); x != templates.end(); ++x) { + TreeModel::Row row; + + row = *(template_model->append ()); + + row[session_template_columns.name] = (*x).name; + row[session_template_columns.path] = (*x).path; + } + + if (!templates.empty()) { + /* select first row */ + template_chooser.set_active (0); + } +} + +void +SessionDialog::setup_new_session_page () +{ + session_new_vbox.set_border_width (12); + session_new_vbox.set_spacing (18); + + VBox *vbox1 = manage (new VBox); + HBox* hbox1 = manage (new HBox); + Label* label1 = manage (new Label); + + vbox1->set_spacing (6); + + hbox1->set_spacing (6); + hbox1->pack_start (*label1, false, false); + hbox1->pack_start (new_name_entry, true, true); + + label1->set_text (_("Session name:")); + + if (!ARDOUR_COMMAND_LINE::session_name.empty()) { + new_name_entry.set_text (Glib::path_get_basename (ARDOUR_COMMAND_LINE::session_name)); + /* name provided - they can move right along */ + open_button->set_sensitive (true); + } + + new_name_entry.signal_changed().connect (sigc::mem_fun (*this, &SessionDialog::new_name_changed)); + new_name_entry.signal_activate().connect (sigc::mem_fun (*this, &SessionDialog::new_name_activated)); + + vbox1->pack_start (*hbox1, true, true); + + /* --- */ + + HBox* hbox2 = manage (new HBox); + Label* label2 = manage (new Label); + + hbox2->set_spacing (6); + hbox2->pack_start (*label2, false, false); + hbox2->pack_start (new_folder_chooser, true, true); + + label2->set_text (_("Create session folder in:")); + + if (!ARDOUR_COMMAND_LINE::session_name.empty()) { + new_folder_chooser.set_current_folder (poor_mans_glob (Glib::path_get_dirname (ARDOUR_COMMAND_LINE::session_name))); + } else if (ARDOUR_UI::instance()->session_loaded) { + // point the new session file chooser at the parent directory of the current session + string session_parent_dir = Glib::path_get_dirname(ARDOUR_UI::instance()->the_session()->path()); + string::size_type last_dir_sep = session_parent_dir.rfind(G_DIR_SEPARATOR); + session_parent_dir = session_parent_dir.substr(0, last_dir_sep); + new_folder_chooser.set_current_folder (session_parent_dir); + string default_session_folder = poor_mans_glob (Config->get_default_session_parent_dir()); + + try { + /* add_shortcut_folder throws an exception if the folder being added already has a shortcut */ + new_folder_chooser.add_shortcut_folder (default_session_folder); + } + catch (Glib::Error & e) { + std::cerr << "new_folder_chooser.add_shortcut_folder (" << default_session_folder << ") threw Glib::Error " << e.what() << std::endl; + } + } else { + new_folder_chooser.set_current_folder (poor_mans_glob (Config->get_default_session_parent_dir())); + } + new_folder_chooser.show (); + new_folder_chooser.set_title (_("Select folder for session")); + +#ifdef __APPLE__ + new_folder_chooser.add_shortcut_folder ("/Volumes"); +#endif + + vbox1->pack_start (*hbox2, false, false); + + session_new_vbox.pack_start (*vbox1, false, false); + + /* --- */ + + VBox *vbox2 = manage (new VBox); + HBox* hbox3 = manage (new HBox); + template_model = ListStore::create (session_template_columns); + + vbox2->set_spacing (6); + + VBox *vbox3 = manage (new VBox); + + vbox3->set_spacing (6); + + /* we may want to hide this and show it at various + times depending on the existence of templates. + */ + template_chooser.set_no_show_all (true); + use_template_button.set_no_show_all (true); + + HBox* hbox4a = manage (new HBox); + use_template_button.set_label (_("Use this template")); + + TreeModel::Row row = *template_model->prepend (); + row[session_template_columns.name] = (_("no template")); + row[session_template_columns.path] = string(); + + hbox4a->set_spacing (6); + hbox4a->pack_start (use_template_button, false, false); + hbox4a->pack_start (template_chooser, true, true); + + template_chooser.set_model (template_model); + + Gtk::CellRendererText* text_renderer = Gtk::manage (new Gtk::CellRendererText); + text_renderer->property_editable() = false; + + template_chooser.pack_start (*text_renderer); + template_chooser.add_attribute (text_renderer->property_text(), session_template_columns.name); + template_chooser.set_active (0); + + vbox3->pack_start (*hbox4a, false, false); + + /* --- */ + + HBox* hbox5 = manage (new HBox); + + hbox5->set_spacing (6); + hbox5->pack_start (more_new_session_options_button, false, false); + + setup_more_options_box (); + more_new_session_options_button.add (more_options_vbox); + + vbox3->pack_start (*hbox5, false, false); + hbox3->pack_start (*vbox3, true, true, 8); + vbox2->pack_start (*hbox3, false, false); + + /* --- */ + + session_new_vbox.pack_start (*vbox2, false, false); + session_new_vbox.show_all (); +} + +void +SessionDialog::new_name_changed () +{ + if (!new_name_entry.get_text().empty()) { + session_selected (); + open_button->set_sensitive (true); + } else { + open_button->set_sensitive (false); + } +} + +void +SessionDialog::new_name_activated () +{ + response (RESPONSE_ACCEPT); +} + +int +SessionDialog::redisplay_recent_sessions () +{ + std::vector session_directories; + RecentSessionsSorter cmp; + + recent_session_display.set_model (Glib::RefPtr(0)); + recent_session_model->clear (); + + ARDOUR::RecentSessions rs; + ARDOUR::read_recent_sessions (rs); + + if (rs.empty()) { + recent_session_display.set_model (recent_session_model); + return 0; + } + // + // sort them alphabetically + sort (rs.begin(), rs.end(), cmp); + + for (ARDOUR::RecentSessions::iterator i = rs.begin(); i != rs.end(); ++i) { + session_directories.push_back ((*i).second); + } + + int session_snapshot_count = 0; + + for (vector::const_iterator i = session_directories.begin(); i != session_directories.end(); ++i) + { + std::vector state_file_paths; + + // now get available states for this session + + get_state_files_in_directory (*i, state_file_paths); + + vector* states; + vector item; + string fullpath = *i; + + /* remove any trailing / */ + + if (fullpath[fullpath.length()-1] == '/') { + fullpath = fullpath.substr (0, fullpath.length()-1); + } + + /* check whether session still exists */ + if (!Glib::file_test(fullpath.c_str(), Glib::FILE_TEST_EXISTS)) { + /* session doesn't exist */ + continue; + } + + /* now get available states for this session */ + + if ((states = Session::possible_states (fullpath)) == 0) { + /* no state file? */ + continue; + } + + std::vector state_file_names(get_file_names_no_extension (state_file_paths)); + + Gtk::TreeModel::Row row = *(recent_session_model->append()); + + row[recent_session_columns.visible_name] = Glib::path_get_basename (fullpath); + row[recent_session_columns.fullpath] = fullpath; + row[recent_session_columns.tip] = Glib::Markup::escape_text (fullpath); + + ++session_snapshot_count; + + if (state_file_names.size() > 1) { + + // add the children + + for (std::vector::iterator i2 = state_file_names.begin(); + i2 != state_file_names.end(); ++i2) { + + Gtk::TreeModel::Row child_row = *(recent_session_model->append (row.children())); + + child_row[recent_session_columns.visible_name] = *i2; + child_row[recent_session_columns.fullpath] = fullpath; + child_row[recent_session_columns.tip] = Glib::Markup::escape_text (fullpath); + ++session_snapshot_count; + } + } + } + + recent_session_display.set_tooltip_column(1); // recent_session_columns.tip + recent_session_display.set_model (recent_session_model); + return session_snapshot_count; + // return rs.size(); +} + +void +SessionDialog::recent_session_row_selected () +{ + if (recent_session_display.get_selection()->count_selected_rows() > 0) { + open_button->set_sensitive (true); + session_selected (); + } else { + open_button->set_sensitive (false); + } +} + +void +SessionDialog::setup_more_options_box () +{ + more_options_vbox.set_border_width (24); + + _output_limit_count.set_adjustment (_output_limit_count_adj); + _input_limit_count.set_adjustment (_input_limit_count_adj); + _master_bus_channel_count.set_adjustment (_master_bus_channel_count_adj); + + chan_count_label_1.set_text (_("channels")); + chan_count_label_3.set_text (_("channels")); + chan_count_label_4.set_text (_("channels")); + + chan_count_label_1.set_alignment(0,0.5); + chan_count_label_1.set_padding(0,0); + chan_count_label_1.set_line_wrap(false); + + chan_count_label_3.set_alignment(0,0.5); + chan_count_label_3.set_padding(0,0); + chan_count_label_3.set_line_wrap(false); + + chan_count_label_4.set_alignment(0,0.5); + chan_count_label_4.set_padding(0,0); + chan_count_label_4.set_line_wrap(false); + + bus_label.set_markup (_("Busses")); + input_label.set_markup (_("Inputs")); + output_label.set_markup (_("Outputs")); + + _master_bus_channel_count.set_flags(Gtk::CAN_FOCUS); + _master_bus_channel_count.set_update_policy(Gtk::UPDATE_ALWAYS); + _master_bus_channel_count.set_numeric(true); + _master_bus_channel_count.set_digits(0); + _master_bus_channel_count.set_wrap(false); + + _create_master_bus.set_label (_("Create master bus")); + _create_master_bus.set_flags(Gtk::CAN_FOCUS); + _create_master_bus.set_relief(Gtk::RELIEF_NORMAL); + _create_master_bus.set_mode(true); + _create_master_bus.set_active(true); + _create_master_bus.set_border_width(0); + + advanced_table.set_row_spacings(0); + advanced_table.set_col_spacings(0); + + _connect_inputs.set_label (_("Automatically connect to physical inputs")); + _connect_inputs.set_flags(Gtk::CAN_FOCUS); + _connect_inputs.set_relief(Gtk::RELIEF_NORMAL); + _connect_inputs.set_mode(true); + _connect_inputs.set_active(Config->get_input_auto_connect() != ManualConnect); + _connect_inputs.set_border_width(0); + + _limit_input_ports.set_label (_("Use only")); + _limit_input_ports.set_flags(Gtk::CAN_FOCUS); + _limit_input_ports.set_relief(Gtk::RELIEF_NORMAL); + _limit_input_ports.set_mode(true); + _limit_input_ports.set_sensitive(true); + _limit_input_ports.set_border_width(0); + + _input_limit_count.set_flags(Gtk::CAN_FOCUS); + _input_limit_count.set_update_policy(Gtk::UPDATE_ALWAYS); + _input_limit_count.set_numeric(true); + _input_limit_count.set_digits(0); + _input_limit_count.set_wrap(false); + _input_limit_count.set_sensitive(false); + + bus_hbox.pack_start (bus_table, Gtk::PACK_SHRINK, 18); + + bus_label.set_alignment(0, 0.5); + bus_label.set_padding(0,0); + bus_label.set_line_wrap(false); + bus_label.set_selectable(false); + bus_label.set_use_markup(true); + bus_frame.set_shadow_type(Gtk::SHADOW_NONE); + bus_frame.set_label_align(0,0.5); + bus_frame.add(bus_hbox); + bus_frame.set_label_widget(bus_label); + + bus_table.set_row_spacings (0); + bus_table.set_col_spacings (0); + bus_table.attach (_create_master_bus, 0, 1, 0, 1, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0); + bus_table.attach (_master_bus_channel_count, 1, 2, 0, 1, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0); + bus_table.attach (chan_count_label_1, 2, 3, 0, 1, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 6, 0); + + input_port_limit_hbox.pack_start(_limit_input_ports, Gtk::PACK_SHRINK, 6); + input_port_limit_hbox.pack_start(_input_limit_count, Gtk::PACK_SHRINK, 0); + input_port_limit_hbox.pack_start(chan_count_label_3, Gtk::PACK_SHRINK, 6); + input_port_vbox.pack_start(_connect_inputs, Gtk::PACK_SHRINK, 0); + input_port_vbox.pack_start(input_port_limit_hbox, Gtk::PACK_EXPAND_PADDING, 0); + input_table.set_row_spacings(0); + input_table.set_col_spacings(0); + input_table.attach(input_port_vbox, 0, 1, 0, 1, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 6, 6); + + input_hbox.pack_start (input_table, Gtk::PACK_SHRINK, 18); + + input_label.set_alignment(0, 0.5); + input_label.set_padding(0,0); + input_label.set_line_wrap(false); + input_label.set_selectable(false); + input_label.set_use_markup(true); + input_frame.set_shadow_type(Gtk::SHADOW_NONE); + input_frame.set_label_align(0,0.5); + input_frame.add(input_hbox); + input_frame.set_label_widget(input_label); + + _connect_outputs.set_label (_("Automatically connect outputs")); + _connect_outputs.set_flags(Gtk::CAN_FOCUS); + _connect_outputs.set_relief(Gtk::RELIEF_NORMAL); + _connect_outputs.set_mode(true); + _connect_outputs.set_active(Config->get_output_auto_connect() != ManualConnect); + _connect_outputs.set_border_width(0); + _limit_output_ports.set_label (_("Use only")); + _limit_output_ports.set_flags(Gtk::CAN_FOCUS); + _limit_output_ports.set_relief(Gtk::RELIEF_NORMAL); + _limit_output_ports.set_mode(true); + _limit_output_ports.set_sensitive(true); + _limit_output_ports.set_border_width(0); + _output_limit_count.set_flags(Gtk::CAN_FOCUS); + _output_limit_count.set_update_policy(Gtk::UPDATE_ALWAYS); + _output_limit_count.set_numeric(false); + _output_limit_count.set_digits(0); + _output_limit_count.set_wrap(false); + _output_limit_count.set_sensitive(false); + output_port_limit_hbox.pack_start(_limit_output_ports, Gtk::PACK_SHRINK, 6); + output_port_limit_hbox.pack_start(_output_limit_count, Gtk::PACK_SHRINK, 0); + output_port_limit_hbox.pack_start(chan_count_label_4, Gtk::PACK_SHRINK, 6); + + _connect_outputs_to_master.set_label (_("... to master bus")); + _connect_outputs_to_master.set_flags(Gtk::CAN_FOCUS); + _connect_outputs_to_master.set_relief(Gtk::RELIEF_NORMAL); + _connect_outputs_to_master.set_mode(true); + _connect_outputs_to_master.set_active(Config->get_output_auto_connect() == AutoConnectMaster); + _connect_outputs_to_master.set_border_width(0); + + _connect_outputs_to_master.set_group (connect_outputs_group); + _connect_outputs_to_physical.set_group (connect_outputs_group); + + _connect_outputs_to_physical.set_label (_("... to physical outputs")); + _connect_outputs_to_physical.set_flags(Gtk::CAN_FOCUS); + _connect_outputs_to_physical.set_relief(Gtk::RELIEF_NORMAL); + _connect_outputs_to_physical.set_mode(true); + _connect_outputs_to_physical.set_active(Config->get_output_auto_connect() == AutoConnectPhysical); + _connect_outputs_to_physical.set_border_width(0); + + output_conn_vbox.pack_start(_connect_outputs, Gtk::PACK_SHRINK, 0); + output_conn_vbox.pack_start(_connect_outputs_to_master, Gtk::PACK_SHRINK, 0); + output_conn_vbox.pack_start(_connect_outputs_to_physical, Gtk::PACK_SHRINK, 0); + output_vbox.set_border_width(6); + + output_port_vbox.pack_start(output_port_limit_hbox, Gtk::PACK_SHRINK, 0); + + output_vbox.pack_start(output_conn_vbox); + output_vbox.pack_start(output_port_vbox); + + output_label.set_alignment(0, 0.5); + output_label.set_padding(0,0); + output_label.set_line_wrap(false); + output_label.set_selectable(false); + output_label.set_use_markup(true); + output_frame.set_shadow_type(Gtk::SHADOW_NONE); + output_frame.set_label_align(0,0.5); + + output_hbox.pack_start (output_vbox, Gtk::PACK_SHRINK, 18); + + output_frame.add(output_hbox); + output_frame.set_label_widget(output_label); + + more_options_vbox.pack_start(advanced_table, Gtk::PACK_SHRINK, 0); + more_options_vbox.pack_start(bus_frame, Gtk::PACK_SHRINK, 6); + more_options_vbox.pack_start(input_frame, Gtk::PACK_SHRINK, 6); + more_options_vbox.pack_start(output_frame, Gtk::PACK_SHRINK, 0); + + /* signals */ + + _connect_inputs.signal_clicked().connect (sigc::mem_fun (*this, &SessionDialog::connect_inputs_clicked)); + _connect_outputs.signal_clicked().connect (sigc::mem_fun (*this, &SessionDialog::connect_outputs_clicked)); + _limit_input_ports.signal_clicked().connect (sigc::mem_fun (*this, &SessionDialog::limit_inputs_clicked)); + _limit_output_ports.signal_clicked().connect (sigc::mem_fun (*this, &SessionDialog::limit_outputs_clicked)); + _create_master_bus.signal_clicked().connect (sigc::mem_fun (*this, &SessionDialog::master_bus_button_clicked)); + + /* note that more_options_vbox is "visible" by default even + * though it may not be displayed to the user, this is so the dialog + * doesn't resize. + */ + more_options_vbox.show_all (); +} + +bool +SessionDialog::create_master_bus() const +{ + return _create_master_bus.get_active(); +} + +int +SessionDialog::master_channel_count() const +{ + return _master_bus_channel_count.get_value_as_int(); +} + +bool +SessionDialog::connect_inputs() const +{ + return _connect_inputs.get_active(); +} + +bool +SessionDialog::limit_inputs_used_for_connection() const +{ + return _limit_input_ports.get_active(); +} + +int +SessionDialog::input_limit_count() const +{ + return _input_limit_count.get_value_as_int(); +} + +bool +SessionDialog::connect_outputs() const +{ + return _connect_outputs.get_active(); +} + +bool +SessionDialog::limit_outputs_used_for_connection() const +{ + return _limit_output_ports.get_active(); +} + +int +SessionDialog::output_limit_count() const +{ + return _output_limit_count.get_value_as_int(); +} + +bool +SessionDialog::connect_outs_to_master() const +{ + return _connect_outputs_to_master.get_active(); +} + +bool +SessionDialog::connect_outs_to_physical() const +{ + return _connect_outputs_to_physical.get_active(); +} + +void +SessionDialog::connect_inputs_clicked () +{ + _limit_input_ports.set_sensitive(_connect_inputs.get_active()); + + if (_connect_inputs.get_active() && _limit_input_ports.get_active()) { + _input_limit_count.set_sensitive(true); + } else { + _input_limit_count.set_sensitive(false); + } +} + +void +SessionDialog::connect_outputs_clicked () +{ + bool const co = _connect_outputs.get_active (); + _limit_output_ports.set_sensitive(co); + _connect_outputs_to_master.set_sensitive(co); + _connect_outputs_to_physical.set_sensitive(co); + + if (co && _limit_output_ports.get_active()) { + _output_limit_count.set_sensitive(true); + } else { + _output_limit_count.set_sensitive(false); + } +} + +void +SessionDialog::limit_inputs_clicked () +{ + _input_limit_count.set_sensitive(_limit_input_ports.get_active()); +} + +void +SessionDialog::limit_outputs_clicked () +{ + _output_limit_count.set_sensitive(_limit_output_ports.get_active()); +} + +void +SessionDialog::master_bus_button_clicked () +{ + bool const yn = _create_master_bus.get_active(); + + _master_bus_channel_count.set_sensitive(yn); + _connect_outputs_to_master.set_sensitive(yn); +} + +void +SessionDialog::recent_row_activated (const Gtk::TreePath&, Gtk::TreeViewColumn*) +{ + response (RESPONSE_ACCEPT); +} + +void +SessionDialog::existing_session_selected () +{ + _existing_session_chooser_used = true; + /* mark this sensitive in case we come back here after a failed open + * attempt and the user has hacked up the fix. sigh. + */ + open_button->set_sensitive (true); + response (RESPONSE_ACCEPT); +} + +void +SessionDialog::updates_button_clicked () +{ + //now open a browser window so user can see more + PBD::open_uri (Config->get_updates_url()); +} + +bool +SessionDialog::info_scroller_update() +{ + info_scroller_count++; + + char buf[512]; + snprintf (buf, std::min(info_scroller_count,sizeof(buf)-1), "%s", ARDOUR_UI::instance()->announce_string().c_str() ); + buf[info_scroller_count] = 0; + info_scroller_label.set_text (buf); + info_scroller_label.show(); + + if (info_scroller_count > ARDOUR_UI::instance()->announce_string().length()) { + info_scroller_connection.disconnect(); + } + + return true; +} + +bool +SessionDialog::on_delete_event (GdkEventAny* ev) +{ + response (RESPONSE_CANCEL); + return ArdourDialog::on_delete_event (ev); +} + diff --git a/gtk2_ardour/session_dialog.h b/gtk2_ardour/session_dialog.h new file mode 100644 index 0000000000..ac4c1a7925 --- /dev/null +++ b/gtk2_ardour/session_dialog.h @@ -0,0 +1,231 @@ +/* + Copyright (C) 2010 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 __gtk2_ardour_session_dialog_h__ +#define __gtk2_ardour_session_dialog_h__ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "ardour/utils.h" + +#include "ardour_dialog.h" + +class EngineControl; + +class SessionDialog : public ArdourDialog { + public: + SessionDialog (bool require_new, const std::string& session_name, const std::string& session_path, const std::string& template_name); + ~SessionDialog (); + + std::string session_name (bool& should_be_new); + std::string session_folder (); + + bool use_session_template(); + std::string session_template_name(); + + // advanced session options + + bool create_master_bus() const; + int master_channel_count() const; + + bool connect_inputs() const; + bool limit_inputs_used_for_connection() const; + int input_limit_count() const; + + bool connect_outputs() const; + bool limit_outputs_used_for_connection() const; + int output_limit_count() const; + + bool connect_outs_to_master() const; + bool connect_outs_to_physical() const; + + private: + bool new_only; + std::string _provided_session_name; + std::string _provided_session_path; + + bool on_delete_event (GdkEventAny*); + + Gtk::Button* cancel_button; + Gtk::Button* open_button; + Gtk::Button* back_button; + Gtk::Button* quit_button; + + bool back_button_pressed (GdkEventButton*); + + /* initial choice page */ + + void setup_initial_choice_box (); + Gtk::VBox ic_vbox; + Gtk::Button ic_new_session_button; + void new_session_button_clicked (); + + /* recent sessions */ + + void setup_existing_session_page (); + + struct RecentSessionsSorter { + bool operator() (std::pair a, std::pair b) const { + return cmp_nocase(a.first, b.first) == -1; + } + }; + + struct RecentSessionModelColumns : public Gtk::TreeModel::ColumnRecord { + RecentSessionModelColumns() { + add (visible_name); + add (tip); + add (fullpath); + } + Gtk::TreeModelColumn visible_name; + Gtk::TreeModelColumn tip; + Gtk::TreeModelColumn fullpath; + }; + + RecentSessionModelColumns recent_session_columns; + Gtk::TreeView recent_session_display; + Glib::RefPtr recent_session_model; + Gtk::ScrolledWindow recent_scroller; + Gtk::Label recent_label; + Gtk::FileChooserButton existing_session_chooser; + int redisplay_recent_sessions (); + void recent_session_row_selected (); + void recent_row_activated (const Gtk::TreePath& path, Gtk::TreeViewColumn* col); + + void existing_session_selected (); + void session_selected (); + + /* new sessions */ + + void setup_new_session_page (); + Gtk::Entry new_name_entry; + Gtk::FileChooserButton new_folder_chooser; + + struct SessionTemplateColumns : public Gtk::TreeModel::ColumnRecord { + SessionTemplateColumns () { + add (name); + add (path); + } + + Gtk::TreeModelColumn name; + Gtk::TreeModelColumn path; + }; + + SessionTemplateColumns session_template_columns; + Glib::RefPtr template_model; + Gtk::ComboBox template_chooser; + + Gtk::VBox session_new_vbox; + Gtk::VBox session_existing_vbox; + Gtk::Expander more_new_session_options_button; + Gtk::CheckButton use_template_button; + std::string load_template_override; + + void more_new_session_options_button_clicked(); + void new_name_changed (); + void new_name_activated (); + void populate_session_templates (); + + /* more options for new sessions */ + + Gtk::VBox more_options_vbox; + + Gtk::Label chan_count_label_1; + Gtk::Label chan_count_label_3; + Gtk::Label chan_count_label_4; + Gtk::Table advanced_table; + Gtk::HBox input_port_limit_hbox; + Gtk::VBox input_port_vbox; + Gtk::Table input_table; + Gtk::HBox input_hbox; + + Gtk::Label bus_label; + Gtk::Frame bus_frame; + Gtk::Table bus_table; + Gtk::HBox bus_hbox; + + Gtk::Label input_label; + Gtk::Frame input_frame; + Gtk::HBox output_port_limit_hbox; + Gtk::VBox output_port_vbox; + Gtk::VBox output_conn_vbox; + Gtk::VBox output_vbox; + Gtk::HBox output_hbox; + + Gtk::Label output_label; + Gtk::Frame output_frame; + Gtk::VBox advanced_vbox; + Gtk::Label advanced_label; + + Gtk::CheckButton _create_master_bus; + Gtk::SpinButton _master_bus_channel_count; + + Gtk::CheckButton _connect_inputs; + Gtk::CheckButton _limit_input_ports; + Gtk::SpinButton _input_limit_count; + + Gtk::CheckButton _connect_outputs; + Gtk::CheckButton _limit_output_ports; + Gtk::SpinButton _output_limit_count; + + Gtk::RadioButtonGroup connect_outputs_group; + Gtk::RadioButton _connect_outputs_to_master; + Gtk::RadioButton _connect_outputs_to_physical; + + Gtk::Adjustment _output_limit_count_adj; + Gtk::Adjustment _input_limit_count_adj; + Gtk::Adjustment _master_bus_channel_count_adj; + + void connect_inputs_clicked (); + void connect_outputs_clicked (); + void limit_inputs_clicked (); + void limit_outputs_clicked (); + void master_bus_button_clicked (); + void setup_more_options_box (); + + /* always there */ + + Glib::RefPtr layout; + + bool _existing_session_chooser_used; ///< set to true when the existing session chooser has been used + + Gtk::Label info_scroller_label; + std::string::size_type info_scroller_count; + bool info_scroller_update(); + sigc::connection info_scroller_connection; + void updates_button_clicked (); +}; + +#endif /* __gtk2_ardour_session_dialog_h__ */ diff --git a/gtk2_ardour/small-splash.png b/gtk2_ardour/small-splash.png new file mode 100644 index 0000000000..0a3c33ea77 Binary files /dev/null and b/gtk2_ardour/small-splash.png differ diff --git a/gtk2_ardour/startup.cc b/gtk2_ardour/startup.cc index 06befae7f5..7bb9b2e295 100644 --- a/gtk2_ardour/startup.cc +++ b/gtk2_ardour/startup.cc @@ -65,89 +65,55 @@ static string poor_mans_glob (string path) return copy; } -ArdourStartup::ArdourStartup (bool require_new, const std::string& session_name, const std::string& session_path, const std::string& template_name) +ArdourStartup::ArdourStartup () : _response (RESPONSE_OK) , config_modified (false) - , new_only (require_new) , default_dir_chooser (0) , monitor_via_hardware_button (string_compose (_("Use an external mixer or the hardware mixer of your audio interface.\n" "%1 will play NO role in monitoring"), PROGRAM_NAME)) , monitor_via_ardour_button (string_compose (_("Ask %1 to play back material as it is being recorded"), PROGRAM_NAME)) - , new_folder_chooser (FILE_CHOOSER_ACTION_SELECT_FOLDER) - , more_new_session_options_button (_("Advanced options ...")) - , _output_limit_count_adj (1, 0, 100, 1, 10, 0) - , _input_limit_count_adj (1, 0, 100, 1, 10, 0) - , _master_bus_channel_count_adj (2, 0, 100, 1, 10, 0) , audio_page_index (-1) , new_user_page_index (-1) , default_folder_page_index (-1) , monitoring_page_index (-1) - , new_session_page_index (-1) - , initial_choice_index (-1) , final_page_index (-1) - , session_options_page_index (-1) - , _existing_session_chooser_used (false) { - new_user = !Glib::file_test (been_here_before_path(), Glib::FILE_TEST_EXISTS); - need_session_info = (session_name.empty() || require_new); - - _provided_session_name = session_name; - _provided_session_path = session_path; + set_keep_above (true); + set_position (WIN_POS_CENTER); + set_border_width (12); + + if ((icon_pixbuf = ::get_icon ("ardour_icon_48px")) == 0) { + throw failed_constructor(); + } + + list > window_icons; + Glib::RefPtr icon; + + if ((icon = ::get_icon ("ardour_icon_16px")) != 0) { + window_icons.push_back (icon); + } + if ((icon = ::get_icon ("ardour_icon_22px")) != 0) { + window_icons.push_back (icon); + } + if ((icon = ::get_icon ("ardour_icon_32px")) != 0) { + window_icons.push_back (icon); + } + if ((icon = ::get_icon ("ardour_icon_48px")) != 0) { + window_icons.push_back (icon); + } + if (!window_icons.empty ()) { + set_default_icon_list (window_icons); + } - if (need_session_info || new_user) { - - set_keep_above (true); - set_position (WIN_POS_CENTER); - set_border_width (12); - - if ((icon_pixbuf = ::get_icon ("ardour_icon_48px")) == 0) { - throw failed_constructor(); - } - - list > window_icons; - Glib::RefPtr icon; - - if ((icon = ::get_icon ("ardour_icon_16px")) != 0) { - window_icons.push_back (icon); - } - if ((icon = ::get_icon ("ardour_icon_22px")) != 0) { - window_icons.push_back (icon); - } - if ((icon = ::get_icon ("ardour_icon_32px")) != 0) { - window_icons.push_back (icon); - } - if ((icon = ::get_icon ("ardour_icon_48px")) != 0) { - window_icons.push_back (icon); - } - if (!window_icons.empty ()) { - set_default_icon_list (window_icons); - } - #ifdef __APPLE__ - setup_prerelease_page (); + setup_prerelease_page (); #endif - if (new_user) { - - setup_new_user_page (); - setup_first_time_config_page (); - setup_monitoring_choice_page (); - setup_monitor_section_choice_page (); - setup_final_page (); - setup_new_session_page (); - - } else { - - if (!new_only) { - setup_initial_choice_page (); - } - setup_new_session_page (); - } - - if (!template_name.empty()) { - use_template_button.set_active (false); - load_template_override = template_name; - } - } + + setup_new_user_page (); + setup_first_time_config_page (); + setup_monitoring_choice_page (); + setup_monitor_section_choice_page (); + setup_final_page (); the_startup = this; } @@ -157,9 +123,16 @@ ArdourStartup::~ArdourStartup () } bool -ArdourStartup::ready_without_display () const +ArdourStartup::required () { - return !new_user && !need_session_info; + return !Glib::file_test (been_here_before_path(), Glib::FILE_TEST_EXISTS); +} + +std::string +ArdourStartup::been_here_before_path () +{ + // XXXX use more specific version so we can catch upgrades + return Glib::build_filename (user_config_directory (), ".a3"); } void @@ -195,89 +168,6 @@ Full information on all the above can be found on the support page at\n\ set_page_complete (*vbox, true); } -bool -ArdourStartup::use_session_template () -{ - if (!load_template_override.empty()) { - return true; - } - - if (use_template_button.get_active()) { - return true; - } - return false; -} - -std::string -ArdourStartup::session_template_name () -{ - if (!load_template_override.empty()) { - string the_path (ARDOUR::user_template_directory()); - return Glib::build_filename (the_path, load_template_override + ARDOUR::template_suffix); - } - - if (use_template_button.get_active()) { - TreeModel::iterator iter = template_chooser.get_active (); - TreeModel::Row row = (*iter); - string s = row[session_template_columns.path]; - return s; - } - - return string(); -} - -std::string -ArdourStartup::session_name (bool& should_be_new) -{ - if (ready_without_display()) { - return _provided_session_name; - } - - /* Try recent session selection */ - - TreeIter iter = recent_session_display.get_selection()->get_selected(); - - if (iter) { - should_be_new = false; - return (*iter)[recent_session_columns.visible_name]; - } - - if (_existing_session_chooser_used) { - /* existing session chosen from file chooser */ - should_be_new = false; - return existing_session_chooser.get_filename (); - } else { - should_be_new = true; - string val = new_name_entry.get_text (); - strip_whitespace_edges (val); - return val; - } -} - -std::string -ArdourStartup::session_folder () -{ - if (ready_without_display()) { - return _provided_session_path; - } - - /* Try recent session selection */ - - TreeIter iter = recent_session_display.get_selection()->get_selected(); - - if (iter) { - return (*iter)[recent_session_columns.fullpath]; - } - - if (_existing_session_chooser_used) { - /* existing session chosen from file chooser */ - return existing_session_chooser.get_current_folder (); - } else { - std::string legal_session_folder_name = legalize_for_path (new_name_entry.get_text()); - return Glib::build_filename (new_folder_chooser.get_current_folder(), legal_session_folder_name); - } -} - void ArdourStartup::setup_new_user_page () { @@ -482,159 +372,12 @@ greater control in monitoring without affecting the mix.")); set_page_complete (mon_sec_vbox, true); } -void -ArdourStartup::setup_initial_choice_page () -{ - ic_vbox.set_spacing (6); - ic_vbox.set_border_width (24); - - /* append the page early because the recent session display will cause - calls to set_page_complete() on this page. - */ - - initial_choice_index = append_page (ic_vbox); - set_page_title (ic_vbox, string_compose("%1 %2", PROGRAM_NAME, VERSIONSTRING)); - set_page_header_image (ic_vbox, icon_pixbuf); - - - HBox* centering_hbox = manage (new HBox); - VBox* centering_vbox = manage (new VBox); - - centering_vbox->set_spacing (6); - - Label* new_label = manage (new Label); - new_label->set_markup (string_compose ("%1", _("Create a new session"))); - new_label->set_alignment (0, 0.5); - - ic_new_session_button.set_label (_("Configure the new session ...")); - ic_new_session_button.signal_clicked().connect (sigc::mem_fun (*this, &ArdourStartup::new_session_button_clicked)); - - centering_vbox->pack_start (*new_label, false, false, 12); - centering_vbox->pack_start (ic_new_session_button, false, true); - - /* Possible update message */ - - if (ARDOUR_UI::instance()->announce_string() != "" ) { - - Gtk::Frame *info_frame = manage(new Gtk::Frame); - info_frame->set_shadow_type(SHADOW_ETCHED_OUT); - centering_vbox->pack_start (*info_frame, false, false, 20); - - Box *info_box = manage (new VBox); - info_box->set_border_width (12); - info_box->set_spacing (6); - info_box->set_name("mixbus_info_box"); - - info_box->pack_start (info_scroller_label, false, false); - - info_frame->add (*info_box); - info_frame->show_all(); - - info_scroller_count = 0; - info_scroller_connection = Glib::signal_timeout().connect (mem_fun(*this, &ArdourStartup::info_scroller_update), 50); - - Gtk::Button *updates_button = manage (new Gtk::Button (_("Check the website for more..."))); - - updates_button->signal_clicked().connect (mem_fun(*this, &ArdourStartup::updates_button_clicked) ); - ARDOUR_UI::instance()->tooltips().set_tip (*updates_button, _("Click to open the program website in your web browser")); - - info_box->pack_start (*updates_button, false, false); - } - - /* recent session scroller */ - - recent_label.set_no_show_all (true); - recent_scroller.set_no_show_all (true); - - recent_label.set_markup (string_compose ("%1", _("Load a recent session"))); - recent_label.set_alignment (0, 0.5); - - recent_session_model = TreeStore::create (recent_session_columns); - - recent_session_display.set_model (recent_session_model); - recent_session_display.append_column (_("Recent Sessions"), recent_session_columns.visible_name); - recent_session_display.set_headers_visible (false); - recent_session_display.get_selection()->set_mode (SELECTION_SINGLE); - - recent_session_display.get_selection()->signal_changed().connect (sigc::mem_fun (*this, &ArdourStartup::recent_session_row_selected)); - - recent_scroller.add (recent_session_display); - recent_scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC); - recent_scroller.set_shadow_type (Gtk::SHADOW_IN); - - recent_session_display.show(); - recent_session_display.signal_row_activated().connect (sigc::mem_fun (*this, &ArdourStartup::recent_row_activated)); - - centering_vbox->pack_start (recent_label, false, false, 12); - centering_vbox->pack_start (recent_scroller, false, true); - - /* Browse button */ - - existing_session_chooser.set_title (_("Select session file")); - existing_session_chooser.signal_file_set().connect (sigc::mem_fun (*this, &ArdourStartup::existing_session_selected)); - existing_session_chooser.set_current_folder(poor_mans_glob (Config->get_default_session_parent_dir())); - - FileFilter session_filter; - session_filter.add_pattern ("*.ardour"); - session_filter.set_name (string_compose (_("%1 sessions"), PROGRAM_NAME)); - existing_session_chooser.add_filter (session_filter); - existing_session_chooser.set_filter (session_filter); - -#ifdef GTKOSX - existing_session_chooser.add_shortcut_folder ("/Volumes"); -#endif - - Label* browse_label = manage (new Label); - browse_label->set_markup (string_compose ("%1", _("Browse for other sessions"))); - browse_label->set_alignment (0, 0.5); - - centering_vbox->pack_start (*browse_label, false, false, 12); - centering_vbox->pack_start (existing_session_chooser, false, false); - - /* pack it all up */ - - centering_hbox->pack_start (*centering_vbox, true, true); - ic_vbox.pack_start (*centering_hbox, true, true); - ic_vbox.show_all (); - - /* user could just click on "Forward" if default - * choice is correct. - */ - - set_page_complete (ic_vbox, true); -} - -void -ArdourStartup::session_selected () -{ - /* HACK HACK HACK ... change the "Apply" button label - to say "Open" - */ - - Gtk::Widget* tl = ic_vbox.get_toplevel(); - Gtk::Window* win; - if ((win = dynamic_cast(tl)) != 0) { - /* ::get_default_widget() is not wrapped in gtkmm */ - Gtk::Widget* def = wrap (gtk_window_get_default_widget (win->gobj())); - Gtk::Button* button; - if ((button = dynamic_cast(def)) != 0) { - button->set_label (_("Open")); - } - } -} - -void -ArdourStartup::new_session_button_clicked () -{ - _existing_session_chooser_used = false; - recent_session_display.get_selection()->unselect_all (); - set_current_page (new_session_page_index); -} - void ArdourStartup::setup_final_page () { - final_page.set_text (string_compose (_("%1 is ready for use"), PROGRAM_NAME)); + string msg = string_compose (_("%1 is ready for use"), PROGRAM_NAME); + + final_page.set_markup (string_compose ("%1", msg)); final_page.show (); final_page_index = append_page (final_page); set_page_complete (final_page, true); @@ -649,24 +392,6 @@ ArdourStartup::on_cancel () gtk_main_quit (); } -void -ArdourStartup::on_prepare (Gtk::Widget* page) -{ - if (page == &session_new_vbox) { - - /* if the user already defined a name by using the recent - * session list or browsing to an existing session - * then we are done. - */ - - bool expect_new_ignored; - - if (!session_name (expect_new_ignored).empty()) { - on_apply (); - } - } -} - bool ArdourStartup::on_delete_event (GdkEventAny*) { @@ -708,574 +433,6 @@ ArdourStartup::on_apply () gtk_main_quit (); } -void -ArdourStartup::populate_session_templates () -{ - vector templates; - - find_session_templates (templates); - - template_model->clear (); - - for (vector::iterator x = templates.begin(); x != templates.end(); ++x) { - TreeModel::Row row; - - row = *(template_model->append ()); - - row[session_template_columns.name] = (*x).name; - row[session_template_columns.path] = (*x).path; - } - - if (!templates.empty()) { - /* select first row */ - template_chooser.set_active (0); - } -} - -void -ArdourStartup::setup_new_session_page () -{ - session_new_vbox.set_border_width (12); - session_new_vbox.set_spacing (18); - - VBox *vbox1 = manage (new VBox); - HBox* hbox1 = manage (new HBox); - Label* label1 = manage (new Label); - - vbox1->set_spacing (6); - - hbox1->set_spacing (6); - hbox1->pack_start (*label1, false, false); - hbox1->pack_start (new_name_entry, true, true); - - label1->set_text (_("Session name:")); - - - if (!ARDOUR_COMMAND_LINE::session_name.empty()) { - new_name_entry.set_text (Glib::path_get_basename (ARDOUR_COMMAND_LINE::session_name)); - /* name provided - they can move right along */ - set_page_complete (session_new_vbox, true); - } - - new_name_entry.signal_changed().connect (sigc::mem_fun (*this, &ArdourStartup::new_name_changed)); - new_name_entry.signal_activate().connect (sigc::mem_fun (*this, &ArdourStartup::move_along_now)); - - vbox1->pack_start (*hbox1, true, true); - - /* --- */ - - HBox* hbox2 = manage (new HBox); - Label* label2 = manage (new Label); - - hbox2->set_spacing (6); - hbox2->pack_start (*label2, false, false); - hbox2->pack_start (new_folder_chooser, true, true); - - label2->set_text (_("Create session folder in:")); - - if (!ARDOUR_COMMAND_LINE::session_name.empty()) { - new_folder_chooser.set_current_folder (poor_mans_glob (Glib::path_get_dirname (ARDOUR_COMMAND_LINE::session_name))); - } else if (ARDOUR_UI::instance()->session_loaded) { - // point the new session file chooser at the parent directory of the current session - string session_parent_dir = Glib::path_get_dirname(ARDOUR_UI::instance()->the_session()->path()); - string::size_type last_dir_sep = session_parent_dir.rfind(G_DIR_SEPARATOR); - session_parent_dir = session_parent_dir.substr(0, last_dir_sep); - new_folder_chooser.set_current_folder (session_parent_dir); - string default_session_folder = poor_mans_glob (Config->get_default_session_parent_dir()); - - try { - /* add_shortcut_folder throws an exception if the folder being added already has a shortcut */ - new_folder_chooser.add_shortcut_folder (default_session_folder); - } - catch (Glib::Error & e) { - std::cerr << "new_folder_chooser.add_shortcut_folder (" << default_session_folder << ") threw Glib::Error " << e.what() << std::endl; - } - } else { - new_folder_chooser.set_current_folder (poor_mans_glob (Config->get_default_session_parent_dir())); - } - new_folder_chooser.show (); - new_folder_chooser.set_title (_("Select folder for session")); - -#ifdef __APPLE__ - new_folder_chooser.add_shortcut_folder ("/Volumes"); -#endif - - vbox1->pack_start (*hbox2, false, false); - - session_new_vbox.pack_start (*vbox1, false, false); - - /* --- */ - - VBox *vbox2 = manage (new VBox); - HBox* hbox3 = manage (new HBox); - template_model = ListStore::create (session_template_columns); - - vbox2->set_spacing (6); - - VBox *vbox3 = manage (new VBox); - - vbox3->set_spacing (6); - - /* we may want to hide this and show it at various - times depending on the existence of templates. - */ - template_chooser.set_no_show_all (true); - use_template_button.set_no_show_all (true); - - HBox* hbox4a = manage (new HBox); - use_template_button.set_label (_("Use this template")); - - TreeModel::Row row = *template_model->prepend (); - row[session_template_columns.name] = (_("no template")); - row[session_template_columns.path] = string(); - - hbox4a->set_spacing (6); - hbox4a->pack_start (use_template_button, false, false); - hbox4a->pack_start (template_chooser, true, true); - - template_chooser.set_model (template_model); - - Gtk::CellRendererText* text_renderer = Gtk::manage (new Gtk::CellRendererText); - text_renderer->property_editable() = false; - - template_chooser.pack_start (*text_renderer); - template_chooser.add_attribute (text_renderer->property_text(), session_template_columns.name); - template_chooser.set_active (0); - - vbox3->pack_start (*hbox4a, false, false); - - /* --- */ - - HBox* hbox5 = manage (new HBox); - - hbox5->set_spacing (6); - hbox5->pack_start (more_new_session_options_button, false, false); - - setup_more_options_box (); - more_new_session_options_button.add (more_options_vbox); - - vbox3->pack_start (*hbox5, false, false); - hbox3->pack_start (*vbox3, true, true, 8); - vbox2->pack_start (*hbox3, false, false); - - /* --- */ - - session_new_vbox.pack_start (*vbox2, false, false); - session_new_vbox.show_all (); - - new_session_page_index = append_page (session_new_vbox); - set_page_type (session_new_vbox, ASSISTANT_PAGE_CONTENT); - set_page_title (session_new_vbox, _("New Session")); - - set_page_type (session_new_vbox, ASSISTANT_PAGE_CONFIRM); -} - -void -ArdourStartup::new_name_changed () -{ - if (!new_name_entry.get_text().empty()) { - session_selected (); - set_page_complete (session_new_vbox, true); - } else { - set_page_complete (session_new_vbox, false); - } -} - -int -ArdourStartup::redisplay_recent_sessions () -{ - std::vector session_directories; - RecentSessionsSorter cmp; - - recent_session_display.set_model (Glib::RefPtr(0)); - recent_session_model->clear (); - - ARDOUR::RecentSessions rs; - ARDOUR::read_recent_sessions (rs); - - if (rs.empty()) { - recent_session_display.set_model (recent_session_model); - return 0; - } - // - // sort them alphabetically - sort (rs.begin(), rs.end(), cmp); - - for (ARDOUR::RecentSessions::iterator i = rs.begin(); i != rs.end(); ++i) { - session_directories.push_back ((*i).second); - } - - int session_snapshot_count = 0; - - for (vector::const_iterator i = session_directories.begin(); i != session_directories.end(); ++i) - { - std::vector state_file_paths; - - // now get available states for this session - - get_state_files_in_directory (*i, state_file_paths); - - vector* states; - vector item; - string fullpath = *i; - - /* remove any trailing / */ - - if (fullpath[fullpath.length()-1] == '/') { - fullpath = fullpath.substr (0, fullpath.length()-1); - } - - /* check whether session still exists */ - if (!Glib::file_test(fullpath.c_str(), Glib::FILE_TEST_EXISTS)) { - /* session doesn't exist */ - continue; - } - - /* now get available states for this session */ - - if ((states = Session::possible_states (fullpath)) == 0) { - /* no state file? */ - continue; - } - - std::vector state_file_names(get_file_names_no_extension (state_file_paths)); - - Gtk::TreeModel::Row row = *(recent_session_model->append()); - - row[recent_session_columns.visible_name] = Glib::path_get_basename (fullpath); - row[recent_session_columns.fullpath] = fullpath; - row[recent_session_columns.tip] = Glib::Markup::escape_text (fullpath); - - ++session_snapshot_count; - - if (state_file_names.size() > 1) { - - // add the children - - for (std::vector::iterator i2 = state_file_names.begin(); - i2 != state_file_names.end(); ++i2) { - - Gtk::TreeModel::Row child_row = *(recent_session_model->append (row.children())); - - child_row[recent_session_columns.visible_name] = *i2; - child_row[recent_session_columns.fullpath] = fullpath; - child_row[recent_session_columns.tip] = Glib::Markup::escape_text (fullpath); - ++session_snapshot_count; - } - } - } - - recent_session_display.set_tooltip_column(1); // recent_session_columns.tip - recent_session_display.set_model (recent_session_model); - return session_snapshot_count; - // return rs.size(); -} - -void -ArdourStartup::recent_session_row_selected () -{ - if (recent_session_display.get_selection()->count_selected_rows() > 0) { - set_page_complete (ic_vbox, true); - session_selected (); - } else { - set_page_complete (ic_vbox, false); - } -} - -void -ArdourStartup::setup_more_options_box () -{ - more_options_vbox.set_border_width (24); - - _output_limit_count.set_adjustment (_output_limit_count_adj); - _input_limit_count.set_adjustment (_input_limit_count_adj); - _master_bus_channel_count.set_adjustment (_master_bus_channel_count_adj); - - chan_count_label_1.set_text (_("channels")); - chan_count_label_3.set_text (_("channels")); - chan_count_label_4.set_text (_("channels")); - - chan_count_label_1.set_alignment(0,0.5); - chan_count_label_1.set_padding(0,0); - chan_count_label_1.set_line_wrap(false); - - chan_count_label_3.set_alignment(0,0.5); - chan_count_label_3.set_padding(0,0); - chan_count_label_3.set_line_wrap(false); - - chan_count_label_4.set_alignment(0,0.5); - chan_count_label_4.set_padding(0,0); - chan_count_label_4.set_line_wrap(false); - - bus_label.set_markup (_("Busses")); - input_label.set_markup (_("Inputs")); - output_label.set_markup (_("Outputs")); - - _master_bus_channel_count.set_flags(Gtk::CAN_FOCUS); - _master_bus_channel_count.set_update_policy(Gtk::UPDATE_ALWAYS); - _master_bus_channel_count.set_numeric(true); - _master_bus_channel_count.set_digits(0); - _master_bus_channel_count.set_wrap(false); - - _create_master_bus.set_label (_("Create master bus")); - _create_master_bus.set_flags(Gtk::CAN_FOCUS); - _create_master_bus.set_relief(Gtk::RELIEF_NORMAL); - _create_master_bus.set_mode(true); - _create_master_bus.set_active(true); - _create_master_bus.set_border_width(0); - - advanced_table.set_row_spacings(0); - advanced_table.set_col_spacings(0); - - _connect_inputs.set_label (_("Automatically connect to physical inputs")); - _connect_inputs.set_flags(Gtk::CAN_FOCUS); - _connect_inputs.set_relief(Gtk::RELIEF_NORMAL); - _connect_inputs.set_mode(true); - _connect_inputs.set_active(Config->get_input_auto_connect() != ManualConnect); - _connect_inputs.set_border_width(0); - - _limit_input_ports.set_label (_("Use only")); - _limit_input_ports.set_flags(Gtk::CAN_FOCUS); - _limit_input_ports.set_relief(Gtk::RELIEF_NORMAL); - _limit_input_ports.set_mode(true); - _limit_input_ports.set_sensitive(true); - _limit_input_ports.set_border_width(0); - - _input_limit_count.set_flags(Gtk::CAN_FOCUS); - _input_limit_count.set_update_policy(Gtk::UPDATE_ALWAYS); - _input_limit_count.set_numeric(true); - _input_limit_count.set_digits(0); - _input_limit_count.set_wrap(false); - _input_limit_count.set_sensitive(false); - - bus_hbox.pack_start (bus_table, Gtk::PACK_SHRINK, 18); - - bus_label.set_alignment(0, 0.5); - bus_label.set_padding(0,0); - bus_label.set_line_wrap(false); - bus_label.set_selectable(false); - bus_label.set_use_markup(true); - bus_frame.set_shadow_type(Gtk::SHADOW_NONE); - bus_frame.set_label_align(0,0.5); - bus_frame.add(bus_hbox); - bus_frame.set_label_widget(bus_label); - - bus_table.set_row_spacings (0); - bus_table.set_col_spacings (0); - bus_table.attach (_create_master_bus, 0, 1, 0, 1, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0); - bus_table.attach (_master_bus_channel_count, 1, 2, 0, 1, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0); - bus_table.attach (chan_count_label_1, 2, 3, 0, 1, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 6, 0); - - input_port_limit_hbox.pack_start(_limit_input_ports, Gtk::PACK_SHRINK, 6); - input_port_limit_hbox.pack_start(_input_limit_count, Gtk::PACK_SHRINK, 0); - input_port_limit_hbox.pack_start(chan_count_label_3, Gtk::PACK_SHRINK, 6); - input_port_vbox.pack_start(_connect_inputs, Gtk::PACK_SHRINK, 0); - input_port_vbox.pack_start(input_port_limit_hbox, Gtk::PACK_EXPAND_PADDING, 0); - input_table.set_row_spacings(0); - input_table.set_col_spacings(0); - input_table.attach(input_port_vbox, 0, 1, 0, 1, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 6, 6); - - input_hbox.pack_start (input_table, Gtk::PACK_SHRINK, 18); - - input_label.set_alignment(0, 0.5); - input_label.set_padding(0,0); - input_label.set_line_wrap(false); - input_label.set_selectable(false); - input_label.set_use_markup(true); - input_frame.set_shadow_type(Gtk::SHADOW_NONE); - input_frame.set_label_align(0,0.5); - input_frame.add(input_hbox); - input_frame.set_label_widget(input_label); - - _connect_outputs.set_label (_("Automatically connect outputs")); - _connect_outputs.set_flags(Gtk::CAN_FOCUS); - _connect_outputs.set_relief(Gtk::RELIEF_NORMAL); - _connect_outputs.set_mode(true); - _connect_outputs.set_active(Config->get_output_auto_connect() != ManualConnect); - _connect_outputs.set_border_width(0); - _limit_output_ports.set_label (_("Use only")); - _limit_output_ports.set_flags(Gtk::CAN_FOCUS); - _limit_output_ports.set_relief(Gtk::RELIEF_NORMAL); - _limit_output_ports.set_mode(true); - _limit_output_ports.set_sensitive(true); - _limit_output_ports.set_border_width(0); - _output_limit_count.set_flags(Gtk::CAN_FOCUS); - _output_limit_count.set_update_policy(Gtk::UPDATE_ALWAYS); - _output_limit_count.set_numeric(false); - _output_limit_count.set_digits(0); - _output_limit_count.set_wrap(false); - _output_limit_count.set_sensitive(false); - output_port_limit_hbox.pack_start(_limit_output_ports, Gtk::PACK_SHRINK, 6); - output_port_limit_hbox.pack_start(_output_limit_count, Gtk::PACK_SHRINK, 0); - output_port_limit_hbox.pack_start(chan_count_label_4, Gtk::PACK_SHRINK, 6); - - _connect_outputs_to_master.set_label (_("... to master bus")); - _connect_outputs_to_master.set_flags(Gtk::CAN_FOCUS); - _connect_outputs_to_master.set_relief(Gtk::RELIEF_NORMAL); - _connect_outputs_to_master.set_mode(true); - _connect_outputs_to_master.set_active(Config->get_output_auto_connect() == AutoConnectMaster); - _connect_outputs_to_master.set_border_width(0); - - _connect_outputs_to_master.set_group (connect_outputs_group); - _connect_outputs_to_physical.set_group (connect_outputs_group); - - _connect_outputs_to_physical.set_label (_("... to physical outputs")); - _connect_outputs_to_physical.set_flags(Gtk::CAN_FOCUS); - _connect_outputs_to_physical.set_relief(Gtk::RELIEF_NORMAL); - _connect_outputs_to_physical.set_mode(true); - _connect_outputs_to_physical.set_active(Config->get_output_auto_connect() == AutoConnectPhysical); - _connect_outputs_to_physical.set_border_width(0); - - output_conn_vbox.pack_start(_connect_outputs, Gtk::PACK_SHRINK, 0); - output_conn_vbox.pack_start(_connect_outputs_to_master, Gtk::PACK_SHRINK, 0); - output_conn_vbox.pack_start(_connect_outputs_to_physical, Gtk::PACK_SHRINK, 0); - output_vbox.set_border_width(6); - - output_port_vbox.pack_start(output_port_limit_hbox, Gtk::PACK_SHRINK, 0); - - output_vbox.pack_start(output_conn_vbox); - output_vbox.pack_start(output_port_vbox); - - output_label.set_alignment(0, 0.5); - output_label.set_padding(0,0); - output_label.set_line_wrap(false); - output_label.set_selectable(false); - output_label.set_use_markup(true); - output_frame.set_shadow_type(Gtk::SHADOW_NONE); - output_frame.set_label_align(0,0.5); - - output_hbox.pack_start (output_vbox, Gtk::PACK_SHRINK, 18); - - output_frame.add(output_hbox); - output_frame.set_label_widget(output_label); - - more_options_vbox.pack_start(advanced_table, Gtk::PACK_SHRINK, 0); - more_options_vbox.pack_start(bus_frame, Gtk::PACK_SHRINK, 6); - more_options_vbox.pack_start(input_frame, Gtk::PACK_SHRINK, 6); - more_options_vbox.pack_start(output_frame, Gtk::PACK_SHRINK, 0); - - /* signals */ - - _connect_inputs.signal_clicked().connect (sigc::mem_fun (*this, &ArdourStartup::connect_inputs_clicked)); - _connect_outputs.signal_clicked().connect (sigc::mem_fun (*this, &ArdourStartup::connect_outputs_clicked)); - _limit_input_ports.signal_clicked().connect (sigc::mem_fun (*this, &ArdourStartup::limit_inputs_clicked)); - _limit_output_ports.signal_clicked().connect (sigc::mem_fun (*this, &ArdourStartup::limit_outputs_clicked)); - _create_master_bus.signal_clicked().connect (sigc::mem_fun (*this, &ArdourStartup::master_bus_button_clicked)); - - /* note that more_options_vbox is "visible" by default even - * though it may not be displayed to the user, this is so the dialog - * doesn't resize. - */ - more_options_vbox.show_all (); -} - -bool -ArdourStartup::create_master_bus() const -{ - return _create_master_bus.get_active(); -} - -int -ArdourStartup::master_channel_count() const -{ - return _master_bus_channel_count.get_value_as_int(); -} - -bool -ArdourStartup::connect_inputs() const -{ - return _connect_inputs.get_active(); -} - -bool -ArdourStartup::limit_inputs_used_for_connection() const -{ - return _limit_input_ports.get_active(); -} - -int -ArdourStartup::input_limit_count() const -{ - return _input_limit_count.get_value_as_int(); -} - -bool -ArdourStartup::connect_outputs() const -{ - return _connect_outputs.get_active(); -} - -bool -ArdourStartup::limit_outputs_used_for_connection() const -{ - return _limit_output_ports.get_active(); -} - -int -ArdourStartup::output_limit_count() const -{ - return _output_limit_count.get_value_as_int(); -} - -bool -ArdourStartup::connect_outs_to_master() const -{ - return _connect_outputs_to_master.get_active(); -} - -bool -ArdourStartup::connect_outs_to_physical() const -{ - return _connect_outputs_to_physical.get_active(); -} - -void -ArdourStartup::connect_inputs_clicked () -{ - _limit_input_ports.set_sensitive(_connect_inputs.get_active()); - - if (_connect_inputs.get_active() && _limit_input_ports.get_active()) { - _input_limit_count.set_sensitive(true); - } else { - _input_limit_count.set_sensitive(false); - } -} - -void -ArdourStartup::connect_outputs_clicked () -{ - bool const co = _connect_outputs.get_active (); - _limit_output_ports.set_sensitive(co); - _connect_outputs_to_master.set_sensitive(co); - _connect_outputs_to_physical.set_sensitive(co); - - if (co && _limit_output_ports.get_active()) { - _output_limit_count.set_sensitive(true); - } else { - _output_limit_count.set_sensitive(false); - } -} - -void -ArdourStartup::limit_inputs_clicked () -{ - _input_limit_count.set_sensitive(_limit_input_ports.get_active()); -} - -void -ArdourStartup::limit_outputs_clicked () -{ - _output_limit_count.set_sensitive(_limit_output_ports.get_active()); -} - -void -ArdourStartup::master_bus_button_clicked () -{ - bool const yn = _create_master_bus.get_active(); - - _master_bus_channel_count.set_sensitive(yn); - _connect_outputs_to_master.set_sensitive(yn); -} void ArdourStartup::move_along_now () @@ -1283,83 +440,5 @@ ArdourStartup::move_along_now () on_apply (); } -void -ArdourStartup::recent_row_activated (const Gtk::TreePath&, Gtk::TreeViewColumn*) -{ - set_page_complete (ic_vbox, true); - move_along_now (); -} - -void -ArdourStartup::existing_session_selected () -{ - _existing_session_chooser_used = true; - - session_selected (); - set_page_complete (ic_vbox, true); - move_along_now (); -} - -std::string -ArdourStartup::been_here_before_path () const -{ - // XXXX use more specific version so we can catch upgrades - return Glib::build_filename (user_config_directory (), ".a3"); -} -void -ArdourStartup::updates_button_clicked () -{ - //now open a browser window so user can see more - PBD::open_uri (Config->get_updates_url()); -} - -bool -ArdourStartup::info_scroller_update() -{ - info_scroller_count++; - - char buf[512]; - snprintf (buf, std::min(info_scroller_count,sizeof(buf)-1), "%s", ARDOUR_UI::instance()->announce_string().c_str() ); - buf[info_scroller_count] = 0; - info_scroller_label.set_text (buf); - info_scroller_label.show(); - - if (info_scroller_count > ARDOUR_UI::instance()->announce_string().length()) { - info_scroller_connection.disconnect(); - } - - return true; -} - -void -ArdourStartup::on_map () -{ - Gtk::Assistant::on_map (); - - populate_session_templates (); - - if (!template_model->children().empty()) { - use_template_button.show(); - template_chooser.show (); - } else { - use_template_button.hide(); - template_chooser.hide (); - } - - if (recent_session_model) { - int cnt = redisplay_recent_sessions (); - if (cnt > 0) { - recent_scroller.show(); - recent_label.show (); - - if (cnt > 4) { - recent_scroller.set_size_request (-1, 300); - } - } else { - recent_scroller.hide(); - recent_label.hide (); - } - } -} diff --git a/gtk2_ardour/startup.h b/gtk2_ardour/startup.h index 361d00e9e1..c5a9a30162 100644 --- a/gtk2_ardour/startup.h +++ b/gtk2_ardour/startup.h @@ -46,32 +46,10 @@ class EngineControl; class ArdourStartup : public Gtk::Assistant { public: - ArdourStartup (bool require_new, const std::string& session_name, const std::string& session_path, const std::string& template_name); + ArdourStartup (); ~ArdourStartup (); - bool ready_without_display () const; - - std::string session_name (bool& should_be_new); - std::string session_folder (); - - bool use_session_template(); - std::string session_template_name(); - - // advanced session options - - bool create_master_bus() const; - int master_channel_count() const; - - bool connect_inputs() const; - bool limit_inputs_used_for_connection() const; - int input_limit_count() const; - - bool connect_outputs() const; - bool limit_outputs_used_for_connection() const; - int output_limit_count() const; - - bool connect_outs_to_master() const; - bool connect_outs_to_physical() const; + static bool required (); gint response () const { return _response; @@ -81,18 +59,12 @@ class ArdourStartup : public Gtk::Assistant { gint _response; bool config_modified; bool new_user; - bool need_session_info; - bool new_only; - std::string _provided_session_name; - std::string _provided_session_path; - std::string been_here_before_path () const; + static std::string been_here_before_path (); void on_apply (); void on_cancel (); bool on_delete_event (GdkEventAny*); - void on_prepare (Gtk::Widget*); - void on_map (); static ArdourStartup *the_startup; @@ -110,13 +82,7 @@ class ArdourStartup : public Gtk::Assistant { Gtk::FileChooserButton* default_dir_chooser; void default_dir_changed(); void setup_first_page (); - - /* initial choice page */ - - void setup_initial_choice_page (); - Gtk::VBox ic_vbox; - Gtk::Button ic_new_session_button; - void new_session_button_clicked (); + Gtk::FileChooserButton new_folder_chooser; /* monitoring choices */ @@ -134,128 +100,6 @@ class ArdourStartup : public Gtk::Assistant { Gtk::RadioButton no_monitor_section_button; void setup_monitor_section_choice_page (); - - /* recent sessions */ - - void setup_existing_session_page (); - - struct RecentSessionsSorter { - bool operator() (std::pair a, std::pair b) const { - return cmp_nocase(a.first, b.first) == -1; - } - }; - - struct RecentSessionModelColumns : public Gtk::TreeModel::ColumnRecord { - RecentSessionModelColumns() { - add (visible_name); - add (tip); - add (fullpath); - } - Gtk::TreeModelColumn visible_name; - Gtk::TreeModelColumn tip; - Gtk::TreeModelColumn fullpath; - }; - - RecentSessionModelColumns recent_session_columns; - Gtk::TreeView recent_session_display; - Glib::RefPtr recent_session_model; - Gtk::ScrolledWindow recent_scroller; - Gtk::Label recent_label; - Gtk::FileChooserButton existing_session_chooser; - int redisplay_recent_sessions (); - void recent_session_row_selected (); - void recent_row_activated (const Gtk::TreePath& path, Gtk::TreeViewColumn* col); - - void existing_session_selected (); - void session_selected (); - - /* new sessions */ - - void setup_new_session_page (); - Gtk::Entry new_name_entry; - Gtk::FileChooserButton new_folder_chooser; - - struct SessionTemplateColumns : public Gtk::TreeModel::ColumnRecord { - SessionTemplateColumns () { - add (name); - add (path); - } - - Gtk::TreeModelColumn name; - Gtk::TreeModelColumn path; - }; - - SessionTemplateColumns session_template_columns; - Glib::RefPtr template_model; - Gtk::ComboBox template_chooser; - - Gtk::VBox session_new_vbox; - Gtk::VBox session_existing_vbox; - Gtk::Expander more_new_session_options_button; - Gtk::CheckButton use_template_button; - std::string load_template_override; - - void more_new_session_options_button_clicked(); - void new_name_changed (); - void populate_session_templates (); - - /* more options for new sessions */ - - Gtk::VBox more_options_vbox; - - Gtk::Label chan_count_label_1; - Gtk::Label chan_count_label_3; - Gtk::Label chan_count_label_4; - Gtk::Table advanced_table; - Gtk::HBox input_port_limit_hbox; - Gtk::VBox input_port_vbox; - Gtk::Table input_table; - Gtk::HBox input_hbox; - - Gtk::Label bus_label; - Gtk::Frame bus_frame; - Gtk::Table bus_table; - Gtk::HBox bus_hbox; - - Gtk::Label input_label; - Gtk::Frame input_frame; - Gtk::HBox output_port_limit_hbox; - Gtk::VBox output_port_vbox; - Gtk::VBox output_conn_vbox; - Gtk::VBox output_vbox; - Gtk::HBox output_hbox; - - Gtk::Label output_label; - Gtk::Frame output_frame; - Gtk::VBox advanced_vbox; - Gtk::Label advanced_label; - - Gtk::CheckButton _create_master_bus; - Gtk::SpinButton _master_bus_channel_count; - - Gtk::CheckButton _connect_inputs; - Gtk::CheckButton _limit_input_ports; - Gtk::SpinButton _input_limit_count; - - Gtk::CheckButton _connect_outputs; - Gtk::CheckButton _limit_output_ports; - Gtk::SpinButton _output_limit_count; - - Gtk::RadioButtonGroup connect_outputs_group; - Gtk::RadioButton _connect_outputs_to_master; - Gtk::RadioButton _connect_outputs_to_physical; - - Gtk::Adjustment _output_limit_count_adj; - Gtk::Adjustment _input_limit_count_adj; - Gtk::Adjustment _master_bus_channel_count_adj; - - void connect_inputs_clicked (); - void connect_outputs_clicked (); - void limit_inputs_clicked (); - void limit_outputs_clicked (); - void master_bus_button_clicked (); - void setup_more_options_box (); - /* final page */ void setup_final_page (); @@ -272,21 +116,12 @@ class ArdourStartup : public Gtk::Assistant { gint default_folder_page_index; gint monitoring_page_index; gint monitor_section_page_index; - gint new_session_page_index; - gint initial_choice_index; gint final_page_index; - gint session_options_page_index; void move_along_now (); - bool _existing_session_chooser_used; ///< set to true when the existing session chooser has been used void setup_prerelease_page (); - Gtk::Label info_scroller_label; - std::string::size_type info_scroller_count; - bool info_scroller_update(); - sigc::connection info_scroller_connection; - void updates_button_clicked (); }; #endif /* __gtk2_ardour_startup_h__ */ diff --git a/gtk2_ardour/utils.cc b/gtk2_ardour/utils.cc index 304b8508c6..c81aff85ab 100644 --- a/gtk2_ardour/utils.cc +++ b/gtk2_ardour/utils.cc @@ -401,7 +401,7 @@ emulate_key_event (Gtk::Widget* w, unsigned int keyval) ev.state = 0; ev.keyval = keyval; ev.length = 0; - ev.string = (const gchar*) ""; + ev.string = const_cast (""); ev.hardware_keycode = keymapkey[0].keycode; ev.group = keymapkey[0].group; g_free(keymapkey); diff --git a/gtk2_ardour/wscript b/gtk2_ardour/wscript index 1f4c7940f8..be7164cf05 100644 --- a/gtk2_ardour/wscript +++ b/gtk2_ardour/wscript @@ -203,6 +203,7 @@ gtk2_ardour_sources = [ 'search_path_option.cc', 'selection.cc', 'send_ui.cc', + 'session_dialog.cc', 'session_import_dialog.cc', 'session_metadata_dialog.cc', 'session_option_editor.cc', -- cgit v1.2.3 From 884789bfadddadcda49cef603a754f8e12e911a6 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Mon, 23 Sep 2013 16:49:24 -0400 Subject: move announcements frame around in the session dialog and adjust spacing/borders --- gtk2_ardour/session_dialog.cc | 25 ++++++++++++++++--------- gtk2_ardour/session_dialog.h | 2 ++ 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/gtk2_ardour/session_dialog.cc b/gtk2_ardour/session_dialog.cc index 481b587b71..710833b873 100644 --- a/gtk2_ardour/session_dialog.cc +++ b/gtk2_ardour/session_dialog.cc @@ -81,6 +81,7 @@ SessionDialog::SessionDialog (bool require_new, const std::string& session_name, set_keep_above (true); set_position (WIN_POS_CENTER); + get_vbox()->set_spacing (6); string image_path; @@ -91,6 +92,15 @@ SessionDialog::SessionDialog (bool require_new, const std::string& session_name, } } + /* this is where announcements will be displayed, but it may be empty + * and invisible most of the time. + */ + + info_frame.set_shadow_type(SHADOW_ETCHED_OUT); + info_frame.set_no_show_all (true); + info_frame.set_border_width (12); + get_vbox()->pack_start (info_frame, false, false); + setup_new_session_page (); if (!new_only) { @@ -236,7 +246,6 @@ void SessionDialog::setup_initial_choice_box () { ic_vbox.set_spacing (6); - ic_vbox.set_border_width (24); HBox* centering_hbox = manage (new HBox); VBox* centering_vbox = manage (new VBox); @@ -249,25 +258,19 @@ SessionDialog::setup_initial_choice_box () ic_new_session_button.add (*new_label); ic_new_session_button.signal_clicked().connect (sigc::mem_fun (*this, &SessionDialog::new_session_button_clicked)); - centering_vbox->pack_start (ic_new_session_button, false, true); + centering_vbox->pack_start (ic_new_session_button, false, false); /* Possible update message */ if (ARDOUR_UI::instance()->announce_string() != "" ) { - Gtk::Frame *info_frame = manage(new Gtk::Frame); - info_frame->set_shadow_type(SHADOW_ETCHED_OUT); - centering_vbox->pack_start (*info_frame, false, false, 20); - Box *info_box = manage (new VBox); info_box->set_border_width (12); info_box->set_spacing (6); - info_box->set_name("mixbus_info_box"); info_box->pack_start (info_scroller_label, false, false); - info_frame->add (*info_box); - info_frame->show_all(); + cerr << "Frame should be visible\n"; info_scroller_count = 0; info_scroller_connection = Glib::signal_timeout().connect (mem_fun(*this, &SessionDialog::info_scroller_update), 50); @@ -278,6 +281,10 @@ SessionDialog::setup_initial_choice_box () ARDOUR_UI::instance()->tooltips().set_tip (*updates_button, _("Click to open the program website in your web browser")); info_box->pack_start (*updates_button, false, false); + + info_frame.add (*info_box); + info_box->show_all (); + info_frame.show (); } /* recent session scroller */ diff --git a/gtk2_ardour/session_dialog.h b/gtk2_ardour/session_dialog.h index ac4c1a7925..bb43bc2931 100644 --- a/gtk2_ardour/session_dialog.h +++ b/gtk2_ardour/session_dialog.h @@ -86,6 +86,8 @@ class SessionDialog : public ArdourDialog { bool back_button_pressed (GdkEventButton*); + Gtk::Frame info_frame; + /* initial choice page */ void setup_initial_choice_box (); -- cgit v1.2.3 From cff174b5417d9b242673588792d390db9f61ca93 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Mon, 23 Sep 2013 21:35:17 -0400 Subject: move rate_as_string() from EngineControl to utils.cc --- gtk2_ardour/engine_dialog.cc | 13 +------------ gtk2_ardour/engine_dialog.h | 1 - gtk2_ardour/utils.cc | 13 +++++++++++++ gtk2_ardour/utils.h | 2 ++ 4 files changed, 16 insertions(+), 13 deletions(-) diff --git a/gtk2_ardour/engine_dialog.cc b/gtk2_ardour/engine_dialog.cc index 79bda1bcc5..a63e310b3f 100644 --- a/gtk2_ardour/engine_dialog.cc +++ b/gtk2_ardour/engine_dialog.cc @@ -48,6 +48,7 @@ #include "ardour_ui.h" #include "engine_dialog.h" #include "gui_thread.h" +#include "utils.h" #include "i18n.h" using namespace std; @@ -800,18 +801,6 @@ EngineControl::device_changed () push_state_to_backend (false); } -string -EngineControl::rate_as_string (float r) -{ - char buf[32]; - if (fmod (r, 1000.0f)) { - snprintf (buf, sizeof (buf), "%.1f kHz", r/1000.0); - } else { - snprintf (buf, sizeof (buf), "%.0f kHz", r/1000.0); - } - return buf; -} - string EngineControl::bufsize_as_string (uint32_t sz) { diff --git a/gtk2_ardour/engine_dialog.h b/gtk2_ardour/engine_dialog.h index 59924e0f0a..ac17814a5f 100644 --- a/gtk2_ardour/engine_dialog.h +++ b/gtk2_ardour/engine_dialog.h @@ -122,7 +122,6 @@ class EngineControl : public ArdourDialog, public PBD::ScopedConnectionList { void setup_midi_tab_for_jack (); void refresh_midi_display (); - std::string rate_as_string (float); std::string bufsize_as_string (uint32_t); float get_rate() const; diff --git a/gtk2_ardour/utils.cc b/gtk2_ardour/utils.cc index c81aff85ab..a0fd7016b5 100644 --- a/gtk2_ardour/utils.cc +++ b/gtk2_ardour/utils.cc @@ -28,6 +28,7 @@ #include #include #include +#include #include #include #include @@ -860,3 +861,15 @@ unique_random_color (list& used_colors) /* XXX need throttle here to make sure we don't spin for ever */ } } + +string +rate_as_string (float r) +{ + char buf[32]; + if (fmod (r, 1000.0f)) { + snprintf (buf, sizeof (buf), "%.1f kHz", r/1000.0); + } else { + snprintf (buf, sizeof (buf), "%.0f kHz", r/1000.0); + } + return buf; +} diff --git a/gtk2_ardour/utils.h b/gtk2_ardour/utils.h index 5d7bf000ea..a1a54898b5 100644 --- a/gtk2_ardour/utils.h +++ b/gtk2_ardour/utils.h @@ -86,4 +86,6 @@ std::string escape_angled_brackets (std::string const &); Gdk::Color unique_random_color (std::list &); +std::string rate_as_string (float r); + #endif /* __ardour_gtk_utils_h__ */ -- cgit v1.2.3 From 4209e8a8347940a5d17b129fa1f52d4f57efd02c Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Mon, 23 Sep 2013 21:35:51 -0400 Subject: add new static functions to get SR and disk sample format from session XML --- libs/ardour/ardour/session.h | 4 ++++ libs/ardour/session_state.cc | 56 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+) diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h index ae5339796c..2fcf6d476a 100644 --- a/libs/ardour/ardour/session.h +++ b/libs/ardour/ardour/session.h @@ -161,6 +161,8 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi virtual ~Session (); + static int get_info_from_path (const std::string& xmlpath, float& sample_rate, SampleFormat& data_format); + std::string path() const { return _path; } std::string name() const { return _name; } std::string snap_name() const { return _current_snapshot_name; } @@ -1618,6 +1620,8 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi void setup_ltc (); void setup_click (); void setup_bundles (); + + static int get_session_info_from_path (XMLTree& state_tree, const std::string& xmlpath); }; } // namespace ARDOUR diff --git a/libs/ardour/session_state.cc b/libs/ardour/session_state.cc index 049cb5b5ee..2b2afc0d3d 100644 --- a/libs/ardour/session_state.cc +++ b/libs/ardour/session_state.cc @@ -3743,3 +3743,59 @@ Session::rename (const std::string& new_name) #undef RENAME } + +int +Session::get_session_info_from_path (XMLTree& tree, const string& xmlpath) +{ + if (!Glib::file_test (xmlpath, Glib::FILE_TEST_EXISTS)) { + return -1; + } + + if (!tree.read (xmlpath)) { + return -1; + } + + return 0; +} + +int +Session::get_info_from_path (const string& xmlpath, float& sample_rate, SampleFormat& data_format) +{ + XMLTree tree; + bool found_sr = false; + bool found_data_format = false; + + if (get_session_info_from_path (tree, xmlpath)) { + return -1; + } + + /* sample rate */ + + const XMLProperty* prop; + if ((prop = tree.root()->property (X_("sample-rate"))) != 0) { + sample_rate = atoi (prop->value()); + found_sr = true; + } + + const XMLNodeList& children (tree.root()->children()); + for (XMLNodeList::const_iterator c = children.begin(); c != children.end(); ++c) { + const XMLNode* child = *c; + if (child->name() == "Config") { + const XMLNodeList& options (child->children()); + for (XMLNodeList::const_iterator oc = options.begin(); oc != options.end(); ++oc) { + const XMLNode* option = *oc; + if (option->property("name")->value() == "native-file-data-format") { + SampleFormat fmt = (SampleFormat) string_2_enum (option->property ("value")->value(), fmt); + data_format = fmt; + found_data_format = true; + break; + } + } + } + if (found_data_format) { + break; + } + } + + return !(found_sr && found_data_format); // zero if they are both found +} -- cgit v1.2.3 From 0f6ba422f673af136c592b5ea3d913cd86f57b19 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Mon, 23 Sep 2013 21:36:13 -0400 Subject: use new Session API to show session SR and disk bit depth in recent sessions list --- gtk2_ardour/session_dialog.cc | 76 ++++++++++++++++++++++++++++++++++--------- gtk2_ardour/session_dialog.h | 4 +++ 2 files changed, 65 insertions(+), 15 deletions(-) diff --git a/gtk2_ardour/session_dialog.cc b/gtk2_ardour/session_dialog.cc index 710833b873..e70f8600e1 100644 --- a/gtk2_ardour/session_dialog.cc +++ b/gtk2_ardour/session_dialog.cc @@ -299,6 +299,8 @@ SessionDialog::setup_initial_choice_box () recent_session_display.set_model (recent_session_model); recent_session_display.append_column (_("Recent Sessions"), recent_session_columns.visible_name); + recent_session_display.append_column (_("Sample Rate"), recent_session_columns.sample_rate); + recent_session_display.append_column (_("Disk Format"), recent_session_columns.disk_format); recent_session_display.set_headers_visible (false); recent_session_display.get_selection()->set_mode (SELECTION_SINGLE); @@ -593,49 +595,94 @@ SessionDialog::redisplay_recent_sessions () vector* states; vector item; - string fullpath = *i; + string dirname = *i; /* remove any trailing / */ - if (fullpath[fullpath.length()-1] == '/') { - fullpath = fullpath.substr (0, fullpath.length()-1); + if (dirname[dirname.length()-1] == '/') { + dirname = dirname.substr (0, dirname.length()-1); } /* check whether session still exists */ - if (!Glib::file_test(fullpath.c_str(), Glib::FILE_TEST_EXISTS)) { + if (!Glib::file_test(dirname.c_str(), Glib::FILE_TEST_EXISTS)) { /* session doesn't exist */ continue; } /* now get available states for this session */ - if ((states = Session::possible_states (fullpath)) == 0) { + if ((states = Session::possible_states (dirname)) == 0) { /* no state file? */ continue; } std::vector state_file_names(get_file_names_no_extension (state_file_paths)); + if (state_file_names.empty()) { + continue; + } + Gtk::TreeModel::Row row = *(recent_session_model->append()); - row[recent_session_columns.visible_name] = Glib::path_get_basename (fullpath); - row[recent_session_columns.fullpath] = fullpath; - row[recent_session_columns.tip] = Glib::Markup::escape_text (fullpath); - + float sr; + SampleFormat sf; + std::string s = Glib::build_filename (dirname, state_file_names.front() + statefile_suffix); + + row[recent_session_columns.visible_name] = Glib::path_get_basename (dirname); + row[recent_session_columns.fullpath] = dirname; /* just the dir, but this works too */ + row[recent_session_columns.tip] = Glib::Markup::escape_text (dirname); + + if (Session::get_info_from_path (s, sr, sf) == 0) { + row[recent_session_columns.sample_rate] = rate_as_string (sr); + switch (sf) { + case FormatFloat: + row[recent_session_columns.disk_format] = _("32 bit float"); + break; + case FormatInt24: + row[recent_session_columns.disk_format] = _("24 bit"); + break; + case FormatInt16: + row[recent_session_columns.disk_format] = _("16 bit"); + break; + } + } else { + row[recent_session_columns.sample_rate] = "??"; + row[recent_session_columns.disk_format] = "--"; + } + ++session_snapshot_count; if (state_file_names.size() > 1) { // add the children - for (std::vector::iterator i2 = state_file_names.begin(); - i2 != state_file_names.end(); ++i2) { + for (std::vector::iterator i2 = state_file_names.begin(); i2 != state_file_names.end(); ++i2) { Gtk::TreeModel::Row child_row = *(recent_session_model->append (row.children())); - + child_row[recent_session_columns.visible_name] = *i2; - child_row[recent_session_columns.fullpath] = fullpath; - child_row[recent_session_columns.tip] = Glib::Markup::escape_text (fullpath); + child_row[recent_session_columns.fullpath] = Glib::build_filename (dirname, *i2 + statefile_suffix); + child_row[recent_session_columns.tip] = Glib::Markup::escape_text (dirname); + + if (Session::get_info_from_path (s, sr, sf) == 0) { + child_row[recent_session_columns.sample_rate] = rate_as_string (sr); + switch (sf) { + case FormatFloat: + child_row[recent_session_columns.disk_format] = _("32 bit float"); + break; + case FormatInt24: + child_row[recent_session_columns.disk_format] = _("24 bit"); + break; + case FormatInt16: + child_row[recent_session_columns.disk_format] = _("16 bit"); + break; + } + } else { + child_row[recent_session_columns.sample_rate] = "??"; + child_row[recent_session_columns.disk_format] = "--"; + } + + ++session_snapshot_count; } } @@ -644,7 +691,6 @@ SessionDialog::redisplay_recent_sessions () recent_session_display.set_tooltip_column(1); // recent_session_columns.tip recent_session_display.set_model (recent_session_model); return session_snapshot_count; - // return rs.size(); } void diff --git a/gtk2_ardour/session_dialog.h b/gtk2_ardour/session_dialog.h index bb43bc2931..21d2f5ea3f 100644 --- a/gtk2_ardour/session_dialog.h +++ b/gtk2_ardour/session_dialog.h @@ -110,10 +110,14 @@ class SessionDialog : public ArdourDialog { add (visible_name); add (tip); add (fullpath); + add (sample_rate); + add (disk_format); } Gtk::TreeModelColumn visible_name; Gtk::TreeModelColumn tip; Gtk::TreeModelColumn fullpath; + Gtk::TreeModelColumn sample_rate; + Gtk::TreeModelColumn disk_format; }; RecentSessionModelColumns recent_session_columns; -- cgit v1.2.3 From f7b6a27de6c63795be79991ffae993932a9fa0eb Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Mon, 23 Sep 2013 23:12:42 -0400 Subject: shrink small-splash.png image by 50% --- gtk2_ardour/small-splash.png | Bin 26238 -> 9671 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/gtk2_ardour/small-splash.png b/gtk2_ardour/small-splash.png index 0a3c33ea77..045062036c 100644 Binary files a/gtk2_ardour/small-splash.png and b/gtk2_ardour/small-splash.png differ -- cgit v1.2.3 From 2c9644320fd8ec04ce88c16ee4331679deaa999f Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Mon, 23 Sep 2013 23:13:07 -0400 Subject: tighten up layout of session dialog; make button say cancel or quit in difference scenarios --- gtk2_ardour/ardour_ui.cc | 8 +++++++- gtk2_ardour/session_dialog.cc | 40 ++++++++++++++++++++++------------------ gtk2_ardour/session_dialog.h | 3 ++- 3 files changed, 31 insertions(+), 20 deletions(-) diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc index 129b77f0a4..e98e3e00a0 100644 --- a/gtk2_ardour/ardour_ui.cc +++ b/gtk2_ardour/ardour_ui.cc @@ -2529,6 +2529,7 @@ ARDOUR_UI::get_session_parameters (bool quit_on_cancel, bool should_be_new, stri string template_name; int ret = -1; bool likely_new = false; + bool cancel_not_quit; /* deal with any existing DIRTY session now, rather than later. don't * treat a non-dirty session this way, so that it stays visible @@ -2539,6 +2540,11 @@ ARDOUR_UI::get_session_parameters (bool quit_on_cancel, bool should_be_new, stri ARDOUR_UI::instance()->video_timeline->sync_session_state(); } + /* if there is already a session, relabel the button + on the SessionDialog so that we don't Quit directly + */ + cancel_not_quit = (_session != 0); + if (_session && _session->dirty()) { if (unload_session (false)) { /* unload cancelled by user */ @@ -2552,7 +2558,7 @@ ARDOUR_UI::get_session_parameters (bool quit_on_cancel, bool should_be_new, stri template_name = load_template; } - SessionDialog session_dialog (should_be_new, session_name, session_path, load_template); + SessionDialog session_dialog (should_be_new, session_name, session_path, load_template, cancel_not_quit); while (ret != 0) { diff --git a/gtk2_ardour/session_dialog.cc b/gtk2_ardour/session_dialog.cc index e70f8600e1..038ea11d76 100644 --- a/gtk2_ardour/session_dialog.cc +++ b/gtk2_ardour/session_dialog.cc @@ -62,8 +62,8 @@ static string poor_mans_glob (string path) return copy; } -SessionDialog::SessionDialog (bool require_new, const std::string& session_name, const std::string& session_path, const std::string& template_name) - : ArdourDialog (_("Session Setup")) +SessionDialog::SessionDialog (bool require_new, const std::string& session_name, const std::string& session_path, const std::string& template_name, bool cancel_not_quit) + : ArdourDialog (_("Session Setup"), true, true) , new_only (require_new) , _provided_session_name (session_name) , _provided_session_path (session_path) @@ -83,15 +83,6 @@ SessionDialog::SessionDialog (bool require_new, const std::string& session_name, set_position (WIN_POS_CENTER); get_vbox()->set_spacing (6); - string image_path; - - if (find_file_in_search_path (ardour_data_search_path(), "small-splash.png", image_path)) { - Gtk::Image* image; - if ((image = manage (new Gtk::Image (image_path))) != 0) { - get_vbox()->pack_start (*image, false, false); - } - } - /* this is where announcements will be displayed, but it may be empty * and invisible most of the time. */ @@ -117,7 +108,7 @@ SessionDialog::SessionDialog (bool require_new, const std::string& session_name, get_vbox()->show_all (); - cancel_button = add_button (Stock::QUIT, RESPONSE_CANCEL); + cancel_button = add_button ((cancel_not_quit ? Stock::CANCEL : Stock::QUIT), RESPONSE_CANCEL); back_button = add_button (Stock::GO_BACK, RESPONSE_NO); open_button = add_button (Stock::OPEN, RESPONSE_ACCEPT); @@ -253,12 +244,27 @@ SessionDialog::setup_initial_choice_box () centering_vbox->set_spacing (6); Label* new_label = manage (new Label); - new_label->set_markup (string_compose ("%1", _("Create a new session"))); + new_label->set_markup (string_compose ("%1", _("New Session"))); + new_label->set_justify (JUSTIFY_CENTER); ic_new_session_button.add (*new_label); ic_new_session_button.signal_clicked().connect (sigc::mem_fun (*this, &SessionDialog::new_session_button_clicked)); - centering_vbox->pack_start (ic_new_session_button, false, false); + Gtk::HBox* hbox = manage (new HBox); + hbox->set_spacing (12); + + string image_path; + + if (find_file_in_search_path (ardour_data_search_path(), "small-splash.png", image_path)) { + Gtk::Image* image; + if ((image = manage (new Gtk::Image (image_path))) != 0) { + hbox->pack_start (*image, false, false); + } + } + + hbox->pack_start (ic_new_session_button, true, true); + + centering_vbox->pack_start (*hbox, false, false); /* Possible update message */ @@ -292,8 +298,7 @@ SessionDialog::setup_initial_choice_box () recent_label.set_no_show_all (true); recent_scroller.set_no_show_all (true); - recent_label.set_markup (string_compose ("%1", _("... or load a recent session"))); - recent_label.set_alignment (0, 0.5); + recent_label.set_markup (string_compose ("%1", _("Recent Sessions"))); recent_session_model = TreeStore::create (recent_session_columns); @@ -333,8 +338,7 @@ SessionDialog::setup_initial_choice_box () #endif Label* browse_label = manage (new Label); - browse_label->set_markup (string_compose ("%1", _("... or browse for existing sessions"))); - browse_label->set_alignment (0, 0.5); + browse_label->set_markup (string_compose ("%1", _("Other Sessions"))); centering_vbox->pack_start (*browse_label, false, false, 12); centering_vbox->pack_start (existing_session_chooser, false, false); diff --git a/gtk2_ardour/session_dialog.h b/gtk2_ardour/session_dialog.h index 21d2f5ea3f..782466a834 100644 --- a/gtk2_ardour/session_dialog.h +++ b/gtk2_ardour/session_dialog.h @@ -47,7 +47,8 @@ class EngineControl; class SessionDialog : public ArdourDialog { public: - SessionDialog (bool require_new, const std::string& session_name, const std::string& session_path, const std::string& template_name); + SessionDialog (bool require_new, const std::string& session_name, const std::string& session_path, + const std::string& template_name, bool cancel_not_quit); ~SessionDialog (); std::string session_name (bool& should_be_new); -- cgit v1.2.3 From d0b67dce80412883da01d4fcd8c5ed283cb85436 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Tue, 24 Sep 2013 22:22:16 -0400 Subject: fix crash when cmdline provides session name --- gtk2_ardour/session_dialog.cc | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/gtk2_ardour/session_dialog.cc b/gtk2_ardour/session_dialog.cc index 038ea11d76..51c7e24f80 100644 --- a/gtk2_ardour/session_dialog.cc +++ b/gtk2_ardour/session_dialog.cc @@ -83,6 +83,15 @@ SessionDialog::SessionDialog (bool require_new, const std::string& session_name, set_position (WIN_POS_CENTER); get_vbox()->set_spacing (6); + cancel_button = add_button ((cancel_not_quit ? Stock::CANCEL : Stock::QUIT), RESPONSE_CANCEL); + back_button = add_button (Stock::GO_BACK, RESPONSE_NO); + open_button = add_button (Stock::OPEN, RESPONSE_ACCEPT); + + back_button->signal_button_press_event().connect (sigc::mem_fun (*this, &SessionDialog::back_button_pressed), false); + + open_button->set_sensitive (false); + back_button->set_sensitive (false); + /* this is where announcements will be displayed, but it may be empty * and invisible most of the time. */ @@ -108,15 +117,6 @@ SessionDialog::SessionDialog (bool require_new, const std::string& session_name, get_vbox()->show_all (); - cancel_button = add_button ((cancel_not_quit ? Stock::CANCEL : Stock::QUIT), RESPONSE_CANCEL); - back_button = add_button (Stock::GO_BACK, RESPONSE_NO); - open_button = add_button (Stock::OPEN, RESPONSE_ACCEPT); - - back_button->signal_button_press_event().connect (sigc::mem_fun (*this, &SessionDialog::back_button_pressed), false); - - open_button->set_sensitive (false); - back_button->set_sensitive (false); - /* fill data models and how/hide accordingly */ populate_session_templates (); -- cgit v1.2.3 From f5cd838afcbee304302b3ab6b56a058f72c1bc2e Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Tue, 24 Sep 2013 22:22:43 -0400 Subject: start explicitly linking against libtimecode (this needs to happen elsewhere too) --- libs/ardour/wscript | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/ardour/wscript b/libs/ardour/wscript index 474a9c58c6..0fd5c4e80f 100644 --- a/libs/ardour/wscript +++ b/libs/ardour/wscript @@ -341,7 +341,7 @@ def build(bld): 'OSX','BOOST','CURL','DL'] obj.use = ['libpbd','libmidipp','libevoral','libvamphost', 'libvampplugin','libtaglib','librubberband', - 'libaudiographer','libltc'] + 'libaudiographer','libltc','libtimecode'] obj.vnum = LIBARDOUR_LIB_VERSION obj.install_path = os.path.join(bld.env['LIBDIR'], 'ardour3') obj.defines = [ -- cgit v1.2.3 From e43a8dac1ccfd7bb9766c9714eb0f47aca72283b Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Wed, 25 Sep 2013 17:59:10 -0400 Subject: make information extraction from session file options list robust against some old badly formatted session files Fixes crash experienced by GillesM, where a rogue XML entry caused a segfault --- libs/ardour/session_state.cc | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/libs/ardour/session_state.cc b/libs/ardour/session_state.cc index 2b2afc0d3d..d96db8f188 100644 --- a/libs/ardour/session_state.cc +++ b/libs/ardour/session_state.cc @@ -3784,11 +3784,20 @@ Session::get_info_from_path (const string& xmlpath, float& sample_rate, SampleFo const XMLNodeList& options (child->children()); for (XMLNodeList::const_iterator oc = options.begin(); oc != options.end(); ++oc) { const XMLNode* option = *oc; - if (option->property("name")->value() == "native-file-data-format") { - SampleFormat fmt = (SampleFormat) string_2_enum (option->property ("value")->value(), fmt); - data_format = fmt; - found_data_format = true; - break; + const XMLProperty* name = option->property("name"); + + if (!name) { + continue; + } + + if (name->value() == "native-file-data-format") { + const XMLProperty* value = option->property ("value"); + if (value) { + SampleFormat fmt = (SampleFormat) string_2_enum (option->property ("value")->value(), fmt); + data_format = fmt; + found_data_format = true; + break; + } } } } -- cgit v1.2.3 From d6274d5c3e588ee0b66bf95551567a77b38b3619 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Wed, 25 Sep 2013 18:24:32 -0400 Subject: fix up enum mess caused by switching from JACK to Engine as the name for jack-related transport sync This will allow older versions of Ardour to continue to startup when the user sync preference is "JACK", because the string used by enum_2_string() will still be "JACK". Versions of ardour3 from git after the enum change until this commit will leave ardour.rc unloaded by old versions of Ardour ***if*** the user sync choice was "JACK". --- libs/ardour/ardour/types.h | 6 +++++- libs/ardour/enums.cc | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/libs/ardour/ardour/types.h b/libs/ardour/ardour/types.h index ca3f1acc19..526a71c58b 100644 --- a/libs/ardour/ardour/types.h +++ b/libs/ardour/ardour/types.h @@ -489,8 +489,12 @@ namespace ARDOUR { }; enum SyncSource { - Engine = 0, + /* These are "synonyms". It is important for JACK to be first + both here and in enums.cc, so that the string "JACK" is + correctly recognized in older session and preference files. + */ JACK = 0, + Engine = 0, MTC, MIDIClock, LTC diff --git a/libs/ardour/enums.cc b/libs/ardour/enums.cc index 3898a0e881..2a38cd2c8a 100644 --- a/libs/ardour/enums.cc +++ b/libs/ardour/enums.cc @@ -335,8 +335,8 @@ setup_enum_writer () REGISTER (_PluginType); REGISTER_ENUM (MTC); - REGISTER_ENUM (Engine); REGISTER_ENUM (JACK); + REGISTER_ENUM (Engine); REGISTER_ENUM (MIDIClock); REGISTER_ENUM (LTC); REGISTER (_SyncSource); -- cgit v1.2.3 From c736d88a5f71a1e5d8c975c7222b93cdc1d4204b Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Wed, 25 Sep 2013 22:56:28 -0400 Subject: don't ping JACK server 4 times to see if it is already up when ardour starts --- libs/backends/jack/jack_api.cc | 2 +- libs/backends/jack/jack_audiobackend.cc | 5 ++++- libs/backends/jack/jack_connection.cc | 36 ++++++++++----------------------- libs/backends/jack/jack_connection.h | 6 ++---- 4 files changed, 18 insertions(+), 31 deletions(-) diff --git a/libs/backends/jack/jack_api.cc b/libs/backends/jack/jack_api.cc index 836acfda11..c8859a1fc9 100644 --- a/libs/backends/jack/jack_api.cc +++ b/libs/backends/jack/jack_api.cc @@ -63,7 +63,7 @@ deinstantiate () static bool already_configured () { - return JackConnection::server_running (); + return !JackConnection::in_control (); } static ARDOUR::AudioBackendInfo _descriptor = { diff --git a/libs/backends/jack/jack_audiobackend.cc b/libs/backends/jack/jack_audiobackend.cc index d4e2f310d3..c6a523f4d2 100644 --- a/libs/backends/jack/jack_audiobackend.cc +++ b/libs/backends/jack/jack_audiobackend.cc @@ -513,7 +513,10 @@ JACKAudioBackend::start () { if (!available()) { - if (!_jack_connection->server_running()) { + if (_jack_connection->in_control()) { + /* we will be starting JACK, so set up the + command that JACK will use when it (auto-)starts + */ setup_jack_startup_command (); } diff --git a/libs/backends/jack/jack_connection.cc b/libs/backends/jack/jack_connection.cc index d5d25c747f..b3d7fcecc4 100644 --- a/libs/backends/jack/jack_connection.cc +++ b/libs/backends/jack/jack_connection.cc @@ -36,6 +36,8 @@ using std::vector; using std::cerr; using std::endl; +bool JackConnection::_in_control = false; + static void jack_halted_callback (void* arg) { JackConnection* jc = static_cast (arg); @@ -54,17 +56,9 @@ JackConnection::JackConnection (const std::string& arg1, const std::string& arg2 , _client_name (arg1) , session_uuid (arg2) { - _in_control = !server_running(); -} - -JackConnection::~JackConnection () -{ - close (); -} + /* See if the server is already up + */ -bool -JackConnection::server_running () -{ EnvironmentalProtectionAgency* global_epa = EnvironmentalProtectionAgency::get_global_epa (); boost::scoped_ptr current_epa; @@ -83,10 +77,15 @@ JackConnection::server_running () if (status == 0) { jack_client_close (c); - return true; + _in_control = false; + } else { + _in_control = true; } +} - return false; +JackConnection::~JackConnection () +{ + close (); } int @@ -106,19 +105,6 @@ JackConnection::open () global_epa->restore (); } - /* check to see if the server is already running so that we know if we - * are starting it. - */ - - jack_client_t* c = jack_client_open ("ardourprobe", JackNoStartServer, &status); - - if (status == 0) { - _in_control = false; - jack_client_close (c); - } else { - _in_control = true; - } - /* ensure that PATH or equivalent includes likely locations of the JACK * server, in case the user's default does not. */ diff --git a/libs/backends/jack/jack_connection.h b/libs/backends/jack/jack_connection.h index 229d9697d9..8d15be6e3a 100644 --- a/libs/backends/jack/jack_connection.h +++ b/libs/backends/jack/jack_connection.h @@ -27,15 +27,13 @@ class JackConnection { void halted_callback (); void halted_info_callback (jack_status_t, const char*); - bool in_control() const { return _in_control; } + static bool in_control() { return _in_control; } - static bool server_running(); - private: jack_client_t* volatile _jack; std::string _client_name; std::string session_uuid; - bool _in_control; + static bool _in_control; }; } // namespace -- cgit v1.2.3 From 82f0f3a9a76097402afae8be1c9a65d526ad8cf2 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Wed, 2 Oct 2013 16:17:22 -0400 Subject: fix up crash caused by changes in object creation order and setting the state of the click IO object --- libs/ardour/ardour/session.h | 1 + libs/ardour/session.cc | 15 +++++++++++---- libs/ardour/session_state.cc | 8 +------- 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h index 2fcf6d476a..937ae4fb2e 100644 --- a/libs/ardour/ardour/session.h +++ b/libs/ardour/ardour/session.h @@ -1619,6 +1619,7 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi void setup_ltc (); void setup_click (); + void setup_click_state (const XMLNode&); void setup_bundles (); static int get_session_info_from_path (XMLTree& state_tree, const std::string& xmlpath); diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc index d45375fe0d..28849e2930 100644 --- a/libs/ardour/session.cc +++ b/libs/ardour/session.cc @@ -592,14 +592,21 @@ Session::setup_ltc () void Session::setup_click () { - XMLNode* child = 0; - _clicking = false; _click_io.reset (new ClickIO (*this, "click")); _click_gain.reset (new Amp (*this)); _click_gain->activate (); - - if (state_tree && (child = find_named_node (*state_tree->root(), "Click")) != 0) { + if (state_tree) { + setup_click_state (*state_tree->root()); + } +} + +void +Session::setup_click_state (const XMLNode& node) +{ + const XMLNode* child = 0; + + if ((child = find_named_node (node, "Click")) != 0) { /* existing state for Click */ int c = 0; diff --git a/libs/ardour/session_state.cc b/libs/ardour/session_state.cc index d96db8f188..94e9f00564 100644 --- a/libs/ardour/session_state.cc +++ b/libs/ardour/session_state.cc @@ -1317,13 +1317,7 @@ Session::set_state (const XMLNode& node, int version) if ((child = find_named_node (node, "Click")) == 0) { warning << _("Session: XML state has no click section") << endmsg; } else if (_click_io) { - const XMLNodeList& children (child->children()); - XMLNodeList::const_iterator i = children.begin(); - _click_io->set_state (**i, version); - ++i; - if (i != children.end()) { - _click_gain->set_state (**i, version); - } + setup_click_state (node); } if ((child = find_named_node (node, ControlProtocolManager::state_node_name)) != 0) { -- cgit v1.2.3 From df363a4fb3057253c1530941176cac49a7ffd409 Mon Sep 17 00:00:00 2001 From: Tim Mayberry Date: Wed, 14 Aug 2013 20:30:09 +1000 Subject: Add AudioBackendThread class to support different thread type on windows --- libs/ardour/ardour/audio_backend.h | 8 ++++-- libs/ardour/ardour/audio_backend_thread.h | 32 +++++++++++++++++++++ libs/ardour/ardour/audioengine.h | 9 ++++-- libs/ardour/ardour/graph.h | 6 ++-- libs/ardour/ardour/types.h | 10 ------- libs/ardour/audioengine.cc | 19 ++++++++---- libs/ardour/graph.cc | 21 ++++++-------- libs/backends/jack/jack_audiobackend.cc | 48 +++++++++++++++++++++++++++---- libs/backends/jack/jack_audiobackend.h | 5 ++-- 9 files changed, 115 insertions(+), 43 deletions(-) create mode 100644 libs/ardour/ardour/audio_backend_thread.h diff --git a/libs/ardour/ardour/audio_backend.h b/libs/ardour/ardour/audio_backend.h index 9052acd530..3d65af481d 100644 --- a/libs/ardour/ardour/audio_backend.h +++ b/libs/ardour/ardour/audio_backend.h @@ -399,13 +399,17 @@ class AudioBackend : public PortEngine { * stacksize. The thread will begin executing @param func, and will exit * when that function returns. */ - virtual int create_process_thread (boost::function func, AudioBackendNativeThread*, size_t stacksize) = 0; + virtual int create_process_thread (boost::function func, AudioBackendThread*, size_t stacksize) = 0; /** Wait for the thread specified by @param thread to exit. * * Return zero on success, non-zero on failure. */ - virtual int wait_for_process_thread_exit (AudioBackendNativeThread thread) = 0; + virtual int join_process_thread (AudioBackendThread* thread) = 0; + + /** Return true if execution context is in a backend thread + */ + virtual bool in_process_thread () = 0; virtual void update_latencies () = 0; diff --git a/libs/ardour/ardour/audio_backend_thread.h b/libs/ardour/ardour/audio_backend_thread.h new file mode 100644 index 0000000000..90efecbc94 --- /dev/null +++ b/libs/ardour/ardour/audio_backend_thread.h @@ -0,0 +1,32 @@ +/* + Copyright (C) 2013 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. + +*/ + +namespace ARDOUR { + +class AudioBackendThread +{ +public: + + AudioBackendThread () { } + + virtual ~AudioBackendThread () { } + +}; + +} // namespace ARDOUR diff --git a/libs/ardour/ardour/audioengine.h b/libs/ardour/ardour/audioengine.h index 201d960479..82364ca191 100644 --- a/libs/ardour/ardour/audioengine.h +++ b/libs/ardour/ardour/audioengine.h @@ -58,6 +58,7 @@ class Session; class ProcessThread; class AudioBackend; class AudioBackendInfo; +class AudioBackendThread; class AudioEngine : public SessionHandlePtr, public PortManager { @@ -100,8 +101,12 @@ public: pframes_t sample_time_at_cycle_start (); pframes_t samples_since_cycle_start (); bool get_sync_offset (pframes_t& offset) const; - int create_process_thread (boost::function func, AudioBackendNativeThread*, size_t stacksize); - int wait_for_process_thread_exit (AudioBackendNativeThread); + + int create_process_thread (boost::function func, AudioBackendThread*, size_t stacksize); + int join_process_thread (AudioBackendThread*); + + bool in_process_thread (); + bool is_realtime() const; bool connected() const; diff --git a/libs/ardour/ardour/graph.h b/libs/ardour/ardour/graph.h index 08af6fb721..ed9e22de31 100644 --- a/libs/ardour/ardour/graph.h +++ b/libs/ardour/ardour/graph.h @@ -31,8 +31,6 @@ #include #include -#include - #include "pbd/semutils.h" #include "ardour/types.h" @@ -49,6 +47,8 @@ class Route; class Session; class GraphEdges; +class AudioBackendThread; + typedef boost::shared_ptr node_ptr_t; typedef std::list< node_ptr_t > node_list_t; @@ -93,7 +93,7 @@ protected: virtual void session_going_away (); private: - std::list _thread_list; + std::list _thread_list; volatile bool _quit_threads; void reset_thread_list (); diff --git a/libs/ardour/ardour/types.h b/libs/ardour/ardour/types.h index 526a71c58b..ee43d1f30f 100644 --- a/libs/ardour/ardour/types.h +++ b/libs/ardour/ardour/types.h @@ -615,16 +615,6 @@ namespace ARDOUR { uint32_t max; //< samples }; -/* PLATFORM SPECIFIC #ifdef's here */ - - /** Define the native thread type used on the platform */ - typedef pthread_t AudioBackendNativeThread; - static inline bool self_thread_equal (AudioBackendNativeThread thr) { - return pthread_equal (thr, pthread_self()); - } - -/* PLATFORM SPECIFIC #endif's here */ - } // namespace ARDOUR diff --git a/libs/ardour/audioengine.cc b/libs/ardour/audioengine.cc index 465f88de56..38e9ad0b86 100644 --- a/libs/ardour/audioengine.cc +++ b/libs/ardour/audioengine.cc @@ -826,21 +826,30 @@ AudioEngine::get_sync_offset (pframes_t& offset) const } int -AudioEngine::create_process_thread (boost::function func, AudioBackendNativeThread* thr, size_t stacksize) +AudioEngine::create_process_thread (boost::function func, AudioBackendThread* thread, size_t stacksize) { if (!_backend) { return -1; } - return _backend->create_process_thread (func, thr, stacksize); + return _backend->create_process_thread (func, thread, stacksize); } int -AudioEngine::wait_for_process_thread_exit (AudioBackendNativeThread thr) +AudioEngine::join_process_thread (AudioBackendThread* thr) { if (!_backend) { - return 0; + return -1; + } + return _backend->join_process_thread (thr); +} + +bool +AudioEngine::in_process_thread () +{ + if (!_backend) { + return false; } - return _backend->wait_for_process_thread_exit (thr); + return _backend->in_process_thread (); } int diff --git a/libs/ardour/graph.cc b/libs/ardour/graph.cc index c8e374cddc..8b3d24031b 100644 --- a/libs/ardour/graph.cc +++ b/libs/ardour/graph.cc @@ -101,24 +101,24 @@ Graph::reset_thread_list () } Glib::Threads::Mutex::Lock lm (_session.engine().process_lock()); - AudioBackendNativeThread a_thread; + AudioBackendThread* backend_thread; if (!_thread_list.empty()) { drop_threads (); } - if (AudioEngine::instance()->create_process_thread (boost::bind (&Graph::main_thread, this), &a_thread, 100000) != 0) { + if (AudioEngine::instance()->create_process_thread (boost::bind (&Graph::main_thread, this), backend_thread, 100000) != 0) { throw failed_constructor (); } - _thread_list.push_back (a_thread); + _thread_list.push_back (backend_thread); for (uint32_t i = 1; i < num_threads; ++i) { - if (AudioEngine::instance()->create_process_thread (boost::bind (&Graph::helper_thread, this), &a_thread, 100000) != 0) { + if (AudioEngine::instance()->create_process_thread (boost::bind (&Graph::helper_thread, this), backend_thread, 100000) != 0) { throw failed_constructor (); } - _thread_list.push_back (a_thread); + _thread_list.push_back (backend_thread); } } @@ -146,8 +146,8 @@ Graph::drop_threads () _callback_start_sem.signal (); - for (list::iterator i = _thread_list.begin(); i != _thread_list.end(); ++i) { - AudioEngine::instance()->wait_for_process_thread_exit (*i); + for (list::iterator i = _thread_list.begin(); i != _thread_list.end(); ++i) { + AudioEngine::instance()->join_process_thread (*i); } _thread_list.clear (); @@ -583,10 +583,5 @@ Graph::process_one_route (Route* route) bool Graph::in_process_thread () const { - for (list::const_iterator i = _thread_list.begin (); i != _thread_list.end(); ++i) { - if (self_thread_equal (*i)) { - return true; - } - } - return false; + return AudioEngine::instance()->in_process_thread (); } diff --git a/libs/backends/jack/jack_audiobackend.cc b/libs/backends/jack/jack_audiobackend.cc index c6a523f4d2..cd4874e85a 100644 --- a/libs/backends/jack/jack_audiobackend.cc +++ b/libs/backends/jack/jack_audiobackend.cc @@ -33,6 +33,7 @@ #include "ardour/audioengine.h" #include "ardour/session.h" #include "ardour/types.h" +#include "ardour/audio_backend_thread.h" #include "jack_audiobackend.h" #include "jack_connection.h" @@ -45,6 +46,17 @@ using namespace PBD; using std::string; using std::vector; +class JACKAudioBackendThread : public AudioBackendThread +{ +public: + + JACKAudioBackendThread (jack_native_thread_t id) + : thread_id(id) { } + + jack_native_thread_t thread_id; + +}; + #define GET_PRIVATE_JACK_POINTER(localvar) jack_client_t* localvar = _jack_connection->jack(); if (!(localvar)) { return; } #define GET_PRIVATE_JACK_POINTER_RET(localvar,r) jack_client_t* localvar = _jack_connection->jack(); if (!(localvar)) { return r; } @@ -825,25 +837,49 @@ JACKAudioBackend::_latency_callback (jack_latency_callback_mode_t mode, void* ar } int -JACKAudioBackend::create_process_thread (boost::function f, pthread_t* thread, size_t stacksize) +JACKAudioBackend::create_process_thread (boost::function f, AudioBackendThread* backend_thread, size_t stacksize) { GET_PRIVATE_JACK_POINTER_RET (_priv_jack, -1); + + jack_native_thread_t thread_id; ThreadData* td = new ThreadData (this, f, stacksize); - if (jack_client_create_thread (_priv_jack, thread, jack_client_real_time_priority (_priv_jack), + if (jack_client_create_thread (_priv_jack, &thread_id, jack_client_real_time_priority (_priv_jack), jack_is_realtime (_priv_jack), _start_process_thread, td)) { return -1; } - return 0; + backend_thread = new JACKAudioBackendThread(thread_id); + return 0; } int -JACKAudioBackend::wait_for_process_thread_exit (AudioBackendNativeThread thr) +JACKAudioBackend::join_process_thread (AudioBackendThread* backend_thread) { + GET_PRIVATE_JACK_POINTER_RET (_priv_jack, -1); + + JACKAudioBackendThread * jack_thread = dynamic_cast(backend_thread); + int ret = 0; + +#if defined(USING_JACK2_EXPANSION_OF_JACK_API) || defined(PLATFORM_WINDOWS) + if (jack_client_stop_thread (_priv_jack, jack_thread->thread_id) != 0) { + error << "AudioEngine: cannot stop process thread" << endmsg; + ret = -1; + } +#else void* status; - /* this doesn't actively try to stop the thread, it just waits till it exits */ - return pthread_join (thr, &status); + ret = pthread_join (jack_thread->thread_id, &status); +#endif + delete jack_thread; + return ret; +} + +bool +JACKAudioBackend::in_process_thread () +{ + // XXX TODO + + return false; } void* diff --git a/libs/backends/jack/jack_audiobackend.h b/libs/backends/jack/jack_audiobackend.h index 9ab545f3ee..822dc71053 100644 --- a/libs/backends/jack/jack_audiobackend.h +++ b/libs/backends/jack/jack_audiobackend.h @@ -103,8 +103,9 @@ class JACKAudioBackend : public AudioBackend { size_t raw_buffer_size (DataType t); - int create_process_thread (boost::function func, AudioBackendNativeThread*, size_t stacksize); - int wait_for_process_thread_exit (AudioBackendNativeThread); + int create_process_thread (boost::function func, AudioBackendThread*, size_t stacksize); + int join_process_thread (AudioBackendThread*); + bool in_process_thread (); void transport_start (); void transport_stop (); -- cgit v1.2.3 From 53ad2d187ffb31edcb90f7db5799886ee1806586 Mon Sep 17 00:00:00 2001 From: Tim Mayberry Date: Wed, 2 Oct 2013 19:40:48 +1000 Subject: Move processing thread list from ARDOUR::Graph into AudioBackend implementation --- libs/ardour/ardour/audio_backend.h | 14 ++++++++-- libs/ardour/ardour/audio_backend_thread.h | 32 --------------------- libs/ardour/ardour/audioengine.h | 7 ++--- libs/ardour/ardour/graph.h | 5 ---- libs/ardour/audioengine.cc | 17 +++++++++--- libs/ardour/graph.cc | 23 ++++++---------- libs/backends/jack/jack_audiobackend.cc | 46 +++++++++++++++---------------- libs/backends/jack/jack_audiobackend.h | 7 +++-- 8 files changed, 63 insertions(+), 88 deletions(-) delete mode 100644 libs/ardour/ardour/audio_backend_thread.h diff --git a/libs/ardour/ardour/audio_backend.h b/libs/ardour/ardour/audio_backend.h index 3d65af481d..0e39625e8c 100644 --- a/libs/ardour/ardour/audio_backend.h +++ b/libs/ardour/ardour/audio_backend.h @@ -399,18 +399,26 @@ class AudioBackend : public PortEngine { * stacksize. The thread will begin executing @param func, and will exit * when that function returns. */ - virtual int create_process_thread (boost::function func, AudioBackendThread*, size_t stacksize) = 0; + virtual int create_process_thread (boost::function func) = 0; - /** Wait for the thread specified by @param thread to exit. + /** Wait for all processing threads to exit. * * Return zero on success, non-zero on failure. */ - virtual int join_process_thread (AudioBackendThread* thread) = 0; + virtual int join_process_threads () = 0; /** Return true if execution context is in a backend thread */ virtual bool in_process_thread () = 0; + /** Return the minimum stack size of audio threads in bytes + */ + static size_t thread_stack_size () { return 100000; } + + /** Return number of processing threads + */ + virtual uint32_t process_thread_count () = 0; + virtual void update_latencies () = 0; protected: diff --git a/libs/ardour/ardour/audio_backend_thread.h b/libs/ardour/ardour/audio_backend_thread.h deleted file mode 100644 index 90efecbc94..0000000000 --- a/libs/ardour/ardour/audio_backend_thread.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - Copyright (C) 2013 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. - -*/ - -namespace ARDOUR { - -class AudioBackendThread -{ -public: - - AudioBackendThread () { } - - virtual ~AudioBackendThread () { } - -}; - -} // namespace ARDOUR diff --git a/libs/ardour/ardour/audioengine.h b/libs/ardour/ardour/audioengine.h index 82364ca191..1bf4be3243 100644 --- a/libs/ardour/ardour/audioengine.h +++ b/libs/ardour/ardour/audioengine.h @@ -58,7 +58,6 @@ class Session; class ProcessThread; class AudioBackend; class AudioBackendInfo; -class AudioBackendThread; class AudioEngine : public SessionHandlePtr, public PortManager { @@ -102,10 +101,10 @@ public: pframes_t samples_since_cycle_start (); bool get_sync_offset (pframes_t& offset) const; - int create_process_thread (boost::function func, AudioBackendThread*, size_t stacksize); - int join_process_thread (AudioBackendThread*); - + int create_process_thread (boost::function func); + int join_process_threads (); bool in_process_thread (); + uint32_t process_thread_count (); bool is_realtime() const; bool connected() const; diff --git a/libs/ardour/ardour/graph.h b/libs/ardour/ardour/graph.h index ed9e22de31..763723c792 100644 --- a/libs/ardour/ardour/graph.h +++ b/libs/ardour/ardour/graph.h @@ -47,8 +47,6 @@ class Route; class Session; class GraphEdges; -class AudioBackendThread; - typedef boost::shared_ptr node_ptr_t; typedef std::list< node_ptr_t > node_list_t; @@ -59,8 +57,6 @@ class Graph : public SessionHandleRef public: Graph (Session & session); - uint32_t threads_in_use () const { return _thread_list.size(); } - void prep(); void trigger (GraphNode * n); void rechain (boost::shared_ptr, GraphEdges const &); @@ -93,7 +89,6 @@ protected: virtual void session_going_away (); private: - std::list _thread_list; volatile bool _quit_threads; void reset_thread_list (); diff --git a/libs/ardour/audioengine.cc b/libs/ardour/audioengine.cc index 38e9ad0b86..631a861741 100644 --- a/libs/ardour/audioengine.cc +++ b/libs/ardour/audioengine.cc @@ -826,21 +826,21 @@ AudioEngine::get_sync_offset (pframes_t& offset) const } int -AudioEngine::create_process_thread (boost::function func, AudioBackendThread* thread, size_t stacksize) +AudioEngine::create_process_thread (boost::function func) { if (!_backend) { return -1; } - return _backend->create_process_thread (func, thread, stacksize); + return _backend->create_process_thread (func); } int -AudioEngine::join_process_thread (AudioBackendThread* thr) +AudioEngine::join_process_threads () { if (!_backend) { return -1; } - return _backend->join_process_thread (thr); + return _backend->join_process_threads (); } bool @@ -852,6 +852,15 @@ AudioEngine::in_process_thread () return _backend->in_process_thread (); } +uint32_t +AudioEngine::process_thread_count () +{ + if (!_backend) { + return 0; + } + return _backend->process_thread_count (); +} + int AudioEngine::set_device_name (const std::string& name) { diff --git a/libs/ardour/graph.cc b/libs/ardour/graph.cc index 8b3d24031b..71eeee41ea 100644 --- a/libs/ardour/graph.cc +++ b/libs/ardour/graph.cc @@ -96,29 +96,24 @@ Graph::reset_thread_list () number of threads. */ - if (_thread_list.size() == num_threads) { + if (AudioEngine::instance()->process_thread_count() == num_threads) { return; } Glib::Threads::Mutex::Lock lm (_session.engine().process_lock()); - AudioBackendThread* backend_thread; - if (!_thread_list.empty()) { + if (AudioEngine::instance()->process_thread_count() != 0) { drop_threads (); } - if (AudioEngine::instance()->create_process_thread (boost::bind (&Graph::main_thread, this), backend_thread, 100000) != 0) { + if (AudioEngine::instance()->create_process_thread (boost::bind (&Graph::main_thread, this)) != 0) { throw failed_constructor (); } - _thread_list.push_back (backend_thread); - for (uint32_t i = 1; i < num_threads; ++i) { - if (AudioEngine::instance()->create_process_thread (boost::bind (&Graph::helper_thread, this), backend_thread, 100000) != 0) { + if (AudioEngine::instance()->create_process_thread (boost::bind (&Graph::helper_thread, this))) { throw failed_constructor (); } - - _thread_list.push_back (backend_thread); } } @@ -140,17 +135,15 @@ Graph::drop_threads () { _quit_threads = true; - for (unsigned int i=0; i< _thread_list.size(); i++) { + uint32_t thread_count = AudioEngine::instance()->process_thread_count (); + + for (unsigned int i=0; i < thread_count; i++) { _execution_sem.signal (); } _callback_start_sem.signal (); - for (list::iterator i = _thread_list.begin(); i != _thread_list.end(); ++i) { - AudioEngine::instance()->join_process_thread (*i); - } - - _thread_list.clear (); + AudioEngine::instance()->join_process_threads (); _execution_tokens = 0; diff --git a/libs/backends/jack/jack_audiobackend.cc b/libs/backends/jack/jack_audiobackend.cc index cd4874e85a..19f15b1fa1 100644 --- a/libs/backends/jack/jack_audiobackend.cc +++ b/libs/backends/jack/jack_audiobackend.cc @@ -33,7 +33,6 @@ #include "ardour/audioengine.h" #include "ardour/session.h" #include "ardour/types.h" -#include "ardour/audio_backend_thread.h" #include "jack_audiobackend.h" #include "jack_connection.h" @@ -46,16 +45,6 @@ using namespace PBD; using std::string; using std::vector; -class JACKAudioBackendThread : public AudioBackendThread -{ -public: - - JACKAudioBackendThread (jack_native_thread_t id) - : thread_id(id) { } - - jack_native_thread_t thread_id; - -}; #define GET_PRIVATE_JACK_POINTER(localvar) jack_client_t* localvar = _jack_connection->jack(); if (!(localvar)) { return; } #define GET_PRIVATE_JACK_POINTER_RET(localvar,r) jack_client_t* localvar = _jack_connection->jack(); if (!(localvar)) { return r; } @@ -837,40 +826,45 @@ JACKAudioBackend::_latency_callback (jack_latency_callback_mode_t mode, void* ar } int -JACKAudioBackend::create_process_thread (boost::function f, AudioBackendThread* backend_thread, size_t stacksize) +JACKAudioBackend::create_process_thread (boost::function f) { GET_PRIVATE_JACK_POINTER_RET (_priv_jack, -1); jack_native_thread_t thread_id; - ThreadData* td = new ThreadData (this, f, stacksize); + ThreadData* td = new ThreadData (this, f, thread_stack_size()); if (jack_client_create_thread (_priv_jack, &thread_id, jack_client_real_time_priority (_priv_jack), jack_is_realtime (_priv_jack), _start_process_thread, td)) { return -1; } - backend_thread = new JACKAudioBackendThread(thread_id); + _jack_threads.push_back(thread_id); return 0; } int -JACKAudioBackend::join_process_thread (AudioBackendThread* backend_thread) +JACKAudioBackend::join_process_threads () { GET_PRIVATE_JACK_POINTER_RET (_priv_jack, -1); - JACKAudioBackendThread * jack_thread = dynamic_cast(backend_thread); int ret = 0; + for (std::vector::const_iterator i = _jack_threads.begin (); + i != _jack_threads.end(); i++) { + #if defined(USING_JACK2_EXPANSION_OF_JACK_API) || defined(PLATFORM_WINDOWS) - if (jack_client_stop_thread (_priv_jack, jack_thread->thread_id) != 0) { - error << "AudioEngine: cannot stop process thread" << endmsg; - ret = -1; - } + if (jack_client_stop_thread (_priv_jack, *i) != 0) { #else - void* status; - ret = pthread_join (jack_thread->thread_id, &status); + void* status; + if (pthread_join (*i, &status) != 0) { #endif - delete jack_thread; + error << "AudioEngine: cannot stop process thread" << endmsg; + ret += -1; + } + } + + _jack_threads.clear(); + return ret; } @@ -882,6 +876,12 @@ JACKAudioBackend::in_process_thread () return false; } +uint32_t +JACKAudioBackend::process_thread_count () +{ + return _jack_threads.size(); +} + void* JACKAudioBackend::_start_process_thread (void* arg) { diff --git a/libs/backends/jack/jack_audiobackend.h b/libs/backends/jack/jack_audiobackend.h index 822dc71053..b8d8b3b3f1 100644 --- a/libs/backends/jack/jack_audiobackend.h +++ b/libs/backends/jack/jack_audiobackend.h @@ -103,9 +103,10 @@ class JACKAudioBackend : public AudioBackend { size_t raw_buffer_size (DataType t); - int create_process_thread (boost::function func, AudioBackendThread*, size_t stacksize); - int join_process_thread (AudioBackendThread*); + int create_process_thread (boost::function func); + int join_process_threads (); bool in_process_thread (); + uint32_t process_thread_count (); void transport_start (); void transport_stop (); @@ -185,6 +186,8 @@ class JACKAudioBackend : public AudioBackend { bool _freewheeling; std::map _raw_buffer_sizes; + std::vector _jack_threads; + static int _xrun_callback (void *arg); static void* _process_thread (void *arg); static int _sample_rate_callback (pframes_t nframes, void *arg); -- cgit v1.2.3 From f3a22fb88027548aebe67107e70113950d72417a Mon Sep 17 00:00:00 2001 From: Tim Mayberry Date: Thu, 3 Oct 2013 19:38:58 +1000 Subject: Implement JACKAudioBackend::in_process_thread --- libs/backends/jack/jack_audiobackend.cc | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/libs/backends/jack/jack_audiobackend.cc b/libs/backends/jack/jack_audiobackend.cc index 19f15b1fa1..a651f2522d 100644 --- a/libs/backends/jack/jack_audiobackend.cc +++ b/libs/backends/jack/jack_audiobackend.cc @@ -871,7 +871,19 @@ JACKAudioBackend::join_process_threads () bool JACKAudioBackend::in_process_thread () { - // XXX TODO + for (std::vector::const_iterator i = _jack_threads.begin (); + i != _jack_threads.end(); i++) { + +#ifdef COMPILER_MINGW + if (*i == GetCurrentThread()) { + return true; + } +#else // pthreads + if (pthread_equal (*i, pthread_self()) != 0) { + return true; + } +#endif + } return false; } -- cgit v1.2.3 From 74f3955682ba25f9d0bd5cc9fb7c8b86a9d36517 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Fri, 4 Oct 2013 11:46:50 -0400 Subject: remove OSC related cruft from ardour_ui_options.cc control surface activation is handled via an entirely separate mechanism now --- gtk2_ardour/ardour_ui_options.cc | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/gtk2_ardour/ardour_ui_options.cc b/gtk2_ardour/ardour_ui_options.cc index 618169d2e8..0e28900450 100644 --- a/gtk2_ardour/ardour_ui_options.cc +++ b/gtk2_ardour/ardour_ui_options.cc @@ -29,10 +29,6 @@ #include "ardour/rc_configuration.h" #include "ardour/session.h" -#ifdef HAVE_LIBLO -#include "ardour/osc.h" -#endif - #include "audio_clock.h" #include "ardour_ui.h" #include "actions.h" @@ -342,16 +338,6 @@ ARDOUR_UI::parameter_changed (std::string p) ActionManager::map_some_state ("options", "SendMMC", &RCConfiguration::get_send_mmc); - } else if (p == "use-osc") { - -#ifdef HAVE_LIBLO - if (Config->get_use_osc()) { - osc->start (); - } else { - osc->stop (); - } -#endif - } else if (p == "keep-tearoffs") { ActionManager::map_some_state ("Common", "KeepTearoffs", &RCConfiguration::get_keep_tearoffs); } else if (p == "mmc-control") { -- cgit v1.2.3 From 3aee160b19b7ae0637475331ae003eb2ae78aae6 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Fri, 4 Oct 2013 12:22:00 -0400 Subject: provide PBD::demangle() even on platforms without HAVE_EXECINFO --- libs/pbd/stacktrace.cc | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/libs/pbd/stacktrace.cc b/libs/pbd/stacktrace.cc index 805b9a2e84..b78f0e9338 100644 --- a/libs/pbd/stacktrace.cc +++ b/libs/pbd/stacktrace.cc @@ -96,6 +96,12 @@ PBD::stacktrace (std::ostream& out, int levels) #else +std::string +PBD::demangle (std::string const & l) +{ + return string; +} + void PBD::stacktrace (std::ostream& out, int /*levels*/) { -- cgit v1.2.3 From 6daa7c1bc31d9688cb2aa2d20bac7c7893f6fc1c Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Fri, 4 Oct 2013 12:46:02 -0400 Subject: remove unnecessary header include --- gtk2_ardour/transcode_video_dialog.cc | 1 - 1 file changed, 1 deletion(-) diff --git a/gtk2_ardour/transcode_video_dialog.cc b/gtk2_ardour/transcode_video_dialog.cc index d4ad8a24ed..6e4a1a3298 100644 --- a/gtk2_ardour/transcode_video_dialog.cc +++ b/gtk2_ardour/transcode_video_dialog.cc @@ -28,7 +28,6 @@ #include #include -#include #include "pbd/error.h" #include "pbd/convert.h" -- cgit v1.2.3 From 1344014cbdc92cd8db6dbb20a9547ea143d8ed20 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Fri, 4 Oct 2013 12:46:31 -0400 Subject: switch from MAXPATHLEN to PATH_MAX, and use not for portability --- gtk2_ardour/sfdb_ui.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gtk2_ardour/sfdb_ui.cc b/gtk2_ardour/sfdb_ui.cc index 5f8564374e..4944ef41a0 100644 --- a/gtk2_ardour/sfdb_ui.cc +++ b/gtk2_ardour/sfdb_ui.cc @@ -26,8 +26,8 @@ #include #include +#include #include -#include #include #include @@ -1468,7 +1468,7 @@ SoundFileOmega::check_link_status (const Session* s, const vector& paths for (vector::const_iterator i = paths.begin(); i != paths.end(); ++i) { - char tmpc[MAXPATHLEN+1]; + char tmpc[PATH_MAX+1]; snprintf (tmpc, sizeof(tmpc), "%s/%s", tmpdir.c_str(), Glib::path_get_basename (*i).c_str()); -- cgit v1.2.3 From 028cd5660f72576dd13dbf838b8ae8eef2e74098 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Fri, 4 Oct 2013 12:50:03 -0400 Subject: use g_strcasecmp() instead of strcasecmp() which doesn't exist with MSVC (some versions, at least) --- gtk2_ardour/gtk_pianokeyboard.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/gtk2_ardour/gtk_pianokeyboard.c b/gtk2_ardour/gtk_pianokeyboard.c index 1e5768040e..f3897e3d44 100644 --- a/gtk2_ardour/gtk_pianokeyboard.c +++ b/gtk2_ardour/gtk_pianokeyboard.c @@ -33,9 +33,9 @@ #include #include -#include #include #include + #include #include @@ -732,13 +732,13 @@ piano_keyboard_set_keyboard_layout(PianoKeyboard *pk, const char *layout) { assert(layout); - if (!strcasecmp(layout, "QWERTY")) { + if (!g_strcasecmp(layout, "QWERTY")) { bind_keys_qwerty(pk); - } else if (!strcasecmp(layout, "QWERTZ")) { + } else if (!g_strcasecmp(layout, "QWERTZ")) { bind_keys_qwertz(pk); - } else if (!strcasecmp(layout, "AZERTY")) { + } else if (!g_strcasecmp(layout, "AZERTY")) { bind_keys_azerty(pk); } else { -- cgit v1.2.3 From ddcb78f3e2a6e6e6404a61e7ea52a1d4fd2c44e7 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Fri, 4 Oct 2013 13:00:59 -0400 Subject: use g_strcasecmp() instead of strcasecmp() which doesn't exist with MSVC (some versions, at least), part 2 --- gtk2_ardour/editor_regions.cc | 8 ++++---- gtk2_ardour/plugin_selector.cc | 10 +++++----- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/gtk2_ardour/editor_regions.cc b/gtk2_ardour/editor_regions.cc index ad5263d1d1..72a0da2909 100644 --- a/gtk2_ardour/editor_regions.cc +++ b/gtk2_ardour/editor_regions.cc @@ -1115,7 +1115,7 @@ EditorRegions::sorter (TreeModel::iterator a, TreeModel::iterator b) switch (_sort_type) { case ByName: - cmp = strcasecmp (region1->name().c_str(), region2->name().c_str()); + cmp = g_strcasecmp (region1->name().c_str(), region2->name().c_str()); break; case ByLength: @@ -1140,7 +1140,7 @@ EditorRegions::sorter (TreeModel::iterator a, TreeModel::iterator b) break; case BySourceFileName: - cmp = strcasecmp (region1->source()->name().c_str(), region2->source()->name().c_str()); + cmp = g_strcasecmp (region1->source()->name().c_str(), region2->source()->name().c_str()); break; case BySourceFileLength: @@ -1153,9 +1153,9 @@ EditorRegions::sorter (TreeModel::iterator a, TreeModel::iterator b) case BySourceFileFS: if (region1->source()->name() == region2->source()->name()) { - cmp = strcasecmp (region1->name().c_str(), region2->name().c_str()); + cmp = g_strcasecmp (region1->name().c_str(), region2->name().c_str()); } else { - cmp = strcasecmp (region1->source()->name().c_str(), region2->source()->name().c_str()); + cmp = g_strcasecmp (region1->source()->name().c_str(), region2->source()->name().c_str()); } break; } diff --git a/gtk2_ardour/plugin_selector.cc b/gtk2_ardour/plugin_selector.cc index 81adf40896..ebfcc677ac 100644 --- a/gtk2_ardour/plugin_selector.cc +++ b/gtk2_ardour/plugin_selector.cc @@ -538,13 +538,13 @@ struct PluginMenuCompareByCreator { bool operator() (PluginInfoPtr a, PluginInfoPtr b) const { int cmp; - cmp = strcasecmp (a->creator.c_str(), b->creator.c_str()); + cmp = g_strcasecmp (a->creator.c_str(), b->creator.c_str()); if (cmp < 0) { return true; } else if (cmp == 0) { /* same creator ... compare names */ - if (strcasecmp (a->name.c_str(), b->name.c_str()) < 0) { + if (g_strcasecmp (a->name.c_str(), b->name.c_str()) < 0) { return true; } } @@ -556,7 +556,7 @@ struct PluginMenuCompareByName { bool operator() (PluginInfoPtr a, PluginInfoPtr b) const { int cmp; - cmp = strcasecmp (a->name.c_str(), b->name.c_str()); + cmp = g_strcasecmp (a->name.c_str(), b->name.c_str()); if (cmp < 0) { return true; @@ -574,13 +574,13 @@ struct PluginMenuCompareByCategory { bool operator() (PluginInfoPtr a, PluginInfoPtr b) const { int cmp; - cmp = strcasecmp (a->category.c_str(), b->category.c_str()); + cmp = g_strcasecmp (a->category.c_str(), b->category.c_str()); if (cmp < 0) { return true; } else if (cmp == 0) { /* same category ... compare names */ - if (strcasecmp (a->name.c_str(), b->name.c_str()) < 0) { + if (g_strcasecmp (a->name.c_str(), b->name.c_str()) < 0) { return true; } } -- cgit v1.2.3 From 449f600c699ebc60d6520ea43b0ac2b91b13f878 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Fri, 4 Oct 2013 13:02:41 -0400 Subject: remove another unnecessary use of libgen.h --- gtk2_ardour/export_video_dialog.cc | 1 - 1 file changed, 1 deletion(-) diff --git a/gtk2_ardour/export_video_dialog.cc b/gtk2_ardour/export_video_dialog.cc index b1b59fa088..dd08b58661 100644 --- a/gtk2_ardour/export_video_dialog.cc +++ b/gtk2_ardour/export_video_dialog.cc @@ -28,7 +28,6 @@ #include #include -#include #include "pbd/error.h" #include "pbd/convert.h" -- cgit v1.2.3 From d74255343e9f74a2797391b0b6931a49678b5efa Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Sun, 6 Oct 2013 16:32:02 -0400 Subject: fix up some aspects of loading from a cmdline session name --- gtk2_ardour/ardour_ui.cc | 19 ++++++++++++++----- gtk2_ardour/session_dialog.cc | 3 +-- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc index e98e3e00a0..e74b8efe98 100644 --- a/gtk2_ardour/ardour_ui.cc +++ b/gtk2_ardour/ardour_ui.cc @@ -2558,6 +2558,18 @@ ARDOUR_UI::get_session_parameters (bool quit_on_cancel, bool should_be_new, stri template_name = load_template; } + session_name = basename_nosuffix (ARDOUR_COMMAND_LINE::session_name); + session_path = ARDOUR_COMMAND_LINE::session_name; + + if (!session_path.empty()) { + if (Glib::file_test (session_path.c_str(), Glib::FILE_TEST_EXISTS)) { + if (Glib::file_test (session_path.c_str(), Glib::FILE_TEST_IS_REGULAR)) { + /* session/snapshot file, change path to be dir */ + session_path = Glib::path_get_dirname (session_path); + } + } + } + SessionDialog session_dialog (should_be_new, session_name, session_path, load_template, cancel_not_quit); while (ret != 0) { @@ -2606,7 +2618,7 @@ ARDOUR_UI::get_session_parameters (bool quit_on_cancel, bool should_be_new, stri should_be_new = false; session_name = session_dialog.session_name (likely_new); - + if (nsm) { likely_new = true; } @@ -2658,6 +2670,7 @@ ARDOUR_UI::get_session_parameters (bool quit_on_cancel, bool should_be_new, stri if (Glib::file_test (session_path, Glib::FileTest (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR))) { + if (likely_new && !nsm) { std::string existing = Glib::build_filename (session_path, session_name); @@ -2695,8 +2708,6 @@ ARDOUR_UI::get_session_parameters (bool quit_on_cancel, bool should_be_new, stri if (likely_new && template_name.empty()) { - cerr << "building a session from dialog\n"; - ret = build_session_from_dialog (session_dialog, session_path, session_name); } else { @@ -4095,8 +4106,6 @@ ARDOUR_UI::reset_route_peak_display (Route* route) int ARDOUR_UI::do_audio_midi_setup (uint32_t desired_sample_rate) { - cerr << "Do AMS\n"; - audio_midi_setup->set_desired_sample_rate (desired_sample_rate); switch (audio_midi_setup->run()) { diff --git a/gtk2_ardour/session_dialog.cc b/gtk2_ardour/session_dialog.cc index 51c7e24f80..dae19067a7 100644 --- a/gtk2_ardour/session_dialog.cc +++ b/gtk2_ardour/session_dialog.cc @@ -185,6 +185,7 @@ std::string SessionDialog::session_name (bool& should_be_new) { if (!_provided_session_name.empty() && !new_only) { + should_be_new = false; return _provided_session_name; } @@ -276,8 +277,6 @@ SessionDialog::setup_initial_choice_box () info_box->pack_start (info_scroller_label, false, false); - cerr << "Frame should be visible\n"; - info_scroller_count = 0; info_scroller_connection = Glib::signal_timeout().connect (mem_fun(*this, &SessionDialog::info_scroller_update), 50); -- cgit v1.2.3 From 7ac849689da88113d43980dd71b291d09639dc28 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Mon, 7 Oct 2013 20:17:49 -0400 Subject: window proxy should delete its window during its destructor --- gtk2_ardour/window_manager.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/gtk2_ardour/window_manager.cc b/gtk2_ardour/window_manager.cc index 3ab9e1adff..4a44dc4691 100644 --- a/gtk2_ardour/window_manager.cc +++ b/gtk2_ardour/window_manager.cc @@ -194,6 +194,7 @@ ProxyBase::ProxyBase (const string& name, const std::string& menu_name, const XM ProxyBase::~ProxyBase () { delete vistracker; + delete _window; } void -- cgit v1.2.3 From 5265ceec51c73983d9883786611de4340f0baf03 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Mon, 7 Oct 2013 20:27:04 -0400 Subject: change tortured GtkUI startup process into something just a little more sane, and remove "stopping" code since that belongs in a destructor --- libs/gtkmm2ext/gtk_ui.cc | 10 ++++++---- libs/gtkmm2ext/gtkmm2ext/gtk_ui.h | 3 +-- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/libs/gtkmm2ext/gtk_ui.cc b/libs/gtkmm2ext/gtk_ui.cc index 6e466f5c9f..d9e4c871a6 100644 --- a/libs/gtkmm2ext/gtk_ui.cc +++ b/libs/gtkmm2ext/gtk_ui.cc @@ -120,9 +120,9 @@ UI::UI (string namestr, int *argc, char ***argv) UI::~UI () { + _receiver.hangup (); } - bool UI::caller_is_ui_thread () { @@ -265,12 +265,14 @@ UI::run (Receiver &old_receiver) Glib::signal_idle().connect (bind_return (mem_fun (old_receiver, &Receiver::hangup), false)); - starting (); + if (starting ()) { + return; + } + _active = true; theMain->run (); _active = false; - stopping (); - _receiver.hangup (); + return; } diff --git a/libs/gtkmm2ext/gtkmm2ext/gtk_ui.h b/libs/gtkmm2ext/gtkmm2ext/gtk_ui.h index 64176232f0..232e7682ed 100644 --- a/libs/gtkmm2ext/gtkmm2ext/gtk_ui.h +++ b/libs/gtkmm2ext/gtkmm2ext/gtk_ui.h @@ -152,8 +152,7 @@ class UI : public AbstractUI stopping just after we return from it (at the top level) */ - sigc::signal starting; - sigc::signal stopping; + virtual int starting() = 0; sigc::signal theme_changed; -- cgit v1.2.3 From 5d85b5257e412e4de1b8a202a7d569e4072b4ca6 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Mon, 7 Oct 2013 20:27:54 -0400 Subject: use new GtkUI design in ARDOUR_UI --- gtk2_ardour/ardour_ui.cc | 26 ++++++++++++++++++-------- gtk2_ardour/ardour_ui.h | 3 +-- gtk2_ardour/ardour_ui_dependents.cc | 8 -------- 3 files changed, 19 insertions(+), 18 deletions(-) diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc index e74b8efe98..5cc72293fb 100644 --- a/gtk2_ardour/ardour_ui.cc +++ b/gtk2_ardour/ardour_ui.cc @@ -361,9 +361,6 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir) (void) theme_manager.get (true); - starting.connect (sigc::mem_fun(*this, &ARDOUR_UI::startup)); - stopping.connect (sigc::mem_fun(*this, &ARDOUR_UI::shutdown)); - _process_thread = new ProcessThread (); _process_thread->init (); @@ -536,6 +533,10 @@ ARDOUR_UI::post_engine () ARDOUR_UI::~ARDOUR_UI () { + if (ui_config->dirty()) { + ui_config->save_state(); + } + delete keyboard; delete editor; delete mixer; @@ -712,8 +713,8 @@ ARDOUR_UI::check_announcements () #endif } -void -ARDOUR_UI::startup () +int +ARDOUR_UI::starting () { Application* app = Application::instance (); char *nsm_url; @@ -785,7 +786,7 @@ ARDOUR_UI::startup () s.hide (); switch (s.response ()) { case Gtk::RESPONSE_REJECT: - exit (1); + return -1; default: break; } @@ -799,8 +800,8 @@ ARDOUR_UI::startup () /* go get a session */ - if (get_session_parameters (true, ARDOUR_COMMAND_LINE::new_session, ARDOUR_COMMAND_LINE::load_template)) { - exit (1); + if (get_session_parameters (false, ARDOUR_COMMAND_LINE::new_session, ARDOUR_COMMAND_LINE::load_template)) { + return -1; } } @@ -816,6 +817,7 @@ ARDOUR_UI::startup () _status_bar_visibility.update (); BootMessage (string_compose (_("%1 is ready for use"), PROGRAM_NAME)); + return 0; } void @@ -2618,6 +2620,7 @@ ARDOUR_UI::get_session_parameters (bool quit_on_cancel, bool should_be_new, stri should_be_new = false; session_name = session_dialog.session_name (likely_new); + session_path = session_dialog.session_folder (); if (nsm) { likely_new = true; @@ -2640,6 +2643,8 @@ ARDOUR_UI::get_session_parameters (bool quit_on_cancel, bool should_be_new, stri _session_is_new = true; } + cerr << "SN " << session_name << " SP " << session_path << endl; + if (session_name[0] == G_DIR_SEPARATOR || (session_name.length() > 2 && session_name[0] == '.' && session_name[1] == G_DIR_SEPARATOR) || (session_name.length() > 3 && session_name[0] == '.' && session_name[1] == '.' && session_name[2] == G_DIR_SEPARATOR)) { @@ -2712,6 +2717,8 @@ ARDOUR_UI::get_session_parameters (bool quit_on_cancel, bool should_be_new, stri } else { + cerr << "Loading session with path = " << session_path << " name = " << session_name << " template " << template_name << endl; + ret = load_session (session_path, session_name, template_name); if (ret == -2) { @@ -3771,6 +3778,7 @@ ARDOUR_UI::disconnect_from_engine () /* drop connection to AudioEngine::Halted so that we don't act * as if the engine unexpectedly shut down */ + halt_connection.disconnect (); if (AudioEngine::instance()->stop ()) { @@ -4117,3 +4125,5 @@ ARDOUR_UI::do_audio_midi_setup (uint32_t desired_sample_rate) return -1; } } + + diff --git a/gtk2_ardour/ardour_ui.h b/gtk2_ardour/ardour_ui.h index 191df0d31d..0253c1ec0a 100644 --- a/gtk2_ardour/ardour_ui.h +++ b/gtk2_ardour/ardour_ui.h @@ -330,8 +330,7 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr static ARDOUR_UI *theArdourUI; - void startup (); - void shutdown (); + int starting (); int ask_about_saving_session (const std::vector& actions); diff --git a/gtk2_ardour/ardour_ui_dependents.cc b/gtk2_ardour/ardour_ui_dependents.cc index 821382717f..fbfc8c7afd 100644 --- a/gtk2_ardour/ardour_ui_dependents.cc +++ b/gtk2_ardour/ardour_ui_dependents.cc @@ -50,14 +50,6 @@ namespace ARDOUR { using namespace ARDOUR; -void -ARDOUR_UI::shutdown () -{ - if (ui_config->dirty()) { - ui_config->save_state(); - } -} - void ARDOUR_UI::we_have_dependents () { -- cgit v1.2.3 From c727d18b800189f571eb994e6597ef6566a70200 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Mon, 7 Oct 2013 20:28:20 -0400 Subject: delete the UI from main() to get full cleanup --- gtk2_ardour/main.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/gtk2_ardour/main.cc b/gtk2_ardour/main.cc index a7497f96fb..ceb6ceb312 100644 --- a/gtk2_ardour/main.cc +++ b/gtk2_ardour/main.cc @@ -518,6 +518,7 @@ int main (int argc, char *argv[]) ui->run (text_receiver); Gtkmm2ext::Application::instance()->cleanup(); + delete ui; ui = 0; ARDOUR::cleanup (); -- cgit v1.2.3 From f1b2674d9b768ed20a5f8aae7e59962c5ed514a4 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Mon, 7 Oct 2013 20:29:05 -0400 Subject: change return type on ARDOUR::cleanup() since nobody cares what it returns --- libs/ardour/ardour/ardour.h | 2 +- libs/ardour/globals.cc | 13 ++++++++++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/libs/ardour/ardour/ardour.h b/libs/ardour/ardour/ardour.h index 311611997f..80bdf9d80e 100644 --- a/libs/ardour/ardour/ardour.h +++ b/libs/ardour/ardour/ardour.h @@ -60,7 +60,7 @@ namespace ARDOUR { */ bool init (bool with_vst, bool try_optimization, const char* localedir); void init_post_engine (); - int cleanup (); + void cleanup (); bool no_auto_connect (); void make_property_quarks (); diff --git a/libs/ardour/globals.cc b/libs/ardour/globals.cc index 459f6f0e51..9850d82d31 100644 --- a/libs/ardour/globals.cc +++ b/libs/ardour/globals.cc @@ -354,9 +354,15 @@ ARDOUR::init_post_engine () ARDOUR::PluginManager::instance().refresh (); } -int -ARDOUR::cleanup () +void +ARDOUR::cleanup () { + if (!libardour_initialized) { + return; + } + + ARDOUR::AudioEngine::destroy (); + delete Library; lrdf_cleanup (); delete &ControlProtocolManager::instance(); @@ -368,7 +374,8 @@ ARDOUR::cleanup () vstfx_exit(); #endif PBD::cleanup (); - return 0; + + return; } void -- cgit v1.2.3 From da7d3afc8763fa4a966a3c10a0c4c9560cc4ebe6 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Mon, 7 Oct 2013 20:30:06 -0400 Subject: use AudioEngine destructor to do necessary stuff when shutting it down, and remove unused Config stuff in AudioEngine --- libs/ardour/ardour/audioengine.h | 4 +--- libs/ardour/audioengine.cc | 16 ++++++++-------- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/libs/ardour/ardour/audioengine.h b/libs/ardour/ardour/audioengine.h index 1bf4be3243..ddffd1d5c0 100644 --- a/libs/ardour/ardour/audioengine.h +++ b/libs/ardour/ardour/audioengine.h @@ -229,6 +229,7 @@ public: std::string _latency_output_name; framecnt_t _latency_signal_latency; bool _started_for_latency; + bool _in_destructor; void meter_thread (); void start_metering_thread (); @@ -236,9 +237,6 @@ public: static gint m_meter_exit; - void parameter_changed (const std::string&); - PBD::ScopedConnection config_connection; - typedef std::map BackendMap; BackendMap _backends; AudioBackendInfo* backend_discover (const std::string&); diff --git a/libs/ardour/audioengine.cc b/libs/ardour/audioengine.cc index 631a861741..f6694d88ea 100644 --- a/libs/ardour/audioengine.cc +++ b/libs/ardour/audioengine.cc @@ -81,6 +81,7 @@ AudioEngine::AudioEngine () , _latency_flush_frames (0) , _latency_signal_latency (0) , _started_for_latency (false) + , _in_destructor (false) { g_atomic_int_set (&m_meter_exit, 0); discover_backends (); @@ -88,15 +89,9 @@ AudioEngine::AudioEngine () AudioEngine::~AudioEngine () { + _in_destructor = true; + stop_metering_thread (); drop_backend (); - - config_connection.disconnect (); - - { - Glib::Threads::Mutex::Lock tm (_process_lock); - session_removed.signal (); - stop_metering_thread (); - } } AudioEngine* @@ -1000,6 +995,11 @@ AudioEngine::update_latencies () void AudioEngine::halted_callback (const char* why) { + if (_in_destructor) { + /* everything is under control */ + return; + } + stop_metering_thread (); _running = false; -- cgit v1.2.3 From 2230dc92cdbed647e1ce3c4835594dec58bc4926 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Mon, 7 Oct 2013 20:30:28 -0400 Subject: remove debug output --- gtk2_ardour/engine_dialog.cc | 1 - 1 file changed, 1 deletion(-) diff --git a/gtk2_ardour/engine_dialog.cc b/gtk2_ardour/engine_dialog.cc index a63e310b3f..dfd24af739 100644 --- a/gtk2_ardour/engine_dialog.cc +++ b/gtk2_ardour/engine_dialog.cc @@ -235,7 +235,6 @@ EngineControl::EngineControl () ARDOUR::AudioEngine::instance()->Stopped.connect (stopped_connection, MISSING_INVALIDATOR, boost::bind (&EngineControl::engine_stopped, this), gui_context()); ARDOUR::AudioEngine::instance()->Halted.connect (stopped_connection, MISSING_INVALIDATOR, boost::bind (&EngineControl::engine_stopped, this), gui_context()); - cerr << "AMS about to change backend\n"; backend_changed (); if (audio_setup) { -- cgit v1.2.3 From 22eea8e9e29e91319163f63b6bdefbcbd1062714 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Mon, 7 Oct 2013 20:46:10 -0400 Subject: possible relief for snapshot loading --- gtk2_ardour/session_dialog.cc | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/gtk2_ardour/session_dialog.cc b/gtk2_ardour/session_dialog.cc index dae19067a7..1eacf00d0d 100644 --- a/gtk2_ardour/session_dialog.cc +++ b/gtk2_ardour/session_dialog.cc @@ -222,12 +222,16 @@ SessionDialog::session_folder () TreeIter iter = recent_session_display.get_selection()->get_selected(); if (iter) { - return (*iter)[recent_session_columns.fullpath]; + string s = (*iter)[recent_session_columns.fullpath]; + if (Glib::file_test (s, Glib::FILE_TEST_IS_REGULAR)) { + return Glib::path_get_dirname (s); + } + return s; } if (_existing_session_chooser_used) { /* existing session chosen from file chooser */ - return existing_session_chooser.get_current_folder (); + return Glib::path_get_dirname (existing_session_chooser.get_current_folder ()); } else { std::string legal_session_folder_name = legalize_for_path (new_name_entry.get_text()); return Glib::build_filename (new_folder_chooser.get_current_folder(), legal_session_folder_name); -- cgit v1.2.3 From 19ba3b8de787637b29dda0b9f71a1eaf8987ad93 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Tue, 8 Oct 2013 12:18:27 -0400 Subject: fix some issues with window flow when session loading fails; shrink "New Session" button in session setup dialog --- gtk2_ardour/ardour_ui.cc | 20 +++++++++++++------- gtk2_ardour/session_dialog.cc | 34 ++++++++++++++++++++++++++-------- gtk2_ardour/session_dialog.h | 4 +++- 3 files changed, 42 insertions(+), 16 deletions(-) diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc index 5cc72293fb..d09544fcf4 100644 --- a/gtk2_ardour/ardour_ui.cc +++ b/gtk2_ardour/ardour_ui.cc @@ -2596,11 +2596,14 @@ ARDOUR_UI::get_session_parameters (bool quit_on_cancel, bool should_be_new, stri } else { session_path = ""; session_name = ""; + session_dialog.clear_given (); } - + if (should_be_new || session_name.empty()) { /* need the dialog to get info from user */ - + + cerr << "run dialog\n"; + switch (session_dialog.run()) { case RESPONSE_ACCEPT: break; @@ -2643,8 +2646,6 @@ ARDOUR_UI::get_session_parameters (bool quit_on_cancel, bool should_be_new, stri _session_is_new = true; } - cerr << "SN " << session_name << " SP " << session_path << endl; - if (session_name[0] == G_DIR_SEPARATOR || (session_name.length() > 2 && session_name[0] == '.' && session_name[1] == G_DIR_SEPARATOR) || (session_name.length() > 3 && session_name[0] == '.' && session_name[1] == '.' && session_name[2] == G_DIR_SEPARATOR)) { @@ -2699,10 +2700,11 @@ ARDOUR_UI::get_session_parameters (bool quit_on_cancel, bool should_be_new, stri } char illegal = Session::session_name_is_legal(session_name); + if (illegal) { pop_back_splash (session_dialog); MessageDialog msg (session_dialog, string_compose(_("To ensure compatibility with various systems\n" - "session names may not contain a '%1' character"), illegal)); + "session names may not contain a '%1' character"), illegal)); msg.run (); ARDOUR_COMMAND_LINE::session_name = ""; // cancel that continue; @@ -2717,8 +2719,6 @@ ARDOUR_UI::get_session_parameters (bool quit_on_cancel, bool should_be_new, stri } else { - cerr << "Loading session with path = " << session_path << " name = " << session_name << " template " << template_name << endl; - ret = load_session (session_path, session_name, template_name); if (ret == -2) { @@ -2730,6 +2730,12 @@ ARDOUR_UI::get_session_parameters (bool quit_on_cancel, bool should_be_new, stri _session->save_state (ARDOUR_COMMAND_LINE::immediate_save, false); exit (1); } + + /* clear this to avoid endless attempts to load the + same session. + */ + + ARDOUR_COMMAND_LINE::session_name = ""; } } diff --git a/gtk2_ardour/session_dialog.cc b/gtk2_ardour/session_dialog.cc index 1eacf00d0d..996dab1cc4 100644 --- a/gtk2_ardour/session_dialog.cc +++ b/gtk2_ardour/session_dialog.cc @@ -74,11 +74,6 @@ SessionDialog::SessionDialog (bool require_new, const std::string& session_name, , _master_bus_channel_count_adj (2, 0, 100, 1, 10, 0) , _existing_session_chooser_used (false) { - if (!session_name.empty() && !require_new) { - response (RESPONSE_OK); - return; - } - set_keep_above (true); set_position (WIN_POS_CENTER); get_vbox()->set_spacing (6); @@ -143,12 +138,32 @@ SessionDialog::SessionDialog (bool require_new, const std::string& session_name, recent_label.hide (); } } + + /* possibly get out of here immediately if everything is ready to go. + We still need to set up the whole dialog because of the way + ARDOUR_UI::get_session_parameters() might skip it on a first + pass then require it for a second pass (e.g. when there + is an error with session loading and we have to ask the user + what to do next). + */ + + if (!session_name.empty() && !require_new) { + response (RESPONSE_OK); + return; + } } SessionDialog::~SessionDialog() { } +void +SessionDialog::clear_given () +{ + _provided_session_path = ""; + _provided_session_name = ""; +} + bool SessionDialog::use_session_template () { @@ -256,7 +271,9 @@ SessionDialog::setup_initial_choice_box () ic_new_session_button.signal_clicked().connect (sigc::mem_fun (*this, &SessionDialog::new_session_button_clicked)); Gtk::HBox* hbox = manage (new HBox); + Gtk::VBox* vbox = manage (new VBox); hbox->set_spacing (12); + vbox->set_spacing (12); string image_path; @@ -266,9 +283,10 @@ SessionDialog::setup_initial_choice_box () hbox->pack_start (*image, false, false); } } - - hbox->pack_start (ic_new_session_button, true, true); - + + vbox->pack_start (ic_new_session_button, true, true, 20); + hbox->pack_start (*vbox, true, true, 20); + centering_vbox->pack_start (*hbox, false, false); /* Possible update message */ diff --git a/gtk2_ardour/session_dialog.h b/gtk2_ardour/session_dialog.h index 782466a834..2178cfbe73 100644 --- a/gtk2_ardour/session_dialog.h +++ b/gtk2_ardour/session_dialog.h @@ -51,9 +51,11 @@ class SessionDialog : public ArdourDialog { const std::string& template_name, bool cancel_not_quit); ~SessionDialog (); + void clear_given (); + std::string session_name (bool& should_be_new); std::string session_folder (); - + bool use_session_template(); std::string session_template_name(); -- cgit v1.2.3 From 1085866f470c250234a9b306ef121dea94b7d650 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Tue, 8 Oct 2013 12:22:08 -0400 Subject: updated DE translation from edgar aichinger --- libs/ardour/po/de.po | 602 ++++++++++++++++++++++++++++----------------------- 1 file changed, 329 insertions(+), 273 deletions(-) diff --git a/libs/ardour/po/de.po b/libs/ardour/po/de.po index 87cd8be124..f92bf49d1e 100644 --- a/libs/ardour/po/de.po +++ b/libs/ardour/po/de.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-09-03 07:59-0400\n" -"PO-Revision-Date: 2013-07-23 15:04+0200\n" +"POT-Creation-Date: 2013-09-26 16:09+0200\n" +"PO-Revision-Date: 2013-09-26 16:32+0200\n" "Last-Translator: Edgar Aichinger \n" "Language-Team: German \n" "Language: de\n" @@ -137,7 +137,7 @@ msgstr "Audio-Wiedergabelisten (unbenutzt)" #: audio_playlist_source.cc:171 audiosource.cc:913 file_source.cc:529 #: midi_playlist_source.cc:144 midi_playlist_source.cc:152 #: midi_playlist_source.cc:159 midi_source.cc:371 plugin_insert.cc:643 -#: rb_effect.cc:332 session.cc:2465 session.cc:2498 session.cc:3643 +#: rb_effect.cc:332 session.cc:2606 session.cc:2639 session.cc:3784 #: session_handle.cc:87 sndfilesource.cc:121 msgid "programming error: %1" msgstr "Programmierfehler: %1" @@ -206,65 +206,21 @@ msgstr "kann VAMP-Plugin \"%1\" nicht laden" msgid "VAMP Plugin \"%1\" could not be loaded" msgstr "VAMP-Plugin \"%1\" konnte nicht geladen werden" -#: audioengine.cc:186 -msgid "" -"This version of JACK is old - you should upgrade to a newer version that " -"supports jack_port_type_get_buffer_size()" -msgstr "" -"Diese JACK-Version ist alt - Sie sollten auf eine Version upgraden, die " -"jack_port_type_get_buffer_size() unterstützt" +#: audioengine.cc:489 +msgid "looking for backends in %1\n" +msgstr "Suche nach Backends in %1\n" -#: audioengine.cc:190 -msgid "Connect session to engine" -msgstr "Verbinde Projekt mit Engine" +#: audioengine.cc:512 +msgid "AudioEngine: cannot load module \"%1\" (%2)" +msgstr "AudioEngine: kann Modul \"%1\" nicht laden (%2)" -#: audioengine.cc:843 -msgid "" -"a port with the name \"%1\" already exists: check for duplicated track/bus " -"names" -msgstr "" -"Ein Port mit Namen \"%1\" existiert bereits: Prüfen Sie auf doppelte Spur/" -"Busnamen" +#: audioengine.cc:518 +msgid "AudioEngine: backend at \"%1\" has no descriptor function." +msgstr "AudioEngine: Backend an \"%1\" hat keine Beschreibungsfunktion." -#: audioengine.cc:845 session.cc:1698 -msgid "" -"No more JACK ports are available. You will need to stop %1 and restart JACK " -"with more ports if you need this many tracks." -msgstr "" -"Keine JACK-Ports mehr verfügbar. Wenn Sie so viele Spuren benötigen, müssen " -"Sie %1 stoppen und JACK mit mehr Ports neu starten." - -#: audioengine.cc:848 -msgid "AudioEngine: cannot register port \"%1\": %2" -msgstr "AudioEngine: kann Port \"%1\": %2 nicht registrieren" - -#: audioengine.cc:878 -msgid "unable to create port: %1" -msgstr "kann Port: %1 nicht erzeugen" - -#: audioengine.cc:932 -msgid "connect called before engine was started" -msgstr "Aufruf von connect vor dem Start der Engine" - -#: audioengine.cc:958 -msgid "AudioEngine: cannot connect %1 (%2) to %3 (%4)" -msgstr "AudioEngine: kann %1 (%2) nicht mit %3 (%4) verbinden" - -#: audioengine.cc:973 audioengine.cc:1004 -msgid "disconnect called before engine was started" -msgstr "Aufruf von disconnect vor dem Start der Engine" - -#: audioengine.cc:1052 -msgid "get_port_by_name() called before engine was started" -msgstr "Aufruf von get_port_by_name() vor dem Start der Engine" - -#: audioengine.cc:1104 -msgid "get_ports called before engine was started" -msgstr "Aufruf von get_ports vor dem Start der Engine" - -#: audioengine.cc:1427 -msgid "failed to connect to JACK" -msgstr "Verbindung zu JACK fehlgeschlagen" +#: audioengine.cc:580 +msgid "Could not create backend for %1: %2" +msgstr "Konnte Backend für %1 nicht erzeugen: %2" #: audioregion.cc:1643 msgid "" @@ -316,8 +272,8 @@ msgstr "AudioSource: kann Pfad für Peaks (b) \"%1\" nicht öffnen (%2)" msgid "" "AudioSource[%1]: peak read - cannot read %2 samples at offset %3 of %4 (%5)" msgstr "" -"AudioSource[%1]: peak read - kann %2 Samples bei Offset %3 von %4 nicht lesen" -"(%5)" +"AudioSource[%1]: peak read - kann %2 Samples bei Offset %3 von %4 nicht " +"lesen(%5)" #: audiosource.cc:667 msgid "%1: could not write read raw data for peak computation (%2)" @@ -467,7 +423,7 @@ msgstr "kann CPU-Takt in /proc/cpuinfo nicht finden" msgid "audio" msgstr "Audio" -#: data_type.cc:28 session.cc:1640 session.cc:1643 +#: data_type.cc:28 session.cc:1781 session.cc:1784 msgid "MIDI" msgstr "MIDI" @@ -582,7 +538,7 @@ msgstr "Dreieck" msgid "Rectangular" msgstr "Rechteck" -#: export_formats.cc:52 session.cc:4861 session.cc:4877 +#: export_formats.cc:52 session.cc:5002 session.cc:5018 msgid "None" msgstr "Kein" @@ -696,7 +652,7 @@ msgstr "" "% unterstützt nur %2 Kanäle, in Ihrer Kanalkonfiguration befinden sich " "jedoch %3 Kanäle" -#: file_source.cc:198 session_state.cc:2891 +#: file_source.cc:198 session_state.cc:2813 msgid "" "there are already 1000 files with names like %1; versioning discontinued" msgstr "" @@ -800,24 +756,24 @@ msgstr "kann momentanes Arbeitsverzeichnis nicht bestimmen (%1)" msgid "unknown file type for session %1" msgstr "Unbekannter Dateityp für Projekt %1" -#: globals.cc:205 +#: globals.cc:207 msgid "Could not set system open files limit to \"unlimited\"" msgstr "" "Konnte die Systemgrenze für offene Dateien nicht auf \"unbeschränkt\" setzen" -#: globals.cc:207 +#: globals.cc:209 msgid "Could not set system open files limit to %1" msgstr "Konnte die Systemgrenze für offene Dateien nicht auf %1 setzen" -#: globals.cc:211 +#: globals.cc:213 msgid "Your system is configured to limit %1 to only %2 open files" msgstr "Ihre Systemkonfiguration beschränkt %1 auf nur %2 offene Dateien" -#: globals.cc:215 +#: globals.cc:217 msgid "Could not get system open files limit (%1)" msgstr "Konnte die Grenze für offene Dateien nicht erhalten (%1)" -#: globals.cc:266 +#: globals.cc:268 msgid "Loading configuration" msgstr "Lade Konfiguration" @@ -939,47 +895,47 @@ msgstr "IO: schlecht geformte Zeichenkette in XML-Knoten für Ausgänge \"%1\"" msgid "IO: bad output string in XML node \"%1\"" msgstr "IO: schlechte Zeichenkette für Ausgang in XML-Knoten \"%1\"" -#: io.cc:1410 +#: io.cc:1411 #, c-format msgid "%s %u" msgstr "%s %u" -#: io.cc:1457 +#: io.cc:1458 #, c-format msgid "%s in" msgstr "%s in" -#: io.cc:1459 +#: io.cc:1460 #, c-format msgid "%s out" msgstr "%s out" -#: io.cc:1534 session.cc:494 session.cc:523 +#: io.cc:1535 session.cc:676 session.cc:705 msgid "mono" msgstr "Mono" -#: io.cc:1536 session.cc:507 session.cc:537 +#: io.cc:1537 session.cc:689 session.cc:719 msgid "L" msgstr "L" -#: io.cc:1536 session.cc:509 session.cc:539 +#: io.cc:1537 session.cc:691 session.cc:721 msgid "R" msgstr "R" -#: io.cc:1538 io.cc:1544 +#: io.cc:1539 io.cc:1545 #, c-format msgid "%d" msgstr "%d" -#: ladspa_plugin.cc:88 +#: ladspa_plugin.cc:86 msgid "LADSPA: module has no descriptor function." msgstr "LADSPA: Modul hat keine Beschreibungsfunktion" -#: ladspa_plugin.cc:93 +#: ladspa_plugin.cc:91 msgid "LADSPA: plugin has gone away since discovery!" msgstr "LADSPA: Plugin ist nicht mehr auffindbar!" -#: ladspa_plugin.cc:100 +#: ladspa_plugin.cc:98 msgid "LADSPA: \"%1\" cannot be used, since it cannot do inplace processing" msgstr "" "LADSPA: \"%1\" kann nicht verwendet werdeen, da es kein \"inplace processing" @@ -1063,7 +1019,7 @@ msgstr "" msgid "incorrect XML mode passed to Locations::set_state" msgstr "unkorrekter XML-Modus an Locations::set_state weitergereicht" -#: location.cc:842 session.cc:4362 session_state.cc:1114 +#: location.cc:842 session.cc:4503 session_state.cc:1031 msgid "session" msgstr "Projekt" @@ -1210,6 +1166,38 @@ msgstr "Fehlende Eigenschaft \"state\" bei AutomationState" msgid "MIDI stretch created non-MIDI source" msgstr "MIDI Streckung erzeugte Nicht-MIDI Quelle" +#: midiport_manager.cc:71 +msgid "MIDI control in" +msgstr "MIDI control in" + +#: midiport_manager.cc:72 +msgid "MIDI control out" +msgstr "MIDI control out" + +#: midiport_manager.cc:74 +msgid "MMC in" +msgstr "MMC in" + +#: midiport_manager.cc:75 +msgid "MMC out" +msgstr "MMC out" + +#: midiport_manager.cc:96 +msgid "MTC in" +msgstr "MTC in" + +#: midiport_manager.cc:98 +msgid "MTC out" +msgstr "MTC out" + +#: midiport_manager.cc:101 +msgid "MIDI Clock in" +msgstr "MIDI Clock in" + +#: midiport_manager.cc:103 +msgid "MIDI Clock out" +msgstr "MIDI Clock out" + #: monitor_processor.cc:53 msgid "monitor dim" msgstr "Monitor dämpfen" @@ -1246,11 +1234,11 @@ msgstr "Polaritätsschalter" msgid "solo control" msgstr "Solo-Schalter" -#: mtc_slave.cc:235 +#: mtc_slave.cc:238 msgid "MTC Slave: atomic read of current time failed, sleeping!" msgstr "MTC Slave: Fehler beim atomisches Lesen der momentanen Zeit, schlafe!" -#: mtc_slave.cc:359 +#: mtc_slave.cc:361 msgid "" "Unknown rate/drop value %1 in incoming MTC stream, session values used " "instead" @@ -1258,11 +1246,11 @@ msgstr "" "Unbekannter Wert %1 für Rate/Abfall in eingehendem MTC-Datenstrom, verwende " "Projektwerte" -#: mtc_slave.cc:379 +#: mtc_slave.cc:381 msgid "Session framerate adjusted from %1 TO: MTC's %2." msgstr "Projekt-Framerate von %1 auf die von MTC: %2 geändert" -#: mtc_slave.cc:393 +#: mtc_slave.cc:395 msgid "Session and MTC framerate mismatch: MTC:%1 %2:%3." msgstr "Framerate von Projekt und MTC stimmen nicht überein: MTC: %1 %2: %3" @@ -1326,19 +1314,19 @@ msgstr "Pannerziel bekam XML-Daten für %1 übergeben - ignoriert" msgid "looking for panners in %1" msgstr "Suche nach Pannern in %1" -#: panner_manager.cc:99 +#: panner_manager.cc:100 msgid "Panner discovered: \"%1\" in %2" msgstr "Panner gefunden: \"%1\" in %2" -#: panner_manager.cc:116 +#: panner_manager.cc:117 msgid "PannerManager: cannot load module \"%1\" (%2)" msgstr "PannerManager: kann Modul \"%1\" nicht laden (%2)" -#: panner_manager.cc:123 +#: panner_manager.cc:124 msgid "PannerManager: module \"%1\" has no descriptor function." msgstr "PannerManager: Modul \"%1\" hat keine Beschreibungsfunktion" -#: panner_manager.cc:186 +#: panner_manager.cc:187 msgid "no panner discovered for in/out = %1/%2" msgstr "keinen Panner für %1/%2 Ein/Ausgänge gefunden" @@ -1461,11 +1449,7 @@ msgstr "unbekannter Plugin-Statustyp \"%1\" - alle Einträge ignoriert" msgid "unknown plugin type \"%1\" - ignored" msgstr "unbekannter Plugintyp \"%1\" - ignoriert" -#: port.cc:367 -msgid "get_connected_latency_range() called while disconnected from JACK" -msgstr "Aufruf von get_connected_latency_range(), während von JACK getrennt" - -#: port.cc:450 +#: port.cc:410 msgid "could not reregister %1" msgstr "konnte %1 nicht erneut registrieren" @@ -1482,6 +1466,38 @@ msgstr "" msgid "non-port insert XML used for port plugin insert" msgstr "Nicht-Port-Insert XML zum Einfügen eines Port-Plugin benutzt" +#: port_manager.cc:270 +msgid "" +"a port with the name \"%1\" already exists: check for duplicated track/bus " +"names" +msgstr "" +"Ein Port mit Namen \"%1\" existiert bereits: Prüfen Sie auf doppelte Spur/" +"Busnamen" + +#: port_manager.cc:272 +msgid "" +"No more ports are available. You will need to stop %1 and restart with more " +"ports if you need this many tracks." +msgstr "" +"Keine Ports mehr verfügbar. Wenn Sie so viele Spuren brauchen, müssen Sie %1 " +"stoppen und mit mehr Ports neu starten." + +#: port_manager.cc:275 +msgid "AudioEngine: cannot register port \"%1\": %2" +msgstr "AudioEngine: kann Port \"%1\": %2 nicht registrieren" + +#: port_manager.cc:314 +msgid "unable to create port: %1" +msgstr "kann Port: %1 nicht erzeugen" + +#: port_manager.cc:401 +msgid "AudioEngine: cannot connect %1 (%2) to %3 (%4)" +msgstr "AudioEngine: kann %1 (%2) nicht mit %3 (%4) verbinden" + +#: port_manager.cc:453 port_manager.cc:454 +msgid "Re-establising port %1 failed" +msgstr "Portwiederherstellung fehlgeschlagen" + #: processor.cc:207 msgid "No %1 property flag in element %2" msgstr "Kein Flag für Eigenschaft \"%1\" in Element %2" @@ -1490,19 +1506,19 @@ msgstr "Kein Flag für Eigenschaft \"%1\" in Element %2" msgid "No child node with active property" msgstr "Kein Kindknoten mit der Eigenschaft \"aktiv\"" -#: rc_configuration.cc:93 +#: rc_configuration.cc:88 msgid "Loading system configuration file %1" msgstr "Lade Systemkonfigurationsdatei %1" -#: rc_configuration.cc:97 +#: rc_configuration.cc:92 msgid "%1: cannot read system configuration file \"%2\"" msgstr "%1: kann Systemkonfigurationsdatei \"%2\" nicht lesen" -#: rc_configuration.cc:102 +#: rc_configuration.cc:97 msgid "%1: system configuration file \"%2\" not loaded successfully." msgstr "%1: Systemkonfigurationsdatei \"%2\" konnte nicht geladen werden." -#: rc_configuration.cc:106 +#: rc_configuration.cc:101 msgid "" "Your system %1 configuration file is empty. This probably means that there " "was an error installing %1" @@ -1510,23 +1526,23 @@ msgstr "" "Ihre %1-Systemkonfigurationsdatei ist leer. Das deutet möglicherweise darauf " "hin, daß bei der Installation von %1 Fehler auftraten." -#: rc_configuration.cc:121 +#: rc_configuration.cc:116 msgid "Loading user configuration file %1" msgstr "Lade Benutzerkonfiguration %1" -#: rc_configuration.cc:125 +#: rc_configuration.cc:120 msgid "%1: cannot read configuration file \"%2\"" msgstr "%1: kann Konfigurationsdatei \"%2\" nicht lesen" -#: rc_configuration.cc:130 +#: rc_configuration.cc:125 msgid "%1: user configuration file \"%2\" not loaded successfully." msgstr "%1: Benutzerkonfiguration \"%2\" konnte nicht geladen werden." -#: rc_configuration.cc:134 +#: rc_configuration.cc:129 msgid "your %1 configuration file is empty. This is not normal." msgstr "Ihre %1-Konfigurationsdatei ist leer. Das ist nicht normal." -#: rc_configuration.cc:151 +#: rc_configuration.cc:146 msgid "Config file %1 not saved" msgstr "Konfigurationsdatei %1 nicht gesichert" @@ -1614,106 +1630,98 @@ msgstr "Send %1" msgid "programming error: send created using role %1" msgstr "Programmierfehler: Send erzeugt mittels Rolle %1" -#: session.cc:347 -msgid "Set block size and sample rate" -msgstr "Setze Blockgröße und Samplerate" +#: session.cc:343 +msgid "Connect to engine" +msgstr "Verbinde zur Engine" -#: session.cc:352 -msgid "Using configuration" -msgstr "Benutze Konfiguration" +#: session.cc:348 +msgid "Session loading complete" +msgstr "Laden des Projektes abgeschlossen" + +#: session.cc:420 +msgid "Set up LTC" +msgstr "LTC einrichten" -#: session.cc:377 +#: session.cc:422 +msgid "Set up Click" +msgstr "Klick einrichten" + +#: session.cc:424 +msgid "Set up standard connections" +msgstr "Richte Standard-Verbindungen ein" + +#: session.cc:561 msgid "LTC In" msgstr "LTC In" -#: session.cc:378 +#: session.cc:562 msgid "LTC Out" msgstr "LTC Out" -#: session.cc:404 +#: session.cc:588 msgid "LTC-in" msgstr "LTC-in" -#: session.cc:405 +#: session.cc:589 msgid "LTC-out" msgstr "LTC-out" -#: session.cc:434 +#: session.cc:625 msgid "could not setup Click I/O" msgstr "konnte Metronom-E/A nicht einrichten" -#: session.cc:461 -msgid "cannot setup Click I/O" -msgstr "kann Metronom-E/A nicht einrichten" - -#: session.cc:464 -msgid "Compute I/O Latencies" -msgstr "Berechne E/A-Latenzen" - -#: session.cc:470 -msgid "Set up standard connections" -msgstr "Richte Standard-Verbindungen ein" - -#: session.cc:491 +#: session.cc:673 #, c-format msgid "out %" msgstr "out %" -#: session.cc:505 +#: session.cc:687 #, c-format msgid "out %+%" msgstr "out %+%" -#: session.cc:520 +#: session.cc:702 #, c-format msgid "in %" msgstr "in %" -#: session.cc:534 +#: session.cc:716 #, c-format msgid "in %+%" msgstr "in %+%" -#: session.cc:570 -msgid "Setup signal flow and plugins" -msgstr "Richte Signalfluss and Plugins ein" - -#: session.cc:614 -msgid "Connect to engine" -msgstr "Verbinde zur Engine" - -#: session.cc:645 +#: session.cc:780 msgid "cannot connect master output %1 to %2" msgstr "kann Master-Ausgang %1 nicht mit %2 verbinden" -#: session.cc:704 +#: session.cc:839 msgid "monitor" msgstr "Monitor" -#: session.cc:749 +#: session.cc:884 msgid "cannot connect control input %1 to %2" msgstr "kann Kontrolleingang %1 nicht mit %2 verbinden" -#: session.cc:769 +#: session.cc:904 msgid "The preferred I/O for the monitor bus (%1) cannot be found" msgstr "Bevorzugte E/A für den Monitorbus (%1) kann nicht gefunden werden" -#: session.cc:800 +#: session.cc:935 msgid "cannot connect control output %1 to %2" msgstr "kann Kontrollausgang %1 nicht mit %2 verbinden" -#: session.cc:864 +#: session.cc:999 msgid "cannot create Auditioner: no auditioning of regions possible" msgstr "" "Kann das Vorhör-System nicht einrichten: kein Vorhören von Regionen möglich" -#: session.cc:1043 +#: session.cc:1183 msgid "Session: you can't use that location for auto punch (start <= end)" msgstr "" "Session: Sie können diese Position nicht für Auto-Punch verwenden (Start <= " "Ende) " -#: session.cc:1083 +#: session.cc:1223 msgid "" "You cannot use this location for auto-loop because it has zero or negative " "length" @@ -1721,84 +1729,92 @@ msgstr "" "Sie können diese Position nicht für \"automatische Schleife\" verwenden, da " "sie keine oder eine negative Länge hat" -#: session.cc:1396 +#: session.cc:1537 msgid "feedback loop setup between %1 and %2" msgstr "Feedbackschleife zwischen %1 und %2 erkannt" -#: session.cc:1692 +#: session.cc:1833 msgid "Session: could not create new midi track." msgstr "Session: konnte keine neue MIDI-Spur erzeugen." -#: session.cc:1875 session.cc:1878 +#: session.cc:1839 +msgid "" +"No more JACK ports are available. You will need to stop %1 and restart JACK " +"with more ports if you need this many tracks." +msgstr "" +"Keine JACK-Ports mehr verfügbar. Wenn Sie so viele Spuren benötigen, müssen " +"Sie %1 stoppen und JACK mit mehr Ports neu starten." + +#: session.cc:2016 session.cc:2019 msgid "Audio" msgstr "Audio" -#: session.cc:1902 session.cc:1910 session.cc:1987 session.cc:1995 +#: session.cc:2043 session.cc:2051 session.cc:2128 session.cc:2136 msgid "cannot configure %1 in/%2 out configuration for new audio track" msgstr "kann %1 ein/%2 aus für neue Audiospur nicht konfigurieren" -#: session.cc:1933 +#: session.cc:2074 msgid "Session: could not create new audio track." msgstr "Session: konnte keine neue Audios.pur erzeugen" -#: session.cc:1965 session.cc:1968 +#: session.cc:2106 session.cc:2109 msgid "Bus" msgstr "Bus" -#: session.cc:2018 +#: session.cc:2159 msgid "Session: could not create new audio route." msgstr "Session: konnte keine neueAudio-Route erzeugen" -#: session.cc:2077 session.cc:2087 +#: session.cc:2218 session.cc:2228 msgid "Session: UINT_MAX routes? impossible!" msgstr "Session: UINT_MAX Routen? unmöglich!" -#: session.cc:2109 +#: session.cc:2250 msgid "Session: cannot create track/bus from template description" msgstr "Session: Kann die Route aus der Vorlagenbeschreibung nicht erzeugen" -#: session.cc:2135 +#: session.cc:2276 msgid "Session: could not create new route from template" msgstr "Session: konnte keine neue Route aus der Vorlage erzeugen." -#: session.cc:2164 +#: session.cc:2305 msgid "Adding new tracks/busses failed" msgstr "Fehler beim Hinzufügen neuer Spuren/Busse" -#: session.cc:3265 +#: session.cc:3406 msgid "FATAL ERROR! Could not find a suitable version of %1 for a rename" msgstr "" "FATALER FEHLER! Konnte keine passende Version von %1 zum Umbenennen finden" -#: session.cc:3385 session.cc:3443 +#: session.cc:3526 session.cc:3584 msgid "There are already %1 recordings for %2, which I consider too many." msgstr "Es gibt bereits %1 Aufnahmen für %2, was ich als zu viele erachte." -#: session.cc:3833 +#: session.cc:3974 msgid "send ID %1 appears to be in use already" msgstr "Send ID %1 ist offenbar schon in Gebrauch" -#: session.cc:3845 +#: session.cc:3986 msgid "aux send ID %1 appears to be in use already" msgstr "Aux-Send ID %1 ist offenbar schon in Gebrauch" -#: session.cc:3857 +#: session.cc:3998 msgid "return ID %1 appears to be in use already" msgstr "Return ID %1 ist offenbar schon in Gebrauch" -#: session.cc:3869 +#: session.cc:4010 msgid "insert ID %1 appears to be in use already" msgstr "Insert ID %1 ist offenbar schon in Gebrauch" -#: session.cc:3996 +#: session.cc:4137 msgid "Cannot write a range where end <= start (e.g. %1 <= %2)" msgstr "Kann einen Bereich mit Ende <= Start nicht schreiben (z.B. %1 <= %2)" -#: session.cc:4025 +#: session.cc:4166 msgid "too many bounced versions of playlist \"%1\"" msgstr "zu viele gebouncete Versionen der Wiedergabeliste \"%1\"" -#: session.cc:4035 +#: session.cc:4176 msgid "cannot create new audio file \"%1\" for %2" msgstr "kann keine neue Audiodatei \"%1\" für %2 erzeugen" @@ -1845,11 +1861,11 @@ msgstr "" "Session: zwei Ereignisse des Typs %1 können nicht im selben Frame existieren " "(%2)." -#: session_export.cc:126 +#: session_export.cc:125 msgid "%1: cannot seek to %2 for export" msgstr "%1: kann für Export nicht Dateiposition %2 aufsuchen" -#: session_export.cc:183 +#: session_export.cc:182 msgid "Export ended unexpectedly: %1" msgstr "Export endet unerwartet: %1" @@ -1861,10 +1877,6 @@ msgstr "" "LTC-Kodierer: ungültige Framerate - das Kodieren von LTC wird für den " "restlichen Teil dieses Projekts ausgesetzt." -#: session_midi.cc:428 -msgid "Session: could not send full MIDI time code" -msgstr "Session: konnte vollständigen MIDI-Timecode nicht senden" - #: session_midi.cc:520 msgid "Session: cannot send quarter-frame MTC message (%1)" msgstr "Session: kann quarter-frame MTC-Nachricht nicht senden (%1)" @@ -1873,97 +1885,101 @@ msgstr "Session: kann quarter-frame MTC-Nachricht nicht senden (%1)" msgid "Session: cannot create Playlist from XML description." msgstr "Session: kann Wiedergabeliste nicht aus der XML-Beschreibung erzeugen" -#: session_process.cc:133 +#: session_process.cc:132 msgid "Session: error in no roll for %1" msgstr "Session: Fehler in no_roll für %1" -#: session_process.cc:1158 +#: session_process.cc:1157 msgid "Programming error: illegal event type in process_event (%1)" msgstr "Programmierfehler: illegaler Ereignistyp in process_event (%1)" -#: session_state.cc:139 +#: session_state.cc:140 msgid "Could not use path %1 (%2)" msgstr "Konnte Pfad %1 nicht benutzen (%2)" -#: session_state.cc:267 +#: session_state.cc:184 msgid "solo cut control (dB)" msgstr "Solo Cut Einstellung (dB)" -#: session_state.cc:360 +#: session_state.cc:208 +msgid "Set block size and sample rate" +msgstr "Setze Blockgröße und Samplerate" + +#: session_state.cc:213 +msgid "Using configuration" +msgstr "Benutze Konfiguration" + +#: session_state.cc:325 msgid "Reset Remote Controls" msgstr "Fernbedienungen zurücksetzen" -#: session_state.cc:385 -msgid "Session loading complete" -msgstr "Laden des Projektes abgeschlossen" - -#: session_state.cc:452 +#: session_state.cc:417 msgid "Session: cannot create session peakfile folder \"%1\" (%2)" msgstr "Session: kann den Peakfile Ordner \"%1\" nicht erzeugen (%2)" -#: session_state.cc:459 +#: session_state.cc:424 msgid "Session: cannot create session sounds dir \"%1\" (%2)" msgstr "" "Session: kann das Projektverzeichnis für Sounddateien \"%1\" nicht erzeugen " "(%2)" -#: session_state.cc:466 +#: session_state.cc:431 msgid "Session: cannot create session midi dir \"%1\" (%2)" msgstr "" "Session: kann das Projektverzeichnis für MIDI \"%1\" nicht erzeugen (%2)" -#: session_state.cc:473 +#: session_state.cc:438 msgid "Session: cannot create session dead sounds folder \"%1\" (%2)" msgstr "Session: kann den Mülleimer des Projektes \"%1\" nicht erzeugen (%2)" -#: session_state.cc:480 +#: session_state.cc:445 msgid "Session: cannot create session export folder \"%1\" (%2)" msgstr "" "Session: kann den Projektordner für Exportdateien \"%1\" nicht erzeugen (%2)" -#: session_state.cc:487 +#: session_state.cc:452 msgid "Session: cannot create session analysis folder \"%1\" (%2)" msgstr "" "Session: kann den Projektordner für Analysedaten \"%1\" nicht erzeugen (%2)" -#: session_state.cc:494 +#: session_state.cc:459 msgid "Session: cannot create session plugins folder \"%1\" (%2)" msgstr "Session: kann den Projektordner für Plugins \"%1\" nicht erzeugen (%2)" -#: session_state.cc:501 +#: session_state.cc:466 msgid "Session: cannot create session externals folder \"%1\" (%2)" msgstr "" "Session: kann den Projektordner für Externals \"%1\" nicht erzeugen (%2)" -#: session_state.cc:515 +#: session_state.cc:480 msgid "Session: cannot create session folder \"%1\" (%2)" msgstr "Session: kann den Projektordner \"%1\" nicht erzeugen (%2)" -#: session_state.cc:548 +#: session_state.cc:514 msgid "Could not open %1 for writing session template" msgstr "Konnte %1 nicht zum Schreiben der Projektvorlage öffnen" -#: session_state.cc:554 +#: session_state.cc:520 msgid "Could not open session template %1 for reading" msgstr "Konnte Projektvorlage %1 nicht zum Lesen öffnen" -#: session_state.cc:573 +#: session_state.cc:539 msgid "master" msgstr "Master" -#: session_state.cc:636 +#: session_state.cc:600 msgid "Could not remove pending capture state at path \"%1\" (%2)" msgstr "Konnte vorläufigen Aufnahmestatus im Pfad \"%1\" nicht entfernen (%2)" -#: session_state.cc:660 +#: session_state.cc:624 msgid "could not rename snapshot %1 to %2 (%3)" msgstr "Konnte Schnappschuss %1 nicht auf %2 umbenennen (%3)" -#: session_state.cc:688 +#: session_state.cc:652 msgid "Could not remove session file at path \"%1\" (%2)" msgstr "Konnte Projektdatei im Pfad \"%1\" nicht entfernen (%2)" -#: session_state.cc:761 +#: session_state.cc:669 msgid "" "the %1 audio engine is not connected and state saving would lose all I/O " "connections. Session not saved" @@ -1971,140 +1987,140 @@ msgstr "" "die %1 Audio-Engine ist nicht verbunden, beim Sichern würden Sie daher alle " "E/A-Verbindungen verlieren. Projekt nicht gesichert" -#: session_state.cc:812 +#: session_state.cc:720 msgid "state could not be saved to %1" msgstr "Status konnte nicht nach %1 gesichert werden" -#: session_state.cc:814 session_state.cc:825 +#: session_state.cc:722 session_state.cc:733 msgid "Could not remove temporary session file at path \"%1\" (%2)" msgstr "Konnte temporäre Projektdatei im Pfad \"%1\" nicht entfernen (%2)" -#: session_state.cc:822 +#: session_state.cc:730 msgid "could not rename temporary session file %1 to %2" msgstr "Konnte temporäre Projektdatei %1 nicht nach %2 umbenennen" -#: session_state.cc:890 +#: session_state.cc:798 msgid "%1: session file \"%2\" doesn't exist!" msgstr "%1: Projektdatei \"%2\" existiert nicht!" -#: session_state.cc:902 +#: session_state.cc:810 msgid "Could not understand session file %1" msgstr "Konnte Projektdatei \"%1\" nicht verstehen" -#: session_state.cc:911 +#: session_state.cc:819 msgid "Session file %1 is not a session" msgstr "Projektdatei %1 ist kein Projekt" -#: session_state.cc:1208 +#: session_state.cc:1125 msgid "programming error: Session: incorrect XML node sent to set_state()" msgstr "" "Programmierfehler: Session: Inkorrekter XML-Knoten an send_state() gesendet" -#: session_state.cc:1257 +#: session_state.cc:1179 msgid "Session: XML state has no options section" msgstr "Session: XML hat keinen Abschnitt \"options\"" -#: session_state.cc:1262 +#: session_state.cc:1184 msgid "Session: XML state has no metadata section" msgstr "Session: XML hat keinen Abschnitt \"metadata\"" -#: session_state.cc:1273 +#: session_state.cc:1195 msgid "Session: XML state has no sources section" msgstr "Session: XML hat keinen Abschnitt \"sources\"" -#: session_state.cc:1280 +#: session_state.cc:1202 msgid "Session: XML state has no Tempo Map section" msgstr "Session: XML hat keinen Abschnitt \"Tempo Map\"" -#: session_state.cc:1287 +#: session_state.cc:1209 msgid "Session: XML state has no locations section" msgstr "Session: XML hat keinen Abschnitt \"locations\"" -#: session_state.cc:1313 +#: session_state.cc:1235 msgid "Session: XML state has no Regions section" msgstr "Session: XML hat keinen Abschnitt \"Regions\"" -#: session_state.cc:1320 +#: session_state.cc:1242 msgid "Session: XML state has no playlists section" msgstr "Session: XML hat keinen Abschnitt \"playlists\"" -#: session_state.cc:1340 +#: session_state.cc:1262 msgid "Session: XML state has no bundles section" msgstr "Session: XML hat keinen Abschnitt \"bundles\"" -#: session_state.cc:1352 +#: session_state.cc:1274 msgid "Session: XML state has no diskstreams section" msgstr "Session: XML hat keinen Abschnitt \"diskstreams\"" -#: session_state.cc:1360 +#: session_state.cc:1282 msgid "Session: XML state has no routes section" msgstr "Session: XML hat keinen Abschnitt \"routes\"" -#: session_state.cc:1372 +#: session_state.cc:1294 msgid "Session: XML state has no route groups section" msgstr "Session: XML hat keinen Abschnitt \"route groups\"" -#: session_state.cc:1381 +#: session_state.cc:1303 msgid "Session: XML state has no edit groups section" msgstr "Session: XML hat keinen Abschnitt \"edit groups\"" -#: session_state.cc:1388 +#: session_state.cc:1310 msgid "Session: XML state has no mix groups section" msgstr "Session: XML hat keinen Abschnitt \"mix groups\"" -#: session_state.cc:1396 +#: session_state.cc:1318 msgid "Session: XML state has no click section" msgstr "Session: XML hat keinen Abschnitt \"click\"" -#: session_state.cc:1444 +#: session_state.cc:1366 msgid "Session: cannot create Route from XML description." msgstr "Session: Kann die Route aus der XML-Beschreibung nicht erzeugen" -#: session_state.cc:1448 +#: session_state.cc:1370 msgid "Loaded track/bus %1" msgstr "Spur/Bus %1 wurde geladen" -#: session_state.cc:1546 +#: session_state.cc:1468 msgid "Could not find diskstream for route" msgstr "Konnte Diskstream für Route nicht finden" -#: session_state.cc:1600 +#: session_state.cc:1522 msgid "Session: cannot create Region from XML description." msgstr "Session: kann Region nicht aus XML-Beschreibung erzeugen" -#: session_state.cc:1604 +#: session_state.cc:1526 msgid "Can not load state for region '%1'" msgstr "Kann Status für Region '%1' nicht laden" -#: session_state.cc:1640 +#: session_state.cc:1562 msgid "Regions in compound description not found (ID's %1 and %2): ignored" msgstr "" "Regionen der Verbindungsbeschreibung nicht gefunden (IDs %1 and %2): " "ignoriert" -#: session_state.cc:1668 +#: session_state.cc:1590 msgid "Nested source has no ID info in session file! (ignored)" msgstr "" "Verschachtelte Quelle hat keine ID-Information in Projektdatei! (ignoriert)" -#: session_state.cc:1680 +#: session_state.cc:1602 msgid "Cannot reconstruct nested source for region %1" msgstr "Kann verschachtelte Quelle für Region %1 nicht wiederherstellen" -#: session_state.cc:1742 +#: session_state.cc:1664 msgid "Session: XMLNode describing a AudioRegion is incomplete (no source)" msgstr "" "Session: XML-Knoten zur Beschreibung einer Audioregion ist unvollständig " "(Quelle fehlt)" -#: session_state.cc:1750 session_state.cc:1771 session_state.cc:1791 +#: session_state.cc:1672 session_state.cc:1693 session_state.cc:1713 msgid "" "Session: XMLNode describing a AudioRegion references an unknown source id =%1" msgstr "" "Session: XML-Knoten zur Beschreibung einer Audioregion referenziert eine " "unbekannte Quell-ID =%1" -#: session_state.cc:1756 session_state.cc:1777 session_state.cc:1797 +#: session_state.cc:1678 session_state.cc:1699 session_state.cc:1719 msgid "" "Session: XMLNode describing a AudioRegion references a non-audio source id =" "%1" @@ -2112,7 +2128,7 @@ msgstr "" "Session: XML-Knoten zur Beschreibung einer Audioregion referenziert eine " "Nicht-Audio Quell-ID =%1" -#: session_state.cc:1820 +#: session_state.cc:1742 msgid "" "Session: XMLNode describing an AudioRegion is missing some master sources; " "ignored" @@ -2120,27 +2136,27 @@ msgstr "" "Session: dem XML-Knoten zur Beschreibung einer Audioregion fehlen einige " "Hauptquellen; ignoriert" -#: session_state.cc:1854 +#: session_state.cc:1776 msgid "Session: XMLNode describing a MidiRegion is incomplete (no source)" msgstr "" "Session: XML-Knoten zur Beschreibung einer MIDI-Region ist unvollständig " "(Quelle fehlt)" -#: session_state.cc:1862 +#: session_state.cc:1784 msgid "" "Session: XMLNode describing a MidiRegion references an unknown source id =%1" msgstr "" "Session: XML-Knoten zur Beschreibung einer MIDI-Region referenziert eine " "unbekannte Quell-ID =%1" -#: session_state.cc:1868 +#: session_state.cc:1790 msgid "" "Session: XMLNode describing a MidiRegion references a non-midi source id =%1" msgstr "" "Session: XML-Knoten zur Beschreibung einer MIDI-Region referenziert eine " "Nicht-MIDI Quell-ID =%1" -#: session_state.cc:1936 +#: session_state.cc:1858 msgid "" "cannot create new file from region name \"%1\" with ident = \"%2\": too many " "existing files with similar names" @@ -2148,121 +2164,121 @@ msgstr "" "kann keine neue Datei aus dem Regionennamen \"%1\" mit ident = \"%2\" " "erzeugen: zu viele Dateien mit ähnlichen Namen existieren" -#: session_state.cc:1959 +#: session_state.cc:1881 msgid "Session: cannot create Source from XML description." msgstr "Session: Kann Quelle aus der XML-Beschreibung nicht erzeugen" -#: session_state.cc:1993 +#: session_state.cc:1915 msgid "A sound file is missing. It will be replaced by silence." msgstr "Eine Audiodatei fehlt. Sie wird durch Stille ersetzt werden." -#: session_state.cc:2016 +#: session_state.cc:1938 msgid "Found a sound file that cannot be used by %1. Talk to the progammers." msgstr "" "Eine nicht mit %1 benutzbare Audiodatei wurde gefunden. Sprechen Sie mit den " "Programmierern." -#: session_state.cc:2033 +#: session_state.cc:1955 msgid "Could not create templates directory \"%1\" (%2)" msgstr "Konnte Vorlagenverzeichnis \"%1\" nicht erzeugen (%2)" -#: session_state.cc:2046 +#: session_state.cc:1968 msgid "Template \"%1\" already exists - new version not created" msgstr "Vorlage \"%1\" existiert bereits - neue Version wurde nicht erzeugt" -#: session_state.cc:2052 +#: session_state.cc:1974 msgid "Could not create directory for Session template\"%1\" (%2)" msgstr "Konnte kein Verzeichnis für Projektvorlage \"%1\" erzeugen (%2)" -#: session_state.cc:2062 +#: session_state.cc:1984 msgid "template not saved" msgstr "Vorlage nicht gesichert" -#: session_state.cc:2072 +#: session_state.cc:1994 msgid "Could not create directory for Session template plugin state\"%1\" (%2)" msgstr "" "Konnte Verzeichnis für Projektvorlagen-Pluginstatus \"%1\" nicht erzeugen " "(%2)" -#: session_state.cc:2267 +#: session_state.cc:2189 msgid "Unknown node \"%1\" found in Bundles list from session file" msgstr "Unbekannter Knoten \"%1\" in Bündelliste der Projektdatei gefunden" -#: session_state.cc:2809 session_state.cc:2815 +#: session_state.cc:2731 session_state.cc:2737 msgid "Cannot expand path %1 (%2)" msgstr "Kann Pfad %1 nicht expandieren (%2)" -#: session_state.cc:2868 +#: session_state.cc:2790 msgid "Session: cannot create dead file folder \"%1\" (%2)" msgstr "Session: kann den Mülleimer \"%1\" nicht erzeugen (%2)" -#: session_state.cc:2907 +#: session_state.cc:2829 msgid "cannot rename unused file source from %1 to %2 (%3)" msgstr "kann unbenutzte Dateiquelle nicht von %1 nach %2 umbenennen (%3)" -#: session_state.cc:2925 +#: session_state.cc:2847 msgid "cannot remove peakfile %1 for %2 (%3)" msgstr "kann Peakdatei %1 für %2 nicht entfernen (%3)" -#: session_state.cc:3227 +#: session_state.cc:3149 msgid "could not backup old history file, current history not saved" msgstr "" "konnte kein Backup der alten Aktionsliste erstellen, momentane Aktionsliste " "ungesichert" -#: session_state.cc:3240 +#: session_state.cc:3162 msgid "history could not be saved to %1" msgstr "Aktionsliste konnte nicht nach %1 gesichert werden" -#: session_state.cc:3243 +#: session_state.cc:3165 msgid "Could not remove history file at path \"%1\" (%2)" msgstr "Konnte Aktionslistendatei im Pfad \"%1\" nicht entfernen (%2)" -#: session_state.cc:3247 +#: session_state.cc:3169 msgid "could not restore history file from backup %1 (%2)" msgstr "konnte Aktionslistendatei nicht aus dem Backup %1 restaurieren (%2)" -#: session_state.cc:3272 +#: session_state.cc:3194 msgid "%1: no history file \"%2\" for this session." msgstr "%1: keine Aktionslistendatei \"%2\" für dieses Projekt." -#: session_state.cc:3278 +#: session_state.cc:3200 msgid "Could not understand session history file \"%1\"" msgstr "Konnte Projekt-Aktionslistendatei \"%1\" nicht verstehen" -#: session_state.cc:3320 +#: session_state.cc:3242 msgid "Failed to downcast MidiSource for NoteDiffCommand" msgstr "MidiSource für NoteDiffCommand nicht auffindbar" -#: session_state.cc:3331 +#: session_state.cc:3253 msgid "Failed to downcast MidiSource for SysExDiffCommand" msgstr "MidiSource für SysExDiffCommand nicht auffindbar" -#: session_state.cc:3342 +#: session_state.cc:3264 msgid "Failed to downcast MidiSource for PatchChangeDiffCommand" msgstr "MidiSource für PatchChangeDiffCommand nicht auffindbar" -#: session_state.cc:3350 +#: session_state.cc:3272 msgid "Couldn't figure out how to make a Command out of a %1 XMLNode." msgstr "Konnte im XML-Knoten \"%1\" keinen Befehl erkennen." -#: session_state.cc:3602 +#: session_state.cc:3524 msgid "Session: unknown diskstream type in XML" msgstr "Session: Unbekannter Diskstream im XML" -#: session_state.cc:3607 +#: session_state.cc:3529 msgid "Session: could not load diskstream via XML state" msgstr "Session: konnte Diskstream nicht via XML-Status laden" -#: session_time.cc:215 -msgid "Unknown JACK transport state %1 in sync callback" -msgstr "Unbekannter JACK-Transportstatus im Sync-Callback" +#: session_time.cc:214 +msgid "Unknown transport state %1 in sync callback" +msgstr "Unbekannter Transportstatus %1 im Sync-Callback" -#: session_transport.cc:168 +#: session_transport.cc:167 msgid "Cannot loop - no loop range defined" msgstr "Kann nicht loopen - kein Schleifenbereich definieert" -#: session_transport.cc:728 +#: session_transport.cc:739 msgid "" "Seamless looping cannot be supported while %1 is using JACK transport.\n" "Recommend changing the configured options" @@ -2271,7 +2287,7 @@ msgstr "" "benutzt.\n" "Ändern Sie die Konfigurationsoption" -#: session_transport.cc:1094 +#: session_transport.cc:1105 msgid "" "Global varispeed cannot be supported while %1 is connected to JACK transport " "control" @@ -2421,7 +2437,7 @@ msgstr "" msgid "attempt to write a non-writable audio file source (%1)" msgstr "Versuch, in eine schreibgeschützte Audio-Dateiquelle zu schreiben (%1)" -#: sndfilesource.cc:396 utils.cc:507 utils.cc:531 utils.cc:545 utils.cc:564 +#: sndfilesource.cc:396 utils.cc:510 utils.cc:534 utils.cc:548 utils.cc:567 msgid "programming error: %1 %2" msgstr "Programmierfehler: %1 %2" @@ -2659,19 +2675,19 @@ msgstr "Sperren" msgid "programming error: unknown edit mode string \"%1\"" msgstr "Programmierfehler: unbekannte Zeichenkette für Editiermodus \"%1\"" -#: utils.cc:389 utils.cc:418 +#: utils.cc:389 utils.cc:421 msgid "MIDI Timecode" msgstr "MIDI Timecode" -#: utils.cc:389 utils.cc:416 +#: utils.cc:389 utils.cc:419 msgid "MTC" msgstr "MTC" -#: utils.cc:393 utils.cc:425 +#: utils.cc:393 utils.cc:428 msgid "MIDI Clock" msgstr "MIDI Clock" -#: utils.cc:397 utils.cc:412 utils.cc:432 +#: utils.cc:397 utils.cc:415 utils.cc:435 msgid "JACK" msgstr "JACK" @@ -2679,22 +2695,62 @@ msgstr "JACK" msgid "programming error: unknown sync source string \"%1\"" msgstr "Programmierfehler: unbekannte Zeichenkette für Sync-Quelle \"%1\"" -#: utils.cc:423 +#: utils.cc:426 msgid "M-Clock" msgstr "M-Clock" -#: utils.cc:429 +#: utils.cc:432 msgid "LTC" msgstr "LTC" -#: utils.cc:599 +#: utils.cc:602 msgid "programming error: unknown native header format: %1" msgstr "Programmierfehler: unbekanntes natives Dateikopfformat: %1" -#: utils.cc:614 +#: utils.cc:617 msgid "cannot open directory %1 (%2)" msgstr "kann Verzeichnis %1 nicht öffnen (%2)" +#~ msgid "Setup signal flow and plugins" +#~ msgstr "Richte Signalfluss and Plugins ein" + +#~ msgid "cannot setup Click I/O" +#~ msgstr "kann Metronom-E/A nicht einrichten" + +#~ msgid "Compute I/O Latencies" +#~ msgstr "Berechne E/A-Latenzen" + +#~ msgid "" +#~ "This version of JACK is old - you should upgrade to a newer version that " +#~ "supports jack_port_type_get_buffer_size()" +#~ msgstr "" +#~ "Diese JACK-Version ist alt - Sie sollten auf eine Version upgraden, die " +#~ "jack_port_type_get_buffer_size() unterstützt" + +#~ msgid "Connect session to engine" +#~ msgstr "Verbinde Projekt mit Engine" + +#~ msgid "connect called before engine was started" +#~ msgstr "Aufruf von connect vor dem Start der Engine" + +#~ msgid "disconnect called before engine was started" +#~ msgstr "Aufruf von disconnect vor dem Start der Engine" + +#~ msgid "get_port_by_name() called before engine was started" +#~ msgstr "Aufruf von get_port_by_name() vor dem Start der Engine" + +#~ msgid "get_ports called before engine was started" +#~ msgstr "Aufruf von get_ports vor dem Start der Engine" + +#~ msgid "failed to connect to JACK" +#~ msgstr "Verbindung zu JACK fehlgeschlagen" + +#~ msgid "get_connected_latency_range() called while disconnected from JACK" +#~ msgstr "Aufruf von get_connected_latency_range(), während von JACK getrennt" + +#~ msgid "Session: could not send full MIDI time code" +#~ msgstr "Session: konnte vollständigen MIDI-Timecode nicht senden" + #~ msgid "Session" #~ msgstr "Projekt" -- cgit v1.2.3 From c94f0b6298f71f47015b12e5b180280bc2948772 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Tue, 8 Oct 2013 12:22:49 -0400 Subject: updated DE translation from edgar aichinger --- gtk2_ardour/po/de.po | 2563 +++++++++++++++++++++++++++----------------------- 1 file changed, 1361 insertions(+), 1202 deletions(-) diff --git a/gtk2_ardour/po/de.po b/gtk2_ardour/po/de.po index 74288bde3f..5817ab3878 100644 --- a/gtk2_ardour/po/de.po +++ b/gtk2_ardour/po/de.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: gtk-ardour 0.347.2\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-09-03 10:44+0200\n" -"PO-Revision-Date: 2013-09-03 11:41+0200\n" +"POT-Creation-Date: 2013-09-26 16:09+0200\n" +"PO-Revision-Date: 2013-09-26 16:32+0200\n" "Last-Translator: Edgar Aichinger \n" "Language-Team: German \n" "Language: de\n" @@ -448,8 +448,8 @@ msgstr "Audiobusse" msgid "Add:" msgstr "Erstelle:" -#: add_route_dialog.cc:114 startup.cc:841 time_fx_dialog.cc:91 -#: add_video_dialog.cc:150 video_server_dialog.cc:112 +#: add_route_dialog.cc:114 time_fx_dialog.cc:91 add_video_dialog.cc:150 +#: video_server_dialog.cc:112 msgid "Options" msgstr "Optionen" @@ -463,21 +463,22 @@ msgid "Group:" msgstr "Gruppe:" #: add_route_dialog.cc:215 add_route_dialog.cc:224 add_route_dialog.cc:298 -#: rc_option_editor.cc:1456 rc_option_editor.cc:1458 rc_option_editor.cc:1460 -#: rc_option_editor.cc:1478 rc_option_editor.cc:1480 rc_option_editor.cc:1488 -#: rc_option_editor.cc:1490 rc_option_editor.cc:1508 rc_option_editor.cc:1521 -#: rc_option_editor.cc:1523 rc_option_editor.cc:1525 rc_option_editor.cc:1556 -#: rc_option_editor.cc:1558 rc_option_editor.cc:1560 rc_option_editor.cc:1568 -#: rc_option_editor.cc:1576 rc_option_editor.cc:1584 +#: ardour_ui_ed.cc:476 engine_dialog.cc:201 rc_option_editor.cc:1454 +#: rc_option_editor.cc:1456 rc_option_editor.cc:1458 rc_option_editor.cc:1474 +#: rc_option_editor.cc:1476 rc_option_editor.cc:1484 rc_option_editor.cc:1486 +#: rc_option_editor.cc:1504 rc_option_editor.cc:1517 rc_option_editor.cc:1519 +#: rc_option_editor.cc:1521 rc_option_editor.cc:1552 rc_option_editor.cc:1554 +#: rc_option_editor.cc:1556 rc_option_editor.cc:1564 rc_option_editor.cc:1572 +#: rc_option_editor.cc:1580 msgid "Audio" msgstr "Audio" #: add_route_dialog.cc:216 add_route_dialog.cc:227 add_route_dialog.cc:299 -#: editor_actions.cc:105 missing_file_dialog.cc:55 rc_option_editor.cc:1707 -#: rc_option_editor.cc:1715 rc_option_editor.cc:1723 rc_option_editor.cc:1732 -#: rc_option_editor.cc:1740 rc_option_editor.cc:1748 rc_option_editor.cc:1756 -#: rc_option_editor.cc:1765 rc_option_editor.cc:1774 rc_option_editor.cc:1783 -#: rc_option_editor.cc:1791 rc_option_editor.cc:1799 +#: editor_actions.cc:105 engine_dialog.cc:202 missing_file_dialog.cc:55 +#: rc_option_editor.cc:1703 rc_option_editor.cc:1711 rc_option_editor.cc:1719 +#: rc_option_editor.cc:1728 rc_option_editor.cc:1736 rc_option_editor.cc:1744 +#: rc_option_editor.cc:1752 rc_option_editor.cc:1761 rc_option_editor.cc:1770 +#: rc_option_editor.cc:1779 rc_option_editor.cc:1787 rc_option_editor.cc:1795 msgid "MIDI" msgstr "MIDI" @@ -626,7 +627,7 @@ msgstr "Normalisieren" msgid "FFT analysis window" msgstr "FFT-Analysefenster" -#: analysis_window.cc:60 editor.cc:1856 +#: analysis_window.cc:60 editor.cc:1857 msgid "Spectral Analysis" msgstr "FFT-Analyse" @@ -650,50 +651,54 @@ msgstr "" "Schaltfläche kann den Status des nichtexistenten Kontrollzieles nicht " "verfolgen\n" -#: ardour_ui.cc:180 +#: ardour_ui.cc:179 msgid "audition" msgstr "Vorhören" -#: ardour_ui.cc:181 +#: ardour_ui.cc:180 msgid "solo" msgstr "Solo" -#: ardour_ui.cc:182 +#: ardour_ui.cc:181 msgid "feedback" msgstr "Feedback" -#: ardour_ui.cc:187 speaker_dialog.cc:36 +#: ardour_ui.cc:186 speaker_dialog.cc:36 msgid "Speaker Configuration" msgstr "Lautsprechereinstellung" -#: ardour_ui.cc:188 theme_manager.cc:56 theme_manager.cc:64 +#: ardour_ui.cc:187 theme_manager.cc:56 theme_manager.cc:64 msgid "Theme Manager" msgstr "Thema" -#: ardour_ui.cc:189 keyeditor.cc:53 +#: ardour_ui.cc:188 keyeditor.cc:53 msgid "Key Bindings" msgstr "Tastenkombinationen" -#: ardour_ui.cc:190 +#: ardour_ui.cc:189 msgid "Preferences" msgstr "Globale Einstellungen" -#: ardour_ui.cc:191 ardour_ui.cc:196 +#: ardour_ui.cc:190 ardour_ui.cc:196 msgid "Add Tracks/Busses" msgstr "Spuren/Busse hinzufügen" -#: ardour_ui.cc:192 +#: ardour_ui.cc:191 msgid "About" msgstr "Über..." -#: ardour_ui.cc:193 location_ui.cc:1146 +#: ardour_ui.cc:192 location_ui.cc:1146 msgid "Locations" msgstr "Positionen" -#: ardour_ui.cc:194 route_params_ui.cc:58 route_params_ui.cc:606 +#: ardour_ui.cc:193 route_params_ui.cc:58 route_params_ui.cc:606 msgid "Tracks and Busses" msgstr "Spuren/Busse" +#: ardour_ui.cc:194 engine_dialog.cc:61 +msgid "Audio/MIDI Setup" +msgstr "Audio/MIDI Einstellungen" + #: ardour_ui.cc:195 msgid "Properties" msgstr "Projekteinstellungen" @@ -718,15 +723,33 @@ msgstr "MIDI-Verbindungen" msgid "Errors" msgstr "Fehlermeldungen" -#: ardour_ui.cc:388 -msgid "Starting audio engine" -msgstr "Starte Audio-Engine" +#: ardour_ui.cc:438 +msgid "" +"The audio backend was shutdown because:\n" +"\n" +"%1" +msgstr "" +"Das Audiobackend wurde aus folgendem Grund beendet:\n" +"\n" +"%1" -#: ardour_ui.cc:758 startup.cc:638 +#: ardour_ui.cc:440 +msgid "" +"`The audio backend has either been shutdown or it\n" +"disconnected %1 because %1\n" +"was not fast enough. Try to restart\n" +"the audio backend and save the session." +msgstr "" +"Das Audiobackend wurde entweder beendet oder von\n" +"%1 getrennt, weil %1 nicht schnell genug\n" +"war. Sie sollten versuchen, das Audiobackend \n" +"neu zu starten und das Projekt zu speichern." + +#: ardour_ui.cc:818 startup.cc:378 msgid "%1 is ready for use" msgstr "%1 ist bereit" -#: ardour_ui.cc:806 +#: ardour_ui.cc:866 msgid "" "WARNING: Your system has a limit for maximum amount of locked memory. This " "might cause %1 to run out of memory before your system runs out of memory. \n" @@ -741,23 +764,23 @@ msgstr "" "Sie können die Speicherbegrenzung mit 'ulimit -l' einsehen und normalerweise " "in %2 verändern." -#: ardour_ui.cc:823 +#: ardour_ui.cc:883 msgid "Do not show this window again" msgstr "Diese Meldung nicht erneut anzeigen" -#: ardour_ui.cc:865 +#: ardour_ui.cc:925 msgid "Don't quit" msgstr "Abbrechen" -#: ardour_ui.cc:866 +#: ardour_ui.cc:926 msgid "Just quit" msgstr "Beenden ohne zu speichern" -#: ardour_ui.cc:867 +#: ardour_ui.cc:927 msgid "Save and quit" msgstr "Speichern und beenden" -#: ardour_ui.cc:877 +#: ardour_ui.cc:937 msgid "" "%1 was unable to save your session.\n" "\n" @@ -771,15 +794,15 @@ msgstr "" "\n" "\"Trotzdem beenden\"." -#: ardour_ui.cc:908 +#: ardour_ui.cc:968 msgid "Please wait while %1 cleans up..." msgstr "Bitte warten Sie, während %1 aufräumt." -#: ardour_ui.cc:925 +#: ardour_ui.cc:986 msgid "Unsaved Session" msgstr "Nicht gespeichertes Projekt" -#: ardour_ui.cc:946 +#: ardour_ui.cc:1007 msgid "" "The session \"%1\"\n" "has not been saved.\n" @@ -797,7 +820,7 @@ msgstr "" "\n" "Wie wollen Sie vorgehen?" -#: ardour_ui.cc:949 +#: ardour_ui.cc:1010 msgid "" "The snapshot \"%1\"\n" "has not been saved.\n" @@ -815,74 +838,75 @@ msgstr "" "\n" "Wie wollen Sie vorgehen?" -#: ardour_ui.cc:963 +#: ardour_ui.cc:1024 msgid "Prompter" msgstr "Frage" -#: ardour_ui.cc:1049 -msgid "disconnected" -msgstr "getrennt" +#: ardour_ui.cc:1110 ardour_ui.cc:1118 +#, c-format +msgid "Audio: none" +msgstr "Audio: Kein" -#: ardour_ui.cc:1056 +#: ardour_ui.cc:1122 #, c-format -msgid "JACK: %.1f kHz / %4.1f ms" -msgstr "JACK: %.1f kHz / %4.1f ms" +msgid "Audio: %.1f kHz / %4.1f ms" +msgstr "Audio: %.1f kHz / %4.1f ms" -#: ardour_ui.cc:1060 +#: ardour_ui.cc:1126 #, c-format -msgid "JACK: % kHz / %4.1f ms" -msgstr "JACK: % kHz / %4.1f ms" +msgid "Audio: % kHz / %4.1f ms" +msgstr "Audio: % kHz / %4.1f ms" -#: ardour_ui.cc:1078 export_video_dialog.cc:68 +#: ardour_ui.cc:1144 export_video_dialog.cc:68 msgid "File:" msgstr "Datei:" -#: ardour_ui.cc:1082 +#: ardour_ui.cc:1148 msgid "BWF" msgstr "BWF" -#: ardour_ui.cc:1085 +#: ardour_ui.cc:1151 msgid "WAV" msgstr "WAV" -#: ardour_ui.cc:1088 +#: ardour_ui.cc:1154 msgid "WAV64" msgstr "WAV64" -#: ardour_ui.cc:1091 session_option_editor.cc:197 +#: ardour_ui.cc:1157 session_option_editor.cc:197 msgid "CAF" msgstr "CAF" -#: ardour_ui.cc:1094 +#: ardour_ui.cc:1160 msgid "AIFF" msgstr "AIFF" -#: ardour_ui.cc:1097 +#: ardour_ui.cc:1163 msgid "iXML" msgstr "iXML" -#: ardour_ui.cc:1100 +#: ardour_ui.cc:1166 msgid "RF64" msgstr "RF64" -#: ardour_ui.cc:1108 +#: ardour_ui.cc:1174 msgid "32-float" msgstr "32-float" -#: ardour_ui.cc:1111 +#: ardour_ui.cc:1177 msgid "24-int" msgstr "24-int" -#: ardour_ui.cc:1114 +#: ardour_ui.cc:1180 msgid "16-int" msgstr "16-int" -#: ardour_ui.cc:1133 +#: ardour_ui.cc:1199 #, c-format msgid "DSP: %5.1f%%" msgstr "DSP: %5.1f%%" -#: ardour_ui.cc:1152 +#: ardour_ui.cc:1218 #, c-format msgid "" "Buffers: p:" @@ -893,61 +917,62 @@ msgstr "" "%% c:" "%%%" -#: ardour_ui.cc:1188 +#: ardour_ui.cc:1259 msgid "Disk: Unknown" msgstr "Disk: Unbekannt" -#: ardour_ui.cc:1190 +#: ardour_ui.cc:1261 msgid "Disk: 24hrs+" msgstr "Disk: 24h+" -#: ardour_ui.cc:1208 +#: ardour_ui.cc:1279 msgid "Disk: >24 hrs" msgstr "Disk: >24 h" -#: ardour_ui.cc:1219 +#: ardour_ui.cc:1290 #, c-format msgid "Disk: %02dh:%02dm:%02ds" msgstr "Disk: %02dh:%02dm:%02ds" -#: ardour_ui.cc:1245 +#: ardour_ui.cc:1316 #, c-format msgid "Timecode|TC: %s" msgstr "Timecode|TC: %s" -#: ardour_ui.cc:1362 ardour_ui.cc:1371 startup.cc:1054 +#: ardour_ui.cc:1433 ardour_ui.cc:1442 session_dialog.cc:301 +#: session_dialog.cc:306 msgid "Recent Sessions" msgstr "Zuletzt verwendete Projekte" -#: ardour_ui.cc:1451 +#: ardour_ui.cc:1521 msgid "" -"%1 is not connected to JACK\n" +"%1 is not connected to any audio backend.\n" "You cannot open or close sessions in this condition" msgstr "" -"%1 ist derzeit nicht mit JACK verbunden.\n" -"Dadurch können keine Projekte geöffnet oder geschlossen werden." +"%1 ist derzeit mit keinem Audiobackend verbunden.\n" +"Daher können keine Projekte geöffnet oder geschlossen werden." -#: ardour_ui.cc:1478 +#: ardour_ui.cc:1545 msgid "Open Session" msgstr "Projekt öffnen" -#: ardour_ui.cc:1503 session_import_dialog.cc:169 -#: session_metadata_dialog.cc:729 startup.cc:1083 +#: ardour_ui.cc:1570 session_dialog.cc:332 session_import_dialog.cc:169 +#: session_metadata_dialog.cc:729 msgid "%1 sessions" msgstr "%1 Projekte" -#: ardour_ui.cc:1540 +#: ardour_ui.cc:1607 msgid "You cannot add a track without a session already loaded." msgstr "" "Sie können erst Spuren oder Busse hinzufügen, wenn ein Projekt geladen wurde." -#: ardour_ui.cc:1548 +#: ardour_ui.cc:1615 msgid "could not create %1 new mixed track" msgid_plural "could not create %1 new mixed tracks" msgstr[0] "konnte %1 neue Audio+MIDI-Spur nicht erstellen" msgstr[1] "konnte %1 neue Audio+MIDI-Spuren nicht erstellen" -#: ardour_ui.cc:1554 ardour_ui.cc:1615 +#: ardour_ui.cc:1621 ardour_ui.cc:1682 msgid "" "There are insufficient JACK ports available\n" "to create a new track or bus.\n" @@ -960,24 +985,24 @@ msgstr "" "%1 und starten Sie JACK mit einer größeren\n" "Anzahl Ports neu." -#: ardour_ui.cc:1589 +#: ardour_ui.cc:1656 msgid "You cannot add a track or bus without a session already loaded." msgstr "" "Sie können erst Spuren oder Busse hinzufügen, wenn ein Projekt geladen wurde." -#: ardour_ui.cc:1598 +#: ardour_ui.cc:1665 msgid "could not create %1 new audio track" msgid_plural "could not create %1 new audio tracks" msgstr[0] "konnte %1 neue Audiospur nicht erstellen." msgstr[1] "konnte %1 neue Audiospuren nicht erstellen." -#: ardour_ui.cc:1607 +#: ardour_ui.cc:1674 msgid "could not create %1 new audio bus" msgid_plural "could not create %1 new audio busses" msgstr[0] "konnte %1 neuen Audiobus nicht erstellen" msgstr[1] "konnte %1 neue Audiobusse nicht erstellen" -#: ardour_ui.cc:1724 +#: ardour_ui.cc:1798 msgid "" "Please create one or more tracks before trying to record.\n" "You can do this with the \"Add Track or Bus\" option in the Session menu." @@ -986,41 +1011,15 @@ msgstr "" "eine oder mehrere Spur hinzu. Die geht über \"Spur/Bus hinzufügen\"\n" "im Menüpunkt Projekt." -#: ardour_ui.cc:2114 -msgid "" -"The audio backend (JACK) was shutdown because:\n" -"\n" -"%1" -msgstr "" -"Der Audioserver (JACK) wurde aus folgendem Grund beendet:\n" -"\n" -"%1" - -#: ardour_ui.cc:2116 -msgid "" -"JACK has either been shutdown or it\n" -"disconnected %1 because %1\n" -"was not fast enough. Try to restart\n" -"JACK, reconnect and save the session." -msgstr "" -"JACK wurde entweder beendet oder von\n" -"%1 getrennt, weil %1 nicht schnell genug\n" -"war. Sie sollten versuchen, JACK neu zu starten,\n" -"neu zu verbinden, und das Projekt zu speichern." - -#: ardour_ui.cc:2142 -msgid "Unable to start the session running" -msgstr "Konnte das aktuelle Projekt nicht starten" - -#: ardour_ui.cc:2222 +#: ardour_ui.cc:2175 msgid "Take Snapshot" msgstr "Schnappschuss machen" -#: ardour_ui.cc:2223 +#: ardour_ui.cc:2176 msgid "Name of new snapshot" msgstr "Name für neuen Schnappschuss" -#: ardour_ui.cc:2247 +#: ardour_ui.cc:2200 msgid "" "To ensure compatibility with various systems\n" "snapshot names may not contain a '%1' character" @@ -1028,29 +1027,29 @@ msgstr "" "Um die Kompatibilität mit verschiedenen Systemen sicher zu stellen,\n" "dürfen Namen von Schnappschüssen kein '%1'-Zeichen enthalten" -#: ardour_ui.cc:2259 +#: ardour_ui.cc:2212 msgid "Confirm Snapshot Overwrite" msgstr "Bestätige das Überschreiben des Schnappschusses" -#: ardour_ui.cc:2260 +#: ardour_ui.cc:2213 msgid "A snapshot already exists with that name. Do you want to overwrite it?" msgstr "" "Ein Schnappschuss mit diesem Namen existiert bereits. Wollen Sie ihn " "überschreiben?" -#: ardour_ui.cc:2263 utils_videotl.cc:67 +#: ardour_ui.cc:2216 utils_videotl.cc:67 msgid "Overwrite" msgstr "Überschreiben" -#: ardour_ui.cc:2297 +#: ardour_ui.cc:2250 msgid "Rename Session" msgstr "Projekt umbenennen" -#: ardour_ui.cc:2298 +#: ardour_ui.cc:2251 msgid "New session name" msgstr "Neuer Projektname" -#: ardour_ui.cc:2312 ardour_ui.cc:2692 ardour_ui.cc:2737 +#: ardour_ui.cc:2265 ardour_ui.cc:2650 ardour_ui.cc:2686 msgid "" "To ensure compatibility with various systems\n" "session names may not contain a '%1' character" @@ -1058,14 +1057,14 @@ msgstr "" "Um die Kompatibilität mit verschiedenen Systemen sicher zu stellen,\n" "dürfen Projektnamen kein '%1'-Zeichen enthalten" -#: ardour_ui.cc:2320 +#: ardour_ui.cc:2273 msgid "" "That name is already in use by another directory/folder. Please try again." msgstr "" "Dieser Name wird schon von einem anderen Verzeichnis/Ordner benutzt. Bitte " "versuchen Sie einen anderen Namen." -#: ardour_ui.cc:2329 +#: ardour_ui.cc:2282 msgid "" "Renaming this session failed.\n" "Things could be seriously messed up at this point" @@ -1073,19 +1072,19 @@ msgstr "" "Das Umbenennen des Projekts ist fehlgeschlagen.\n" "Dies könnte auf schwerwiegende Probleme hinweisen." -#: ardour_ui.cc:2440 +#: ardour_ui.cc:2393 msgid "Save Template" msgstr "Als Vorlage Speichern" -#: ardour_ui.cc:2441 +#: ardour_ui.cc:2394 msgid "Name for template:" msgstr "Name für Vorlage" -#: ardour_ui.cc:2442 +#: ardour_ui.cc:2395 msgid "-template" msgstr "-Vorlage" -#: ardour_ui.cc:2480 +#: ardour_ui.cc:2433 msgid "" "This session\n" "%1\n" @@ -1095,52 +1094,48 @@ msgstr "" "%1\n" "existiert bereits. Wollen Sie sie öffnen?" -#: ardour_ui.cc:2490 +#: ardour_ui.cc:2443 msgid "Open Existing Session" msgstr "Vorhandenes Projekt öffnen" -#: ardour_ui.cc:2728 +#: ardour_ui.cc:2677 msgid "There is no existing session at \"%1\"" msgstr "Es gibt kein Projekt in: \"%1\"" -#: ardour_ui.cc:2815 +#: ardour_ui.cc:2764 msgid "Please wait while %1 loads your session" msgstr "Bitte warten Sie, während %1 das Projekt lädt" -#: ardour_ui.cc:2830 +#: ardour_ui.cc:2779 msgid "Port Registration Error" msgstr "Fehler bei der Registrierung von Ports" -#: ardour_ui.cc:2831 +#: ardour_ui.cc:2780 msgid "Click the Close button to try again." msgstr "Klicken Sie auf Schließen, um es erneut zu versuchen." -#: ardour_ui.cc:2852 +#: ardour_ui.cc:2801 msgid "Session \"%1 (snapshot %2)\" did not load successfully" msgstr "Projekt \"%1 (Schnappschuss %2)\" konnte nicht geladen werden." -#: ardour_ui.cc:2858 +#: ardour_ui.cc:2808 msgid "Loading Error" msgstr "Fehler beim Laden" -#: ardour_ui.cc:2859 -msgid "Click the Refresh button to try again." -msgstr "Klicken Sie auf Aktualisieren, um es erneut zu versuchen." - -#: ardour_ui.cc:2941 +#: ardour_ui.cc:2875 msgid "Could not create session in \"%1\"" msgstr "Konnte kein Projekt in \"%1\" anlegen" -#: ardour_ui.cc:3041 +#: ardour_ui.cc:2975 msgid "No files were ready for clean-up" msgstr "Keine Audiodateien zum Aufräumen vorhanden" -#: ardour_ui.cc:3045 ardour_ui.cc:3055 ardour_ui.cc:3188 ardour_ui.cc:3195 +#: ardour_ui.cc:2979 ardour_ui.cc:2989 ardour_ui.cc:3122 ardour_ui.cc:3129 #: ardour_ui_ed.cc:104 msgid "Clean-up" msgstr "Aufräumen" -#: ardour_ui.cc:3046 +#: ardour_ui.cc:2980 msgid "" "If this seems suprising, \n" "check for any existing snapshots.\n" @@ -1152,19 +1147,19 @@ msgstr "" "sind sie wahrscheinlich noch in einem\n" "älteren Schnappschuss als Region eingebunden." -#: ardour_ui.cc:3105 +#: ardour_ui.cc:3039 msgid "kilo" msgstr "kilo" -#: ardour_ui.cc:3108 +#: ardour_ui.cc:3042 msgid "mega" msgstr "mega" -#: ardour_ui.cc:3111 +#: ardour_ui.cc:3045 msgid "giga" msgstr "giga" -#: ardour_ui.cc:3116 +#: ardour_ui.cc:3050 msgid "" "The following file was deleted from %2,\n" "releasing %3 %4bytes of disk space" @@ -1178,7 +1173,7 @@ msgstr[1] "" "Die folgenden %1 Dateien wurden von %2\n" "gelöscht und gaben %3 %4bytes Speicherplatz frei" -#: ardour_ui.cc:3123 +#: ardour_ui.cc:3057 msgid "" "The following file was not in use and \n" "has been moved to: %2\n" @@ -1216,11 +1211,11 @@ msgstr[1] "" "\n" "%3 %4bytes Speicherplatz freigegeben werden.\n" -#: ardour_ui.cc:3183 +#: ardour_ui.cc:3117 msgid "Are you sure you want to clean-up?" msgstr "Wollen Sie wirklich aufräumen?" -#: ardour_ui.cc:3190 +#: ardour_ui.cc:3124 msgid "" "Clean-up is a destructive operation.\n" "ALL undo/redo information will be lost if you clean-up.\n" @@ -1232,42 +1227,42 @@ msgstr "" "Nach dem Aufräumen werden alle nicht benötigten Audiodateien in den \"dead " "sounds\" Ordner verschoben." -#: ardour_ui.cc:3198 +#: ardour_ui.cc:3132 msgid "CleanupDialog" msgstr "Aufräumdialog" -#: ardour_ui.cc:3228 +#: ardour_ui.cc:3162 msgid "Cleaned Files" msgstr "Aufgeräumte Dateien" -#: ardour_ui.cc:3245 +#: ardour_ui.cc:3179 msgid "deleted file" msgstr "gelöschte Datei" -#: ardour_ui.cc:3337 +#: ardour_ui.cc:3271 msgid "" "Video-Server was not launched by Ardour. The request to stop it is ignored." msgstr "" "Der Video-Server wurde nicht von Ardour gestartet, der Befehl ihn anzuhalten " "wird ignoriert." -#: ardour_ui.cc:3341 +#: ardour_ui.cc:3275 msgid "Stop Video-Server" msgstr "Video-Server anhalten" -#: ardour_ui.cc:3342 +#: ardour_ui.cc:3276 msgid "Do you really want to stop the Video Server?" msgstr "Wollen Sie den Video-Server wirklich anhalten?" -#: ardour_ui.cc:3345 +#: ardour_ui.cc:3279 msgid "Yes, Stop It" msgstr "Ja, anhalten." -#: ardour_ui.cc:3371 +#: ardour_ui.cc:3305 msgid "The Video Server is already started." msgstr "Der Video-Server läuft bereits" -#: ardour_ui.cc:3373 +#: ardour_ui.cc:3307 msgid "" "An external Video Server is configured and can be reached. Not starting a " "new instance." @@ -1275,7 +1270,7 @@ msgstr "" "Ein externer Video-Server wurde konfiguriert, ist aber nicht erreichbar. Es " "wird keine neue Instanz gestartet." -#: ardour_ui.cc:3381 ardour_ui.cc:3471 +#: ardour_ui.cc:3315 ardour_ui.cc:3405 msgid "" "Could not connect to the Video Server. Start it or configure its access URL " "in Edit -> Preferences." @@ -1284,36 +1279,36 @@ msgstr "" "ihn vorher starten oder die Adresse in Bearbeiten -> Globale Einstellungen " "anpassen" -#: ardour_ui.cc:3405 +#: ardour_ui.cc:3339 msgid "Specified docroot is not an existing directory." msgstr "Das eingestellte Dokumentenverzeichnis existiert nicht." -#: ardour_ui.cc:3410 +#: ardour_ui.cc:3344 msgid "Given Video Server is not an executable file." msgstr "Der eingestellte Video-Server ist keine ausführbare Datei." -#: ardour_ui.cc:3443 +#: ardour_ui.cc:3377 msgid "Cannot launch the video-server" msgstr "Kann den Videoserver nicht starten " -#: ardour_ui.cc:3452 +#: ardour_ui.cc:3386 msgid "Video-server was started but does not respond to requests..." msgstr "Viideoserver wurde gestartet, reagiert aber nicht auf Anfragen..." -#: ardour_ui.cc:3497 editor_audio_import.cc:632 +#: ardour_ui.cc:3431 editor_audio_import.cc:632 msgid "could not open %1" msgstr "Konnte \"%s\" nicht öffnen." -#: ardour_ui.cc:3501 +#: ardour_ui.cc:3435 msgid "no video-file selected" msgstr "Es wurde keine Video-Datei ausgewählt." -#: ardour_ui.cc:3673 +#: ardour_ui.cc:3607 msgid "Recording was stopped because your system could not keep up." msgstr "" "Die Aufnahme wurde gestoppt, da Ihr System nicht schnell genug folgen konnte." -#: ardour_ui.cc:3702 +#: ardour_ui.cc:3636 msgid "" "The disk system on your computer\n" "was not able to keep up with %1.\n" @@ -1327,7 +1322,7 @@ msgstr "" "Die Daten konnten nicht schnell genug geschrieben\n" "werden, um die Aufnahme fortzuführen.\n" -#: ardour_ui.cc:3721 +#: ardour_ui.cc:3655 msgid "" "The disk system on your computer\n" "was not able to keep up with %1.\n" @@ -1341,11 +1336,11 @@ msgstr "" "Die Daten konnten nicht schnell genug gelesen\n" "werden, um die Wiedergabe aufrechtzuerhalten.\n" -#: ardour_ui.cc:3761 +#: ardour_ui.cc:3695 msgid "Crash Recovery" msgstr "Absturz-Wiederherstellung" -#: ardour_ui.cc:3762 +#: ardour_ui.cc:3696 msgid "" "This session appears to have been in the\n" "middle of recording when %1 or\n" @@ -1363,19 +1358,19 @@ msgstr "" "für Sie wiederherstellen oder sie verwerfen.\n" "Bitte entscheiden Sie, wie Sie vorgehen möchten.\n" -#: ardour_ui.cc:3774 +#: ardour_ui.cc:3708 msgid "Ignore crash data" msgstr "Daten verwerfen" -#: ardour_ui.cc:3775 +#: ardour_ui.cc:3709 msgid "Recover from crash" msgstr "Daten wiederherstellen" -#: ardour_ui.cc:3795 +#: ardour_ui.cc:3729 msgid "Sample Rate Mismatch" msgstr "Samplerate passt nicht" -#: ardour_ui.cc:3796 +#: ardour_ui.cc:3730 msgid "" "This session was created with a sample rate of %1 Hz, but\n" "%2 is currently running at %3 Hz. If you load this session,\n" @@ -1386,23 +1381,23 @@ msgstr "" "%2 läuft derzeit mit %3 Hz. Wenn Sie dieses Projekt laden, \n" "wird Ihr Audiomaterial mit der falschen Samplerate abgespielt.\n" -#: ardour_ui.cc:3805 +#: ardour_ui.cc:3739 msgid "Do not load session" msgstr "Projekt nicht laden" -#: ardour_ui.cc:3806 +#: ardour_ui.cc:3740 msgid "Load session anyway" msgstr "Projekt trotzdem laden" -#: ardour_ui.cc:3829 -msgid "Could not disconnect from JACK" -msgstr "Konnte Verbindung mit JACK nicht trennen" +#: ardour_ui.cc:3766 +msgid "Could not disconnect from Audio/MIDI engine" +msgstr "Konnte Verbindung mit der Audio/MIDI Engine nicht trennen" -#: ardour_ui.cc:3842 -msgid "Could not reconnect to JACK" -msgstr "Konnte nicht erneut zu JACK verbinden" +#: ardour_ui.cc:3781 +msgid "Could not reconnect to the Audio/MIDI engine" +msgstr "Konnte nicht zur Audio/MIDI Engine wiederverbinden" -#: ardour_ui.cc:4116 +#: ardour_ui.cc:4056 msgid "" "%4This is a session from an older version of %3%5\n" "\n" @@ -1562,20 +1557,20 @@ msgstr "[WARNUNG]:" msgid "[INFO]: " msgstr "[INFO]: " -#: ardour_ui2.cc:247 ardour_ui_ed.cc:377 +#: ardour_ui2.cc:247 ardour_ui_ed.cc:344 msgid "Auto Return" msgstr "Auto Return" -#: ardour_ui2.cc:249 ardour_ui_ed.cc:380 +#: ardour_ui2.cc:249 ardour_ui_ed.cc:347 msgid "Follow Edits" msgstr "Folge Bearbeitungen" -#: ardour_ui2.cc:628 rc_option_editor.cc:1004 rc_option_editor.cc:1022 -#: rc_option_editor.cc:1025 rc_option_editor.cc:1027 rc_option_editor.cc:1029 -#: rc_option_editor.cc:1037 rc_option_editor.cc:1045 rc_option_editor.cc:1047 -#: rc_option_editor.cc:1055 rc_option_editor.cc:1062 rc_option_editor.cc:1071 -#: rc_option_editor.cc:1073 rc_option_editor.cc:1075 rc_option_editor.cc:1083 -#: rc_option_editor.cc:1085 rc_option_editor.cc:1094 +#: ardour_ui2.cc:628 rc_option_editor.cc:1002 rc_option_editor.cc:1020 +#: rc_option_editor.cc:1023 rc_option_editor.cc:1025 rc_option_editor.cc:1027 +#: rc_option_editor.cc:1035 rc_option_editor.cc:1043 rc_option_editor.cc:1045 +#: rc_option_editor.cc:1053 rc_option_editor.cc:1060 rc_option_editor.cc:1069 +#: rc_option_editor.cc:1071 rc_option_editor.cc:1073 rc_option_editor.cc:1081 +#: rc_option_editor.cc:1083 rc_option_editor.cc:1092 #: session_option_editor.cc:234 session_option_editor.cc:236 #: session_option_editor.cc:257 session_option_editor.cc:259 #: session_option_editor.cc:261 session_option_editor.cc:268 @@ -1594,19 +1589,19 @@ msgstr "Mixer laden" msgid "Reload Session History" msgstr "Projekt-Aktionsverlauf laden" -#: ardour_ui_dialogs.cc:242 +#: ardour_ui_dialogs.cc:238 msgid "Don't close" msgstr "Abbrechen" -#: ardour_ui_dialogs.cc:243 +#: ardour_ui_dialogs.cc:239 msgid "Just close" msgstr "Ohne speichern schließen" -#: ardour_ui_dialogs.cc:244 +#: ardour_ui_dialogs.cc:240 msgid "Save and close" msgstr "Speichern und schließen" -#: ardour_ui_dialogs.cc:340 +#: ardour_ui_dialogs.cc:339 msgid "This screen is not tall enough to display the mixer window" msgstr "" "Dieser Bildschirm ist nicht hoch genug, um das Mixerfenster darzustellen" @@ -1616,11 +1611,11 @@ msgid "Session" msgstr "Projekt" #: ardour_ui_ed.cc:106 editor_actions.cc:134 editor_regions.cc:115 -#: port_group.cc:457 session_option_editor.cc:82 session_option_editor.cc:89 +#: port_group.cc:458 session_option_editor.cc:82 session_option_editor.cc:89 msgid "Sync" msgstr "Sync" -#: ardour_ui_ed.cc:107 engine_dialog.cc:369 +#: ardour_ui_ed.cc:107 msgid "Options" msgstr "Optionen" @@ -1648,15 +1643,15 @@ msgstr "Dateiformat" msgid "Sample Format" msgstr "Sampleformat" -#: ardour_ui_ed.cc:114 rc_option_editor.cc:1826 rc_option_editor.cc:1839 +#: ardour_ui_ed.cc:114 rc_option_editor.cc:1822 rc_option_editor.cc:1835 msgid "Control Surfaces" msgstr "Eingabegeräte / Controller" -#: ardour_ui_ed.cc:115 rc_option_editor.cc:1558 +#: ardour_ui_ed.cc:115 rc_option_editor.cc:1554 msgid "Plugins" msgstr "Plugins" -#: ardour_ui_ed.cc:116 rc_option_editor.cc:1902 +#: ardour_ui_ed.cc:116 rc_option_editor.cc:1898 msgid "Metering" msgstr "Pegelanzeige" @@ -1754,170 +1749,153 @@ msgstr "Nicht benutzte Dateien entfernen..." msgid "Flush Wastebasket" msgstr "Müll leeren" -#: ardour_ui_ed.cc:189 keyeditor.cc:253 rc_option_editor.cc:1472 -msgid "JACK" -msgstr "JACK" - -#: ardour_ui_ed.cc:190 route_params_ui.cc:105 -msgid "Latency" -msgstr "Latenz" - -#: ardour_ui_ed.cc:192 -msgid "Reconnect" -msgstr "Verbinde neu" - -#: ardour_ui_ed.cc:195 global_port_matrix.cc:207 io_selector.cc:210 -#: mixer_strip.cc:719 mixer_strip.cc:845 -msgid "Disconnect" -msgstr "Trenne" - -#: ardour_ui_ed.cc:222 +#: ardour_ui_ed.cc:189 msgid "Quit" msgstr "Beenden" -#: ardour_ui_ed.cc:226 +#: ardour_ui_ed.cc:193 msgid "Maximise Editor Space" msgstr "Editor maximieren" -#: ardour_ui_ed.cc:227 +#: ardour_ui_ed.cc:194 msgid "Show Toolbars" msgstr "Zeige Werkzeugleisten" -#: ardour_ui_ed.cc:230 mixer_ui.cc:1865 mixer_ui.cc:1871 +#: ardour_ui_ed.cc:197 mixer_ui.cc:1865 mixer_ui.cc:1871 msgid "Window|Mixer" msgstr "Mixer" -#: ardour_ui_ed.cc:231 +#: ardour_ui_ed.cc:198 msgid "Toggle Editor+Mixer" msgstr "Editor+Mixer umschalten" -#: ardour_ui_ed.cc:232 meterbridge.cc:230 meterbridge.cc:236 +#: ardour_ui_ed.cc:199 meterbridge.cc:230 meterbridge.cc:236 msgid "Window|Meterbridge" msgstr "Meterbridge" -#: ardour_ui_ed.cc:234 midi_tracer.cc:39 +#: ardour_ui_ed.cc:201 midi_tracer.cc:42 msgid "MIDI Tracer" msgstr "Midisignale verfolgen" -#: ardour_ui_ed.cc:236 +#: ardour_ui_ed.cc:203 msgid "Chat" msgstr "Chat" -#: ardour_ui_ed.cc:238 +#: ardour_ui_ed.cc:205 msgid "Help|Manual" msgstr "Handbuch" -#: ardour_ui_ed.cc:239 +#: ardour_ui_ed.cc:206 msgid "Reference" msgstr "Referenz" -#: ardour_ui_ed.cc:241 plugin_ui.cc:418 +#: ardour_ui_ed.cc:208 plugin_ui.cc:416 msgid "Save" msgstr "Speichern" -#: ardour_ui_ed.cc:249 rc_option_editor.cc:1114 rc_option_editor.cc:1125 -#: rc_option_editor.cc:1134 rc_option_editor.cc:1147 rc_option_editor.cc:1160 -#: rc_option_editor.cc:1169 rc_option_editor.cc:1179 rc_option_editor.cc:1181 -#: rc_option_editor.cc:1191 rc_option_editor.cc:1207 rc_option_editor.cc:1220 -#: rc_option_editor.cc:1238 rc_option_editor.cc:1240 rc_option_editor.cc:1254 -#: rc_option_editor.cc:1257 rc_option_editor.cc:1259 rc_option_editor.cc:1276 -#: rc_option_editor.cc:1287 +#: ardour_ui_ed.cc:216 rc_option_editor.cc:1112 rc_option_editor.cc:1123 +#: rc_option_editor.cc:1132 rc_option_editor.cc:1145 rc_option_editor.cc:1158 +#: rc_option_editor.cc:1167 rc_option_editor.cc:1177 rc_option_editor.cc:1179 +#: rc_option_editor.cc:1189 rc_option_editor.cc:1205 rc_option_editor.cc:1218 +#: rc_option_editor.cc:1236 rc_option_editor.cc:1238 rc_option_editor.cc:1252 +#: rc_option_editor.cc:1255 rc_option_editor.cc:1257 rc_option_editor.cc:1274 +#: rc_option_editor.cc:1285 msgid "Transport" msgstr "Transport" -#: ardour_ui_ed.cc:255 engine_dialog.cc:85 +#: ardour_ui_ed.cc:222 msgid "Stop" msgstr "Stopp" -#: ardour_ui_ed.cc:258 +#: ardour_ui_ed.cc:225 msgid "Roll" msgstr "Wiedergabe" -#: ardour_ui_ed.cc:262 +#: ardour_ui_ed.cc:229 msgid "Start/Stop" msgstr "Start/Stopp" -#: ardour_ui_ed.cc:265 +#: ardour_ui_ed.cc:232 msgid "Start/Continue/Stop" msgstr "Start/Stopp" -#: ardour_ui_ed.cc:268 +#: ardour_ui_ed.cc:235 msgid "Stop and Forget Capture" msgstr "Stopp + Aufnahme verwerfen" -#: ardour_ui_ed.cc:278 +#: ardour_ui_ed.cc:245 msgid "Transition To Roll" msgstr "Vorwärts (normal)" -#: ardour_ui_ed.cc:282 +#: ardour_ui_ed.cc:249 msgid "Transition To Reverse" msgstr "Rückwärts (normal)" -#: ardour_ui_ed.cc:286 +#: ardour_ui_ed.cc:253 msgid "Play Loop Range" msgstr "Schleife wiedergeben" -#: ardour_ui_ed.cc:289 +#: ardour_ui_ed.cc:256 msgid "Play Selected Range" msgstr "Gewählten Bereich wiedergeben" -#: ardour_ui_ed.cc:292 +#: ardour_ui_ed.cc:259 msgid "Play Selection w/Preroll" msgstr "Ausgewählten Bereich mit Vorlauf wiedergeben" -#: ardour_ui_ed.cc:296 +#: ardour_ui_ed.cc:263 msgid "Enable Record" msgstr "Aufnahme aktivieren" -#: ardour_ui_ed.cc:299 +#: ardour_ui_ed.cc:266 msgid "Start Recording" msgstr "Aufnahme starten" -#: ardour_ui_ed.cc:303 +#: ardour_ui_ed.cc:270 msgid "Rewind" msgstr "Rückwärts (beschleunigen)" -#: ardour_ui_ed.cc:306 +#: ardour_ui_ed.cc:273 msgid "Rewind (Slow)" msgstr "Rückwärts (langsam)" -#: ardour_ui_ed.cc:309 +#: ardour_ui_ed.cc:276 msgid "Rewind (Fast)" msgstr "Rückwärts (schnell)" -#: ardour_ui_ed.cc:312 startup.cc:727 +#: ardour_ui_ed.cc:279 msgid "Forward" msgstr "Vorwärts (beschleunigen)" -#: ardour_ui_ed.cc:315 +#: ardour_ui_ed.cc:282 msgid "Forward (Slow)" msgstr "Vorwärts (langsam)" -#: ardour_ui_ed.cc:318 +#: ardour_ui_ed.cc:285 msgid "Forward (Fast)" msgstr "Vorwärts (schnell)" -#: ardour_ui_ed.cc:321 +#: ardour_ui_ed.cc:288 msgid "Goto Zero" msgstr "Zum Nullpunkt springen" -#: ardour_ui_ed.cc:324 +#: ardour_ui_ed.cc:291 msgid "Goto Start" msgstr "Zum Anfang springen" -#: ardour_ui_ed.cc:327 +#: ardour_ui_ed.cc:294 msgid "Goto End" msgstr "Zum Ende springen" -#: ardour_ui_ed.cc:330 +#: ardour_ui_ed.cc:297 msgid "Goto Wall Clock" msgstr "Zur lokalen Uhrzeit springen" -#: ardour_ui_ed.cc:334 +#: ardour_ui_ed.cc:301 msgid "Focus On Clock" msgstr "Fokus auf Zeitanzeige setzen" -#: ardour_ui_ed.cc:338 ardour_ui_ed.cc:347 audio_clock.cc:2046 editor.cc:237 +#: ardour_ui_ed.cc:305 ardour_ui_ed.cc:314 audio_clock.cc:2046 editor.cc:237 #: editor_actions.cc:544 editor_actions.cc:553 export_timespan_selector.cc:88 #: session_option_editor.cc:41 session_option_editor.cc:61 #: session_option_editor.cc:80 session_option_editor.cc:96 @@ -1926,125 +1904,121 @@ msgstr "Fokus auf Zeitanzeige setzen" msgid "Timecode" msgstr "Timecode" -#: ardour_ui_ed.cc:340 ardour_ui_ed.cc:349 editor_actions.cc:542 +#: ardour_ui_ed.cc:307 ardour_ui_ed.cc:316 editor_actions.cc:542 msgid "Bars & Beats" msgstr "Takte & Schläge" -#: ardour_ui_ed.cc:342 ardour_ui_ed.cc:351 +#: ardour_ui_ed.cc:309 ardour_ui_ed.cc:318 msgid "Minutes & Seconds" msgstr "Minuten & Sekunden" -#: ardour_ui_ed.cc:344 ardour_ui_ed.cc:353 audio_clock.cc:2050 editor.cc:238 +#: ardour_ui_ed.cc:311 ardour_ui_ed.cc:320 audio_clock.cc:2050 editor.cc:238 #: editor_actions.cc:543 msgid "Samples" msgstr "Samples" -#: ardour_ui_ed.cc:356 +#: ardour_ui_ed.cc:323 msgid "Punch In" msgstr "Punch In" -#: ardour_ui_ed.cc:357 mixer_strip.cc:1905 route_ui.cc:137 +#: ardour_ui_ed.cc:324 mixer_strip.cc:1905 route_ui.cc:137 #: time_info_box.cc:113 msgid "In" msgstr "In" -#: ardour_ui_ed.cc:360 +#: ardour_ui_ed.cc:327 msgid "Punch Out" msgstr "Punch Out" -#: ardour_ui_ed.cc:361 time_info_box.cc:114 +#: ardour_ui_ed.cc:328 time_info_box.cc:114 msgid "Out" msgstr "Out" -#: ardour_ui_ed.cc:364 +#: ardour_ui_ed.cc:331 msgid "Punch In/Out" msgstr "Punch In/Out" -#: ardour_ui_ed.cc:365 +#: ardour_ui_ed.cc:332 msgid "In/Out" msgstr "In/Out" -#: ardour_ui_ed.cc:368 rc_option_editor.cc:1071 +#: ardour_ui_ed.cc:335 rc_option_editor.cc:1069 msgid "Click" msgstr "Klick" -#: ardour_ui_ed.cc:371 +#: ardour_ui_ed.cc:338 msgid "Auto Input" msgstr "Auto Input" -#: ardour_ui_ed.cc:374 +#: ardour_ui_ed.cc:341 msgid "Auto Play" msgstr "Auto Play" -#: ardour_ui_ed.cc:385 +#: ardour_ui_ed.cc:352 msgid "Sync Startup to Video" msgstr "Start mit Video synchronisieren" -#: ardour_ui_ed.cc:387 +#: ardour_ui_ed.cc:354 msgid "Time Master" msgstr "Time Master" -#: ardour_ui_ed.cc:394 +#: ardour_ui_ed.cc:361 msgid "Toggle Record Enable Track %1" msgstr "Aufnahme auf Spur %1 aktivieren" -#: ardour_ui_ed.cc:401 +#: ardour_ui_ed.cc:368 msgid "Percentage" msgstr "Prozent" -#: ardour_ui_ed.cc:402 shuttle_control.cc:169 +#: ardour_ui_ed.cc:369 shuttle_control.cc:169 msgid "Semitones" msgstr "Halbtöne" -#: ardour_ui_ed.cc:406 +#: ardour_ui_ed.cc:373 msgid "Send MTC" msgstr "MTC senden" -#: ardour_ui_ed.cc:408 +#: ardour_ui_ed.cc:375 msgid "Send MMC" msgstr "MMC senden" -#: ardour_ui_ed.cc:410 +#: ardour_ui_ed.cc:377 msgid "Use MMC" msgstr "Benutze MMC" -#: ardour_ui_ed.cc:412 rc_option_editor.cc:1710 +#: ardour_ui_ed.cc:379 rc_option_editor.cc:1706 msgid "Send MIDI Clock" msgstr "MIDI Clock senden" -#: ardour_ui_ed.cc:414 +#: ardour_ui_ed.cc:381 msgid "Send MIDI Feedback" msgstr "MIDI Feedback senden" -#: ardour_ui_ed.cc:420 +#: ardour_ui_ed.cc:387 msgid "Panic" msgstr "Panic" -#: ardour_ui_ed.cc:560 +#: ardour_ui_ed.cc:472 msgid "Wall Clock" msgstr "Uhrzeit" -#: ardour_ui_ed.cc:561 +#: ardour_ui_ed.cc:473 msgid "Disk Space" msgstr "Speicherplatz" -#: ardour_ui_ed.cc:562 +#: ardour_ui_ed.cc:474 msgid "DSP" msgstr "DSP" -#: ardour_ui_ed.cc:563 +#: ardour_ui_ed.cc:475 msgid "Buffers" msgstr "Puffer" -#: ardour_ui_ed.cc:564 -msgid "JACK Sampling Rate and Latency" -msgstr "JACK Samplerate und Latenz" - -#: ardour_ui_ed.cc:565 +#: ardour_ui_ed.cc:477 msgid "Timecode Format" msgstr "Timecode-Format" -#: ardour_ui_ed.cc:566 +#: ardour_ui_ed.cc:478 msgid "File Format" msgstr "Dateiformat" @@ -2183,32 +2157,32 @@ msgid "hide track" msgstr "Diese Spur verbergen" #: automation_time_axis.cc:255 automation_time_axis.cc:307 -#: automation_time_axis.cc:496 gain_meter.cc:195 generic_pluginui.cc:456 -#: generic_pluginui.cc:746 panner_ui.cc:150 +#: automation_time_axis.cc:496 gain_meter.cc:194 generic_pluginui.cc:454 +#: generic_pluginui.cc:744 panner_ui.cc:149 msgid "Automation|Manual" msgstr "Manuell" #: automation_time_axis.cc:257 automation_time_axis.cc:318 -#: automation_time_axis.cc:501 editor.cc:1933 editor.cc:2010 -#: editor_actions.cc:118 editor_actions.cc:1865 gain_meter.cc:198 -#: generic_pluginui.cc:459 generic_pluginui.cc:748 midi_time_axis.cc:1488 -#: midi_time_axis.cc:1491 midi_time_axis.cc:1494 panner_ui.cc:153 +#: automation_time_axis.cc:501 editor.cc:1934 editor.cc:2011 +#: editor_actions.cc:118 editor_actions.cc:1865 gain_meter.cc:197 +#: generic_pluginui.cc:457 generic_pluginui.cc:746 midi_time_axis.cc:1488 +#: midi_time_axis.cc:1491 midi_time_axis.cc:1494 panner_ui.cc:152 msgid "Play" msgstr "Wiedergabe" #: automation_time_axis.cc:259 automation_time_axis.cc:329 -#: automation_time_axis.cc:506 gain_meter.cc:201 generic_pluginui.cc:462 -#: generic_pluginui.cc:750 panner_ui.cc:156 +#: automation_time_axis.cc:506 gain_meter.cc:200 generic_pluginui.cc:460 +#: generic_pluginui.cc:748 panner_ui.cc:155 msgid "Write" msgstr "Schreiben" #: automation_time_axis.cc:261 automation_time_axis.cc:340 -#: automation_time_axis.cc:511 gain_meter.cc:204 generic_pluginui.cc:465 -#: generic_pluginui.cc:752 panner_ui.cc:159 +#: automation_time_axis.cc:511 gain_meter.cc:203 generic_pluginui.cc:463 +#: generic_pluginui.cc:750 panner_ui.cc:158 msgid "Touch" msgstr "Ändern" -#: automation_time_axis.cc:351 generic_pluginui.cc:468 meter_patterns.cc:108 +#: automation_time_axis.cc:351 generic_pluginui.cc:466 meter_patterns.cc:108 msgid "???" msgstr "???" @@ -2233,8 +2207,8 @@ msgstr "Automationssmodus" msgid "Discrete" msgstr "Diskret" -#: automation_time_axis.cc:537 editor.cc:1457 editor.cc:1464 editor.cc:1520 -#: editor.cc:1526 export_format_dialog.cc:476 +#: automation_time_axis.cc:537 editor.cc:1458 editor.cc:1465 editor.cc:1521 +#: editor.cc:1527 export_format_dialog.cc:476 msgid "Linear" msgstr "Linear" @@ -2265,13 +2239,13 @@ msgstr "Eingang" msgid "Output" msgstr "Ausgang" -#: bundle_manager.cc:264 editor.cc:1974 editor_actions.cc:90 +#: bundle_manager.cc:264 editor.cc:1975 editor_actions.cc:90 #: editor_actions.cc:100 msgid "Edit" msgstr "Bearbeiten" -#: bundle_manager.cc:265 editor.cc:5493 editor_actions.cc:310 -#: editor_actions.cc:368 plugin_ui.cc:419 processor_box.cc:2229 +#: bundle_manager.cc:265 editor.cc:5494 editor_actions.cc:310 +#: editor_actions.cc:368 plugin_ui.cc:417 processor_box.cc:2229 #: route_time_axis.cc:713 msgid "Delete" msgstr "Löschen" @@ -2448,164 +2422,164 @@ msgstr "Länge" msgid "edit note" msgstr "Note bearbeiten" -#: editor.cc:137 editor.cc:3429 +#: editor.cc:137 editor.cc:3430 msgid "CD Frames" msgstr "CD-Frames" -#: editor.cc:138 editor.cc:3431 +#: editor.cc:138 editor.cc:3432 msgid "Timecode Frames" msgstr "Timecode-Frames" -#: editor.cc:139 editor.cc:3433 +#: editor.cc:139 editor.cc:3434 msgid "Timecode Seconds" msgstr "Timecode-Sekunden" -#: editor.cc:140 editor.cc:3435 +#: editor.cc:140 editor.cc:3436 msgid "Timecode Minutes" msgstr "Timecode-Minuten" -#: editor.cc:141 editor.cc:3437 +#: editor.cc:141 editor.cc:3438 msgid "Seconds" msgstr "Sekunden" -#: editor.cc:142 editor.cc:3439 +#: editor.cc:142 editor.cc:3440 msgid "Minutes" msgstr "Minuten" -#: editor.cc:143 editor.cc:3413 quantize_dialog.cc:37 quantize_dialog.cc:141 +#: editor.cc:143 editor.cc:3414 quantize_dialog.cc:37 quantize_dialog.cc:141 msgid "Beats/128" msgstr "Schläge/128" -#: editor.cc:144 editor.cc:3411 quantize_dialog.cc:38 quantize_dialog.cc:143 +#: editor.cc:144 editor.cc:3412 quantize_dialog.cc:38 quantize_dialog.cc:143 msgid "Beats/64" msgstr "Schläge/64" -#: editor.cc:145 editor.cc:3409 quantize_dialog.cc:39 quantize_dialog.cc:145 +#: editor.cc:145 editor.cc:3410 quantize_dialog.cc:39 quantize_dialog.cc:145 msgid "Beats/32" msgstr "Schläge/32" -#: editor.cc:146 editor.cc:3407 +#: editor.cc:146 editor.cc:3408 msgid "Beats/28" msgstr "Schläge/28" -#: editor.cc:147 editor.cc:3405 +#: editor.cc:147 editor.cc:3406 msgid "Beats/24" msgstr "Schläge/24" -#: editor.cc:148 editor.cc:3403 +#: editor.cc:148 editor.cc:3404 msgid "Beats/20" msgstr "Schläge/20" -#: editor.cc:149 editor.cc:3401 quantize_dialog.cc:40 quantize_dialog.cc:147 +#: editor.cc:149 editor.cc:3402 quantize_dialog.cc:40 quantize_dialog.cc:147 msgid "Beats/16" msgstr "Schläge/16" -#: editor.cc:150 editor.cc:3399 +#: editor.cc:150 editor.cc:3400 msgid "Beats/14" msgstr "Schläge/14" -#: editor.cc:151 editor.cc:3397 +#: editor.cc:151 editor.cc:3398 msgid "Beats/12" msgstr "Schläge/12" -#: editor.cc:152 editor.cc:3395 +#: editor.cc:152 editor.cc:3396 msgid "Beats/10" msgstr "Schläge/10" -#: editor.cc:153 editor.cc:3393 quantize_dialog.cc:41 quantize_dialog.cc:149 +#: editor.cc:153 editor.cc:3394 quantize_dialog.cc:41 quantize_dialog.cc:149 msgid "Beats/8" msgstr "Schläge/8" -#: editor.cc:154 editor.cc:3391 +#: editor.cc:154 editor.cc:3392 msgid "Beats/7" msgstr "Schläge/7" -#: editor.cc:155 editor.cc:3389 +#: editor.cc:155 editor.cc:3390 msgid "Beats/6" msgstr "Schläge/6" -#: editor.cc:156 editor.cc:3387 +#: editor.cc:156 editor.cc:3388 msgid "Beats/5" msgstr "Schläge/5" -#: editor.cc:157 editor.cc:3385 quantize_dialog.cc:42 quantize_dialog.cc:151 +#: editor.cc:157 editor.cc:3386 quantize_dialog.cc:42 quantize_dialog.cc:151 msgid "Beats/4" msgstr "Schläge/4" -#: editor.cc:158 editor.cc:3383 quantize_dialog.cc:43 quantize_dialog.cc:153 +#: editor.cc:158 editor.cc:3384 quantize_dialog.cc:43 quantize_dialog.cc:153 msgid "Beats/3" msgstr "Schläge/3" -#: editor.cc:159 editor.cc:3381 quantize_dialog.cc:44 quantize_dialog.cc:155 +#: editor.cc:159 editor.cc:3382 quantize_dialog.cc:44 quantize_dialog.cc:155 msgid "Beats/2" msgstr "Schläge/2" -#: editor.cc:160 editor.cc:3415 quantize_dialog.cc:45 quantize_dialog.cc:157 +#: editor.cc:160 editor.cc:3416 quantize_dialog.cc:45 quantize_dialog.cc:157 msgid "Beats" msgstr "Schläge" -#: editor.cc:161 editor.cc:3417 +#: editor.cc:161 editor.cc:3418 msgid "Bars" msgstr "Takte" -#: editor.cc:162 editor.cc:3419 +#: editor.cc:162 editor.cc:3420 msgid "Marks" msgstr "Marker" -#: editor.cc:163 editor.cc:3421 +#: editor.cc:163 editor.cc:3422 msgid "Region starts" msgstr "Regionen-Anfang" -#: editor.cc:164 editor.cc:3423 +#: editor.cc:164 editor.cc:3424 msgid "Region ends" msgstr "Regionen-Ende" -#: editor.cc:165 editor.cc:3427 +#: editor.cc:165 editor.cc:3428 msgid "Region syncs" msgstr "Regionen-Sync" -#: editor.cc:166 editor.cc:3425 +#: editor.cc:166 editor.cc:3426 msgid "Region bounds" msgstr "Regionengrenzen" -#: editor.cc:171 editor.cc:3455 editor_actions.cc:485 +#: editor.cc:171 editor.cc:3456 editor_actions.cc:485 msgid "No Grid" msgstr "Raster aus" -#: editor.cc:172 editor.cc:3457 editor_actions.cc:486 +#: editor.cc:172 editor.cc:3458 editor_actions.cc:486 msgid "Grid" msgstr "Einrasten" -#: editor.cc:173 editor.cc:3459 editor_actions.cc:487 +#: editor.cc:173 editor.cc:3460 editor_actions.cc:487 msgid "Magnetic" msgstr "Magnetisch" -#: editor.cc:178 editor.cc:188 editor.cc:3498 editor.cc:3523 +#: editor.cc:178 editor.cc:188 editor.cc:3499 editor.cc:3524 #: editor_actions.cc:117 editor_actions.cc:468 msgid "Playhead" msgstr "Positionszeiger" -#: editor.cc:179 editor.cc:3496 editor_actions.cc:470 +#: editor.cc:179 editor.cc:3497 editor_actions.cc:470 msgid "Marker" msgstr "Marker" -#: editor.cc:180 editor.cc:189 editor.cc:3525 editor_actions.cc:469 +#: editor.cc:180 editor.cc:189 editor.cc:3526 editor_actions.cc:469 msgid "Mouse" msgstr "Maus" -#: editor.cc:185 editor.cc:3517 mono_panner_editor.cc:42 +#: editor.cc:185 editor.cc:3518 mono_panner_editor.cc:42 msgid "Left" msgstr "Links" -#: editor.cc:186 editor.cc:3519 mono_panner_editor.cc:47 +#: editor.cc:186 editor.cc:3520 mono_panner_editor.cc:47 msgid "Right" msgstr "Rechts" -#: editor.cc:187 editor.cc:3521 +#: editor.cc:187 editor.cc:3522 msgid "Center" msgstr "Mitte" -#: editor.cc:190 editor.cc:3090 editor.cc:3527 +#: editor.cc:190 editor.cc:3091 editor.cc:3528 msgid "Edit point" msgstr "Arbeitspunkt" @@ -2665,337 +2639,337 @@ msgstr "Video Zeitleiste" msgid "mode" msgstr "Modus" -#: editor.cc:542 +#: editor.cc:541 msgid "Regions" msgstr "Regionen" -#: editor.cc:543 +#: editor.cc:542 msgid "Tracks & Busses" msgstr "Spuren & Busse" -#: editor.cc:544 +#: editor.cc:543 msgid "Snapshots" msgstr "Schnappschüsse" -#: editor.cc:545 +#: editor.cc:544 msgid "Track & Bus Groups" msgstr "Spuren & Bus-Gruppen" -#: editor.cc:546 +#: editor.cc:545 msgid "Ranges & Marks" msgstr "Bereiche & Marker" -#: editor.cc:690 editor.cc:5345 rc_option_editor.cc:1294 -#: rc_option_editor.cc:1302 rc_option_editor.cc:1310 rc_option_editor.cc:1318 -#: rc_option_editor.cc:1335 rc_option_editor.cc:1337 rc_option_editor.cc:1345 -#: rc_option_editor.cc:1353 rc_option_editor.cc:1373 rc_option_editor.cc:1385 -#: rc_option_editor.cc:1387 rc_option_editor.cc:1395 rc_option_editor.cc:1403 -#: rc_option_editor.cc:1411 rc_option_editor.cc:1419 rc_option_editor.cc:1427 -#: rc_option_editor.cc:1442 rc_option_editor.cc:1446 +#: editor.cc:690 editor.cc:5346 rc_option_editor.cc:1292 +#: rc_option_editor.cc:1300 rc_option_editor.cc:1308 rc_option_editor.cc:1316 +#: rc_option_editor.cc:1333 rc_option_editor.cc:1335 rc_option_editor.cc:1343 +#: rc_option_editor.cc:1351 rc_option_editor.cc:1371 rc_option_editor.cc:1383 +#: rc_option_editor.cc:1385 rc_option_editor.cc:1393 rc_option_editor.cc:1401 +#: rc_option_editor.cc:1409 rc_option_editor.cc:1417 rc_option_editor.cc:1425 +#: rc_option_editor.cc:1440 rc_option_editor.cc:1444 msgid "Editor" msgstr "Editor" -#: editor.cc:1215 editor.cc:1225 editor.cc:4440 editor_actions.cc:130 +#: editor.cc:1215 editor.cc:1225 editor.cc:4441 editor_actions.cc:130 #: editor_actions.cc:1813 msgid "Loop" msgstr "Schleife" -#: editor.cc:1231 editor.cc:1241 editor.cc:4467 editor_actions.cc:131 +#: editor.cc:1231 editor.cc:1241 editor.cc:4468 editor_actions.cc:131 #: time_info_box.cc:67 msgid "Punch" msgstr "Punch" -#: editor.cc:1352 +#: editor.cc:1353 msgid "Linear (for highly correlated material)" msgstr "Linear (für stark korreliertes Material)" -#: editor.cc:1362 editor.cc:1499 editor.cc:1561 +#: editor.cc:1363 editor.cc:1500 editor.cc:1562 msgid "Constant power" msgstr "Konstante Energie" -#: editor.cc:1371 editor.cc:1492 editor.cc:1554 +#: editor.cc:1372 editor.cc:1493 editor.cc:1555 msgid "Symmetric" msgstr "Symmetrisch" -#: editor.cc:1381 editor.cc:1474 editor.cc:1536 +#: editor.cc:1382 editor.cc:1475 editor.cc:1537 msgid "Slow" msgstr "Langsam" -#: editor.cc:1390 editor.cc:1483 editor.cc:1545 sfdb_ui.cc:1627 +#: editor.cc:1391 editor.cc:1484 editor.cc:1546 sfdb_ui.cc:1627 #: sfdb_ui.cc:1736 msgid "Fast" msgstr "Schnell" -#: editor.cc:1437 +#: editor.cc:1438 msgid "programming error: fade in canvas item has no regionview data pointer!" msgstr "Programmierfehler: fade in canvas item has no regionview data pointer!" -#: editor.cc:1448 editor.cc:1512 +#: editor.cc:1449 editor.cc:1513 msgid "Deactivate" msgstr "Deaktivieren" -#: editor.cc:1450 editor.cc:1514 +#: editor.cc:1451 editor.cc:1515 msgid "Activate" msgstr "Aktivieren" -#: editor.cc:1458 editor.cc:1521 +#: editor.cc:1459 editor.cc:1522 msgid "Slowest" msgstr "Sehr langsam" -#: editor.cc:1572 route_time_axis.cc:1877 selection.cc:1009 selection.cc:1064 +#: editor.cc:1573 route_time_axis.cc:1877 selection.cc:1009 selection.cc:1064 msgid "programming error: " msgstr "Programmierfehler:" -#: editor.cc:1673 editor.cc:1681 editor_ops.cc:3522 +#: editor.cc:1674 editor.cc:1682 editor_ops.cc:3522 msgid "Freeze" msgstr "Einfrieren" -#: editor.cc:1677 +#: editor.cc:1678 msgid "Unfreeze" msgstr "Auftauen" -#: editor.cc:1816 +#: editor.cc:1817 msgid "Selected Regions" msgstr "Ausgewählte Regionen" -#: editor.cc:1852 editor_markers.cc:895 +#: editor.cc:1853 editor_markers.cc:895 msgid "Play Range" msgstr "Bereich wiedergeben" -#: editor.cc:1853 editor_markers.cc:898 +#: editor.cc:1854 editor_markers.cc:898 msgid "Loop Range" msgstr "Bereich in Schleife wiedergeben" -#: editor.cc:1862 editor_actions.cc:332 +#: editor.cc:1863 editor_actions.cc:332 msgid "Move Range Start to Previous Region Boundary" msgstr "Anfang des Bereiches zur vorherigen Regiongrenze verschieben" -#: editor.cc:1869 editor_actions.cc:339 +#: editor.cc:1870 editor_actions.cc:339 msgid "Move Range Start to Next Region Boundary" msgstr "Anfang des Bereiches zur nächsten Regiongrenze verschieben" -#: editor.cc:1876 editor_actions.cc:346 +#: editor.cc:1877 editor_actions.cc:346 msgid "Move Range End to Previous Region Boundary" msgstr "Ende des Bereiches zur vorherigen Regiongrenze verschieben" -#: editor.cc:1883 editor_actions.cc:353 +#: editor.cc:1884 editor_actions.cc:353 msgid "Move Range End to Next Region Boundary" msgstr "Ende des Bereiches zur nächsten Regiongrenze verschieben" -#: editor.cc:1889 +#: editor.cc:1890 msgid "Convert to Region In-Place" msgstr "In Region umwanden (direkt)" -#: editor.cc:1890 +#: editor.cc:1891 msgid "Convert to Region in Region List" msgstr "In Region umwanden (in Regionenliste hinzufügen)" -#: editor.cc:1893 editor_markers.cc:925 +#: editor.cc:1894 editor_markers.cc:925 msgid "Select All in Range" msgstr "Alles im Bereich auswählen" -#: editor.cc:1896 +#: editor.cc:1897 msgid "Set Loop from Range" msgstr "Schleife aus Bereich erstellen" -#: editor.cc:1897 +#: editor.cc:1898 msgid "Set Punch from Range" msgstr "Punch aus Bereich erstellen" -#: editor.cc:1900 +#: editor.cc:1901 msgid "Add Range Markers" msgstr "Bereichsmarker einfügen" -#: editor.cc:1903 +#: editor.cc:1904 msgid "Crop Region to Range" msgstr "Region auf Bereich kürzen" -#: editor.cc:1904 +#: editor.cc:1905 msgid "Fill Range with Region" msgstr "Bereich mit Region füllen" -#: editor.cc:1905 editor_actions.cc:289 +#: editor.cc:1906 editor_actions.cc:289 msgid "Duplicate Range" msgstr "Bereich duplizieren" -#: editor.cc:1908 +#: editor.cc:1909 msgid "Consolidate Range" msgstr "Bereich als neue Region pre-Mixer" -#: editor.cc:1909 +#: editor.cc:1910 msgid "Consolidate Range With Processing" msgstr "Bereich als neue Region post-mixer" -#: editor.cc:1910 +#: editor.cc:1911 msgid "Bounce Range to Region List" msgstr "Auswahl zur Regionenliste bouncen" -#: editor.cc:1911 +#: editor.cc:1912 msgid "Bounce Range to Region List With Processing" msgstr "Auswahl zur Regionenliste bouncen (Post-Fader)" -#: editor.cc:1912 editor_markers.cc:908 +#: editor.cc:1913 editor_markers.cc:908 msgid "Export Range..." msgstr "Bereich exportieren..." -#: editor.cc:1927 editor.cc:2008 editor_actions.cc:281 +#: editor.cc:1928 editor.cc:2009 editor_actions.cc:281 msgid "Play From Edit Point" msgstr "Wiedergabe ab Arbeitspunkt" -#: editor.cc:1928 editor.cc:2009 +#: editor.cc:1929 editor.cc:2010 msgid "Play From Start" msgstr "Wiedergabe ab Anfang" -#: editor.cc:1929 +#: editor.cc:1930 msgid "Play Region" msgstr "Region wiedergeben" -#: editor.cc:1931 +#: editor.cc:1932 msgid "Loop Region" msgstr "Region in Schleife wiedergeben" -#: editor.cc:1941 editor.cc:2018 +#: editor.cc:1942 editor.cc:2019 msgid "Select All in Track" msgstr "Alles in der Spur auswählen" -#: editor.cc:1942 editor.cc:2019 editor_actions.cc:185 +#: editor.cc:1943 editor.cc:2020 editor_actions.cc:185 #: export_timespan_selector.cc:53 processor_box.cc:2237 msgid "Select All" msgstr "Alles auswählen" -#: editor.cc:1943 editor.cc:2020 +#: editor.cc:1944 editor.cc:2021 msgid "Invert Selection in Track" msgstr "Auswahl in der Spur umkehren" -#: editor.cc:1944 editor.cc:2021 editor_actions.cc:187 +#: editor.cc:1945 editor.cc:2022 editor_actions.cc:187 msgid "Invert Selection" msgstr "Auswahl umkehren" -#: editor.cc:1946 +#: editor.cc:1947 msgid "Set Range to Loop Range" msgstr "Bereich als Schleife auswählen" -#: editor.cc:1947 +#: editor.cc:1948 msgid "Set Range to Punch Range" msgstr "Bereich als Punchbereich" -#: editor.cc:1949 editor.cc:2023 editor_actions.cc:188 +#: editor.cc:1950 editor.cc:2024 editor_actions.cc:188 msgid "Select All After Edit Point" msgstr "Alle Regionen nach dem Arbeitspunkt auswählen" -#: editor.cc:1950 editor.cc:2024 editor_actions.cc:189 +#: editor.cc:1951 editor.cc:2025 editor_actions.cc:189 msgid "Select All Before Edit Point" msgstr "Alle Regionen vor dem Arbeitspunkt auswählen" -#: editor.cc:1951 editor.cc:2025 +#: editor.cc:1952 editor.cc:2026 msgid "Select All After Playhead" msgstr "Alle Regionen nach dem Positionszeiger auswählen" -#: editor.cc:1952 editor.cc:2026 +#: editor.cc:1953 editor.cc:2027 msgid "Select All Before Playhead" msgstr "Alle Regionen vor dem Positionszeiger auswählen" -#: editor.cc:1953 +#: editor.cc:1954 msgid "Select All Between Playhead and Edit Point" msgstr "Alle zwischen Positionszeiger und Arbeitspunkt auswählen" -#: editor.cc:1954 +#: editor.cc:1955 msgid "Select All Within Playhead and Edit Point" msgstr "Alles zwischen Positionszeiger und Arbeitspunkt auswählen" -#: editor.cc:1955 +#: editor.cc:1956 msgid "Select Range Between Playhead and Edit Point" msgstr "Wähle Bereich zwischen Positionszeiger und Arbeitspunkt aus" -#: editor.cc:1957 editor.cc:2028 editor_actions.cc:127 editor_actions.cc:128 +#: editor.cc:1958 editor.cc:2029 editor_actions.cc:127 editor_actions.cc:128 msgid "Select" msgstr "Auswahl" -#: editor.cc:1965 editor.cc:2036 editor_actions.cc:309 processor_box.cc:2222 +#: editor.cc:1966 editor.cc:2037 editor_actions.cc:309 processor_box.cc:2222 msgid "Cut" msgstr "Ausschneiden" -#: editor.cc:1966 editor.cc:2037 editor_actions.cc:312 processor_box.cc:2225 +#: editor.cc:1967 editor.cc:2038 editor_actions.cc:312 processor_box.cc:2225 msgid "Copy" msgstr "Kopieren" -#: editor.cc:1967 editor.cc:2038 editor_actions.cc:313 processor_box.cc:2233 +#: editor.cc:1968 editor.cc:2039 editor_actions.cc:313 processor_box.cc:2233 msgid "Paste" msgstr "Einfügen" -#: editor.cc:1971 editor_actions.cc:87 +#: editor.cc:1972 editor_actions.cc:87 msgid "Align" msgstr "Ausrichten" -#: editor.cc:1972 +#: editor.cc:1973 msgid "Align Relative" msgstr "Relativ ausrichten" -#: editor.cc:1979 +#: editor.cc:1980 msgid "Insert Selected Region" msgstr "Ausgewählte Region einfügen" -#: editor.cc:1980 +#: editor.cc:1981 msgid "Insert Existing Media" msgstr "Vorhandenes Material importieren" -#: editor.cc:1989 editor.cc:2045 +#: editor.cc:1990 editor.cc:2046 msgid "Nudge Entire Track Later" msgstr "Gesamte Spur schrittweise nach hinten" -#: editor.cc:1990 editor.cc:2046 +#: editor.cc:1991 editor.cc:2047 msgid "Nudge Track After Edit Point Later" msgstr "Spur nach Arbeitspunkt schrittweise nach hinten" -#: editor.cc:1991 editor.cc:2047 +#: editor.cc:1992 editor.cc:2048 msgid "Nudge Entire Track Earlier" msgstr "Gesamte Spur schrittweise nach vorne" -#: editor.cc:1992 editor.cc:2048 +#: editor.cc:1993 editor.cc:2049 msgid "Nudge Track After Edit Point Earlier" msgstr "Spur nach Arbeitspunkt schrittweise nach vorne" -#: editor.cc:1994 editor.cc:2050 +#: editor.cc:1995 editor.cc:2051 msgid "Nudge" msgstr "Verschieben" -#: editor.cc:3070 +#: editor.cc:3071 msgid "Smart Mode (add Range functions to Object mode)" msgstr "Smart-Modus (zusätzliche Bereichsfunktionen m Objekt-Modus)" -#: editor.cc:3071 +#: editor.cc:3072 msgid "Object Mode (select/move Objects)" msgstr "Objekt-Modus (Objekte auswählen/verschieben)" -#: editor.cc:3072 +#: editor.cc:3073 msgid "Range Mode (select/move Ranges)" msgstr "Bereichs-Modus (Bereiche auswählen/verschieben)" -#: editor.cc:3073 +#: editor.cc:3074 msgid "Draw/Edit MIDI Notes" msgstr "MIDI Noten eingeben/editieren" -#: editor.cc:3074 +#: editor.cc:3075 msgid "Draw Region Gain" msgstr "Lautstärkeautomation zeichnen" -#: editor.cc:3075 +#: editor.cc:3076 msgid "Select Zoom Range" msgstr "Zoombereich auswählen" -#: editor.cc:3076 +#: editor.cc:3077 msgid "Stretch/Shrink Regions and MIDI Notes" msgstr "Regionen und MIDI-Noten strecken/stauchen (Time-Stretch)" -#: editor.cc:3077 +#: editor.cc:3078 msgid "Listen to Specific Regions" msgstr "Ausgewählte Regionen vorhören" -#: editor.cc:3078 +#: editor.cc:3079 msgid "Note Level Editing" msgstr "Auf Notenebene bearbeiten" -#: editor.cc:3079 +#: editor.cc:3080 msgid "" "Groups: click to (de)activate\n" "Context-click for other operations" @@ -3003,51 +2977,51 @@ msgstr "" "Gruppen: Klicken zum (De)aktivieren\n" "Rechtsklick für Optionen" -#: editor.cc:3080 +#: editor.cc:3081 msgid "Nudge Region/Selection Later" msgstr "Region/Auswahl schrittweise nach hinten" -#: editor.cc:3081 +#: editor.cc:3082 msgid "Nudge Region/Selection Earlier" msgstr "Region/Auswahl schrittweise nach vorne" -#: editor.cc:3082 editor_actions.cc:242 +#: editor.cc:3083 editor_actions.cc:242 msgid "Zoom In" msgstr "Vergrößern" -#: editor.cc:3083 editor_actions.cc:241 +#: editor.cc:3084 editor_actions.cc:241 msgid "Zoom Out" msgstr "Verkleinern" -#: editor.cc:3084 editor_actions.cc:243 +#: editor.cc:3085 editor_actions.cc:243 msgid "Zoom to Session" msgstr "Auf ganzes Projekt zoomen" -#: editor.cc:3085 +#: editor.cc:3086 msgid "Zoom focus" msgstr "Zoom-Mittelpunkt" -#: editor.cc:3086 +#: editor.cc:3087 msgid "Expand Tracks" msgstr "Spuren vergrößern" -#: editor.cc:3087 +#: editor.cc:3088 msgid "Shrink Tracks" msgstr "Spuren verkleinern" -#: editor.cc:3088 +#: editor.cc:3089 msgid "Snap/Grid Units" msgstr "Rastereinheiten" -#: editor.cc:3089 +#: editor.cc:3090 msgid "Snap/Grid Mode" msgstr "Einrastmodus" -#: editor.cc:3091 +#: editor.cc:3092 msgid "Edit Mode" msgstr "Bearbeitungsmodus" -#: editor.cc:3092 +#: editor.cc:3093 msgid "" "Nudge Clock\n" "(controls distance used to nudge regions and selections)" @@ -3056,39 +3030,39 @@ msgstr "" "(bestimmt den Abstand für das schrittweise Verschieben von Regionen und " "Bereichen)" -#: editor.cc:3194 +#: editor.cc:3195 msgid "malformed URL passed to drag-n-drop code" msgstr "Ungültige URL an drag-n-drop-Code weitergeleitet" -#: editor.cc:3256 editor_actions.cc:291 +#: editor.cc:3257 editor_actions.cc:291 msgid "Command|Undo" msgstr "Rückgängig" -#: editor.cc:3258 +#: editor.cc:3259 msgid "Command|Undo (%1)" msgstr "Rückgängig (%1)" -#: editor.cc:3265 editor_actions.cc:292 +#: editor.cc:3266 editor_actions.cc:292 msgid "Redo" msgstr "Wiederherstellen" -#: editor.cc:3267 +#: editor.cc:3268 msgid "Redo (%1)" msgstr "Wiederherstellen (%1)" -#: editor.cc:3286 editor.cc:3310 editor_actions.cc:106 editor_actions.cc:1794 +#: editor.cc:3287 editor.cc:3311 editor_actions.cc:106 editor_actions.cc:1794 msgid "Duplicate" msgstr "Duplizieren" -#: editor.cc:3287 +#: editor.cc:3288 msgid "Number of duplications:" msgstr "Anzahl der Duplikate:" -#: editor.cc:3864 +#: editor.cc:3865 msgid "Playlist Deletion" msgstr "Löschen von Wiedergabelisten" -#: editor.cc:3865 +#: editor.cc:3866 msgid "" "Playlist %1 is currently unused.\n" "If it is kept, its audio files will not be cleaned.\n" @@ -3100,36 +3074,36 @@ msgstr "" "Falls sie gelöscht wird, werden die ausschließlich von ihr verwendeten " "Audiodateien gelöscht." -#: editor.cc:3875 +#: editor.cc:3876 msgid "Delete Playlist" msgstr "Wiedergabeliste löschen" -#: editor.cc:3876 +#: editor.cc:3877 msgid "Keep Playlist" msgstr "Wiedergabeliste behalten" -#: editor.cc:3877 editor_audio_import.cc:581 editor_ops.cc:5856 +#: editor.cc:3878 editor_audio_import.cc:581 editor_ops.cc:5856 #: sfdb_freesound_mootcher.cc:69 processor_box.cc:2003 processor_box.cc:2028 msgid "Cancel" msgstr "Abbrechen" -#: editor.cc:4021 +#: editor.cc:4022 msgid "new playlists" msgstr "Neue Wiedergabelisten" -#: editor.cc:4037 +#: editor.cc:4038 msgid "copy playlists" msgstr "Wiedergabelisten kopieren" -#: editor.cc:4052 +#: editor.cc:4053 msgid "clear playlists" msgstr "Wiedergabelisten zurücksetzen" -#: editor.cc:4687 +#: editor.cc:4688 msgid "Please wait while %1 loads visual data." msgstr "Bitte warten Sie, während %1 die Daten zur Anzeige des Projekts lädt." -#: editor.cc:5492 editor_markers.cc:940 panner_ui.cc:393 processor_box.cc:2253 +#: editor.cc:5493 editor_markers.cc:940 panner_ui.cc:392 processor_box.cc:2253 msgid "Edit..." msgstr "Bearbeiten..." @@ -3178,8 +3152,8 @@ msgstr "Layering" msgid "Position" msgstr "Position" -#: editor_actions.cc:101 gain_meter.cc:121 gain_meter.cc:791 panner_ui.cc:177 -#: panner_ui.cc:586 +#: editor_actions.cc:101 gain_meter.cc:120 gain_meter.cc:794 panner_ui.cc:176 +#: panner_ui.cc:585 msgid "Trim" msgstr "Anpassen" @@ -3229,7 +3203,7 @@ msgstr "MIDI Optionen" msgid "Misc Options" msgstr "Sonstiges" -#: editor_actions.cc:115 rc_option_editor.cc:1460 route_group_dialog.cc:48 +#: editor_actions.cc:115 rc_option_editor.cc:1458 route_group_dialog.cc:48 #: session_option_editor.cc:218 session_option_editor.cc:225 msgid "Monitoring" msgstr "Monitoring" @@ -3637,11 +3611,11 @@ msgstr "Log" #: editor_actions.cc:320 msgid "Move Later to Transient" -msgstr "Zum nächsten Transienten" +msgstr "Zum nächsten Transienten bewegen" #: editor_actions.cc:321 msgid "Move Earlier to Transient" -msgstr "Zum vorigen Transienten" +msgstr "Zum vorigen Transienten bewegen" #: editor_actions.cc:325 msgid "Start Range" @@ -3966,7 +3940,7 @@ msgstr "Min:Sek" msgid "Video Monitor" msgstr "Videomonitor" -#: editor_actions.cc:549 rc_option_editor.cc:1842 +#: editor_actions.cc:549 rc_option_editor.cc:1838 msgid "Video" msgstr "Video" @@ -4485,31 +4459,31 @@ msgstr "Tempomarker kopieren" msgid "move tempo mark" msgstr "Tempowechsel bewegen" -#: editor_drag.cc:2545 +#: editor_drag.cc:2550 msgid "change fade in length" msgstr "Ändere Fade-In Länge" -#: editor_drag.cc:2663 +#: editor_drag.cc:2668 msgid "change fade out length" msgstr "Fade-Out verändern" -#: editor_drag.cc:3018 +#: editor_drag.cc:3023 msgid "move marker" msgstr "Marker bewegen" -#: editor_drag.cc:3581 +#: editor_drag.cc:3586 msgid "An error occurred while executing time stretch operation" msgstr "Beim Ausführen der Timestretch-Operation trat ein Fehler auf" -#: editor_drag.cc:4011 +#: editor_drag.cc:4016 msgid "programming_error: %1" msgstr "Programmierfehler: %1" -#: editor_drag.cc:4081 editor_markers.cc:680 +#: editor_drag.cc:4086 editor_markers.cc:680 msgid "new range marker" msgstr "Neuer Bereich" -#: editor_drag.cc:4762 +#: editor_drag.cc:4767 msgid "rubberband selection" msgstr "Gummiband-Auswahl" @@ -5206,7 +5180,7 @@ msgstr "Übermäßige Aufteilung?" #: editor_ops.cc:6125 msgid "place transient" -msgstr "Transienten Platzieren" +msgstr "Transienten platzieren" #: editor_ops.cc:6160 msgid "snap regions to grid" @@ -5401,8 +5375,8 @@ msgstr "G" msgid "Region position glued to Bars|Beats time?" msgstr "Regionenposition an Takt und Schäge gebunden?" -#: editor_regions.cc:120 editor_routes.cc:207 gain_meter.cc:759 -#: mixer_strip.cc:1931 meter_strip.cc:320 panner_ui.cc:554 +#: editor_regions.cc:120 editor_routes.cc:207 gain_meter.cc:762 +#: mixer_strip.cc:1931 meter_strip.cc:320 panner_ui.cc:553 #: stereo_panner.cc:237 msgid "M" msgstr "M" @@ -5447,8 +5421,7 @@ msgstr "Ungenutzte Regionen entfernen" msgid "Mult." msgstr "Viele" -#: editor_regions.cc:847 engine_dialog.cc:84 midi_list_editor.cc:103 -#: time_info_box.cc:91 +#: editor_regions.cc:847 midi_list_editor.cc:103 time_info_box.cc:91 msgid "Start" msgstr "Start" @@ -5514,7 +5487,7 @@ msgstr "Solo ein" msgid "SI" msgstr "SI" -#: editor_routes.cc:209 mixer_strip.cc:353 rc_option_editor.cc:1880 +#: editor_routes.cc:209 mixer_strip.cc:353 rc_option_editor.cc:1876 msgid "Solo Isolated" msgstr "Isoliertes Solo" @@ -5733,264 +5706,196 @@ msgstr "" "Time-Stretch konnte nicht gestartet werden - Fehler beim erstellen des " "Threads" -#: engine_dialog.cc:75 -msgid "Realtime" -msgstr "Realtime" +#: engine_dialog.cc:73 +msgid "Device Control Panel" +msgstr "Gerätekontrollfeld" -#: engine_dialog.cc:76 -msgid "Do not lock memory" -msgstr "Speicherzugriff nicht sperren" +#: engine_dialog.cc:74 engine_dialog.cc:1600 +msgid "Measure latency" +msgstr "Latenz messen" -#: engine_dialog.cc:77 -msgid "Unlock memory" -msgstr "Speicherzugriff öffnen" +#: engine_dialog.cc:75 +msgid "Use results" +msgstr "Benutze Ergebnisse" #: engine_dialog.cc:78 -msgid "No zombies" -msgstr "Keine Zombies (Soft Mode)" +msgid "Refresh list" +msgstr "Liste auffrischen" #: engine_dialog.cc:79 -msgid "Provide monitor ports" -msgstr "Monitor-Ports erstellen" - -#: engine_dialog.cc:80 -msgid "Force 16 bit" -msgstr "Erzwinge 16 Bit" - -#: engine_dialog.cc:81 -msgid "H/W monitoring" -msgstr "Hardware Monitoring" - -#: engine_dialog.cc:82 -msgid "H/W metering" -msgstr "Hardware-Pegelanzeige" - -#: engine_dialog.cc:83 -msgid "Verbose output" -msgstr "Ausführliche Statusmeldungen" +msgid "Start MIDI ALSA/JACK bridge" +msgstr "Starte MIDI ALSA/JACK bridge" -#: engine_dialog.cc:103 -msgid "8000Hz" -msgstr "8000 Hz" +#: engine_dialog.cc:121 +msgid "Latency Measurement Tool" +msgstr "Latenzmeßwerkzeug" -#: engine_dialog.cc:104 -msgid "22050Hz" -msgstr "22050 Hz" - -#: engine_dialog.cc:105 -msgid "44100Hz" -msgstr "44100 Hz" - -#: engine_dialog.cc:106 -msgid "48000Hz" -msgstr "48000 Hz" - -#: engine_dialog.cc:107 -msgid "88200Hz" -msgstr "88200 Hz" - -#: engine_dialog.cc:108 -msgid "96000Hz" -msgstr "96000 Hz" - -#: engine_dialog.cc:109 -msgid "192000Hz" -msgstr "192000 Hz" - -#: engine_dialog.cc:127 engine_dialog.cc:132 engine_dialog.cc:169 -#: engine_dialog.cc:562 midi_channel_selector.cc:163 -#: midi_channel_selector.cc:402 midi_channel_selector.cc:438 -#: rc_option_editor.cc:1250 sfdb_ui.cc:538 -msgid "None" -msgstr "Kein" - -#: engine_dialog.cc:128 engine_dialog.cc:563 -msgid "Triangular" -msgstr "dreieckig" - -#: engine_dialog.cc:129 engine_dialog.cc:565 -msgid "Rectangular" -msgstr "rechteckig" - -#: engine_dialog.cc:130 engine_dialog.cc:567 -msgid "Shaped" -msgstr "shaped" +#: engine_dialog.cc:134 +msgid "" +"Turn down the volume on your hardware to a very low " +"level." +msgstr "" +"Stellen Sie Ihre Hardwarelautstärke auf einen sehr " +"niedrigen " +"Pegel ein." -#: engine_dialog.cc:158 engine_dialog.cc:483 engine_dialog.cc:974 -msgid "Playback/recording on 1 device" -msgstr "Wiedergabe/Aufnahme mit einem Gerät" +#: engine_dialog.cc:142 +msgid "" +"Select two channels below and connect them using a cable or (less ideally) a " +"speaker and microphone." +msgstr "" +"Wählen Sie unten zwei Kanäle aus und verbinden sie mit einem Kabel oder " +"(weniger empfehlenswert) mittels Lautsprecher und Mikrofon." -#: engine_dialog.cc:159 engine_dialog.cc:487 engine_dialog.cc:540 -#: engine_dialog.cc:977 -msgid "Playback/recording on 2 devices" -msgstr "Wiedergabe/Aufnahme mit zwei Geräten" +#: engine_dialog.cc:147 +msgid "Output channel" +msgstr "Ausgangskanal" -#: engine_dialog.cc:160 engine_dialog.cc:503 engine_dialog.cc:980 -msgid "Playback only" -msgstr "Nur Wiedergabe" +#: engine_dialog.cc:155 +msgid "Input channel" +msgstr "Eingangskanal" -#: engine_dialog.cc:161 engine_dialog.cc:505 engine_dialog.cc:983 -msgid "Recording only" -msgstr "Nur Aufnahme" +#: engine_dialog.cc:174 +msgid "Once the channels are connected, click the \"Measure latency\" button." +msgstr "" +"Wenn die Kanäle verbunden sind, klicken Sie den Knopf \"Latenz messen\"." -#: engine_dialog.cc:171 engine_dialog.cc:448 -msgid "coremidi" -msgstr "coremidi" +#: engine_dialog.cc:187 +msgid "When satisfied with the results, click the \"Use results\" button." +msgstr "" +"Wenn Sie mit dem Resultat zufrieden sind, klicken Sie den Knopf \"Benutze " +"Ergebnisse\"." -#: engine_dialog.cc:173 engine_dialog.cc:581 -msgid "seq" -msgstr "seq" +#: engine_dialog.cc:203 route_params_ui.cc:105 +msgid "Latency" +msgstr "Latenz" -#: engine_dialog.cc:174 engine_dialog.cc:583 -msgid "raw" -msgstr "raw" +#: engine_dialog.cc:298 +msgid "Audio System:" +msgstr "Audiosystem:" -#: engine_dialog.cc:181 +#: engine_dialog.cc:337 msgid "Driver:" msgstr "Treiber:" -#: engine_dialog.cc:186 -msgid "Audio Interface:" -msgstr "Audio-Schnittstelle:" +#: engine_dialog.cc:343 +msgid "Device:" +msgstr "Gerät:" -#: engine_dialog.cc:191 sfdb_ui.cc:147 sfdb_ui.cc:260 sfdb_ui.cc:265 +#: engine_dialog.cc:348 engine_dialog.cc:430 sfdb_ui.cc:147 sfdb_ui.cc:260 +#: sfdb_ui.cc:265 msgid "Sample rate:" msgstr "Samplerate:" -#: engine_dialog.cc:196 +#: engine_dialog.cc:354 engine_dialog.cc:437 msgid "Buffer size:" msgstr "Puffergröße" -#: engine_dialog.cc:202 -msgid "Number of buffers:" -msgstr "Pufferanzahl:" +#: engine_dialog.cc:367 +msgid "Input Channels:" +msgstr "Eingangskanäle:" -#: engine_dialog.cc:209 -msgid "Approximate latency:" -msgstr "Latenz (ca.)" +#: engine_dialog.cc:378 +msgid "Output Channels:" +msgstr "Ausgangskanäle:" -#: engine_dialog.cc:222 -msgid "Audio mode:" -msgstr "Audio-Modus:" +#: engine_dialog.cc:389 +msgid "Hardware input latency:" +msgstr "Hardware Eingangslatenz (Samples)" -#: engine_dialog.cc:284 engine_dialog.cc:408 -msgid "Ignore" -msgstr "ignorieren" +#: engine_dialog.cc:392 engine_dialog.cc:405 +msgid "samples" +msgstr "Samples" -#: engine_dialog.cc:292 -msgid "Client timeout" -msgstr "Client Timeout" +#: engine_dialog.cc:402 +msgid "Hardware output latency:" +msgstr "Hardware Ausgangslatenz (Samples)" -#: engine_dialog.cc:299 -msgid "Number of ports:" -msgstr "Portanzahl" +#: engine_dialog.cc:422 +msgid "" +"The %1 audio backend was configured and started externally.\n" +"This limits your control over it." +msgstr "" +"Das %1 Audiobackend wurde extern konfiguriert und gestartet.\n" +"Dies beschränkt Ihre Kontrolle darüber." -#: engine_dialog.cc:304 -msgid "MIDI driver:" -msgstr "MIDI-Treiber:" +#: engine_dialog.cc:531 +msgid "MIDI Inputs" +msgstr "MIDI Eingänge" -#: engine_dialog.cc:310 -msgid "Dither:" -msgstr "Dithering:" +#: engine_dialog.cc:548 +msgid "MIDI Outputs" +msgstr "MIDI Ausgänge" -#: engine_dialog.cc:319 -msgid "" -"No JACK server found anywhere on this system. Please install JACK and restart" -msgstr "" -"Es wurde kein JACK Server auf diesem System gefunden. Bitte installieren Sie " -"JACK vor einem Neuversuch." +#: engine_dialog.cc:617 +msgid "all available channels" +msgstr "alle verfügbaren Kanäle" -#: engine_dialog.cc:327 -msgid "Server:" -msgstr "Server:" +#: engine_dialog.cc:811 +#, c-format +msgid "%u samples" +msgstr "%u Samples" -#: engine_dialog.cc:339 -msgid "Input device:" -msgstr "Eingangsgerät:" +#: engine_dialog.cc:862 +#, c-format +msgid "(%.1f msecs)" +msgstr "(%.1f msecs)" -#: engine_dialog.cc:343 -msgid "Output device:" -msgstr "Ausgabegerät:" +#: engine_dialog.cc:1281 +msgid "Cannot set driver to %1" +msgstr "Kann Treiber nicht auf %1 setzen" -#: engine_dialog.cc:348 -msgid "Hardware input latency:" -msgstr "Hardware Eingangslatenz (Samples)" +#: engine_dialog.cc:1285 +msgid "Cannot set device name to %1" +msgstr "Kann Gerät nicht auf %1 setzen" -#: engine_dialog.cc:351 engine_dialog.cc:357 -msgid "samples" -msgstr "Samples" +#: engine_dialog.cc:1289 +msgid "Cannot set sample rate to %1" +msgstr "Kann Samplerate nicht auf %1 setzen" -#: engine_dialog.cc:354 -msgid "Hardware output latency:" -msgstr "Hardware Ausgangslatenz (Samples)" +#: engine_dialog.cc:1293 +msgid "Cannot set buffer size to %1" +msgstr "Kann Buffergröße nicht auf %1 setzen" -#: engine_dialog.cc:368 -msgid "Device" -msgstr "Gerät" +#: engine_dialog.cc:1299 +msgid "Cannot set input channels to %1" +msgstr "Kann Eingangskanäle nicht auf %1 setzen" -#: engine_dialog.cc:370 -msgid "Advanced" -msgstr "Erweitert" +#: engine_dialog.cc:1303 +msgid "Cannot set output channels to %1" +msgstr "Kann Ausgangskanäle nicht auf %1 setzen" -#: engine_dialog.cc:653 -msgid "cannot open JACK rc file %1 to store parameters" -msgstr "kann die JACK rc-Datei %1 nicht öffnen, um die Parameter zu sichern" +#: engine_dialog.cc:1309 +msgid "Cannot set input latency to %1" +msgstr "Kann Eingangslatenz nicht auf %1 setzen" -#: engine_dialog.cc:787 -msgid "" -"You do not have any audio devices capable of\n" -"simultaneous playback and recording.\n" -"\n" -"Please use Applications -> Utilities -> Audio MIDI Setup\n" -"to create an \"aggregrate\" device, or install a suitable\n" -"audio interface.\n" -"\n" -"Please send email to Apple and ask them why new Macs\n" -"have no duplex audio device.\n" -"\n" -"Alternatively, if you really want just playback\n" -"or recording but not both, start JACK before running\n" -"%1 and choose the relevant device then." -msgstr "" -"Sie haben keine Soundkarte, die gleichzeitiges\n" -"Abspielen und Aufnehmen unterstützt.\n" -"\n" -"Benützen Sie Programme>Dienstprogramme>Audio-Midi-Setup\n" -" um ein kombiniertes Gerät zu erzeugen, oder installieren Sie ein\n" -"geeignetes Audiointerface.\n" -"\n" -"Bitte senden Sie eine E-Mail an Apple und fragen Sie, warum Sie\n" -"keine Duplex Soundkarte in Ihrem Mac haben.\n" -"\n" -"Wenn Sie Audiomaterial wirklich nicht gleichzeitig aufnehmen und wiedergeben " -"wollen,\n" -"können Sie JACK vor dem Starten von %1 aufrufen und das entsprechende Gerät " -"auswählen." +#: engine_dialog.cc:1313 +msgid "Cannot set output latency to %1" +msgstr "Kann Ausgangslatenz nicht auf %1 setzen" -#: engine_dialog.cc:800 -msgid "No suitable audio devices" -msgstr "Keine passenden Audiogeräte." +#: engine_dialog.cc:1534 +msgid "No signal detected " +msgstr "Kein Signal erkannt" -#: engine_dialog.cc:1017 -msgid "JACK appears to be missing from the %1 bundle" -msgstr "JACK scheint im %1-Paket zu fehlen." +#: engine_dialog.cc:1547 port_insert_ui.cc:71 port_insert_ui.cc:99 +msgid "Disconnected from audio engine" +msgstr "Von Audio-Engine getrennt" -#: engine_dialog.cc:1087 -msgid "You need to choose an audio device first." -msgstr "Sie müssen zuerst ein Audiogerät auswählen." +#: engine_dialog.cc:1587 port_insert_ui.cc:135 +msgid "Detecting ..." +msgstr "Messe..." -#: engine_dialog.cc:1104 -msgid "Audio device \"%1\" not known on this computer." -msgstr "Audiogerät %1 scheint auf diesem Computer nicht vorhanden zu sein." +#: engine_dialog.cc:1589 +msgid "Cancel measurement" +msgstr "Messung abbrechen" -#: engine_dialog.cc:1256 -msgid "AudioSetup value for %1 is missing data" -msgstr "Es fehlen Daten zum AudioSetup-Wert von %1" +#: engine_dialog.cc:1657 +msgid "Disconnect from %1" +msgstr "Trenne von %1" -#: engine_dialog.cc:1335 -msgid "configuration files contain a JACK server path that doesn't exist (%1)" -msgstr "" -"die Konfiguration enthält einen JACK-Serverpfad, der nicht existiert (%1)" +#: engine_dialog.cc:1669 +msgid "Connect to %1" +msgstr "Verbinde zu %1" #: export_channel_selector.cc:45 sfdb_ui.cc:145 msgid "Channels:" @@ -6325,72 +6230,77 @@ msgstr "getSoundResourceFile: Wurzel = %1, != Antwort" msgid "%1" msgstr "%1" -#: gain_meter.cc:106 gain_meter.cc:357 gain_meter.cc:462 gain_meter.cc:856 +#: gain_meter.cc:105 gain_meter.cc:360 gain_meter.cc:465 gain_meter.cc:859 msgid "-inf" msgstr "-inf" -#: gain_meter.cc:112 gain_meter.cc:913 +#: gain_meter.cc:111 gain_meter.cc:916 msgid "Fader automation mode" msgstr "Fader Automationsmodus" -#: gain_meter.cc:113 gain_meter.cc:914 +#: gain_meter.cc:112 gain_meter.cc:917 msgid "Fader automation type" msgstr "Fader-Automationstyp" -#: gain_meter.cc:122 gain_meter.cc:795 panner_ui.cc:178 panner_ui.cc:590 +#: gain_meter.cc:121 gain_meter.cc:798 panner_ui.cc:177 panner_ui.cc:589 msgid "Abs" msgstr "Abs" -#: gain_meter.cc:762 mixer_strip.cc:1948 meter_strip.cc:337 panner_ui.cc:557 +#: gain_meter.cc:765 mixer_strip.cc:1948 meter_strip.cc:337 panner_ui.cc:556 #: route_time_axis.cc:2411 msgid "P" msgstr "P" -#: gain_meter.cc:765 panner_ui.cc:560 +#: gain_meter.cc:768 panner_ui.cc:559 msgid "T" msgstr "T" -#: gain_meter.cc:768 panner_ui.cc:563 +#: gain_meter.cc:771 panner_ui.cc:562 msgid "W" msgstr "W" -#: generic_pluginui.cc:83 +#: generic_pluginui.cc:81 msgid "Presets" msgstr "Voreinstellungen" -#: generic_pluginui.cc:232 +#: generic_pluginui.cc:230 msgid "Switches" msgstr "Schalter" -#: generic_pluginui.cc:242 generic_pluginui.cc:376 processor_box.cc:2212 +#: generic_pluginui.cc:240 generic_pluginui.cc:374 processor_box.cc:2212 msgid "Controls" msgstr "Steuerelemente" -#: generic_pluginui.cc:270 +#: generic_pluginui.cc:268 msgid "Plugin Editor: could not build control element for port %1" msgstr "Plugin Editor: konnte kein Steuerelement für Port %1 erzeugen" -#: generic_pluginui.cc:408 +#: generic_pluginui.cc:406 msgid "Meters" msgstr "Pegelanzeigen" -#: generic_pluginui.cc:423 +#: generic_pluginui.cc:421 msgid "Automation control" msgstr "Automation" -#: generic_pluginui.cc:430 +#: generic_pluginui.cc:428 msgid "Mgnual" msgstr "Mgnuell" -#: global_port_matrix.cc:164 +#: global_port_matrix.cc:157 msgid "Audio Connection Manager" msgstr "Audio Verbindungsmanager" -#: global_port_matrix.cc:167 +#: global_port_matrix.cc:160 msgid "MIDI Connection Manager" msgstr "Midi Verbindungsmanager" -#: global_port_matrix.cc:213 io_selector.cc:216 +#: global_port_matrix.cc:200 io_selector.cc:210 mixer_strip.cc:719 +#: mixer_strip.cc:845 +msgid "Disconnect" +msgstr "Trenne" + +#: global_port_matrix.cc:206 io_selector.cc:216 msgid "port" msgstr "Port" @@ -6588,19 +6498,19 @@ msgstr "" msgid "Main_menu" msgstr "Hauptmenü" -#: keyeditor.cc:255 +#: keyeditor.cc:253 msgid "redirectmenu" msgstr "Umleitungsmenü" -#: keyeditor.cc:257 +#: keyeditor.cc:255 msgid "Editor_menus" msgstr "Editor-Menü" -#: keyeditor.cc:259 +#: keyeditor.cc:257 msgid "RegionList" msgstr "Regionenliste" -#: keyeditor.cc:261 +#: keyeditor.cc:259 msgid "ProcessorMenu" msgstr "Prozessor-Menü" @@ -6622,7 +6532,7 @@ msgid_plural "%1 samples" msgstr[0] "%1 Sample" msgstr[1] "%1 Samples" -#: latency_gui.cc:72 panner_ui.cc:392 +#: latency_gui.cc:72 panner_ui.cc:391 msgid "Reset" msgstr "Zurücksetzen" @@ -6714,103 +6624,73 @@ msgstr "Bereiche (Inclusive CD Track-Bereichen)" msgid "add range marker" msgstr "Bereich hinzufügen" -#: main.cc:83 -msgid "%1 could not connect to JACK." -msgstr "%1 konnte nicht zu JACK verbinden." +#: main.cc:81 +msgid "%1 could not connect to the audio backend." +msgstr "%1 konnte nicht zum Audiobackend verbinden." -#: main.cc:87 -msgid "" -"There are several possible reasons:\n" -"\n" -"1) JACK is not running.\n" -"2) JACK is running as another user, perhaps root.\n" -"3) There is already another client called \"%1\".\n" -"\n" -"Please consider the possibilities, and perhaps (re)start JACK." -msgstr "" -"Dafür kann es verschiedene Gründe geben:\n" -"\n" -"1) JACK läuft nicht.\n" -"2) JACK wurde unter einem anderen Benutzer gestartet, möglicherweise als " -"root.\n" -"3) Es gibt bereits einen anderen Client mit der Bezeichnung \"%1\".\n" -"\n" -"Betrachten Sie bitte diese Möglichkeiten und starten Sie ggf. JACK neu." - -#: main.cc:203 main.cc:324 +#: main.cc:194 main.cc:315 msgid "cannot create user %3 folder %1 (%2)" msgstr "Kann benutzerspezifischen %3-Ordner %1 nicht erstellen: %2" -#: main.cc:210 main.cc:331 +#: main.cc:201 main.cc:322 msgid "cannot open pango.rc file %1" msgstr "kann die Datei pango.rc nicht öffnen %1" -#: main.cc:235 main.cc:358 +#: main.cc:226 main.cc:349 msgid "Cannot find ArdourMono TrueType font" msgstr "Kann den TrueType-Font ArdourMono nicht finden" -#: main.cc:247 main.cc:364 +#: main.cc:238 main.cc:355 msgid "Cannot load ArdourMono TrueType font." msgstr "Kann den TrueType-Font ArdourMono nicht laden." -#: main.cc:312 +#: main.cc:303 msgid "" "No fontconfig file found on your system. Things may looked very odd or ugly" msgstr "" "Keine fontconfig-Datei auf Ihrem System gefunden. Das kann zu seltsamem oder " "hässlichem Aussehen führen" -#: main.cc:368 +#: main.cc:359 msgid "Failed to set fontconfig configuration." msgstr "Fontconfig-Konfiguration gescheitert." -#: main.cc:379 main.cc:395 -msgid "JACK exited" -msgstr "JACK wurde beendet" +#: main.cc:370 main.cc:386 +msgid "The audio backend (%1) has failed, or terminated" +msgstr "Das Audiobackend (%1) funktioniert nicht oder wurde beendet" -#: main.cc:382 +#: main.cc:373 msgid "" -"JACK exited unexpectedly, and without notifying %1.\n" +"%2 exited unexpectedly, and without notifying %1.\n" "\n" -"This could be due to misconfiguration or to an error inside JACK.\n" +"This could be due to misconfiguration or to an error inside %2.\n" "\n" "Click OK to exit %1." msgstr "" -"JACK wurde unerwartet und ohne Benachrichtigung beendet %1.\n" +"%2 wurde unerwartet und ohne %1 zu benachrichtigen beendet .\n" "\n" "Dies liegt entweder an einer fehlerhaften Konfiguration oder an einem Fehler " -"in JACK.\n" +"in %2.\n" "\n" "Klicke OK, um %1 zu verlassen." -#: main.cc:397 -msgid "" -"JACK exited unexpectedly, and without notifying %1.\n" -"\n" -"This is probably due to an error inside JACK. You should restart JACK\n" -"and reconnect %1 to it, or exit %1 now. You cannot save your\n" -"session at this time, because we would lose your connection information.\n" -msgstr "" -"JACK wurde unerwartet und ohne Benachrichtigung beendet %1.\n" -"\n" -"Dies liegt wahrscheinlich an einem Fehler in JACK. Sie sollten\n" -"JACK neu starten und %1 erneut mit ihm verbinden, oder %1 jetzt beenden.\n" -"Momentan läßt sich das Projekt nicht speichern, da alle Informationen\n" -"über Verbindungen verloren gehen würden.\n" +#: main.cc:387 +msgid "%2 exited unexpectedly, and without notifying %1." +msgstr "%2 wurde unerwartet und ohne %1 zu benachrichtigen beendet " -#: main.cc:487 +#: main.cc:474 msgid " (built using " msgstr " (kompiliert mit Version " -#: main.cc:490 +#: main.cc:477 msgid " and GCC version " msgstr " und GCC Version" -#: main.cc:500 +#: main.cc:487 msgid "Copyright (C) 1999-2012 Paul Davis" msgstr "Copyright (C) 1999-2012 Paul Davis" -#: main.cc:501 +#: main.cc:488 msgid "" "Some portions Copyright (C) Steve Harris, Ari Johnson, Brett Viren, Joel " "Baker, Robin Gareus" @@ -6818,34 +6698,34 @@ msgstr "" "Einige Teile Copyright (C) Steve Harris, Ari Johnson, Brett Viren, Joel " "Baker, Robin Gareus" -#: main.cc:503 +#: main.cc:490 msgid "%1 comes with ABSOLUTELY NO WARRANTY" msgstr "%1 wird Ihnen ohne jegliche Gewährleistung" -#: main.cc:504 +#: main.cc:491 msgid "not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." msgstr "" "für allgemeine oder spezielle Gebrauchstauglichkeit zur Verfügung gestellt." -#: main.cc:505 +#: main.cc:492 msgid "This is free software, and you are welcome to redistribute it " msgstr "Dies ist freie Software, die Sie gerne weitergeben dürfen" -#: main.cc:506 +#: main.cc:493 msgid "under certain conditions; see the source for copying conditions." msgstr "" "solange Sie sich an die Bedingungen, die in der Datei COPYING aufgeführt " "sind halten." -#: main.cc:513 +#: main.cc:500 msgid "could not initialize %1." msgstr "Konnte %1 nicht initialisieren." -#: main.cc:522 +#: main.cc:509 msgid "Cannot xinstall SIGPIPE error handler" msgstr "Kann die SIGPIPE Fehlerbehandlung nicht installieren" -#: main.cc:528 +#: main.cc:515 msgid "could not create %1 GUI" msgstr "konnte das %1 GUI nicht erstellen" @@ -6862,6 +6742,11 @@ msgstr "MarkerText" msgid "All" msgstr "Alle" +#: midi_channel_selector.cc:163 midi_channel_selector.cc:402 +#: midi_channel_selector.cc:438 rc_option_editor.cc:1248 sfdb_ui.cc:538 +msgid "None" +msgstr "Kein" + #: midi_channel_selector.cc:167 midi_channel_selector.cc:407 #: midi_channel_selector.cc:443 msgid "Invert" @@ -7250,27 +7135,27 @@ msgstr "alle" msgid "some" msgstr "einige" -#: midi_tracer.cc:43 +#: midi_tracer.cc:46 msgid "Line history: " msgstr "Aktionsliste:" -#: midi_tracer.cc:51 +#: midi_tracer.cc:54 msgid "Auto-Scroll" msgstr "Auto-Scroll" -#: midi_tracer.cc:52 +#: midi_tracer.cc:55 msgid "Decimal" msgstr "Dezimal" -#: midi_tracer.cc:53 rc_option_editor.cc:659 +#: midi_tracer.cc:56 rc_option_editor.cc:657 msgid "Enabled" msgstr "Aktiviert" -#: midi_tracer.cc:54 +#: midi_tracer.cc:57 msgid "Delta times" msgstr "Deltazeiten" -#: midi_tracer.cc:66 +#: midi_tracer.cc:70 msgid "Port:" msgstr "Port:" @@ -7411,7 +7296,7 @@ msgid "pre" msgstr "Pre" #: mixer_strip.cc:95 mixer_strip.cc:123 mixer_strip.cc:354 mixer_strip.cc:1300 -#: rc_option_editor.cc:1881 +#: rc_option_editor.cc:1877 msgid "Comments" msgstr "Kommentare" @@ -7459,11 +7344,11 @@ msgstr "iso" msgid "Mix group" msgstr "Bearbeitungsgruppe" -#: mixer_strip.cc:351 rc_option_editor.cc:1878 +#: mixer_strip.cc:351 rc_option_editor.cc:1874 msgid "Phase Invert" msgstr "Phaseninvertierung" -#: mixer_strip.cc:352 rc_option_editor.cc:1879 route_ui.cc:1218 +#: mixer_strip.cc:352 rc_option_editor.cc:1875 route_ui.cc:1218 msgid "Solo Safe" msgstr "Solo sperren" @@ -7471,7 +7356,7 @@ msgstr "Solo sperren" msgid "Group" msgstr "Gruppe" -#: mixer_strip.cc:356 rc_option_editor.cc:1882 +#: mixer_strip.cc:356 rc_option_editor.cc:1878 msgid "Meter Point" msgstr "Abgreifpunkt der Pegelanzeige" @@ -7492,9 +7377,10 @@ msgid "Snd" msgstr "Snd" #: mixer_strip.cc:701 mixer_strip.cc:829 processor_box.cc:2154 -msgid "Not connected to JACK - no I/O changes are possible" +msgid "Not connected to audio engine - no I/O changes are possible" msgstr "" -"Nicht mit Jack verbunden - es sind keine Änderungen an Ein-/Ausgängen möglich" +"Nicht mit Audioengine verbunden - es sind keine Änderungen an Ein-/Ausgängen " +"möglich" #: mixer_strip.cc:1096 msgid "INPUT to %1" @@ -8014,11 +7900,11 @@ msgstr "" #: opts.cc:63 msgid "" -" -c, --name Use a specific jack client name, default is " +" -c, --name Use a specific backend client name, default is " "ardour\n" msgstr "" -" -c, --name name Benutze spezielle JACK-Clientkennung, " -"Standard: ardour\n" +" -c, --name name Benutze speziellen Backend-Clientnamen, " +"Voreinstellung: ardour\n" #: opts.cc:64 msgid "" @@ -8092,7 +7978,7 @@ msgstr "" msgid "Panner (2D)" msgstr "Panner (2D)" -#: panner2d.cc:783 panner_ui.cc:384 plugin_ui.cc:451 +#: panner2d.cc:783 panner_ui.cc:383 plugin_ui.cc:449 msgid "Bypass" msgstr "Bypass" @@ -8100,15 +7986,15 @@ msgstr "Bypass" msgid "Panner" msgstr "Panner" -#: panner_ui.cc:71 +#: panner_ui.cc:70 msgid "Pan automation mode" msgstr "Pan-Automationsmodus" -#: panner_ui.cc:72 +#: panner_ui.cc:71 msgid "Pan automation type" msgstr "Pan-Automationstyp" -#: panner_ui.cc:295 +#: panner_ui.cc:294 msgid "" "No panner user interface is currently available for %1-in/2out tracks/busses" msgstr "Für %1-in/2out Spuren/Busse ist momentan kein Panner-UI verfügbar" @@ -8264,11 +8150,11 @@ msgstr "Nach Urheber" msgid "By Category" msgstr "Nach Kategorie" -#: plugin_ui.cc:116 +#: plugin_ui.cc:114 msgid "Eh? LADSPA plugins don't have editors!" msgstr "Merkwürdig... LADSPA-Plugins sollten kein GUI haben!" -#: plugin_ui.cc:125 plugin_ui.cc:227 +#: plugin_ui.cc:123 plugin_ui.cc:225 msgid "" "unknown type of editor-supplying plugin (note: no VST support in this " "version of %1)" @@ -8276,11 +8162,11 @@ msgstr "" "Unbekannter Plugintyp mit eigenem Editor (Hinweis: diese %1-Version " "unterstützt keine VST-Plugins)" -#: plugin_ui.cc:128 +#: plugin_ui.cc:126 msgid "unknown type of editor-supplying plugin" msgstr "Unbekannter Plugintyp" -#: plugin_ui.cc:257 +#: plugin_ui.cc:255 msgid "" "unknown type of editor-supplying plugin (note: no linuxVST support in this " "version of %1)" @@ -8288,23 +8174,23 @@ msgstr "" "Unbekannter Plugintyp mit eigenem Editor (Hinweis: diese %1-Version " "unterstützt keine linuxVST-Plugins)" -#: plugin_ui.cc:329 +#: plugin_ui.cc:327 msgid "create_lv2_editor called on non-LV2 plugin" msgstr "create_lv2_editor auf nicht-LV2-Plugin angewandt" -#: plugin_ui.cc:417 +#: plugin_ui.cc:415 msgid "Add" msgstr "Hinzufügen" -#: plugin_ui.cc:421 +#: plugin_ui.cc:419 msgid "Description" msgstr "Beschreibung:" -#: plugin_ui.cc:422 +#: plugin_ui.cc:420 msgid "Plugin analysis" msgstr "Pluginanalyse" -#: plugin_ui.cc:429 +#: plugin_ui.cc:427 msgid "" "Presets (if any) for this plugin\n" "(Both factory and user-created)" @@ -8312,23 +8198,23 @@ msgstr "" "Presets (falls existent) für dieses Plugin\n" "(Hersteller- und Benutzerpresets)" -#: plugin_ui.cc:430 +#: plugin_ui.cc:428 msgid "Save a new preset" msgstr "Neues Preset speichern" -#: plugin_ui.cc:431 +#: plugin_ui.cc:429 msgid "Save the current preset" msgstr "Momentanes Preset speichern" -#: plugin_ui.cc:432 +#: plugin_ui.cc:430 msgid "Delete the current preset" msgstr "Lösche das aktuelle Preset" -#: plugin_ui.cc:433 +#: plugin_ui.cc:431 msgid "Disable signal processing by the plugin" msgstr "Deaktiviere die Signalverarbeitung des Plugins" -#: plugin_ui.cc:466 plugin_ui.cc:662 +#: plugin_ui.cc:464 plugin_ui.cc:660 msgid "" "Click to allow the plugin to receive keyboard events that %1 would normally " "use as a shortcut" @@ -8336,29 +8222,29 @@ msgstr "" "Klicke, damit das Plugin Tastaturbefehle erhält, die %1 sonst als " "Tastenkürzel verwenden würde" -#: plugin_ui.cc:467 +#: plugin_ui.cc:465 msgid "Click to enable/disable this plugin" msgstr "Klicke, um dieses Plugin zu ein/auszuschalten" -#: plugin_ui.cc:506 +#: plugin_ui.cc:504 msgid "latency (%1 sample)" msgid_plural "latency (%1 samples)" msgstr[0] "Latenz (%1 Sample)" msgstr[1] "Latenz (%1 Samples)" -#: plugin_ui.cc:508 +#: plugin_ui.cc:506 msgid "latency (%1 ms)" msgstr "Latenz (%1 ms)" -#: plugin_ui.cc:519 +#: plugin_ui.cc:517 msgid "Edit Latency" msgstr "Latenz bearbeiten" -#: plugin_ui.cc:558 +#: plugin_ui.cc:556 msgid "Plugin preset %1 not found" msgstr "Plugin Preset %1 nicht gefunden" -#: plugin_ui.cc:595 +#: plugin_ui.cc:593 msgid "" "Plugin presets are not supported in this build of %1. Consider paying for a " "full version" @@ -8366,7 +8252,7 @@ msgstr "" "Pluginpresets werden in diesem Version von %1 nicht unterstützt. Erwägen " "Sie, für eine Vollversion zu zahlen" -#: plugin_ui.cc:615 plugin_ui.cc:630 +#: plugin_ui.cc:613 plugin_ui.cc:628 msgid "" "Plugin presets are not supported in this build of %1. Consider paying for a " "newer version" @@ -8374,35 +8260,35 @@ msgstr "" "Pluginpresets werden in diesem Version von %1 nicht unterstützt. Erwägen " "Sie, für eine neuere Version zu zahlen" -#: plugin_ui.cc:669 +#: plugin_ui.cc:667 msgid "Click to allow normal use of %1 keyboard shortcuts" msgstr "Klicke, um die normale Verwendung von %1 Tastenkürzeln zu aktivieren" -#: port_group.cc:335 +#: port_group.cc:337 msgid "%1 Busses" msgstr "%1 Busse" -#: port_group.cc:336 +#: port_group.cc:338 msgid "%1 Tracks" msgstr "%1 Spuren" -#: port_group.cc:337 +#: port_group.cc:339 msgid "Hardware" msgstr "Hardware" -#: port_group.cc:338 +#: port_group.cc:340 msgid "%1 Misc" msgstr "%1 Sonstige" -#: port_group.cc:339 +#: port_group.cc:341 msgid "Other" msgstr "Andere" -#: port_group.cc:430 port_group.cc:431 +#: port_group.cc:432 port_group.cc:433 msgid "LTC Out" msgstr "LTC Ausgang" -#: port_group.cc:434 port_group.cc:435 +#: port_group.cc:436 port_group.cc:437 msgid "LTC In" msgstr "LTC Eingang" @@ -8438,15 +8324,15 @@ msgstr "MIDI clock out" msgid "MMC out" msgstr "MMC out" -#: port_group.cc:540 +#: port_group.cc:532 msgid ":monitor" msgstr ":monitor" -#: port_group.cc:552 +#: port_group.cc:544 msgid "system:" msgstr "system:" -#: port_group.cc:553 +#: port_group.cc:545 msgid "alsa_pcm" msgstr "alsa_pcm" @@ -8462,18 +8348,10 @@ msgstr "Send/Ausgang" msgid "Return/Input" msgstr "Return/Input" -#: port_insert_ui.cc:71 port_insert_ui.cc:99 -msgid "Disconnected from audio engine" -msgstr "Von Audio-Engine getrennt" - #: port_insert_ui.cc:86 msgid "No signal detected" msgstr "Kein Signal erkannt" -#: port_insert_ui.cc:135 -msgid "Detecting ..." -msgstr "Messe..." - #: port_insert_ui.cc:166 msgid "Port Insert " msgstr "Port Insert " @@ -8596,7 +8474,7 @@ msgstr "Alle Regler verbergen" msgid "on" msgstr "an" -#: processor_box.cc:465 rc_option_editor.cc:1911 rc_option_editor.cc:1925 +#: processor_box.cc:465 rc_option_editor.cc:1907 rc_option_editor.cc:1921 msgid "off" msgstr "Aus" @@ -8830,101 +8708,101 @@ msgstr "Notenanfang einrasten an" msgid "Snap note end" msgstr "Notenende einrasten an" -#: rc_option_editor.cc:69 +#: rc_option_editor.cc:67 msgid "Click audio file:" msgstr "Audiodatei für Klick" -#: rc_option_editor.cc:72 rc_option_editor.cc:79 +#: rc_option_editor.cc:70 rc_option_editor.cc:77 msgid "Browse..." msgstr "Durchsuchen..." -#: rc_option_editor.cc:76 +#: rc_option_editor.cc:74 msgid "Click emphasis audio file:" msgstr "Audiodatei für Klick-Betonung" -#: rc_option_editor.cc:108 +#: rc_option_editor.cc:106 msgid "Choose Click" msgstr "Click auswählen" -#: rc_option_editor.cc:128 +#: rc_option_editor.cc:126 msgid "Choose Click Emphasis" msgstr "Click-Betonung auswählen" -#: rc_option_editor.cc:160 +#: rc_option_editor.cc:158 msgid "Limit undo history to" msgstr "Limitiere Aktionsliste auf" -#: rc_option_editor.cc:161 +#: rc_option_editor.cc:159 msgid "Save undo history of" msgstr "Speichere Aktionsliste von" -#: rc_option_editor.cc:170 rc_option_editor.cc:177 +#: rc_option_editor.cc:168 rc_option_editor.cc:175 msgid "commands" msgstr "Aktionen" -#: rc_option_editor.cc:315 +#: rc_option_editor.cc:313 msgid "Edit using:" msgstr "Bearbeiten mit:" -#: rc_option_editor.cc:321 rc_option_editor.cc:347 rc_option_editor.cc:374 +#: rc_option_editor.cc:319 rc_option_editor.cc:345 rc_option_editor.cc:372 msgid "+ button" msgstr "+ Maustaste" -#: rc_option_editor.cc:341 +#: rc_option_editor.cc:339 msgid "Delete using:" msgstr "Entfernen mit:" -#: rc_option_editor.cc:368 +#: rc_option_editor.cc:366 msgid "Insert note using:" msgstr "Note einfügen:" -#: rc_option_editor.cc:395 +#: rc_option_editor.cc:393 msgid "Ignore snap using:" msgstr "Einrasten ignorieren mittels:" -#: rc_option_editor.cc:411 +#: rc_option_editor.cc:409 msgid "Keyboard layout:" msgstr "Tastaturlayout:" -#: rc_option_editor.cc:534 +#: rc_option_editor.cc:532 msgid "Font scaling:" msgstr "Schriftskalierung" -#: rc_option_editor.cc:586 +#: rc_option_editor.cc:584 msgid "Playback (seconds of buffering):" msgstr "Wiedergabe (gepufferte Sekunden):" -#: rc_option_editor.cc:599 +#: rc_option_editor.cc:597 msgid "Recording (seconds of buffering):" msgstr "Aufnahme (gepufferte Sekunden):" -#: rc_option_editor.cc:656 +#: rc_option_editor.cc:654 msgid "Control Surface Protocol" msgstr "Eingabegeräteprotokoll" -#: rc_option_editor.cc:660 +#: rc_option_editor.cc:658 msgid "Feedback" msgstr "Feedback" -#: rc_option_editor.cc:665 +#: rc_option_editor.cc:663 msgid "Double-click on a name to edit settings for an enabled protocol" msgstr "" "Doppelklick auf einen Namen editiert Einstellungen für ein aktiviertes " "Protokoll" -#: rc_option_editor.cc:817 +#: rc_option_editor.cc:815 msgid "Show Video Export Info before export" msgstr "Zeige Video-Exportinformationen vor dem Exportieren" -#: rc_option_editor.cc:818 +#: rc_option_editor.cc:816 msgid "Show Video Server Startup Dialog" msgstr "Zeige den Videoserver-Startdialog" -#: rc_option_editor.cc:819 +#: rc_option_editor.cc:817 msgid "Advanced Setup (remote video server)" msgstr "Ausführliche Einrichtung (entfernter Videoserver)" -#: rc_option_editor.cc:827 +#: rc_option_editor.cc:825 msgid "" "When enabled you can speficify a custom video-server URL and docroot. " "- Do not enable this option unless you know what you are doing." @@ -8933,11 +8811,11 @@ msgstr "" "für den Videoserver eingeben. - Aktivieren Sie diese Option nur, wenn Sie " "wissen, was Sie tun." -#: rc_option_editor.cc:829 +#: rc_option_editor.cc:827 msgid "Video Server URL:" msgstr "Videoserver URL:" -#: rc_option_editor.cc:834 +#: rc_option_editor.cc:832 msgid "" "Base URL of the video-server including http prefix. This is usually 'http://" "hostname.example.org:1554/' and defaults to 'http://localhost:1554/' when " @@ -8947,11 +8825,11 @@ msgstr "" "hostname.example.org:1554/' und ist auf 'http://localhost:1554/' " "voreingestellt, wenn der Videoserver lokal läuft" -#: rc_option_editor.cc:836 +#: rc_option_editor.cc:834 msgid "Video Folder:" msgstr "Videoordner:" -#: rc_option_editor.cc:841 +#: rc_option_editor.cc:839 msgid "" "Local path to the video-server document-root. Only files below this " "directory will be accessible by the video-server. If the server run on a " @@ -8966,7 +8844,7 @@ msgstr "" "werden, falls es nicht zugänglich ist. Wird für den lokalen Videomonitor und " "die Dateisuche beim Öffnen/Hinzufügen einer Videodatei benutzt." -#: rc_option_editor.cc:848 +#: rc_option_editor.cc:846 msgid "" "When enabled an information window with details is displayed before " "the video-export dialog." @@ -8974,94 +8852,94 @@ msgstr "" "Wenn aktiviert , wird vor dem Videoexport-Dialog ein " "Informationsfenster mit Details angezeigt." -#: rc_option_editor.cc:853 +#: rc_option_editor.cc:851 msgid "" "When enabled the video server is never launched automatically without " "confirmation" msgstr "" "Wenn aktiviert, wird der Videoserver nie ohne Bestätigung gestartet" -#: rc_option_editor.cc:993 +#: rc_option_editor.cc:991 msgid "%1 Preferences" msgstr "%1 Einstellungen" -#: rc_option_editor.cc:1004 +#: rc_option_editor.cc:1002 msgid "DSP CPU Utilization" msgstr "DSP CPU Nutzung" -#: rc_option_editor.cc:1008 +#: rc_option_editor.cc:1006 msgid "Signal processing uses" msgstr "Die Signalverarbeitung verwendet" -#: rc_option_editor.cc:1013 +#: rc_option_editor.cc:1011 msgid "all but one processor" msgstr "Alle außer einem Prozessor" -#: rc_option_editor.cc:1014 +#: rc_option_editor.cc:1012 msgid "all available processors" msgstr "Alle verfügbaren Prozessoren" -#: rc_option_editor.cc:1017 +#: rc_option_editor.cc:1015 msgid "%1 processors" msgstr "%1 Prozessoren" -#: rc_option_editor.cc:1020 +#: rc_option_editor.cc:1018 msgid "This setting will only take effect when %1 is restarted." msgstr "Diese Einstellung wird erst nach einem Neustart von %1 wirksam." -#: rc_option_editor.cc:1025 +#: rc_option_editor.cc:1023 msgid "Options|Undo" msgstr "Undo" -#: rc_option_editor.cc:1032 +#: rc_option_editor.cc:1030 msgid "Verify removal of last capture" msgstr "Verwerfen der letzten Aufnahme bestätigen" -#: rc_option_editor.cc:1040 +#: rc_option_editor.cc:1038 msgid "Make periodic backups of the session file" msgstr "Erstelle regelmäßig Backups der Projektdatei" -#: rc_option_editor.cc:1045 +#: rc_option_editor.cc:1043 msgid "Session Management" msgstr "Projektmanagement:" -#: rc_option_editor.cc:1050 +#: rc_option_editor.cc:1048 msgid "Always copy imported files" msgstr "Importierte Dateien immer kopieren" -#: rc_option_editor.cc:1057 +#: rc_option_editor.cc:1055 msgid "Default folder for new sessions:" msgstr "Standardordner für neue Projekte" -#: rc_option_editor.cc:1065 +#: rc_option_editor.cc:1063 msgid "Maximum number of recent sessions" msgstr "Maximale Anzahl kürzlich geöffneter Projekte" -#: rc_option_editor.cc:1078 +#: rc_option_editor.cc:1076 msgid "Click gain level" msgstr "Lautstärke für Klick" -#: rc_option_editor.cc:1083 route_time_axis.cc:215 route_time_axis.cc:676 +#: rc_option_editor.cc:1081 route_time_axis.cc:215 route_time_axis.cc:676 msgid "Automation" msgstr "Automationen" -#: rc_option_editor.cc:1088 +#: rc_option_editor.cc:1086 msgid "Thinning factor (larger value => less data)" msgstr "Ausdünnungsfaktor (größerer Wert => weniger Daten)" -#: rc_option_editor.cc:1097 +#: rc_option_editor.cc:1095 msgid "Automation sampling interval (milliseconds)" msgstr "Meßintervall für Automation (Millisekunden)" -#: rc_option_editor.cc:1109 +#: rc_option_editor.cc:1107 msgid "Keep record-enable engaged on stop" msgstr "Aufnahme bleibt nach Stopp aktiviert" -#: rc_option_editor.cc:1118 +#: rc_option_editor.cc:1116 msgid "Stop recording when an xrun occurs" msgstr "Aufnahme bei xrun stoppen" -#: rc_option_editor.cc:1123 +#: rc_option_editor.cc:1121 msgid "" "When enabled %1 will stop recording if an over- or underrun is " "detected by the audio engine" @@ -9069,15 +8947,15 @@ msgstr "" "Falls an, wird %1 Aufnahmen bei Auftreten von Over- oder Underruns " "abbrechen" -#: rc_option_editor.cc:1129 +#: rc_option_editor.cc:1127 msgid "Create markers where xruns occur" msgstr "Bei xrun Marker erzeugen" -#: rc_option_editor.cc:1138 +#: rc_option_editor.cc:1136 msgid "Stop at the end of the session" msgstr "Am Ende des Projektes anhalten" -#: rc_option_editor.cc:1143 +#: rc_option_editor.cc:1141 msgid "" "When enabled if %1 is not recording, it will stop the " "transport when it reaches the current session end marker\n" @@ -9090,11 +8968,11 @@ msgstr "" "\n" "Falls aus , wird Ardour am Ende des Projektes immer weiterlaufen" -#: rc_option_editor.cc:1151 -msgid "Do seamless looping (not possible when slaved to MTC, JACK etc)" -msgstr "Nahtlose Schleifen (nicht möglich wenn MTC, JACK etc. Master sind)" +#: rc_option_editor.cc:1149 +msgid "Do seamless looping (not possible when slaved to MTC, LTC etc)" +msgstr "Nahtlose Schleifen (nicht möglich, wenn an MTC, LTC o.ä. gekoppelt)" -#: rc_option_editor.cc:1156 +#: rc_option_editor.cc:1154 msgid "" "When enabled this will loop by reading ahead and wrapping around at " "the loop point, preventing any need to do a transport locate at the end of " @@ -9111,11 +8989,11 @@ msgstr "" "Schleife springen, was oft einen hörbaren Klick oder kurze Verzögerung " "verursacht" -#: rc_option_editor.cc:1164 +#: rc_option_editor.cc:1162 msgid "Disable per-track record disarm while rolling" msgstr "Während der Aufnahme Aufnahmestatus einzelner Spuren sperren" -#: rc_option_editor.cc:1168 +#: rc_option_editor.cc:1166 msgid "" "When enabled this will prevent you from accidentally stopping " "specific tracks recording during a take" @@ -9123,11 +9001,11 @@ msgstr "" "Wenn eingeschaltet , hindert Sie dies daran, während eines " "Aufnahmevorgangs unabsichtlich bei einzelnen Spuren die Aufnahme zu beenden" -#: rc_option_editor.cc:1173 +#: rc_option_editor.cc:1171 msgid "12dB gain reduction during fast-forward and fast-rewind" msgstr "Beim Spulen Pegel um 12dB absenken" -#: rc_option_editor.cc:1177 +#: rc_option_editor.cc:1175 msgid "" "This will reduce the unpleasant increase in perceived volume that occurs " "when fast-forwarding or rewinding through some kinds of audio" @@ -9135,19 +9013,19 @@ msgstr "" "Dies wird die unangenehme Steigerung der wahrgenommenen Lautstärke " "verringern, die bei manchem Material bei Vor/Rücklauf auftritt" -#: rc_option_editor.cc:1181 +#: rc_option_editor.cc:1179 msgid "Sync/Slave" msgstr "Sync/Slave" -#: rc_option_editor.cc:1185 +#: rc_option_editor.cc:1183 msgid "External timecode source" msgstr "Externe Timecode-Quelle" -#: rc_option_editor.cc:1195 +#: rc_option_editor.cc:1193 msgid "Match session video frame rate to external timecode" msgstr "Videoframerate des Projekts an externen Timecode anpassen" -#: rc_option_editor.cc:1201 +#: rc_option_editor.cc:1199 msgid "" "This option controls the value of the video frame rate while chasing " "an external timecode source.\n" @@ -9171,11 +9049,11 @@ msgstr "" "wird zwischen den Standards der externen Quelle und des Projektes " "konvertieren." -#: rc_option_editor.cc:1211 +#: rc_option_editor.cc:1209 msgid "External timecode is sync locked" msgstr "Externe Timecode-Quelle ist starr synchronisiert" -#: rc_option_editor.cc:1217 +#: rc_option_editor.cc:1215 msgid "" "When enabled indicates that the selected external timecode source " "shares sync (Black & Burst, Wordclock, etc) with the audio interface." @@ -9183,11 +9061,11 @@ msgstr "" "Falls an, zeigt dies an, daß die ausgewählte externe Timecode-Quelle " "synchron zum Audio-Interface läuft (Black & Burst, Wordclock, etc)." -#: rc_option_editor.cc:1224 +#: rc_option_editor.cc:1222 msgid "Lock to 29.9700 fps instead of 30000/1001" msgstr "Fest auf 29.9700 fps statt 30000/1001" -#: rc_option_editor.cc:1230 +#: rc_option_editor.cc:1228 msgid "" "When enabled the external timecode source is assumed to use 29.97 fps " "instead of 30000/1001.\n" @@ -9210,27 +9088,27 @@ msgstr "" "widersprechend - da bei der Variante mit exakt 29.97 fps kein Timecode-Drift " "auftritt.\n" -#: rc_option_editor.cc:1240 +#: rc_option_editor.cc:1238 msgid "LTC Reader" msgstr "LTC-Leser" -#: rc_option_editor.cc:1244 +#: rc_option_editor.cc:1242 msgid "LTC incoming port" msgstr "LTC Eingangsport" -#: rc_option_editor.cc:1257 +#: rc_option_editor.cc:1255 msgid "LTC Generator" msgstr "LTC-Generator" -#: rc_option_editor.cc:1262 +#: rc_option_editor.cc:1260 msgid "Enable LTC generator" msgstr "LTC-Generator aktivieren" -#: rc_option_editor.cc:1269 +#: rc_option_editor.cc:1267 msgid "send LTC while stopped" msgstr "LTC senden, wenn Transport steht" -#: rc_option_editor.cc:1275 +#: rc_option_editor.cc:1273 msgid "" "When enabled %1 will continue to send LTC information even when the " "transport (playhead) is not moving" @@ -9238,11 +9116,11 @@ msgstr "" "Falls an, wird %1 weiterhin LTC-Information senden, sogar wenn der " "Transport (Positionszeiger) stillsteht" -#: rc_option_editor.cc:1281 +#: rc_option_editor.cc:1279 msgid "LTC generator level" msgstr "LTC-Generator-Lautstärke" -#: rc_option_editor.cc:1285 +#: rc_option_editor.cc:1283 msgid "" "Specify the Peak Volume of the generated LTC signal in dbFS. A good value " "is 0dBu ^= -18dbFS in an EBU calibrated system" @@ -9250,108 +9128,108 @@ msgstr "" "Geben Sie den Spitzenwert des erzeugten LTC-Signals in dbFS an. Ein guter " "Wert für ein EBU-kalibriertes System ist 0dBu ^= -18dbFS" -#: rc_option_editor.cc:1297 +#: rc_option_editor.cc:1295 msgid "Link selection of regions and tracks" msgstr "Auswahl von Spuren und Regionen verbinden" -#: rc_option_editor.cc:1305 +#: rc_option_editor.cc:1303 msgid "Move relevant automation when audio regions are moved" msgstr "Verschiebe relevante Automationen mit Region" -#: rc_option_editor.cc:1313 +#: rc_option_editor.cc:1311 msgid "Show meters on tracks in the editor" msgstr "Aktiviere Pegelanzeigen im Editor" -#: rc_option_editor.cc:1321 +#: rc_option_editor.cc:1319 msgid "Display master-meter in the toolbar" msgstr "Master-Pegelanzeige in der Werkzeugleiste anzeigen" -#: rc_option_editor.cc:1328 +#: rc_option_editor.cc:1326 msgid "Regions in active edit groups are edited together" msgstr "Regionen der aktiven Bearbeitungsgruppen werden gemeinsam bearbeitet" -#: rc_option_editor.cc:1329 +#: rc_option_editor.cc:1327 msgid "whenever they overlap in time" msgstr "immer, wenn sie sich auf der Zeitachse überlappen" -#: rc_option_editor.cc:1330 +#: rc_option_editor.cc:1328 msgid "only if they have identical length, position and origin" msgstr "nur bei identischer Länge, Position und Herkunft" -#: rc_option_editor.cc:1340 +#: rc_option_editor.cc:1338 msgid "Make rubberband selection rectangle snap to the grid" msgstr "Gummiband-Auswahl an Raster ausrichten" -#: rc_option_editor.cc:1348 +#: rc_option_editor.cc:1346 msgid "Show waveforms in regions" msgstr "Zeige Wellenformen in Regionen" -#: rc_option_editor.cc:1356 +#: rc_option_editor.cc:1354 msgid "Show gain envelopes in audio regions" msgstr "Zeige Lautstärkekurven in Regionen an" -#: rc_option_editor.cc:1357 +#: rc_option_editor.cc:1355 msgid "in all modes" msgstr "in allen Modi" -#: rc_option_editor.cc:1358 +#: rc_option_editor.cc:1356 msgid "only in region gain mode" msgstr "nur im Region-Gain Modus" -#: rc_option_editor.cc:1365 +#: rc_option_editor.cc:1363 msgid "Waveform scale" msgstr "Wellenformskalierung" -#: rc_option_editor.cc:1370 +#: rc_option_editor.cc:1368 msgid "linear" msgstr "Linear" -#: rc_option_editor.cc:1371 +#: rc_option_editor.cc:1369 msgid "logarithmic" msgstr "Logarithmisch" -#: rc_option_editor.cc:1377 +#: rc_option_editor.cc:1375 msgid "Waveform shape" msgstr "Wellenform Anzeigeart" -#: rc_option_editor.cc:1382 +#: rc_option_editor.cc:1380 msgid "traditional" msgstr "Traditionell" -#: rc_option_editor.cc:1383 +#: rc_option_editor.cc:1381 msgid "rectified" msgstr "Rectified" -#: rc_option_editor.cc:1390 +#: rc_option_editor.cc:1388 msgid "Show waveforms for audio while it is being recorded" msgstr "Zeige bei Aufnahmen die Wellenformen des aufgenommenen Audiomaterials" -#: rc_option_editor.cc:1398 +#: rc_option_editor.cc:1396 msgid "Show zoom toolbar" msgstr "Zeige Zoom Toolbar" -#: rc_option_editor.cc:1406 +#: rc_option_editor.cc:1404 msgid "Color regions using their track's color" msgstr "Färbe Regionen in der Spurfarbe ein" -#: rc_option_editor.cc:1414 +#: rc_option_editor.cc:1412 msgid "Update editor window during drags of the summary" msgstr "" "Aktualisiere das Editorfenster, während die Projektübersicht verändert wird" -#: rc_option_editor.cc:1422 +#: rc_option_editor.cc:1420 msgid "Synchronise editor and mixer track order" msgstr "Einheitliche Reihenfolge der Spuren im Editor und Mixer" -#: rc_option_editor.cc:1430 +#: rc_option_editor.cc:1428 msgid "Synchronise editor and mixer selection" msgstr "Synchronisiere Auswahl der Spuren im Editor und Mixer" -#: rc_option_editor.cc:1437 +#: rc_option_editor.cc:1435 msgid "Name new markers" msgstr "Neue Marker benennen" -#: rc_option_editor.cc:1443 +#: rc_option_editor.cc:1441 msgid "" "If enabled, popup a dialog when a new marker is created to allow its name to " "be set as it is created.\n" @@ -9363,241 +9241,245 @@ msgstr "" "\n" "Marker können jederzeit per Rechtsklick umbenannt werden" -#: rc_option_editor.cc:1449 +#: rc_option_editor.cc:1447 msgid "Auto-scroll editor window when dragging near its edges" msgstr "Bei Mausziehen nahe den Rändern das Editorfenster automatisch scrollen" -#: rc_option_editor.cc:1456 +#: rc_option_editor.cc:1454 msgid "Buffering" msgstr "Pufferung" -#: rc_option_editor.cc:1464 +#: rc_option_editor.cc:1462 msgid "Record monitoring handled by" msgstr "Aufnahmemonitoring wird verwaltet von" -#: rc_option_editor.cc:1475 +#: rc_option_editor.cc:1468 +msgid "via Audio Driver" +msgstr "via Audiotreiber" + +#: rc_option_editor.cc:1471 msgid "ardour" msgstr "Ardour" -#: rc_option_editor.cc:1476 +#: rc_option_editor.cc:1472 msgid "audio hardware" msgstr "Audiohardware" -#: rc_option_editor.cc:1483 +#: rc_option_editor.cc:1479 msgid "Tape machine mode" msgstr "Bandmaschinen-Modus" -#: rc_option_editor.cc:1488 +#: rc_option_editor.cc:1484 msgid "Connection of tracks and busses" msgstr "Verbindung von Spuren und Bussen" -#: rc_option_editor.cc:1493 +#: rc_option_editor.cc:1489 msgid "Auto-connect master/monitor busses" msgstr "Master/Monitor-Busse automatisch verbinden" -#: rc_option_editor.cc:1500 +#: rc_option_editor.cc:1496 msgid "Connect track inputs" msgstr "Verbinde Spureingänge" -#: rc_option_editor.cc:1505 +#: rc_option_editor.cc:1501 msgid "automatically to physical inputs" msgstr "automatisch mit Audioeingängen" -#: rc_option_editor.cc:1506 rc_option_editor.cc:1519 +#: rc_option_editor.cc:1502 rc_option_editor.cc:1515 msgid "manually" msgstr "manuell" -#: rc_option_editor.cc:1512 +#: rc_option_editor.cc:1508 msgid "Connect track and bus outputs" msgstr "Verbinde Spur- und Busausgänge" -#: rc_option_editor.cc:1517 +#: rc_option_editor.cc:1513 msgid "automatically to physical outputs" msgstr "automatisch mit Audioausgängen" -#: rc_option_editor.cc:1518 +#: rc_option_editor.cc:1514 msgid "automatically to master bus" msgstr "automatisch mit dem Master-Bus" -#: rc_option_editor.cc:1523 +#: rc_option_editor.cc:1519 msgid "Denormals" msgstr "Denormals" -#: rc_option_editor.cc:1528 +#: rc_option_editor.cc:1524 msgid "Use DC bias to protect against denormals" msgstr "Nutze DC bias als Schutz vor Denormals" -#: rc_option_editor.cc:1535 +#: rc_option_editor.cc:1531 msgid "Processor handling" msgstr "Umgang des Prozessors mit Denormals" -#: rc_option_editor.cc:1540 +#: rc_option_editor.cc:1536 msgid "no processor handling" msgstr "nicht behandeln" -#: rc_option_editor.cc:1545 +#: rc_option_editor.cc:1541 msgid "use FlushToZero" msgstr "Benutze FlushToZero" -#: rc_option_editor.cc:1549 +#: rc_option_editor.cc:1545 msgid "use DenormalsAreZero" msgstr "Benutze DenormalsAreZero" -#: rc_option_editor.cc:1553 +#: rc_option_editor.cc:1549 msgid "use FlushToZero and DenormalsAreZero" msgstr "Benutze FlushToZero & DenormalsAreZero" -#: rc_option_editor.cc:1563 +#: rc_option_editor.cc:1559 msgid "Silence plugins when the transport is stopped" msgstr "Deaktiviere Plugins, wenn der Transport gestoppt ist." -#: rc_option_editor.cc:1571 +#: rc_option_editor.cc:1567 msgid "Make new plugins active" msgstr "Neue Plugins sind aktiv" -#: rc_option_editor.cc:1579 +#: rc_option_editor.cc:1575 msgid "Enable automatic analysis of audio" msgstr "Audiodaten automatisch analysieren" -#: rc_option_editor.cc:1587 +#: rc_option_editor.cc:1583 msgid "Replicate missing region channels" msgstr "Fehlende Kanäle von Regionen ersetzen" -#: rc_option_editor.cc:1594 rc_option_editor.cc:1609 rc_option_editor.cc:1621 -#: rc_option_editor.cc:1633 rc_option_editor.cc:1645 rc_option_editor.cc:1649 -#: rc_option_editor.cc:1657 rc_option_editor.cc:1665 rc_option_editor.cc:1673 -#: rc_option_editor.cc:1675 rc_option_editor.cc:1683 rc_option_editor.cc:1691 -#: rc_option_editor.cc:1699 +#: rc_option_editor.cc:1590 rc_option_editor.cc:1605 rc_option_editor.cc:1617 +#: rc_option_editor.cc:1629 rc_option_editor.cc:1641 rc_option_editor.cc:1645 +#: rc_option_editor.cc:1653 rc_option_editor.cc:1661 rc_option_editor.cc:1669 +#: rc_option_editor.cc:1671 rc_option_editor.cc:1679 rc_option_editor.cc:1687 +#: rc_option_editor.cc:1695 msgid "Solo / mute" msgstr "Solo / Mute" -#: rc_option_editor.cc:1597 +#: rc_option_editor.cc:1593 msgid "Solo-in-place mute cut (dB)" msgstr "Solo-in-Place Mute Dämpfung (dB)" -#: rc_option_editor.cc:1604 +#: rc_option_editor.cc:1600 msgid "Solo controls are Listen controls" msgstr "Solo-Schalter arbeiten als AFL/PFL" -#: rc_option_editor.cc:1613 +#: rc_option_editor.cc:1609 msgid "Listen Position" msgstr "Abhörpunkt" -#: rc_option_editor.cc:1618 +#: rc_option_editor.cc:1614 msgid "after-fader (AFL)" msgstr "After-Fader (AFL)" -#: rc_option_editor.cc:1619 +#: rc_option_editor.cc:1615 msgid "pre-fader (PFL)" msgstr "Pre-Fader (PFL)" -#: rc_option_editor.cc:1625 +#: rc_option_editor.cc:1621 msgid "PFL signals come from" msgstr "Abgreifpunkt der PFL Signale" -#: rc_option_editor.cc:1630 +#: rc_option_editor.cc:1626 msgid "before pre-fader processors" msgstr "Vor den Pre-Fader Prozessoren" -#: rc_option_editor.cc:1631 +#: rc_option_editor.cc:1627 msgid "pre-fader but after pre-fader processors" msgstr "Pre-Fader, aber nach den Prozessoren" -#: rc_option_editor.cc:1637 +#: rc_option_editor.cc:1633 msgid "AFL signals come from" msgstr "Abgreifpunkt der AFL Signale" -#: rc_option_editor.cc:1642 +#: rc_option_editor.cc:1638 msgid "immediately post-fader" msgstr "Direkt nach dem Fader" -#: rc_option_editor.cc:1643 +#: rc_option_editor.cc:1639 msgid "after post-fader processors (before pan)" msgstr "Nach den Post-Fader Prozessoren (vor Pan)" -#: rc_option_editor.cc:1652 +#: rc_option_editor.cc:1648 msgid "Exclusive solo" msgstr "Exclusives Solo" -#: rc_option_editor.cc:1660 +#: rc_option_editor.cc:1656 msgid "Show solo muting" msgstr "Solo auf anderen Kanälen als Mute anzeigen" -#: rc_option_editor.cc:1668 +#: rc_option_editor.cc:1664 msgid "Soloing overrides muting" msgstr "Solo ist trotz Mute hörbar" -#: rc_option_editor.cc:1673 +#: rc_option_editor.cc:1669 msgid "Default track / bus muting options" msgstr "Standardeinstellungen für Mute von Spuren / Bussen" -#: rc_option_editor.cc:1678 +#: rc_option_editor.cc:1674 msgid "Mute affects pre-fader sends" msgstr "Mute schaltet Pre-Fader Sends stumm" -#: rc_option_editor.cc:1686 +#: rc_option_editor.cc:1682 msgid "Mute affects post-fader sends" msgstr "Mute schaltet Post-Fader Sends stumm" -#: rc_option_editor.cc:1694 +#: rc_option_editor.cc:1690 msgid "Mute affects control outputs" msgstr "Mute schaltet Abhörausgänge stumm" -#: rc_option_editor.cc:1702 +#: rc_option_editor.cc:1698 msgid "Mute affects main outputs" msgstr "Mute schaltet Hauptausgänge stumm" -#: rc_option_editor.cc:1718 +#: rc_option_editor.cc:1714 msgid "Send MIDI Time Code" msgstr "Sende MIDI Time Code" -#: rc_option_editor.cc:1726 +#: rc_option_editor.cc:1722 msgid "Percentage either side of normal transport speed to transmit MTC" msgstr "" "Prozentzahl beiderseits der normalen Transportgeschwindigkeit, bis zu der " "MTC übertragen wird" -#: rc_option_editor.cc:1735 +#: rc_option_editor.cc:1731 msgid "Obey MIDI Machine Control commands" msgstr "MIDI Machine Control Commands empfangen" -#: rc_option_editor.cc:1743 +#: rc_option_editor.cc:1739 msgid "Send MIDI Machine Control commands" msgstr "MIDI Machine Control Commands senden" -#: rc_option_editor.cc:1751 +#: rc_option_editor.cc:1747 msgid "Send MIDI control feedback" msgstr "MIDI Control Feedback senden" -#: rc_option_editor.cc:1759 +#: rc_option_editor.cc:1755 msgid "Inbound MMC device ID" msgstr "ID des eingehenden MMC-Geräts" -#: rc_option_editor.cc:1768 +#: rc_option_editor.cc:1764 msgid "Outbound MMC device ID" msgstr "ID des ausgehenden MMC-Geräts" -#: rc_option_editor.cc:1777 +#: rc_option_editor.cc:1773 msgid "Initial program change" msgstr "Erstmaliger Programmwechsel" -#: rc_option_editor.cc:1786 +#: rc_option_editor.cc:1782 msgid "Display first MIDI bank/program as 0" msgstr "Erste(s) MIDI Bank/Programm als 0 anzeigen" -#: rc_option_editor.cc:1794 +#: rc_option_editor.cc:1790 msgid "Never display periodic MIDI messages (MTC, MIDI Clock)" msgstr "Periodische MIDI Nachrichten nie anzeigen (MTC, MIDI Clock)" -#: rc_option_editor.cc:1802 +#: rc_option_editor.cc:1798 msgid "Sound MIDI notes as they are selected" msgstr "MIDI Noten ertönen bei Auswahl" -#: rc_option_editor.cc:1810 rc_option_editor.cc:1820 rc_option_editor.cc:1822 +#: rc_option_editor.cc:1806 rc_option_editor.cc:1816 rc_option_editor.cc:1818 msgid "User interaction" msgstr "Benutzerinteraktion" -#: rc_option_editor.cc:1813 +#: rc_option_editor.cc:1809 msgid "" "Use translations of %1 messages\n" " (requires a restart of %1 to take effect)\n" @@ -9607,131 +9489,131 @@ msgstr "" " (erfordert Neustart von %1)\n" " (falls für Ihre gewünschte Sprache verfügbar)" -#: rc_option_editor.cc:1820 +#: rc_option_editor.cc:1816 msgid "Keyboard" msgstr "Tastatur" -#: rc_option_editor.cc:1830 +#: rc_option_editor.cc:1826 msgid "Control surface remote ID" msgstr "Remote ID des Eingabegeräts" -#: rc_option_editor.cc:1835 +#: rc_option_editor.cc:1831 msgid "assigned by user" msgstr "vom Benutzer festgelegt" -#: rc_option_editor.cc:1836 +#: rc_option_editor.cc:1832 msgid "follows order of mixer" msgstr "folgt Reihenfolge im Mixer" -#: rc_option_editor.cc:1837 +#: rc_option_editor.cc:1833 msgid "follows order of editor" msgstr "folgt Reihenfolge im Editor" -#: rc_option_editor.cc:1846 rc_option_editor.cc:1854 rc_option_editor.cc:1864 -#: rc_option_editor.cc:1885 rc_option_editor.cc:1894 rc_option_editor.cc:1902 -#: rc_option_editor.cc:1916 rc_option_editor.cc:1935 rc_option_editor.cc:1951 -#: rc_option_editor.cc:1967 rc_option_editor.cc:1981 rc_option_editor.cc:1995 -#: rc_option_editor.cc:1997 +#: rc_option_editor.cc:1842 rc_option_editor.cc:1850 rc_option_editor.cc:1860 +#: rc_option_editor.cc:1881 rc_option_editor.cc:1890 rc_option_editor.cc:1898 +#: rc_option_editor.cc:1912 rc_option_editor.cc:1931 rc_option_editor.cc:1947 +#: rc_option_editor.cc:1963 rc_option_editor.cc:1977 rc_option_editor.cc:1991 +#: rc_option_editor.cc:1993 msgid "Preferences|GUI" msgstr "GUI" -#: rc_option_editor.cc:1849 +#: rc_option_editor.cc:1845 msgid "Graphically indicate mouse pointer hovering over various widgets" msgstr "Mouseover-Effekt über verschiedenen Anzeigen" -#: rc_option_editor.cc:1857 +#: rc_option_editor.cc:1853 msgid "Show tooltips if mouse hovers over a control" msgstr "Zeige Tooltips, wenn die Maus über einem Element schwebt" -#: rc_option_editor.cc:1867 +#: rc_option_editor.cc:1863 msgid "GUI" msgstr "GUI" -#: rc_option_editor.cc:1870 +#: rc_option_editor.cc:1866 msgid "update transport clock display every 40ms instead of every 100ms" msgstr "Auffrischen der Transport-Zeitanzeige alle 40ms statt 100ms" -#: rc_option_editor.cc:1887 +#: rc_option_editor.cc:1883 msgid "Mixer Strip" msgstr "Anzeige im Channel strip" -#: rc_option_editor.cc:1897 +#: rc_option_editor.cc:1893 msgid "Use narrow strips in the mixer by default" msgstr "Standardmäßig schmale Mixer-Kanalzüge verwenden" -#: rc_option_editor.cc:1906 +#: rc_option_editor.cc:1902 msgid "Peak hold time" msgstr "Haltezeit für Spitzenwert" -#: rc_option_editor.cc:1912 +#: rc_option_editor.cc:1908 msgid "short" msgstr "Kurz" -#: rc_option_editor.cc:1913 +#: rc_option_editor.cc:1909 msgid "medium" msgstr "Mittel" -#: rc_option_editor.cc:1914 +#: rc_option_editor.cc:1910 msgid "long" msgstr "Lange" -#: rc_option_editor.cc:1920 +#: rc_option_editor.cc:1916 msgid "DPM fall-off" msgstr "Abfall der digitalen Pegelanzeige" -#: rc_option_editor.cc:1926 +#: rc_option_editor.cc:1922 msgid "slowest [6.6dB/sec]" msgstr "am langsamsten [6.6dB/sec]" -#: rc_option_editor.cc:1927 +#: rc_option_editor.cc:1923 msgid "slow [8.6dB/sec] (BBC PPM, EBU PPM)" msgstr "langsam [8.6dB/sec] (BBC PPM, EBU PPM)" -#: rc_option_editor.cc:1928 +#: rc_option_editor.cc:1924 msgid "slowish [12.0dB/sec] (DIN)" msgstr "etwas langsam [12.0dB/sec] (DIN)" -#: rc_option_editor.cc:1929 +#: rc_option_editor.cc:1925 msgid "moderate [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)" msgstr "mäßig [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)" -#: rc_option_editor.cc:1930 +#: rc_option_editor.cc:1926 msgid "medium [20dB/sec]" msgstr "mittel [20dB/sec]" -#: rc_option_editor.cc:1931 +#: rc_option_editor.cc:1927 msgid "fast [32dB/sec]" msgstr "schnell [32dB/sec]" -#: rc_option_editor.cc:1932 +#: rc_option_editor.cc:1928 msgid "faster [46dB/sec]" msgstr "schneller [46dB/sec]" -#: rc_option_editor.cc:1933 +#: rc_option_editor.cc:1929 msgid "fastest [70dB/sec]" msgstr "am schnellsten [70dB/sec]" -#: rc_option_editor.cc:1939 +#: rc_option_editor.cc:1935 msgid "Meter line-up level; 0dBu" msgstr "Ausrichtung der Pegelanzeige; 0dBu" -#: rc_option_editor.cc:1944 rc_option_editor.cc:1960 +#: rc_option_editor.cc:1940 rc_option_editor.cc:1956 msgid "-24dBFS (SMPTE US: 4dBu = -20dBFS)" msgstr "-24dBFS (SMPTE US: 4dBu = -20dBFS)" -#: rc_option_editor.cc:1945 rc_option_editor.cc:1961 +#: rc_option_editor.cc:1941 rc_option_editor.cc:1957 msgid "-20dBFS (SMPTE RP.0155)" msgstr "-20dBFS (SMPTE RP.0155)" -#: rc_option_editor.cc:1946 rc_option_editor.cc:1962 +#: rc_option_editor.cc:1942 rc_option_editor.cc:1958 msgid "-18dBFS (EBU, BBC)" msgstr "-18dBFS (EBU, BBC)" -#: rc_option_editor.cc:1947 rc_option_editor.cc:1963 +#: rc_option_editor.cc:1943 rc_option_editor.cc:1959 msgid "-15dBFS (DIN)" msgstr "-15dBFS (DIN)" -#: rc_option_editor.cc:1949 +#: rc_option_editor.cc:1945 msgid "" "Configure meter-marks and color-knee point for dBFS scale DPM, set reference " "level for IEC1/Nordic, IEC2 PPM and VU meter." @@ -9739,39 +9621,39 @@ msgstr "" "Konfiguriere Skalierung und Farbschwellwert für DPM mit dBFS-Skala, " "setzeReferenzpegel für IEC1/Nordisch, IEC2 PPM und VU Pegelanzeigen." -#: rc_option_editor.cc:1955 +#: rc_option_editor.cc:1951 msgid "IEC1/DIN Meter line-up level; 0dBu" msgstr "Ausrichtung der IEC1/DIN Pegelanzeige; 0dBu" -#: rc_option_editor.cc:1965 +#: rc_option_editor.cc:1961 msgid "Reference level for IEC1/DIN meter." msgstr "Referenzpegel für IEC1/DIN Pegelanzeige." -#: rc_option_editor.cc:1971 +#: rc_option_editor.cc:1967 msgid "VU Meter standard" msgstr "Standard für VU-Pegelanzeige" -#: rc_option_editor.cc:1976 +#: rc_option_editor.cc:1972 msgid "0VU = -2dBu (France)" msgstr "0VU = -2dBu (Frankreich)" -#: rc_option_editor.cc:1977 +#: rc_option_editor.cc:1973 msgid "0VU = 0dBu (North America, Australia)" msgstr "0VU = 0dBu (Nordamerika, Australien)" -#: rc_option_editor.cc:1978 +#: rc_option_editor.cc:1974 msgid "0VU = +4dBu (standard)" msgstr "0VU = +4dBu (Standard)" -#: rc_option_editor.cc:1979 +#: rc_option_editor.cc:1975 msgid "0VU = +8dBu" msgstr "0VU = +8dBu" -#: rc_option_editor.cc:1985 +#: rc_option_editor.cc:1981 msgid "Peak threshold [dBFS]" msgstr "Schwelle für Spitzenwert [dBFS]" -#: rc_option_editor.cc:1993 +#: rc_option_editor.cc:1989 msgid "" "Specify the audio signal level in dbFS at and above which the meter-peak " "indicator will flash red." @@ -9779,7 +9661,7 @@ msgstr "" "Geben Sie den Signalpegel in dbFS an, bei dessen Erreichen oder " "Überschreitung die Spitzenwertanzeige in der Pegelanzeige rot blinkt" -#: rc_option_editor.cc:2000 +#: rc_option_editor.cc:1996 msgid "LED meter style" msgstr "Pegelanzeigen im LED-Stil" @@ -10496,6 +10378,118 @@ msgstr "Projektordner" msgid "Send " msgstr "Send " +#: session_dialog.cc:66 +msgid "Session Setup" +msgstr "Projekteinrichtung" + +#: session_dialog.cc:71 +msgid "Advanced options ..." +msgstr "Erweiterte Einstellungen..." + +#: session_dialog.cc:247 +msgid "New Session" +msgstr "Neues Projekt" + +#: session_dialog.cc:284 +msgid "Check the website for more..." +msgstr "Informieren Sie sich auf der Webseite weiter..." + +#: session_dialog.cc:287 +msgid "Click to open the program website in your web browser" +msgstr "Klicken Sie, um die Webseite in Ihrem Web-Browse zu öffnen" + +#: session_dialog.cc:307 +msgid "Sample Rate" +msgstr "Samplerate" + +#: session_dialog.cc:308 +msgid "Disk Format" +msgstr "Dateiformat" + +#: session_dialog.cc:326 +msgid "Select session file" +msgstr "Projektdatei auswählen" + +#: session_dialog.cc:341 +msgid "Other Sessions" +msgstr "Andere Projekte" + +#: session_dialog.cc:367 +msgid "Open" +msgstr "Öffnen" + +#: session_dialog.cc:434 +msgid "Session name:" +msgstr "Projektname:" + +#: session_dialog.cc:456 +msgid "Create session folder in:" +msgstr "Ort des Projektverzeichnisses:" + +#: session_dialog.cc:479 +msgid "Select folder for session" +msgstr "Ordner für Projekt wählen" + +#: session_dialog.cc:508 +msgid "Use this template" +msgstr "Diese Vorlage verwenden" + +#: session_dialog.cc:511 +msgid "no template" +msgstr "keine Vorlage" + +#: session_dialog.cc:643 session_dialog.cc:675 +msgid "32 bit float" +msgstr "32 Bit float" + +#: session_dialog.cc:646 session_dialog.cc:678 +msgid "24 bit" +msgstr "24 Bit" + +#: session_dialog.cc:649 session_dialog.cc:681 +msgid "16 bit" +msgstr "16 Bit" + +#: session_dialog.cc:720 session_dialog.cc:721 session_dialog.cc:722 +msgid "channels" +msgstr "Kanäle" + +#: session_dialog.cc:736 +msgid "Busses" +msgstr "Busse" + +#: session_dialog.cc:737 +msgid "Inputs" +msgstr "Eingänge" + +#: session_dialog.cc:738 +msgid "Outputs" +msgstr "Ausgänge" + +#: session_dialog.cc:746 +msgid "Create master bus" +msgstr "Master-Bus erstellen" + +#: session_dialog.cc:756 +msgid "Automatically connect to physical inputs" +msgstr "Automatisch mit Audioeingängen verbinden" + +#: session_dialog.cc:763 session_dialog.cc:822 +msgid "Use only" +msgstr "Benutze nur" + +#: session_dialog.cc:816 +msgid "Automatically connect outputs" +msgstr "Ausgänge automatisch verbinden" + +#: session_dialog.cc:838 +msgid "... to master bus" +msgstr "... mit dem Master-Bus" + +#: session_dialog.cc:848 +msgid "... to physical outputs" +msgstr "... mit den Audioausgängen" + #: session_import_dialog.cc:64 msgid "Import from Session" msgstr "Aus Projekt importieren" @@ -11387,14 +11381,6 @@ msgid "Azimuth:" msgstr "Azimut:" #: startup.cc:72 -msgid "Create a new session" -msgstr "Neues Projekt erzeugen" - -#: startup.cc:73 -msgid "Open an existing session" -msgstr "Vorhandenes Projekt öffnen" - -#: startup.cc:74 msgid "" "Use an external mixer or the hardware mixer of your audio interface.\n" "%1 will play NO role in monitoring" @@ -11402,15 +11388,11 @@ msgstr "" "Verwende einen externen Mixer oder den Hardwaremixer der Audiohardware.\n" "%1 wird das Monitoring NICHT übernehmen." -#: startup.cc:76 +#: startup.cc:74 msgid "Ask %1 to play back material as it is being recorded" msgstr "%1 soll laufende Aufnahmen wiedergeben" -#: startup.cc:79 -msgid "I'd like more options for this session" -msgstr "Erweiterte Optionen für dieses Projekt" - -#: startup.cc:194 +#: startup.cc:143 msgid "" "Welcome to this BETA release of Ardour %1\n" "\n" @@ -11462,15 +11444,11 @@ msgstr "" "\n" " http://ardour.org/support\n" -#: startup.cc:218 +#: startup.cc:167 msgid "This is a BETA RELEASE" msgstr "Dies ist ein BETA RELEASE" -#: startup.cc:324 -msgid "Audio / MIDI Setup" -msgstr "Audio / MIDI Einstellungen" - -#: startup.cc:336 +#: startup.cc:176 msgid "" "%1 is a digital audio workstation. You can use it to " "record, edit and mix multi-track audio. You can produce your own CDs, mix " @@ -11487,15 +11465,15 @@ msgstr "" "Es gibt ein paar Dinge, die vor dem ersten Programmstart konfiguriert werden " "müssen." -#: startup.cc:362 +#: startup.cc:202 msgid "Welcome to %1" msgstr "Willkommen zu %1" -#: startup.cc:385 +#: startup.cc:225 msgid "Default folder for %1 sessions" msgstr "Standardordner für %1 Projekte" -#: startup.cc:391 +#: startup.cc:231 msgid "" "Each project that you work on with %1 has its own folder.\n" "These can require a lot of disk space if you are recording audio.\n" @@ -11512,11 +11490,11 @@ msgstr "" "(Neue Projekte können überall abgespeichert werden, dies ist nur die " "Vorgabe)" -#: startup.cc:415 +#: startup.cc:253 msgid "Default folder for new sessions" msgstr "Standardordner für neue Projekte" -#: startup.cc:436 +#: startup.cc:274 msgid "" "While recording instruments or vocals, you probably want to listen to the\n" "signal as well as record it. This is called \"monitoring\". There are\n" @@ -11541,15 +11519,15 @@ msgstr "" "\n" "If you do not understand what this is about, just accept the default." -#: startup.cc:457 +#: startup.cc:295 msgid "Monitoring Choices" msgstr "Auswahl des Monitoring" -#: startup.cc:480 +#: startup.cc:318 msgid "Use a Master bus directly" msgstr "Nutze den Master-Bus direkt" -#: startup.cc:482 +#: startup.cc:320 msgid "" "Connect the Master bus directly to your hardware outputs. This is preferable " "for simple usage." @@ -11557,11 +11535,11 @@ msgstr "" "Verbinde den Master-Bus direkt mit den Audioausgängen. Wird für " "einfacheAnwendungen empfohlen." -#: startup.cc:491 +#: startup.cc:329 msgid "Use an additional Monitor bus" msgstr "Nutze einen zusätzlichen Monitor-Bus" -#: startup.cc:494 +#: startup.cc:332 msgid "" "Use a Monitor bus between Master bus and hardware outputs for \n" "greater control in monitoring without affecting the mix." @@ -11569,7 +11547,7 @@ msgstr "" "Nutze einen Monitor-Bus zwischen Master-Bus und Audioausgängen, um mehr\n" "Möglichkeiten für das Monitoring zu bekommen, ohne den Mix zu beeinflussen." -#: startup.cc:516 +#: startup.cc:354 msgid "" "You can change this preference at any time via the Preferences dialog.\n" "You can also add or remove the monitor section to/from any session.\n" @@ -11583,110 +11561,10 @@ msgstr "" "\n" "Im Zweifelsfall akzeptieren Sie die Voreinstellung." -#: startup.cc:527 +#: startup.cc:365 msgid "Monitor Section" msgstr "Monitorsektion" -#: startup.cc:573 -msgid "Check the website for more..." -msgstr "Informieren Sie sich auf der Webseite weiter..." - -#: startup.cc:576 -msgid "Click to open the program website in your web browser" -msgstr "Klicken Sie, um die Webseite in Ihrem Web-Browse zu öffnen" - -#: startup.cc:729 -msgid "Open" -msgstr "Öffnen" - -#: startup.cc:775 -msgid "Session name:" -msgstr "Projektname:" - -#: startup.cc:798 -msgid "Create session folder in:" -msgstr "Ort des Projektverzeichnisses:" - -#: startup.cc:821 -msgid "Select folder for session" -msgstr "Ordner für Projekt wählen" - -#: startup.cc:853 -msgid "Use this template" -msgstr "Diese Vorlage verwenden" - -#: startup.cc:856 -msgid "no template" -msgstr "keine Vorlage" - -#: startup.cc:884 -msgid "Use an existing session as a template:" -msgstr "Ein vorhandenes Projekt als Vorlage verwenden:" - -#: startup.cc:896 -msgid "Select template" -msgstr "Vorlage auswählen" - -#: startup.cc:922 -msgid "New Session" -msgstr "Neues Projekt" - -#: startup.cc:1077 -msgid "Select session file" -msgstr "Projektdatei auswählen" - -#: startup.cc:1093 -msgid "Browse:" -msgstr "Durchsuchen:" - -#: startup.cc:1102 -msgid "Select a session" -msgstr "Projekt auswählen" - -#: startup.cc:1129 startup.cc:1130 startup.cc:1131 -msgid "channels" -msgstr "Kanäle" - -#: startup.cc:1145 -msgid "Busses" -msgstr "Busse" - -#: startup.cc:1146 -msgid "Inputs" -msgstr "Eingänge" - -#: startup.cc:1147 -msgid "Outputs" -msgstr "Ausgänge" - -#: startup.cc:1155 -msgid "Create master bus" -msgstr "Master-Bus erstellen" - -#: startup.cc:1165 -msgid "Automatically connect to physical inputs" -msgstr "Automatisch mit Audioeingängen verbinden" - -#: startup.cc:1172 startup.cc:1231 -msgid "Use only" -msgstr "Benutze nur" - -#: startup.cc:1225 -msgid "Automatically connect outputs" -msgstr "Ausgänge automatisch verbinden" - -#: startup.cc:1247 -msgid "... to master bus" -msgstr "... mit dem Master-Bus" - -#: startup.cc:1257 -msgid "... to physical outputs" -msgstr "... mit den Audioausgängen" - -#: startup.cc:1307 -msgid "Advanced Session Options" -msgstr "Erweiterte Einstellungen" - #: step_entry.cc:59 msgid "Step Entry: %1" msgstr "Eingabemodus (Step Entry): %1" @@ -12364,23 +12242,23 @@ msgstr "" msgid "Config file %1 not saved" msgstr "Konfigurationsdatei %1 nicht gespeichert" -#: utils.cc:110 utils.cc:153 +#: utils.cc:111 utils.cc:154 msgid "bad XPM header %1" msgstr "Fehlerhafter XPM Header %1" -#: utils.cc:292 utils.cc:324 +#: utils.cc:293 utils.cc:325 msgid "missing RGBA style for \"%1\"" msgstr "Fehlender RGBA Style für \"%1\"" -#: utils.cc:591 +#: utils.cc:598 msgid "cannot find XPM file for %1" msgstr "Konnte XPM-Datei für %1 nicht finden" -#: utils.cc:617 +#: utils.cc:624 msgid "cannot find icon image for %1 using %2" msgstr "Konnte Icon-Bild für %1 unter %2 nicht finden" -#: utils.cc:632 +#: utils.cc:639 msgid "Caught exception while loading icon named %1" msgstr "" "Während des Ladens des Icons mit dem Namen %1 trat ein Ausnahmefehler auf" @@ -12809,51 +12687,55 @@ msgstr "von 00:00:00:00 bis Videoende" msgid "from the video's start to the video's end" msgstr "von Videostart bis Videoende" -#: export_video_dialog.cc:184 +#: export_video_dialog.cc:154 +msgid "Selected range" +msgstr "Ausgewählter Bereich" + +#: export_video_dialog.cc:190 msgid "Settings:" msgstr "Einstellungen:" -#: export_video_dialog.cc:192 +#: export_video_dialog.cc:198 msgid "Range:" msgstr "Bereich:" -#: export_video_dialog.cc:195 +#: export_video_dialog.cc:201 msgid "Preset:" msgstr "Preset:" -#: export_video_dialog.cc:198 +#: export_video_dialog.cc:204 msgid "Video Codec:" msgstr "Videocodec:" -#: export_video_dialog.cc:201 +#: export_video_dialog.cc:207 msgid "Video KBit/s:" msgstr "Video KBit/s:" -#: export_video_dialog.cc:204 +#: export_video_dialog.cc:210 msgid "Audio Codec:" msgstr "Audiocodec:" -#: export_video_dialog.cc:207 +#: export_video_dialog.cc:213 msgid "Audio KBit/s:" msgstr "Audio KBit/s:" -#: export_video_dialog.cc:210 +#: export_video_dialog.cc:216 msgid "Audio Samplerate:" msgstr "Audiosamplerate:" -#: export_video_dialog.cc:387 +#: export_video_dialog.cc:392 msgid "Normalizing audio" msgstr "Audio normalisieren" -#: export_video_dialog.cc:391 +#: export_video_dialog.cc:396 msgid "Exporting audio" msgstr "Exportiere Audio" -#: export_video_dialog.cc:437 +#: export_video_dialog.cc:442 msgid "Exporting Audio..." msgstr "Exportiere Audio..." -#: export_video_dialog.cc:494 +#: export_video_dialog.cc:499 msgid "" "Export Video: Cannot query duration of video-file, using duration from " "timeline instead." @@ -12861,33 +12743,33 @@ msgstr "" "Exportiere Video: Kann die Dauer der Videodatei nicht eruieren, verwende " "statt dessen die Dauer aus der Zeitleiste." -#: export_video_dialog.cc:523 +#: export_video_dialog.cc:533 msgid "Export Video: No Master Out Ports to Connect for Audio Export" msgstr "" "Exportiere Video: Keine Master-Ausgangsports zum Verbinden für den " "Audioexport" -#: export_video_dialog.cc:562 +#: export_video_dialog.cc:572 msgid "Encoding Video..." msgstr "Enkodiere Video..." -#: export_video_dialog.cc:581 +#: export_video_dialog.cc:591 msgid "Export Video: Video input file cannot be read." msgstr "Exportiere Video: Die Videoquelldatei kann nicht gelesen werden." -#: export_video_dialog.cc:679 +#: export_video_dialog.cc:684 msgid "Encoding Video.. Pass 1/2" msgstr "Kodiere Video.. Durchgang 1/2" -#: export_video_dialog.cc:691 +#: export_video_dialog.cc:696 msgid "Encoding Video.. Pass 2/2" msgstr "Kodiere Video.. Durchgang 2/2" -#: export_video_dialog.cc:779 +#: export_video_dialog.cc:803 msgid "Transcoding failed." msgstr "Transkodieren fehlgeschlagen." -#: export_video_dialog.cc:948 export_video_dialog.cc:968 +#: export_video_dialog.cc:972 export_video_dialog.cc:992 msgid "Save Exported Video File" msgstr "Sichere exportierte Videodatei" @@ -12920,6 +12802,286 @@ msgstr "" "\n" "Handbuch im Browser öffnen? " +#~ msgid "Click the Refresh button to try again." +#~ msgstr "Klicken Sie auf Aktualisieren, um es erneut zu versuchen." + +#~ msgid "JACK" +#~ msgstr "JACK" + +#~ msgid "Reconnect" +#~ msgstr "Verbinde neu" + +#~ msgid "Window|Audio/MIDI Setup" +#~ msgstr "Audio/MIDI Einstellungen" + +#~ msgid "JACK Sampling Rate and Latency" +#~ msgstr "JACK Samplerate und Latenz" + +#~ msgid "Launch Control App" +#~ msgstr "Starte Steuerungsprogramm" + +#~ msgid "" +#~ "1. Turn down the volume on your hardware to a very " +#~ "low level.\n" +#~ "\n" +#~ "2. Connect the two channels that you select below using either a cable or " +#~ "(less ideally) a speaker and microphone.\n" +#~ "\n" +#~ "3. Once the channels are connected, click the \"Measure latency\" " +#~ "button.\n" +#~ "\n" +#~ "4. When satisfied with the results, click the \"Use results\" button." +#~ msgstr "" +#~ "1. Stellen Sie die Lautstärke ihrer Hardware auf " +#~ "einen sehr leisen Pegel.\n" +#~ "\n" +#~ "2. Verbinden Sie die zwei Kanäle, die Sie unten auswählen, entweder per " +#~ "Kabel oder (weniger ideal) per Lautsprecher und Mikrophon.\n" +#~ "\n" +#~ "3. Klicken Sie den Knopf \"Latenz messen\".\n" +#~ "\n" +#~ "4. Wenn Sie mit den Ergebnissen zufrieden sind, klicken Sie den Knopf " +#~ "\"Benutze Egebnisse\"." + +#~ msgid "" +#~ "There are several possible reasons:\n" +#~ "\n" +#~ "1) JACK is not running.\n" +#~ "2) JACK is running as another user, perhaps root.\n" +#~ "3) There is already another client called \"%1\".\n" +#~ "\n" +#~ "Please consider the possibilities, and perhaps (re)start JACK." +#~ msgstr "" +#~ "Dafür kann es verschiedene Gründe geben:\n" +#~ "\n" +#~ "1) JACK läuft nicht.\n" +#~ "2) JACK wurde unter einem anderen Benutzer gestartet, möglicherweise als " +#~ "root.\n" +#~ "3) Es gibt bereits einen anderen Client mit der Bezeichnung \"%1\".\n" +#~ "\n" +#~ "Betrachten Sie bitte diese Möglichkeiten und starten Sie ggf. JACK neu." + +#~ msgid "Create a new session" +#~ msgstr "Neues Projekt erzeugen" + +#~ msgid "Open an existing session" +#~ msgstr "Vorhandenes Projekt öffnen" + +#~ msgid "I'd like more options for this session" +#~ msgstr "Erweiterte Optionen für dieses Projekt" + +#~ msgid "Use an existing session as a template:" +#~ msgstr "Ein vorhandenes Projekt als Vorlage verwenden:" + +#~ msgid "Select template" +#~ msgstr "Vorlage auswählen" + +#~ msgid "Browse:" +#~ msgstr "Durchsuchen:" + +#~ msgid "Select a session" +#~ msgstr "Projekt auswählen" + +#~ msgid "Playback/recording on 1 device" +#~ msgstr "Wiedergabe/Aufnahme mit einem Gerät" + +#~ msgid "Playback/recording on 2 devices" +#~ msgstr "Wiedergabe/Aufnahme mit zwei Geräten" + +#~ msgid "Playback only" +#~ msgstr "Nur Wiedergabe" + +#~ msgid "Recording only" +#~ msgstr "Nur Aufnahme" + +#~ msgid "Realtime" +#~ msgstr "Realtime" + +#~ msgid "Starting audio engine" +#~ msgstr "Starte Audio-Engine" + +#~ msgid "disconnected" +#~ msgstr "getrennt" + +#~ msgid "Unable to start the session running" +#~ msgstr "Konnte das aktuelle Projekt nicht starten" + +#~ msgid "Do not lock memory" +#~ msgstr "Speicherzugriff nicht sperren" + +#~ msgid "Unlock memory" +#~ msgstr "Speicherzugriff öffnen" + +#~ msgid "No zombies" +#~ msgstr "Keine Zombies (Soft Mode)" + +#~ msgid "Provide monitor ports" +#~ msgstr "Monitor-Ports erstellen" + +#~ msgid "H/W monitoring" +#~ msgstr "Hardware Monitoring" + +#~ msgid "H/W metering" +#~ msgstr "Hardware-Pegelanzeige" + +#~ msgid "Verbose output" +#~ msgstr "Ausführliche Statusmeldungen" + +#~ msgid "8000Hz" +#~ msgstr "8000 Hz" + +#~ msgid "22050Hz" +#~ msgstr "22050 Hz" + +#~ msgid "44100Hz" +#~ msgstr "44100 Hz" + +#~ msgid "48000Hz" +#~ msgstr "48000 Hz" + +#~ msgid "88200Hz" +#~ msgstr "88200 Hz" + +#~ msgid "96000Hz" +#~ msgstr "96000 Hz" + +#~ msgid "192000Hz" +#~ msgstr "192000 Hz" + +#~ msgid "Triangular" +#~ msgstr "dreieckig" + +#~ msgid "Rectangular" +#~ msgstr "rechteckig" + +#~ msgid "Shaped" +#~ msgstr "shaped" + +#~ msgid "coremidi" +#~ msgstr "coremidi" + +#~ msgid "seq" +#~ msgstr "seq" + +#~ msgid "raw" +#~ msgstr "raw" + +#~ msgid "Audio Interface:" +#~ msgstr "Audio-Schnittstelle:" + +#~ msgid "Number of buffers:" +#~ msgstr "Pufferanzahl:" + +#~ msgid "Approximate latency:" +#~ msgstr "Latenz (ca.)" + +#~ msgid "Audio mode:" +#~ msgstr "Audio-Modus:" + +#~ msgid "Ignore" +#~ msgstr "ignorieren" + +#~ msgid "Client timeout" +#~ msgstr "Client Timeout" + +#~ msgid "Number of ports:" +#~ msgstr "Portanzahl" + +#~ msgid "MIDI driver:" +#~ msgstr "MIDI-Treiber:" + +#~ msgid "Dither:" +#~ msgstr "Dithering:" + +#~ msgid "" +#~ "No JACK server found anywhere on this system. Please install JACK and " +#~ "restart" +#~ msgstr "" +#~ "Es wurde kein JACK Server auf diesem System gefunden. Bitte installieren " +#~ "Sie JACK vor einem Neuversuch." + +#~ msgid "Server:" +#~ msgstr "Server:" + +#~ msgid "Input device:" +#~ msgstr "Eingangsgerät:" + +#~ msgid "Output device:" +#~ msgstr "Ausgabegerät:" + +#~ msgid "Advanced" +#~ msgstr "Erweitert" + +#~ msgid "cannot open JACK rc file %1 to store parameters" +#~ msgstr "kann die JACK rc-Datei %1 nicht öffnen, um die Parameter zu sichern" + +#~ msgid "" +#~ "You do not have any audio devices capable of\n" +#~ "simultaneous playback and recording.\n" +#~ "\n" +#~ "Please use Applications -> Utilities -> Audio MIDI Setup\n" +#~ "to create an \"aggregrate\" device, or install a suitable\n" +#~ "audio interface.\n" +#~ "\n" +#~ "Please send email to Apple and ask them why new Macs\n" +#~ "have no duplex audio device.\n" +#~ "\n" +#~ "Alternatively, if you really want just playback\n" +#~ "or recording but not both, start JACK before running\n" +#~ "%1 and choose the relevant device then." +#~ msgstr "" +#~ "Sie haben keine Soundkarte, die gleichzeitiges\n" +#~ "Abspielen und Aufnehmen unterstützt.\n" +#~ "\n" +#~ "Benützen Sie Programme>Dienstprogramme>Audio-Midi-Setup\n" +#~ " um ein kombiniertes Gerät zu erzeugen, oder installieren Sie ein\n" +#~ "geeignetes Audiointerface.\n" +#~ "\n" +#~ "Bitte senden Sie eine E-Mail an Apple und fragen Sie, warum Sie\n" +#~ "keine Duplex Soundkarte in Ihrem Mac haben.\n" +#~ "\n" +#~ "Wenn Sie Audiomaterial wirklich nicht gleichzeitig aufnehmen und " +#~ "wiedergeben wollen,\n" +#~ "können Sie JACK vor dem Starten von %1 aufrufen und das entsprechende " +#~ "Gerät auswählen." + +#~ msgid "No suitable audio devices" +#~ msgstr "Keine passenden Audiogeräte." + +#~ msgid "JACK appears to be missing from the %1 bundle" +#~ msgstr "JACK scheint im %1-Paket zu fehlen." + +#~ msgid "You need to choose an audio device first." +#~ msgstr "Sie müssen zuerst ein Audiogerät auswählen." + +#~ msgid "Audio device \"%1\" not known on this computer." +#~ msgstr "Audiogerät %1 scheint auf diesem Computer nicht vorhanden zu sein." + +#~ msgid "AudioSetup value for %1 is missing data" +#~ msgstr "Es fehlen Daten zum AudioSetup-Wert von %1" + +#~ msgid "" +#~ "configuration files contain a JACK server path that doesn't exist (%1)" +#~ msgstr "" +#~ "die Konfiguration enthält einen JACK-Serverpfad, der nicht existiert (%1)" + +#~ msgid "JACK exited" +#~ msgstr "JACK wurde beendet" + +#~ msgid "" +#~ "JACK exited unexpectedly, and without notifying %1.\n" +#~ "\n" +#~ "This is probably due to an error inside JACK. You should restart JACK\n" +#~ "and reconnect %1 to it, or exit %1 now. You cannot save your\n" +#~ "session at this time, because we would lose your connection information.\n" +#~ msgstr "" +#~ "JACK wurde unerwartet und ohne Benachrichtigung beendet %1.\n" +#~ "\n" +#~ "Dies liegt wahrscheinlich an einem Fehler in JACK. Sie sollten\n" +#~ "JACK neu starten und %1 erneut mit ihm verbinden, oder %1 jetzt beenden.\n" +#~ "Momentan läßt sich das Projekt nicht speichern, da alle Informationen\n" +#~ "über Verbindungen verloren gehen würden.\n" + #~ msgid "Failed to set session-framerate: " #~ msgstr "Konnte Projekt-Framerate nicht einstellen: " @@ -12974,9 +13136,6 @@ msgstr "" #~ msgid "What would you like to do ?" #~ msgstr "Was möchten Sie tun?" -#~ msgid "Connect" -#~ msgstr "Verbinden" - #~ msgid "Mixer on Top" #~ msgstr "Mixer über Editor" -- cgit v1.2.3 From 7e077bdebaa20eff758a812821e1c80991c1e59b Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Tue, 8 Oct 2013 14:01:43 -0400 Subject: -arestore jack timebase master and jack session callback functionality (moved into the JACK backend) --- libs/ardour/session_jack.cc | 185 ----------------------------------- libs/backends/jack/jack_session.cc | 193 +++++++++++++++++++++++++++++++++++++ libs/backends/jack/jack_session.h | 47 +++++++++ 3 files changed, 240 insertions(+), 185 deletions(-) delete mode 100644 libs/ardour/session_jack.cc create mode 100644 libs/backends/jack/jack_session.cc create mode 100644 libs/backends/jack/jack_session.h diff --git a/libs/ardour/session_jack.cc b/libs/ardour/session_jack.cc deleted file mode 100644 index af8a93fec3..0000000000 --- a/libs/ardour/session_jack.cc +++ /dev/null @@ -1,185 +0,0 @@ -/* - Copyright (C) 1999-2013 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. - -*/ - - -#ifdef WAF_BUILD -#include "libardour-config.h" -#endif - -#include - -#include - -#include "jack/jack.h" -#include "jack/session.h" - -#include "ardour/audioengine.h" -#include "ardour/filename_extensions.h" -#include "ardour/session.h" -#include "ardour/session_directory.h" -#include "ardour/tempo.h" - -using namespace ARDOUR; -using std::string; - -#ifdef HAVE_JACK_SESSION -void -Session::jack_session_event (jack_session_event_t* event) -{ - char timebuf[128], *tmp; - time_t n; - struct tm local_time; - - time (&n); - localtime_r (&n, &local_time); - strftime (timebuf, sizeof(timebuf), "JS_%FT%T", &local_time); - - while ((tmp = strchr(timebuf, ':'))) { *tmp = '.'; } - - if (event->type == JackSessionSaveTemplate) - { - if (save_template( timebuf )) { - event->flags = JackSessionSaveError; - } else { - string cmd ("ardour3 -P -U "); - cmd += event->client_uuid; - cmd += " -T "; - cmd += timebuf; - - event->command_line = strdup (cmd.c_str()); - } - } - else - { - if (save_state (timebuf)) { - event->flags = JackSessionSaveError; - } else { - std::string xml_path (_session_dir->root_path()); - std::string legalized_filename = legalize_for_path (timebuf) + statefile_suffix; - xml_path = Glib::build_filename (xml_path, legalized_filename); - - string cmd ("ardour3 -P -U "); - cmd += event->client_uuid; - cmd += " \""; - cmd += xml_path; - cmd += '\"'; - - event->command_line = strdup (cmd.c_str()); - } - } - - /* this won't be called if the port engine in use is not JACK, so we do - not have to worry about the type of PortEngine::private_handle() - */ - - jack_client_t* jack_client = (jack_client_t*) AudioEngine::instance()->port_engine().private_handle(); - - if (jack_client) { - jack_session_reply (jack_client, event); - } - - if (event->type == JackSessionSaveAndQuit) { - Quit (); /* EMIT SIGNAL */ - } - - jack_session_event_free( event ); -} -#endif - -void -Session::jack_timebase_callback (jack_transport_state_t /*state*/, - pframes_t /*nframes*/, - jack_position_t* pos, - int /*new_position*/) -{ - Timecode::BBT_Time bbt; - - /* BBT info */ - - if (_tempo_map) { - - TempoMetric metric (_tempo_map->metric_at (_transport_frame)); - - try { - _tempo_map->bbt_time_rt (_transport_frame, bbt); - - pos->bar = bbt.bars; - pos->beat = bbt.beats; - pos->tick = bbt.ticks; - - // XXX still need to set bar_start_tick - - pos->beats_per_bar = metric.meter().divisions_per_bar(); - pos->beat_type = metric.meter().note_divisor(); - pos->ticks_per_beat = Timecode::BBT_Time::ticks_per_beat; - pos->beats_per_minute = metric.tempo().beats_per_minute(); - - pos->valid = jack_position_bits_t (pos->valid | JackPositionBBT); - - } catch (...) { - /* no message */ - } - } - -#ifdef HAVE_JACK_VIDEO_SUPPORT - //poke audio video ratio so Ardour can track Video Sync - pos->audio_frames_per_video_frame = frame_rate() / timecode_frames_per_second(); - pos->valid = jack_position_bits_t (pos->valid | JackAudioVideoRatio); -#endif - -#if 0 - /* Timecode info */ - - pos->timecode_offset = config.get_timecode_offset(); - t.timecode_frame_rate = timecode_frames_per_second(); - pos->valid = jack_position_bits_t (pos->valid | JackPositionTimecode; - - if (_transport_speed) { - - if (play_loop) { - - Location* location = _locations.auto_loop_location(); - - if (location) { - - t.transport_state = JackTransportLooping; - t.loop_start = location->start(); - t.loop_end = location->end(); - t.valid = jack_transport_bits_t (t.valid | JackTransportLoop); - - } else { - - t.loop_start = 0; - t.loop_end = 0; - t.transport_state = JackTransportRolling; - - } - - } else { - - t.loop_start = 0; - t.loop_end = 0; - t.transport_state = JackTransportRolling; - - } - - } -#endif -} - diff --git a/libs/backends/jack/jack_session.cc b/libs/backends/jack/jack_session.cc new file mode 100644 index 0000000000..ca51dafccc --- /dev/null +++ b/libs/backends/jack/jack_session.cc @@ -0,0 +1,193 @@ +/* + Copyright (C) 2013 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 + +#include + +#include + +#include "ardour/audioengine.h" +#include "ardour/filename_extensions.h" +#include "ardour/session.h" +#include "ardour/session_directory.h" +#include "ardour/tempo.h" + +#include "jack_session.h" + +using namespace ARDOUR; +using std::string; + +JACKSession::JACKSession (Session* s) + : SessionHandlePtr (s) +{ +} + +JACKSession::~JACKSession () +{ +} + +void +JACKSession::session_event (jack_session_event_t* event) +{ + char timebuf[128], *tmp; + time_t n; + struct tm local_time; + + time (&n); + localtime_r (&n, &local_time); + strftime (timebuf, sizeof(timebuf), "JS_%FT%T", &local_time); + + while ((tmp = strchr(timebuf, ':'))) { *tmp = '.'; } + + if (event->type == JackSessionSaveTemplate) + { + if (_session->save_template( timebuf )) { + event->flags = JackSessionSaveError; + } else { + string cmd ("ardour3 -P -U "); + cmd += event->client_uuid; + cmd += " -T "; + cmd += timebuf; + + event->command_line = strdup (cmd.c_str()); + } + } + else + { + if (_session->save_state (timebuf)) { + event->flags = JackSessionSaveError; + } else { + std::string xml_path (_session->session_directory().root_path()); + std::string legalized_filename = legalize_for_path (timebuf) + statefile_suffix; + xml_path = Glib::build_filename (xml_path, legalized_filename); + + string cmd ("ardour3 -P -U "); + cmd += event->client_uuid; + cmd += " \""; + cmd += xml_path; + cmd += '\"'; + + event->command_line = strdup (cmd.c_str()); + } + } + + /* this won't be called if the port engine in use is not JACK, so we do + not have to worry about the type of PortEngine::private_handle() + */ + + jack_client_t* jack_client = (jack_client_t*) AudioEngine::instance()->port_engine().private_handle(); + + if (jack_client) { + jack_session_reply (jack_client, event); + } + + if (event->type == JackSessionSaveAndQuit) { + _session->Quit (); /* EMIT SIGNAL */ + } + + jack_session_event_free (event); +} + +void +JACKSession::timebase_callback (jack_transport_state_t /*state*/, + pframes_t /*nframes*/, + jack_position_t* pos, + int /*new_position*/) +{ + Timecode::BBT_Time bbt; + TempoMap& tempo_map (_session->tempo_map()); + framepos_t tf = _session->transport_frame (); + + /* BBT info */ + + TempoMetric metric (tempo_map.metric_at (tf)); + + try { + tempo_map.bbt_time_rt (tf, bbt); + + pos->bar = bbt.bars; + pos->beat = bbt.beats; + pos->tick = bbt.ticks; + + // XXX still need to set bar_start_tick + + pos->beats_per_bar = metric.meter().divisions_per_bar(); + pos->beat_type = metric.meter().note_divisor(); + pos->ticks_per_beat = Timecode::BBT_Time::ticks_per_beat; + pos->beats_per_minute = metric.tempo().beats_per_minute(); + + pos->valid = jack_position_bits_t (pos->valid | JackPositionBBT); + + } catch (...) { + /* no message */ + } + +#ifdef HAVE_JACK_VIDEO_SUPPORT + //poke audio video ratio so Ardour can track Video Sync + pos->audio_frames_per_video_frame = _session->frame_rate() / _session->timecode_frames_per_second(); + pos->valid = jack_position_bits_t (pos->valid | JackAudioVideoRatio); +#endif + +#ifdef HAVE_JACK_TIMCODE_SUPPORT + /* This is not yet defined in JACK */ + + /* Timecode info */ + + pos->timecode_offset = _session->config.get_timecode_offset(); + t.timecode_frame_rate = _session->timecode_frames_per_second(); + pos->valid = jack_position_bits_t (pos->valid | JackPositionTimecode); +#endif + +#ifdef HAVE_JACK_LOOPING_SUPPORT + /* This is not yet defined in JACK */ + if (_transport_speed) { + + if (play_loop) { + + Location* location = _session->locations()->auto_loop_location(); + + if (location) { + + t.transport_state = JackTransportLooping; + t.loop_start = location->start(); + t.loop_end = location->end(); + t.valid = jack_transport_bits_t (t.valid | JackTransportLoop); + + } else { + + t.loop_start = 0; + t.loop_end = 0; + t.transport_state = JackTransportRolling; + + } + + } else { + + t.loop_start = 0; + t.loop_end = 0; + t.transport_state = JackTransportRolling; + + } + + } +#endif +} + diff --git a/libs/backends/jack/jack_session.h b/libs/backends/jack/jack_session.h new file mode 100644 index 0000000000..c912b5f170 --- /dev/null +++ b/libs/backends/jack/jack_session.h @@ -0,0 +1,47 @@ +/* + Copyright (C) 2013 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_jack_audiobackend_jack_session_h__ +#define __ardour_jack_audiobackend_jack_session_h__ + +#include +#include + +#include "ardour/types.h" +#include "ardour/session_handle.h" + +namespace ARDOUR { + class Session; + +class JACKSession : public ARDOUR::SessionHandlePtr +{ + public: + JACKSession (ARDOUR::Session* s); + ~JACKSession (); + + void session_event (jack_session_event_t* event); + void timebase_callback (jack_transport_state_t /*state*/, + ARDOUR::pframes_t /*nframes*/, + jack_position_t* pos, + int /*new_position*/); +}; + +} /* namespace */ + +#endif /* __ardour_jack_audiobackend_jack_session_h__ */ -- cgit v1.2.3 From c98abed37fd9ffd7402f3ecf2c05df811488d610 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Tue, 8 Oct 2013 14:02:03 -0400 Subject: restore jack timebase master and jack session callback functionality (moved into the JACK backend) --- libs/ardour/ardour/session.h | 9 --------- libs/ardour/wscript | 1 - libs/backends/jack/jack_audiobackend.cc | 10 ++++++---- libs/backends/jack/jack_audiobackend.h | 11 +++++++---- libs/backends/jack/wscript | 3 ++- 5 files changed, 15 insertions(+), 19 deletions(-) diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h index 937ae4fb2e..9c4edfa1a1 100644 --- a/libs/ardour/ardour/session.h +++ b/libs/ardour/ardour/session.h @@ -881,15 +881,6 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi MIDI::MachineControl& mmc() { return *_mmc; } - /* Callbacks specifically related to JACK, and called directly - * from the JACK audio backend. - */ - -#ifdef HAVE_JACK_SESSION - void jack_session_event (jack_session_event_t* event); -#endif - void jack_timebase_callback (jack_transport_state_t, pframes_t, jack_position_t*, int); - protected: friend class AudioEngine; void set_block_size (pframes_t nframes); diff --git a/libs/ardour/wscript b/libs/ardour/wscript index 0fd5c4e80f..4231691d17 100644 --- a/libs/ardour/wscript +++ b/libs/ardour/wscript @@ -180,7 +180,6 @@ libardour_sources = [ 'session_events.cc', 'session_export.cc', 'session_handle.cc', - 'session_jack.cc', 'session_ltc.cc', 'session_metadata.cc', 'session_midi.cc', diff --git a/libs/backends/jack/jack_audiobackend.cc b/libs/backends/jack/jack_audiobackend.cc index a651f2522d..a9bbe4b35a 100644 --- a/libs/backends/jack/jack_audiobackend.cc +++ b/libs/backends/jack/jack_audiobackend.cc @@ -37,6 +37,7 @@ #include "jack_audiobackend.h" #include "jack_connection.h" #include "jack_utils.h" +#include "jack_session.h" #include "i18n.h" @@ -64,6 +65,7 @@ JACKAudioBackend::JACKAudioBackend (AudioEngine& e, boost::shared_ptrConnected.connect_same_thread (jack_connection_connection, boost::bind (&JACKAudioBackend::when_connected_to_jack, this)); _jack_connection->Disconnected.connect_same_thread (disconnect_connection, boost::bind (&JACKAudioBackend::disconnected, this, _1)); @@ -748,7 +750,8 @@ JACKAudioBackend::jack_timebase_callback (jack_transport_state_t state, pframes_ ARDOUR::Session* session = engine.session(); if (session) { - session->jack_timebase_callback (state, nframes, pos, new_position); + JACKSession jsession (session); + jsession.timebase_callback (state, nframes, pos, new_position); } } @@ -793,7 +796,6 @@ JACKAudioBackend::_xrun_callback (void *arg) return 0; } -#ifdef HAVE_JACK_SESSION void JACKAudioBackend::_session_callback (jack_session_event_t *event, void *arg) { @@ -801,10 +803,10 @@ JACKAudioBackend::_session_callback (jack_session_event_t *event, void *arg) ARDOUR::Session* session = jab->engine.session(); if (session) { - session->jack_session_event (event); + JACKSession jsession (session); + jsession.session_event (event); } } -#endif void JACKAudioBackend::_freewheel_callback (int onoff, void *arg) diff --git a/libs/backends/jack/jack_audiobackend.h b/libs/backends/jack/jack_audiobackend.h index b8d8b3b3f1..cb24835d5b 100644 --- a/libs/backends/jack/jack_audiobackend.h +++ b/libs/backends/jack/jack_audiobackend.h @@ -30,15 +30,14 @@ #include #include -#ifdef HAVE_JACK_SESSION #include -#endif #include "ardour/audio_backend.h" namespace ARDOUR { class JackConnection; +class JACKSession; class JACKAudioBackend : public AudioBackend { public: @@ -196,9 +195,7 @@ class JACKAudioBackend : public AudioBackend { static int _jack_sync_callback (jack_transport_state_t, jack_position_t*, void *arg); static void _freewheel_callback (int , void *arg); static void _latency_callback (jack_latency_callback_mode_t, void*); -#ifdef HAVE_JACK_SESSION static void _session_callback (jack_session_event_t *event, void *arg); -#endif void jack_timebase_callback (jack_transport_state_t, pframes_t, jack_position_t*, int); int jack_sync_callback (jack_transport_state_t, jack_position_t*); @@ -261,6 +258,12 @@ class JACKAudioBackend : public AudioBackend { void when_connected_to_jack (); PBD::ScopedConnection jack_connection_connection; + + /* Object to manage interactions with Session in a way that + keeps JACK out of libardour directly + */ + + JACKSession* _session; }; } // namespace diff --git a/libs/backends/jack/wscript b/libs/backends/jack/wscript index 98c39c7b16..73b2005f84 100644 --- a/libs/backends/jack/wscript +++ b/libs/backends/jack/wscript @@ -28,7 +28,8 @@ def build(bld): 'jack_connection.cc', 'jack_audiobackend.cc', 'jack_portengine.cc', - 'jack_utils.cc' + 'jack_utils.cc', + 'jack_session.cc', ] obj.includes = ['.'] obj.cxxflags = [ '-fPIC' ] -- cgit v1.2.3 From 645350815c79be0e6f3a87ab3a251b12c266f5f1 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Tue, 8 Oct 2013 14:16:13 -0400 Subject: remove link-time use of JACK, since it is now dlopen'ed by the chosen backend --- libs/ardour/wscript | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/libs/ardour/wscript b/libs/ardour/wscript index 4231691d17..96932495f4 100644 --- a/libs/ardour/wscript +++ b/libs/ardour/wscript @@ -245,8 +245,6 @@ def configure(conf): autowaf.configure(conf) autowaf.check_pkg(conf, 'aubio', uselib_store='AUBIO', atleast_version='0.3.2') - autowaf.check_pkg(conf, 'jack', uselib_store='JACK', - atleast_version='0.118.2') autowaf.check_pkg(conf, 'libxml-2.0', uselib_store='XML') autowaf.check_pkg(conf, 'lrdf', uselib_store='LRDF', atleast_version='0.4.0') @@ -297,9 +295,6 @@ def configure(conf): conf.check(header_name='sys/vfs.h', define_name='HAVE_SYS_VFS_H',mandatory=False) conf.check(header_name='sys/statvfs.h', define_name='HAVE_SYS_STATVFS_H',mandatory=False) - conf.check(header_name='jack/session.h', uselib = [ 'JACK' ], - define_name='HAVE_JACK_SESSION') - conf.check(header_name='unistd.h', define_name='HAVE_UNISTD',mandatory=False) if flac_supported(): @@ -336,7 +331,7 @@ def build(bld): obj.name = 'ardour' obj.target = 'ardour' obj.uselib = ['GLIBMM','GTHREAD','AUBIO','SIGCPP','XML','UUID', - 'JACK','SNDFILE','SAMPLERATE','LRDF','AUDIOUNITS', + 'SNDFILE','SAMPLERATE','LRDF','AUDIOUNITS', 'OSX','BOOST','CURL','DL'] obj.use = ['libpbd','libmidipp','libevoral','libvamphost', 'libvampplugin','libtaglib','librubberband', @@ -403,7 +398,7 @@ def build(bld): testcommon.includes = obj.includes + ['test', '../pbd', '..'] testcommon.source = ['test/test_globals.cc', 'test/testrunner.cc', 'test/test_needing_session.cc', 'test/test_common.cc', 'test/dummy_lxvst.cc', 'test/audio_region_test.cc', 'test/test_util.cc'] - testcommon.uselib = ['CPPUNIT','SIGCPP','JACK','GLIBMM','GTHREAD', + testcommon.uselib = ['CPPUNIT','SIGCPP','GLIBMM','GTHREAD', 'SAMPLERATE','XML','LRDF','COREAUDIO'] testcommon.use = ['libpbd','libmidipp','libevoral','libvamphost', 'libvampplugin','libtaglib','librubberband', @@ -479,7 +474,7 @@ def build(bld): session_load_tester.includes = obj.includes session_load_tester.includes.append ('test') - session_load_tester.uselib = ['CPPUNIT','SIGCPP','JACK','GLIBMM','GTHREAD', + session_load_tester.uselib = ['CPPUNIT','SIGCPP','GLIBMM','GTHREAD', 'SAMPLERATE','XML','LRDF','COREAUDIO'] session_load_tester.use = ['libpbd','libmidipp','ardour'] session_load_tester.name = 'libardour-session-load-tester' @@ -514,7 +509,7 @@ def build(bld): profilingobj.includes = obj.includes profilingobj.includes.append ('test') - profilingobj.uselib = ['CPPUNIT','SIGCPP','JACK','GLIBMM','GTHREAD', + profilingobj.uselib = ['CPPUNIT','SIGCPP','GLIBMM','GTHREAD', 'SAMPLERATE','XML','LRDF','COREAUDIO'] profilingobj.use = ['libpbd','libmidipp','ardour'] profilingobj.name = 'libardour-profiling' @@ -541,7 +536,7 @@ def create_ardour_test_program(bld, includes, name, target, sources): testobj = bld(features = 'cxx cxxprogram') testobj.includes = includes + ['test', '../pbd', '..'] testobj.source = sources - testobj.uselib = ['CPPUNIT','SIGCPP','JACK','GLIBMM','GTHREAD', + testobj.uselib = ['CPPUNIT','SIGCPP','GLIBMM','GTHREAD', 'SAMPLERATE','XML','LRDF','COREAUDIO'] testobj.use = ['libpbd','libmidipp','libevoral','libvamphost', 'libvampplugin','libtaglib','librubberband', -- cgit v1.2.3 From af8a1c146dadeda43c2f8bcc3a5982ff13d69eb3 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Tue, 8 Oct 2013 16:13:39 -0400 Subject: move JACK configuration test(s) down to where they belong (in libs/backend/jack) --- libs/backends/jack/wscript | 2 +- wscript | 5 ----- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/libs/backends/jack/wscript b/libs/backends/jack/wscript index 73b2005f84..06463bf3ec 100644 --- a/libs/backends/jack/wscript +++ b/libs/backends/jack/wscript @@ -19,6 +19,7 @@ def options(opt): autowaf.set_options(opt) def configure(conf): + autowaf.check_pkg(conf, 'jack', uselib_store='JACK', atleast_version='0.123.0') autowaf.configure(conf) def build(bld): @@ -32,7 +33,6 @@ def build(bld): 'jack_session.cc', ] obj.includes = ['.'] - obj.cxxflags = [ '-fPIC' ] obj.name = 'jack_audiobackend' obj.target = 'jack_audiobackend' obj.uselib = [ 'JACK' ] diff --git a/wscript b/wscript index fded3e1652..da7b39d883 100644 --- a/wscript +++ b/wscript @@ -612,8 +612,6 @@ def configure(conf): if Options.options.boost_sp_debug: conf.env.append_value('CXXFLAGS', '-DBOOST_SP_ENABLE_DEBUG_HOOKS') - autowaf.check_header(conf, 'cxx', 'jack/session.h', define="JACK_SESSION", mandatory = False) - conf.check_cxx(fragment = "#include \nint main(void) { return (BOOST_VERSION >= 103900 ? 0 : 1); }\n", execute = "1", mandatory = True, @@ -661,8 +659,6 @@ def configure(conf): if opts.lxvst: conf.define('LXVST_SUPPORT', 1) conf.env['LXVST_SUPPORT'] = True - if bool(conf.env['JACK_SESSION']): - conf.define('HAVE_JACK_SESSION', 1) conf.define('WINDOWS_KEY', opts.windows_key) conf.env['PROGRAM_NAME'] = opts.program_name if opts.rt_alloc_debug: @@ -716,7 +712,6 @@ const char* const ardour_config_info = "\\n\\ write_config_text('FLAC', conf.is_defined('HAVE_FLAC')) write_config_text('FPU optimization', opts.fpu_optimization) write_config_text('Freedesktop files', opts.freedesktop) - write_config_text('JACK session support', conf.is_defined('JACK_SESSION')) write_config_text('LV2 UI embedding', conf.is_defined('HAVE_SUIL')) write_config_text('LV2 support', conf.is_defined('LV2_SUPPORT')) write_config_text('LXVST support', conf.is_defined('LXVST_SUPPORT')) -- cgit v1.2.3 From 927ebe3b5f10e4969ffa9ba52ebeee6c3ad2fb37 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Tue, 8 Oct 2013 17:12:20 -0400 Subject: reduce version requirement for JACK --- libs/backends/jack/wscript | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/backends/jack/wscript b/libs/backends/jack/wscript index 06463bf3ec..d76ec095ca 100644 --- a/libs/backends/jack/wscript +++ b/libs/backends/jack/wscript @@ -19,7 +19,7 @@ def options(opt): autowaf.set_options(opt) def configure(conf): - autowaf.check_pkg(conf, 'jack', uselib_store='JACK', atleast_version='0.123.0') + autowaf.check_pkg(conf, 'jack', uselib_store='JACK', atleast_version='0.121.0') autowaf.configure(conf) def build(bld): -- cgit v1.2.3 From 465b800d8b7dc0d9e0f92a16c6fcae29d2bbd544 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Wed, 9 Oct 2013 13:57:00 -0400 Subject: when looking for backends, search for *.dll as well as *.so and *.dylib --- libs/ardour/audioengine.cc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/libs/ardour/audioengine.cc b/libs/ardour/audioengine.cc index f6694d88ea..f79c90feea 100644 --- a/libs/ardour/audioengine.cc +++ b/libs/ardour/audioengine.cc @@ -474,6 +474,7 @@ AudioEngine::discover_backends () Glib::PatternSpec so_extension_pattern("*backend.so"); Glib::PatternSpec dylib_extension_pattern("*backend.dylib"); + Glib::PatternSpec dll_extension_pattern("*backend.dll"); find_matching_files_in_search_path (backend_search_path (), so_extension_pattern, backend_modules); @@ -481,6 +482,9 @@ AudioEngine::discover_backends () find_matching_files_in_search_path (backend_search_path (), dylib_extension_pattern, backend_modules); + find_matching_files_in_search_path (backend_search_path (), + dll_extension_pattern, backend_modules); + DEBUG_TRACE (DEBUG::Panning, string_compose (_("looking for backends in %1\n"), backend_search_path().to_string())); for (vector::iterator i = backend_modules.begin(); i != backend_modules.end(); ++i) { -- cgit v1.2.3 From c4b20f1a20956fa0ab77f36013aceb759837ab9c Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Thu, 10 Oct 2013 11:24:16 -0400 Subject: nicely handle the (should-never-happen) case of no audio/MIDI backends being detected --- gtk2_ardour/ardour_ui.cc | 6 +++++- gtk2_ardour/engine_dialog.cc | 8 ++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc index d09544fcf4..fe773d94e8 100644 --- a/gtk2_ardour/ardour_ui.cc +++ b/gtk2_ardour/ardour_ui.cc @@ -796,7 +796,11 @@ ARDOUR_UI::starting () * audio backend end up. */ - audio_midi_setup.get (true); + try { + audio_midi_setup.get (true); + } catch (...) { + return -1; + } /* go get a session */ diff --git a/gtk2_ardour/engine_dialog.cc b/gtk2_ardour/engine_dialog.cc index dfd24af739..c9ebcf4cf2 100644 --- a/gtk2_ardour/engine_dialog.cc +++ b/gtk2_ardour/engine_dialog.cc @@ -30,6 +30,7 @@ #include "pbd/error.h" #include "pbd/xml++.h" #include "pbd/unwind.h" +#include "pbd/failed_constructor.h" #include #include @@ -94,6 +95,13 @@ EngineControl::EngineControl () */ vector backends = ARDOUR::AudioEngine::instance()->available_backends(); + + if (backends.empty()) { + MessageDialog msg (string_compose (_("No audio/MIDI backends detected. %1 cannot run\n\n(This is a build/packaging/system error. It should never happen.)"), PROGRAM_NAME)); + msg.run (); + throw failed_constructor (); + } + for (vector::const_iterator b = backends.begin(); b != backends.end(); ++b) { strings.push_back ((*b)->name); } -- cgit v1.2.3 From 2308291e59f93bcf406aa78f70f22215459d0f20 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Thu, 10 Oct 2013 12:58:38 -0400 Subject: add API to AudioBackend to allow discovery of possible MIDI I/O options --- libs/ardour/ardour/audio_backend.h | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/libs/ardour/ardour/audio_backend.h b/libs/ardour/ardour/audio_backend.h index 0e39625e8c..f596164de7 100644 --- a/libs/ardour/ardour/audio_backend.h +++ b/libs/ardour/ardour/audio_backend.h @@ -239,7 +239,26 @@ class AudioBackend : public PortEngine { * app is undefined or cannot be launched. */ virtual void launch_control_app () = 0; - /* Basic state control */ + + /* @return a vector of strings that describe the available + * MIDI options. + * + * These can be presented to the user to decide which + * MIDI drivers, options etc. can be used. The returned strings + * should be thought of as the key to a map of possible + * approaches to handling MIDI within the backend. Ensure that + * the strings will make sense to the user. + */ + virtual std::vector enumerate_midi_options () const = 0; + + /* Request the use of the MIDI option named @param option, which + * should be one of the strings returned by enumerate_midi_options() + * + * @return zero if successful, non-zero otherwise + */ + virtual int set_midi_option (const std::string& option) = 0; + + /* State Control */ /** Start using the device named in the most recent call * to set_device(), with the parameters set by various -- cgit v1.2.3 From 1bd04f8bf3fa6dc1e18a39e805781fe7acd1940e Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Thu, 10 Oct 2013 12:59:11 -0400 Subject: add JACK backend support for MIDI option discovery --- libs/backends/jack/jack_audiobackend.cc | 15 +++++++++ libs/backends/jack/jack_audiobackend.h | 4 +++ libs/backends/jack/jack_utils.cc | 54 +++++++++++++++++++++++++++++++++ libs/backends/jack/jack_utils.h | 5 +++ 4 files changed, 78 insertions(+) diff --git a/libs/backends/jack/jack_audiobackend.cc b/libs/backends/jack/jack_audiobackend.cc index a9bbe4b35a..397ba0e498 100644 --- a/libs/backends/jack/jack_audiobackend.cc +++ b/libs/backends/jack/jack_audiobackend.cc @@ -490,6 +490,8 @@ JACKAudioBackend::setup_jack_startup_command () options.realtime = true; options.ports_max = 2048; + ARDOUR::set_midi_option (options, _target_midi_option); + /* this must always be true for any server instance we start ourselves */ @@ -1110,3 +1112,16 @@ JACKAudioBackend::launch_control_app () args.push_back (appname); Glib::spawn_async ("", args, Glib::SPAWN_SEARCH_PATH); } + +vector +JACKAudioBackend::enumerate_midi_options () const +{ + return ARDOUR::enumerate_midi_options (); +} + +int +JACKAudioBackend::set_midi_option (const string& opt) +{ + _target_midi_option = opt; + return 0; +} diff --git a/libs/backends/jack/jack_audiobackend.h b/libs/backends/jack/jack_audiobackend.h index cb24835d5b..139e1f3cce 100644 --- a/libs/backends/jack/jack_audiobackend.h +++ b/libs/backends/jack/jack_audiobackend.h @@ -149,6 +149,9 @@ class JACKAudioBackend : public AudioBackend { /* MIDI */ + std::vector enumerate_midi_options () const; + int set_midi_option (const std::string&); + int midi_event_get (pframes_t& timestamp, size_t& size, uint8_t** buf, void* port_buffer, uint32_t event_index); int midi_event_put (void* port_buffer, pframes_t timestamp, const uint8_t* buffer, size_t size); uint32_t get_midi_event_count (void* port_buffer); @@ -237,6 +240,7 @@ class JACKAudioBackend : public AudioBackend { uint32_t _target_systemic_output_latency; uint32_t _current_sample_rate; uint32_t _current_buffer_size; + std::string _target_midi_option; typedef std::set DeviceList; typedef std::map DriverDeviceMap; diff --git a/libs/backends/jack/jack_utils.cc b/libs/backends/jack/jack_utils.cc index 93fc3d440a..0a5b3eb44d 100644 --- a/libs/backends/jack/jack_utils.cc +++ b/libs/backends/jack/jack_utils.cc @@ -92,6 +92,8 @@ namespace { const char * const default_device_name = X_("Default"); } +static ARDOUR::MidiOptions midi_options; + std::string get_none_string () { @@ -846,6 +848,9 @@ ARDOUR::get_jack_command_line_string (JackCommandLineOptions& options, string& c if (options.soft_mode) { args.push_back ("-s"); } + } + + if (options.driver == alsa_driver_name || options.driver == coreaudio_driver_name) { if (!options.midi_driver.empty() && options.midi_driver != get_none_string ()) { args.push_back ("-X"); @@ -900,3 +905,52 @@ ARDOUR::write_jack_config_file (const std::string& config_file_path, const strin jackdrc.close (); return true; } + +vector +ARDOUR::enumerate_midi_options () +{ + if (midi_options.empty()) { +#ifdef HAVE_ALSA + midi_options.push_back (make_pair (_("ALSA raw devices"), alsaraw_midi_driver_name)); + midi_options.push_back (make_pair (_("ALSA sequencer"), alsaseq_midi_driver_name)); +#endif +#ifdef HAVE_PORTAUDIO + /* Windows folks: what name makes sense here? Are there other + choices as well ? + */ + midi_options.push_back (make_pair (_("Multimedia Extension"), winmme_midi_driver_name)); +#endif +#ifdef __APPLE__ + midi_options.push_back (make_pair (_("CoreMIDI"), coremidi_midi_driver_name)); +#endif + } + + vector v; + + v.push_back (get_none_string()); + + for (MidiOptions::const_iterator i = midi_options.begin(); i != midi_options.end(); ++i) { + v.push_back (i->first); + } + + return v; +} + +int +ARDOUR::set_midi_option (ARDOUR::JackCommandLineOptions& options, const string& opt) +{ + if (opt.empty() || opt == get_none_string()) { + options.midi_driver = ""; + return 0; + } + + for (MidiOptions::const_iterator i = midi_options.begin(); i != midi_options.end(); ++i) { + if (i->first == opt) { + options.midi_driver = i->second; + return 0; + } + } + + return -1; +} + diff --git a/libs/backends/jack/jack_utils.h b/libs/backends/jack/jack_utils.h index a7521ad1c4..5a06fe7ad7 100644 --- a/libs/backends/jack/jack_utils.h +++ b/libs/backends/jack/jack_utils.h @@ -180,6 +180,8 @@ namespace ARDOUR { */ bool get_jack_default_server_path (std::string& server_path); + typedef std::vector > MidiOptions; + /** * @return The name of the jack server config file */ @@ -228,6 +230,9 @@ namespace ARDOUR { std::string midi_driver; }; + std::vector enumerate_midi_options (); + int set_midi_option (ARDOUR::JackCommandLineOptions&, const std::string& opt); + /** * @return true if able to build a valid command line based on options */ -- cgit v1.2.3 From 645e9caeeefe0db6ed7615842b317f3b6ecb95d9 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Thu, 10 Oct 2013 12:59:33 -0400 Subject: basic use of new backend MIDI options --- gtk2_ardour/engine_dialog.cc | 39 +++++++++++++++++++++++++++++++++++---- gtk2_ardour/engine_dialog.h | 2 ++ 2 files changed, 37 insertions(+), 4 deletions(-) diff --git a/gtk2_ardour/engine_dialog.cc b/gtk2_ardour/engine_dialog.cc index c9ebcf4cf2..8ec62f844c 100644 --- a/gtk2_ardour/engine_dialog.cc +++ b/gtk2_ardour/engine_dialog.cc @@ -77,7 +77,6 @@ EngineControl::EngineControl () , lm_table (5, 2) , have_lm_results (false) , midi_refresh_button (_("Refresh list")) - , aj_button (_("Start MIDI ALSA/JACK bridge")) , ignore_changes (0) , _desired_sample_rate (0) , no_push (true) @@ -207,7 +206,7 @@ EngineControl::EngineControl () /* pack it all up */ notebook.pages().push_back (TabElem (basic_vbox, _("Audio"))); - notebook.pages().push_back (TabElem (midi_vbox, _("MIDI"))); + // notebook.pages().push_back (TabElem (midi_vbox, _("MIDI"))); notebook.pages().push_back (TabElem (lm_vbox, _("Latency"))); notebook.set_border_width (12); @@ -413,6 +412,10 @@ EngineControl::build_full_control_notebook () basic_packer.attach (*label, 2, 3, row, row+1, xopt, (AttachOptions) 0); ++row; + label = manage (left_aligned_label (_("MIDI I/O using"))); + basic_packer.attach (*label, 0, 1, row, row + 1, xopt, (AttachOptions) 0); + basic_packer.attach (midi_option_combo, 1, 2, row, row + 1, xopt, (AttachOptions) 0); + row++; } void @@ -510,7 +513,6 @@ EngineControl::setup_midi_tab_for_backend () void EngineControl::setup_midi_tab_for_jack () { - midi_vbox.pack_start (aj_button, false, false); } void @@ -612,7 +614,22 @@ EngineControl::backend_changed () */ list_devices (); } - + + vector midi_options = backend->enumerate_midi_options(); + + if (midi_options.size() == 1) { + /* only contains the "none" option */ + midi_option_combo.set_sensitive (false); + } else { + if (_have_control) { + set_popdown_strings (midi_option_combo, midi_options); + midi_option_combo.set_active_text (midi_options.front()); + midi_option_combo.set_sensitive (true); + } else { + midi_option_combo.set_sensitive (false); + } + } + maybe_display_saved_state (); } @@ -970,6 +987,10 @@ EngineControl::maybe_display_saved_state () show_buffer_duration (); input_latency.set_value (state->input_latency); output_latency.set_value (state->output_latency); + + if (!state->midi_option.empty()) { + midi_option_combo.set_active_text (state->midi_option); + } } } @@ -996,6 +1017,7 @@ EngineControl::get_state () node->add_property ("input-channels", (*i).input_channels); node->add_property ("output-channels", (*i).output_channels); node->add_property ("active", (*i).active ? "yes" : "no"); + node->add_property ("midi-option", (*i).midi_option); state_nodes->add_child_nocopy (*node); } @@ -1092,6 +1114,11 @@ EngineControl::set_state (const XMLNode& root) } state.active = string_is_affirmative (prop->value ()); + if ((prop = grandchild->property ("midi-option")) == 0) { + continue; + } + state.midi_option = prop->value (); + states.push_back (state); } } @@ -1109,6 +1136,7 @@ EngineControl::set_state (const XMLNode& root) buffer_size_combo.set_active_text (bufsize_as_string ((*i).buffer_size)); input_latency.set_value ((*i).input_latency); output_latency.set_value ((*i).output_latency); + midi_option_combo.set_active_text ((*i).midi_option); ignore_changes--; break; } @@ -1139,6 +1167,7 @@ EngineControl::push_state_to_backend (bool start) bool change_bufsize = false; bool change_latency = false; bool change_channels = false; + bool change_midi = false; uint32_t ochan = get_output_channels (); uint32_t ichan = get_input_channels (); @@ -1321,6 +1350,8 @@ EngineControl::push_state_to_backend (bool start) return -1; } } + + backend->set_midi_option (midi_option_combo.get_active_text()); if (start || (was_running && restart_required)) { if (ARDOUR_UI::instance()->reconnect_to_engine()) { diff --git a/gtk2_ardour/engine_dialog.h b/gtk2_ardour/engine_dialog.h index ac17814a5f..ae9c360e55 100644 --- a/gtk2_ardour/engine_dialog.h +++ b/gtk2_ardour/engine_dialog.h @@ -62,6 +62,7 @@ class EngineControl : public ArdourDialog, public PBD::ScopedConnectionList { Gtk::ComboBoxText driver_combo; Gtk::ComboBoxText device_combo; Gtk::ComboBoxText sample_rate_combo; + Gtk::ComboBoxText midi_option_combo; Gtk::ComboBoxText buffer_size_combo; Gtk::Label buffer_size_duration_label; Gtk::Adjustment input_latency_adjustment; @@ -149,6 +150,7 @@ class EngineControl : public ArdourDialog, public PBD::ScopedConnectionList { uint32_t input_channels; uint32_t output_channels; bool active; + std::string midi_option; State() : input_latency (0) -- cgit v1.2.3 From b5f36f57885cc52e9c435b84e42f34cc2a0214a7 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Thu, 10 Oct 2013 16:16:59 -0400 Subject: fix up parsing of send gain MIDI bindings so that they actually work --- libs/pbd/controllable_descriptor.cc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/libs/pbd/controllable_descriptor.cc b/libs/pbd/controllable_descriptor.cc index 9c930e4dbd..392b917ec8 100644 --- a/libs/pbd/controllable_descriptor.cc +++ b/libs/pbd/controllable_descriptor.cc @@ -104,11 +104,10 @@ ControllableDescriptor::set (const std::string& str) } } else if (path[1] == "send") { - if (path.size() == 3 && rest.size() == 3) { + if (path.size() == 3 && rest.size() == 2) { if (path[2] == "gain") { _subtype = SendGain; _target.push_back (atoi (rest[1])); - _target.push_back (atoi (rest[2])); } else { return -1; } -- cgit v1.2.3 From 25ca45f3959d5838a9c637ecc8687511d835140b Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Thu, 10 Oct 2013 16:17:46 -0400 Subject: add API to get current MIDI option from an audio/MIDI backend --- libs/ardour/ardour/audio_backend.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libs/ardour/ardour/audio_backend.h b/libs/ardour/ardour/audio_backend.h index f596164de7..4f7a153eec 100644 --- a/libs/ardour/ardour/audio_backend.h +++ b/libs/ardour/ardour/audio_backend.h @@ -257,6 +257,8 @@ class AudioBackend : public PortEngine { * @return zero if successful, non-zero otherwise */ virtual int set_midi_option (const std::string& option) = 0; + + virtual std::string midi_option () const = 0; /* State Control */ -- cgit v1.2.3 From c96108c2e129cb454d872479f23fbbe6548caf6d Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Thu, 10 Oct 2013 16:18:00 -0400 Subject: add API to get current MIDI option from an audio/MIDI backend --- libs/backends/jack/jack_audiobackend.cc | 6 ++++++ libs/backends/jack/jack_audiobackend.h | 1 + 2 files changed, 7 insertions(+) diff --git a/libs/backends/jack/jack_audiobackend.cc b/libs/backends/jack/jack_audiobackend.cc index 397ba0e498..98ba2d5ff7 100644 --- a/libs/backends/jack/jack_audiobackend.cc +++ b/libs/backends/jack/jack_audiobackend.cc @@ -409,6 +409,12 @@ JACKAudioBackend::interleaved () const return false; } +string +JACKAudioBackend::midi_option () const +{ + return _target_midi_option; +} + uint32_t JACKAudioBackend::input_channels () const { diff --git a/libs/backends/jack/jack_audiobackend.h b/libs/backends/jack/jack_audiobackend.h index 139e1f3cce..67e5e6001a 100644 --- a/libs/backends/jack/jack_audiobackend.h +++ b/libs/backends/jack/jack_audiobackend.h @@ -151,6 +151,7 @@ class JACKAudioBackend : public AudioBackend { std::vector enumerate_midi_options () const; int set_midi_option (const std::string&); + std::string midi_option () const; int midi_event_get (pframes_t& timestamp, size_t& size, uint8_t** buf, void* port_buffer, uint32_t event_index); int midi_event_put (void* port_buffer, pframes_t timestamp, const uint8_t* buffer, size_t size); -- cgit v1.2.3 From b194c1ad88b0b6a0b1c324a34980010a5bd0cb28 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Thu, 10 Oct 2013 16:18:27 -0400 Subject: more fixes and rationalizations for MIDI option handling in the audio MIDI setup --- gtk2_ardour/engine_dialog.cc | 35 +++++++++++++++++++++++++++++++---- gtk2_ardour/engine_dialog.h | 2 ++ 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/gtk2_ardour/engine_dialog.cc b/gtk2_ardour/engine_dialog.cc index 8ec62f844c..3e7fc76c01 100644 --- a/gtk2_ardour/engine_dialog.cc +++ b/gtk2_ardour/engine_dialog.cc @@ -58,6 +58,9 @@ using namespace Gtkmm2ext; using namespace PBD; using namespace Glib; +static const unsigned int midi_tab = -1; /* not currently in use */ +static const unsigned int latency_tab = 1; /* zero-based, page zero is the main setup page */ + EngineControl::EngineControl () : ArdourDialog (_("Audio/MIDI Setup")) , basic_packer (9, 3) @@ -254,6 +257,7 @@ EngineControl::EngineControl () sample_rate_combo.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::sample_rate_changed)); buffer_size_combo.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::buffer_size_changed)); device_combo.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::device_changed)); + midi_option_combo.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::midi_option_changed)); input_latency.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::parameter_changed)); output_latency.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::parameter_changed)); @@ -887,6 +891,14 @@ EngineControl::show_buffer_duration () buffer_size_duration_label.set_text (buf); } +void +EngineControl::midi_option_changed () +{ + if (!ignore_changes) { + save_state (); + } +} + void EngineControl::parameter_changed () { @@ -963,6 +975,7 @@ EngineControl::store_state (State& state) state.output_latency = get_output_latency (); state.input_channels = get_input_channels (); state.output_channels = get_output_channels (); + state.midi_option = get_midi_option (); } void @@ -1195,6 +1208,10 @@ EngineControl::push_state_to_backend (bool start) if (get_buffer_size() != backend->buffer_size()) { change_bufsize = true; } + + if (get_midi_option() != backend->midi_option()) { + change_midi = true; + } /* zero-requested channels means "all available" */ @@ -1228,6 +1245,7 @@ EngineControl::push_state_to_backend (bool start) change_bufsize = true; change_channels = true; change_latency = true; + change_midi = true; } } else { @@ -1278,6 +1296,7 @@ EngineControl::push_state_to_backend (bool start) if (change_driver || change_device || change_channels || change_latency || (change_rate && !backend->can_change_sample_rate_when_running()) || + change_midi || (change_bufsize && !backend->can_change_buffer_size_when_running())) { restart_required = true; } else { @@ -1286,7 +1305,7 @@ EngineControl::push_state_to_backend (bool start) if (was_running) { - if (!change_driver && !change_device && !change_channels && !change_latency) { + if (!change_driver && !change_device && !change_channels && !change_latency && !change_midi) { /* no changes in any parameters that absolutely require a * restart, so check those that might be changeable without a * restart @@ -1351,7 +1370,9 @@ EngineControl::push_state_to_backend (bool start) } } - backend->set_midi_option (midi_option_combo.get_active_text()); + if (change_midi) { + backend->set_midi_option (get_midi_option()); + } if (start || (was_running && restart_required)) { if (ARDOUR_UI::instance()->reconnect_to_engine()) { @@ -1427,6 +1448,12 @@ EngineControl::get_buffer_size () const return samples; } +string +EngineControl::get_midi_option () const +{ + return midi_option_combo.get_active_text(); +} + uint32_t EngineControl::get_input_channels() const { @@ -1519,12 +1546,12 @@ EngineControl::on_switch_page (GtkNotebookPage*, guint page_num) apply_button->set_sensitive (false); } - if (page_num == 1) { + if (page_num == midi_tab) { /* MIDI tab */ refresh_midi_display (); } - if (page_num == 2) { + if (page_num == latency_tab) { /* latency tab */ if (!ARDOUR::AudioEngine::instance()->running()) { diff --git a/gtk2_ardour/engine_dialog.h b/gtk2_ardour/engine_dialog.h index ae9c360e55..5ecd840e98 100644 --- a/gtk2_ardour/engine_dialog.h +++ b/gtk2_ardour/engine_dialog.h @@ -118,6 +118,7 @@ class EngineControl : public ArdourDialog, public PBD::ScopedConnectionList { void sample_rate_changed (); void buffer_size_changed (); void parameter_changed (); + void midi_option_changed (); void setup_midi_tab_for_backend (); void setup_midi_tab_for_jack (); @@ -134,6 +135,7 @@ class EngineControl : public ArdourDialog, public PBD::ScopedConnectionList { std::string get_device_name() const; std::string get_driver() const; std::string get_backend() const; + std::string get_midi_option () const; void device_changed (); void list_devices (); -- cgit v1.2.3 From cf3d8d15f0a442c382a8c6995da06f5a09eed00e Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Thu, 10 Oct 2013 16:54:46 -0400 Subject: some slightly hackish changes to make it possible to use the new internal ALSA midi client (soon to become a driver, however) --- libs/backends/jack/jack_utils.cc | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/libs/backends/jack/jack_utils.cc b/libs/backends/jack/jack_utils.cc index 0a5b3eb44d..9fb1e42352 100644 --- a/libs/backends/jack/jack_utils.cc +++ b/libs/backends/jack/jack_utils.cc @@ -83,6 +83,7 @@ namespace { const char * const dummy_driver_command_line_name = X_("dummy"); // should we provide more "pretty" names like above? + const char * const alsaint_midi_driver_name = X_("alsa"); const char * const alsaseq_midi_driver_name = X_("seq"); const char * const alsaraw_midi_driver_name = X_("raw"); const char * const winmme_midi_driver_name = X_("winmme"); @@ -742,6 +743,13 @@ ARDOUR::get_jack_command_line_string (JackCommandLineOptions& options, string& c } #endif + if (options.driver == alsa_driver_name) { + if (options.midi_driver == alsaint_midi_driver_name) { + args.push_back ("-I"); + args.push_back ("alsa_midi"); + } + } + string command_line_driver_name; if (!get_jack_command_line_audio_driver_name (options.driver, command_line_driver_name)) { @@ -852,9 +860,11 @@ ARDOUR::get_jack_command_line_string (JackCommandLineOptions& options, string& c if (options.driver == alsa_driver_name || options.driver == coreaudio_driver_name) { - if (!options.midi_driver.empty() && options.midi_driver != get_none_string ()) { - args.push_back ("-X"); - args.push_back (options.midi_driver); + if (options.midi_driver != alsaint_midi_driver_name) { + if (!options.midi_driver.empty() && options.midi_driver != get_none_string ()) { + args.push_back ("-X"); + args.push_back (options.midi_driver); + } } } @@ -911,8 +921,9 @@ ARDOUR::enumerate_midi_options () { if (midi_options.empty()) { #ifdef HAVE_ALSA - midi_options.push_back (make_pair (_("ALSA raw devices"), alsaraw_midi_driver_name)); - midi_options.push_back (make_pair (_("ALSA sequencer"), alsaseq_midi_driver_name)); + midi_options.push_back (make_pair (_("ALSA"), alsaint_midi_driver_name)); + midi_options.push_back (make_pair (_("(legacy) ALSA raw devices"), alsaraw_midi_driver_name)); + midi_options.push_back (make_pair (_("(legacy) ALSA sequencer"), alsaseq_midi_driver_name)); #endif #ifdef HAVE_PORTAUDIO /* Windows folks: what name makes sense here? Are there other -- cgit v1.2.3 From a38c0efbe78e9b4db8ecfa38f690f1697c731482 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Thu, 10 Oct 2013 21:07:17 -0400 Subject: minor tweaks to audio/MIDI setup window --- gtk2_ardour/ardour_ui.cc | 1 + gtk2_ardour/engine_dialog.cc | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc index fe773d94e8..3cbdfba019 100644 --- a/gtk2_ardour/ardour_ui.cc +++ b/gtk2_ardour/ardour_ui.cc @@ -4125,6 +4125,7 @@ int ARDOUR_UI::do_audio_midi_setup (uint32_t desired_sample_rate) { audio_midi_setup->set_desired_sample_rate (desired_sample_rate); + audio_midi_setup->set_position (WIN_POS_CENTER); switch (audio_midi_setup->run()) { case Gtk::RESPONSE_OK: diff --git a/gtk2_ardour/engine_dialog.cc b/gtk2_ardour/engine_dialog.cc index 3e7fc76c01..dccffde949 100644 --- a/gtk2_ardour/engine_dialog.cc +++ b/gtk2_ardour/engine_dialog.cc @@ -416,7 +416,7 @@ EngineControl::build_full_control_notebook () basic_packer.attach (*label, 2, 3, row, row+1, xopt, (AttachOptions) 0); ++row; - label = manage (left_aligned_label (_("MIDI I/O using"))); + label = manage (left_aligned_label (_("MIDI System"))); basic_packer.attach (*label, 0, 1, row, row + 1, xopt, (AttachOptions) 0); basic_packer.attach (midi_option_combo, 1, 2, row, row + 1, xopt, (AttachOptions) 0); row++; -- cgit v1.2.3 From ac8ec1434778e2ce9e59e38add43a11001a5cb3a Mon Sep 17 00:00:00 2001 From: Tim Mayberry Date: Wed, 24 Jul 2013 18:19:05 +1000 Subject: Fix script used to run libardour tests --- libs/ardour/run-tests.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/libs/ardour/run-tests.sh b/libs/ardour/run-tests.sh index fc7d68a8a5..e894fecb63 100755 --- a/libs/ardour/run-tests.sh +++ b/libs/ardour/run-tests.sh @@ -2,6 +2,7 @@ # # Run libardour test suite. # +. test-env.sh if [ "$1" == "--single" ] || [ "$2" == "--single" ]; then if [ "$1" == "--single" ]; then -- cgit v1.2.3 From d30fa04013673be456faec7b06e9e4ac0b31040c Mon Sep 17 00:00:00 2001 From: Tim Mayberry Date: Sat, 10 Aug 2013 13:14:52 +1000 Subject: Add get_test_sample_rate to common test functions in libardour tests --- libs/ardour/test/audio_region_test.cc | 2 +- libs/ardour/test/test_common.cc | 6 ++++++ libs/ardour/test/test_common.h | 2 ++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/libs/ardour/test/audio_region_test.cc b/libs/ardour/test/audio_region_test.cc index df3fa72d10..f5ecfc7d88 100644 --- a/libs/ardour/test/audio_region_test.cc +++ b/libs/ardour/test/audio_region_test.cc @@ -42,7 +42,7 @@ AudioRegionTest::setUp () std::string const test_wav_path = Glib::build_filename (new_test_output_dir(), "test.wav"); _playlist = PlaylistFactory::create (DataType::AUDIO, *_session, "test"); _audio_playlist = boost::dynamic_pointer_cast (_playlist); - _source = SourceFactory::createWritable (DataType::AUDIO, *_session, test_wav_path, "", false, Fs); + _source = SourceFactory::createWritable (DataType::AUDIO, *_session, test_wav_path, "", false, get_test_sample_rate ()); /* Write a staircase to the source */ diff --git a/libs/ardour/test/test_common.cc b/libs/ardour/test/test_common.cc index 8364d91be1..2d26a4da8e 100644 --- a/libs/ardour/test/test_common.cc +++ b/libs/ardour/test/test_common.cc @@ -51,3 +51,9 @@ new_test_output_dir () } while (g_mkdir_with_parents (new_test_dir.c_str(), 0755) != 0); return new_test_dir; } + +int +get_test_sample_rate () +{ + return 44100; +} diff --git a/libs/ardour/test/test_common.h b/libs/ardour/test/test_common.h index 9e15458781..1ddc177a9e 100644 --- a/libs/ardour/test/test_common.h +++ b/libs/ardour/test/test_common.h @@ -25,4 +25,6 @@ PBD::SearchPath test_search_path (); std::string new_test_output_dir (); +int get_test_sample_rate (); + #endif -- cgit v1.2.3 From e53bf08b101118d08166ffa22e7e7d41abdd702c Mon Sep 17 00:00:00 2001 From: Tim Mayberry Date: Sat, 10 Aug 2013 15:19:36 +1000 Subject: Delete test_globals.h/cc now that the contents has moved to test_common.h/cc --- libs/ardour/test/audio_region_read_test.cc | 1 - libs/ardour/test/audio_region_test.cc | 1 - libs/ardour/test/playlist_read_test.cc | 1 - libs/ardour/test/test_globals.cc | 3 --- libs/ardour/test/test_globals.h | 2 -- libs/ardour/wscript | 2 +- 6 files changed, 1 insertion(+), 9 deletions(-) delete mode 100644 libs/ardour/test/test_globals.cc delete mode 100644 libs/ardour/test/test_globals.h diff --git a/libs/ardour/test/audio_region_read_test.cc b/libs/ardour/test/audio_region_read_test.cc index dc3127ea2e..6a8e3600f1 100644 --- a/libs/ardour/test/audio_region_read_test.cc +++ b/libs/ardour/test/audio_region_read_test.cc @@ -20,7 +20,6 @@ #include "ardour/region.h" #include "ardour/audioregion.h" #include "audio_region_read_test.h" -#include "test_globals.h" CPPUNIT_TEST_SUITE_REGISTRATION (AudioRegionReadTest); diff --git a/libs/ardour/test/audio_region_test.cc b/libs/ardour/test/audio_region_test.cc index f5ecfc7d88..69f67d21ec 100644 --- a/libs/ardour/test/audio_region_test.cc +++ b/libs/ardour/test/audio_region_test.cc @@ -27,7 +27,6 @@ #include "ardour/audioregion.h" #include "ardour/audioplaylist.h" #include "audio_region_test.h" -#include "test_globals.h" #include "test_common.h" using namespace std; diff --git a/libs/ardour/test/playlist_read_test.cc b/libs/ardour/test/playlist_read_test.cc index 54b0bc4fd5..78b2e4eadd 100644 --- a/libs/ardour/test/playlist_read_test.cc +++ b/libs/ardour/test/playlist_read_test.cc @@ -22,7 +22,6 @@ #include "ardour/audioregion.h" #include "ardour/session.h" #include "playlist_read_test.h" -#include "test_globals.h" CPPUNIT_TEST_SUITE_REGISTRATION (PlaylistReadTest); diff --git a/libs/ardour/test/test_globals.cc b/libs/ardour/test/test_globals.cc deleted file mode 100644 index e40f951d75..0000000000 --- a/libs/ardour/test/test_globals.cc +++ /dev/null @@ -1,3 +0,0 @@ -#include "test_globals.h" - -int const Fs = 44100; diff --git a/libs/ardour/test/test_globals.h b/libs/ardour/test/test_globals.h deleted file mode 100644 index ccd5c27384..0000000000 --- a/libs/ardour/test/test_globals.h +++ /dev/null @@ -1,2 +0,0 @@ - -extern int const Fs; diff --git a/libs/ardour/wscript b/libs/ardour/wscript index 96932495f4..e91d019dd5 100644 --- a/libs/ardour/wscript +++ b/libs/ardour/wscript @@ -396,7 +396,7 @@ def build(bld): # only build these common sources once testcommon = bld(features = 'cxx') testcommon.includes = obj.includes + ['test', '../pbd', '..'] - testcommon.source = ['test/test_globals.cc', 'test/testrunner.cc', 'test/test_needing_session.cc', + testcommon.source = ['test/testrunner.cc', 'test/test_needing_session.cc', 'test/test_common.cc', 'test/dummy_lxvst.cc', 'test/audio_region_test.cc', 'test/test_util.cc'] testcommon.uselib = ['CPPUNIT','SIGCPP','GLIBMM','GTHREAD', 'SAMPLERATE','XML','LRDF','COREAUDIO'] -- cgit v1.2.3 From 1eed53c4a86f5cc54a3861df921f7656abefe193 Mon Sep 17 00:00:00 2001 From: Tim Mayberry Date: Sat, 10 Aug 2013 15:30:38 +1000 Subject: Update test to use correct SourceFactory::createWritable API --- libs/ardour/test/audio_region_test.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/ardour/test/audio_region_test.cc b/libs/ardour/test/audio_region_test.cc index 69f67d21ec..a25a78a40b 100644 --- a/libs/ardour/test/audio_region_test.cc +++ b/libs/ardour/test/audio_region_test.cc @@ -41,7 +41,7 @@ AudioRegionTest::setUp () std::string const test_wav_path = Glib::build_filename (new_test_output_dir(), "test.wav"); _playlist = PlaylistFactory::create (DataType::AUDIO, *_session, "test"); _audio_playlist = boost::dynamic_pointer_cast (_playlist); - _source = SourceFactory::createWritable (DataType::AUDIO, *_session, test_wav_path, "", false, get_test_sample_rate ()); + _source = SourceFactory::createWritable (DataType::AUDIO, *_session, test_wav_path, false, get_test_sample_rate ()); /* Write a staircase to the source */ -- cgit v1.2.3 From ee95f05fee7fb1a8eb644fdc098f390083c3b736 Mon Sep 17 00:00:00 2001 From: Tim Mayberry Date: Sat, 10 Aug 2013 16:09:28 +1000 Subject: Use test_search_path to find test data files for automation test --- libs/ardour/test/automation_list_property_test.cc | 24 +++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/libs/ardour/test/automation_list_property_test.cc b/libs/ardour/test/automation_list_property_test.cc index 90e2e22989..073fcf4b09 100644 --- a/libs/ardour/test/automation_list_property_test.cc +++ b/libs/ardour/test/automation_list_property_test.cc @@ -16,11 +16,15 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +#include +#include + #include "pbd/properties.h" #include "pbd/stateful_diff_command.h" #include "ardour/automation_list.h" #include "automation_list_property_test.h" #include "test_util.h" +#include "test_common.h" CPPUNIT_TEST_SUITE_REGISTRATION (AutomationListPropertyTest); @@ -52,9 +56,15 @@ AutomationListPropertyTest::basicTest () /* Now it has changed */ CPPUNIT_ASSERT_EQUAL (true, property.changed()); + std::string test_data_file1 = Glib::build_filename (test_search_path().front(), "automation_list_property_test1.ref"); + CPPUNIT_ASSERT (Glib::file_test (test_data_file1, Glib::FILE_TEST_EXISTS)); + XMLNode* foo = new XMLNode ("test"); property.get_changes_as_xml (foo); - check_xml (foo, "../libs/ardour/test/data/automation_list_property_test1.ref", ignore_properties); + check_xml (foo, test_data_file1, ignore_properties); + + std::string test_data_file2 = Glib::build_filename (test_search_path().front(), "automation_list_property_test2.ref"); + CPPUNIT_ASSERT (Glib::file_test (test_data_file2, Glib::FILE_TEST_EXISTS)); /* Do some more */ property.clear_changes (); @@ -64,7 +74,7 @@ AutomationListPropertyTest::basicTest () CPPUNIT_ASSERT_EQUAL (true, property.changed()); foo = new XMLNode ("test"); property.get_changes_as_xml (foo); - check_xml (foo, "../libs/ardour/test/data/automation_list_property_test2.ref", ignore_properties); + check_xml (foo, test_data_file2, ignore_properties); } /** Here's a StatefulDestructible class that has a AutomationListProperty */ @@ -119,11 +129,17 @@ AutomationListPropertyTest::undoTest () sheila->_jim->add (7, 8); StatefulDiffCommand sdc (sheila); + std::string test_data_file3 = Glib::build_filename (test_search_path().front(), "automation_list_property_test3.ref"); + CPPUNIT_ASSERT (Glib::file_test (test_data_file3, Glib::FILE_TEST_EXISTS)); + /* Undo */ sdc.undo (); - check_xml (&sheila->get_state(), "../libs/ardour/test/data/automation_list_property_test3.ref", ignore_properties); + check_xml (&sheila->get_state(), test_data_file3, ignore_properties); + + std::string test_data_file4 = Glib::build_filename (test_search_path().front(), "automation_list_property_test4.ref"); + CPPUNIT_ASSERT (Glib::file_test (test_data_file4, Glib::FILE_TEST_EXISTS)); /* Redo */ sdc.redo (); - check_xml (&sheila->get_state(), "../libs/ardour/test/data/automation_list_property_test4.ref", ignore_properties); + check_xml (&sheila->get_state(), test_data_file4, ignore_properties); } -- cgit v1.2.3 From b91fa19fe79d61f8f9b7fef6d54accbedb6dbc23 Mon Sep 17 00:00:00 2001 From: Tim Mayberry Date: Sat, 10 Aug 2013 18:26:47 +1000 Subject: return bool in test util function to check writing xml to file is successful --- libs/ardour/test/test_util.cc | 4 ++-- libs/ardour/test/test_util.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/libs/ardour/test/test_util.cc b/libs/ardour/test/test_util.cc index 1514012d97..220a57567c 100644 --- a/libs/ardour/test/test_util.cc +++ b/libs/ardour/test/test_util.cc @@ -60,12 +60,12 @@ check_xml (XMLNode* node, string ref_file, list const & ignore_propertie check_nodes (p, q, ignore_properties); } -void +bool write_ref (XMLNode* node, string ref_file) { XMLTree ref; ref.set_root (node); - ref.write (ref_file); + return ref.write (ref_file); } class TestReceiver : public Receiver diff --git a/libs/ardour/test/test_util.h b/libs/ardour/test/test_util.h index fea74a2ea8..dd4b078e9f 100644 --- a/libs/ardour/test/test_util.h +++ b/libs/ardour/test/test_util.h @@ -8,5 +8,5 @@ namespace ARDOUR { } extern void check_xml (XMLNode *, std::string, std::list const &); -extern void write_ref (XMLNode *, std::string); +extern bool write_ref (XMLNode *, std::string); extern ARDOUR::Session* load_session (std::string, std::string); -- cgit v1.2.3 From 42b475069bf96a97f07a1f88b39a51ff8a5b77d4 Mon Sep 17 00:00:00 2001 From: Tim Mayberry Date: Sat, 10 Aug 2013 18:49:45 +1000 Subject: Add arg to test function to be able to prefix test output directory This makes it much easier to find test output from a specific test --- libs/ardour/test/test_common.cc | 3 ++- libs/ardour/test/test_common.h | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/libs/ardour/test/test_common.cc b/libs/ardour/test/test_common.cc index 2d26a4da8e..61f92972d1 100644 --- a/libs/ardour/test/test_common.cc +++ b/libs/ardour/test/test_common.cc @@ -37,13 +37,14 @@ test_search_path () } std::string -new_test_output_dir () +new_test_output_dir (std::string prefix) { std::string tmp_dir = Glib::build_filename (g_get_tmp_dir(), "ardour_test"); std::string dir_name; std::string new_test_dir; do { ostringstream oss; + oss << prefix; oss << g_random_int (); dir_name = oss.str(); new_test_dir = Glib::build_filename (tmp_dir, dir_name); diff --git a/libs/ardour/test/test_common.h b/libs/ardour/test/test_common.h index 1ddc177a9e..91fd066ac2 100644 --- a/libs/ardour/test/test_common.h +++ b/libs/ardour/test/test_common.h @@ -23,7 +23,7 @@ PBD::SearchPath test_search_path (); -std::string new_test_output_dir (); +std::string new_test_output_dir (std::string prefix = ""); int get_test_sample_rate (); -- cgit v1.2.3 From 2e91da8a26809717284a06364d4354d037013fde Mon Sep 17 00:00:00 2001 From: Tim Mayberry Date: Sat, 10 Aug 2013 18:56:59 +1000 Subject: Write state data from automation list test to check why test is failing --- libs/ardour/test/automation_list_property_test.cc | 26 +++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/libs/ardour/test/automation_list_property_test.cc b/libs/ardour/test/automation_list_property_test.cc index 073fcf4b09..e5a74cad2f 100644 --- a/libs/ardour/test/automation_list_property_test.cc +++ b/libs/ardour/test/automation_list_property_test.cc @@ -32,6 +32,16 @@ using namespace std; using namespace PBD; using namespace ARDOUR; +void +write_automation_list_xml (XMLNode* node, std::string filename) +{ + // use the same output dir for all of them + static std::string test_output_dir = new_test_output_dir ("automation_list_property"); + std::string output_file = Glib::build_filename (test_output_dir, filename); + + CPPUNIT_ASSERT (write_ref (node, output_file)); +} + void AutomationListPropertyTest::basicTest () { @@ -56,14 +66,17 @@ AutomationListPropertyTest::basicTest () /* Now it has changed */ CPPUNIT_ASSERT_EQUAL (true, property.changed()); - std::string test_data_file1 = Glib::build_filename (test_search_path().front(), "automation_list_property_test1.ref"); + std::string test_data_filename = "automation_list_property_test1.ref"; + std::string test_data_file1 = Glib::build_filename (test_search_path().front(), test_data_filename); CPPUNIT_ASSERT (Glib::file_test (test_data_file1, Glib::FILE_TEST_EXISTS)); XMLNode* foo = new XMLNode ("test"); property.get_changes_as_xml (foo); + write_automation_list_xml (foo, test_data_filename); check_xml (foo, test_data_file1, ignore_properties); - std::string test_data_file2 = Glib::build_filename (test_search_path().front(), "automation_list_property_test2.ref"); + test_data_filename = "automation_list_property_test2.ref"; + std::string test_data_file2 = Glib::build_filename (test_search_path().front(), test_data_filename); CPPUNIT_ASSERT (Glib::file_test (test_data_file2, Glib::FILE_TEST_EXISTS)); /* Do some more */ @@ -74,6 +87,7 @@ AutomationListPropertyTest::basicTest () CPPUNIT_ASSERT_EQUAL (true, property.changed()); foo = new XMLNode ("test"); property.get_changes_as_xml (foo); + write_automation_list_xml (foo, test_data_filename); check_xml (foo, test_data_file2, ignore_properties); } @@ -129,17 +143,21 @@ AutomationListPropertyTest::undoTest () sheila->_jim->add (7, 8); StatefulDiffCommand sdc (sheila); - std::string test_data_file3 = Glib::build_filename (test_search_path().front(), "automation_list_property_test3.ref"); + std::string test_data_filename = "automation_list_property_test3.ref"; + std::string test_data_file3 = Glib::build_filename (test_search_path().front(), test_data_filename); CPPUNIT_ASSERT (Glib::file_test (test_data_file3, Glib::FILE_TEST_EXISTS)); /* Undo */ sdc.undo (); + write_automation_list_xml (&sheila->get_state(), test_data_filename); check_xml (&sheila->get_state(), test_data_file3, ignore_properties); - std::string test_data_file4 = Glib::build_filename (test_search_path().front(), "automation_list_property_test4.ref"); + test_data_filename = "automation_list_property_test4.ref"; + std::string test_data_file4 = Glib::build_filename (test_search_path().front(), test_data_filename); CPPUNIT_ASSERT (Glib::file_test (test_data_file4, Glib::FILE_TEST_EXISTS)); /* Redo */ sdc.redo (); + write_automation_list_xml (&sheila->get_state(), test_data_filename); check_xml (&sheila->get_state(), test_data_file4, ignore_properties); } -- cgit v1.2.3 From 034c80088c9eeeb13d9240769094a9e3a646eb29 Mon Sep 17 00:00:00 2001 From: Tim Mayberry Date: Fri, 16 Aug 2013 21:41:55 +1000 Subject: Use test-env.sh in run-session-tests.sh Also make the script executable --- libs/ardour/run-session-tests.sh | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) mode change 100644 => 100755 libs/ardour/run-session-tests.sh diff --git a/libs/ardour/run-session-tests.sh b/libs/ardour/run-session-tests.sh old mode 100644 new mode 100755 index 63218d8887..034f8b5a7f --- a/libs/ardour/run-session-tests.sh +++ b/libs/ardour/run-session-tests.sh @@ -8,20 +8,7 @@ if [ ! -f './tempo.cc' ]; then exit 1; fi -cd ../.. -top=`pwd` -cd build - -libs='libs' - -export LD_LIBRARY_PATH=$libs/audiographer:$libs/vamp-sdk:$libs/surfaces:$libs/surfaces/control_protocol:$libs/ardour:$libs/midi++2:$libs/pbd:$libs/rubberband:$libs/soundtouch:$libs/gtkmm2ext:$libs/appleutility:$libs/taglib:$libs/evoral:$libs/evoral/src/libsmf:$libs/timecode:/usr/local/lib:/usr/local/lib64:$LD_LIBRARY_PATH - -export ARDOUR_CONFIG_PATH=$top:$top/gtk2_ardour:$libs/..:$libs/../gtk2_ardour -export ARDOUR_PANNER_PATH=$libs/panners/2in2out:$libs/panners/1in2out:$libs/panners/vbap -export ARDOUR_SURFACES_PATH=$libs/surfaces/osc:$libs/surfaces/generic_midi:$libs/surfaces/tranzport:$libs/surfaces/powermate:$libs/surfaces/mackie -export ARDOUR_MCP_PATH="../mcp" -export ARDOUR_DLL_PATH=$libs -export ARDOUR_DATA_PATH=$top/gtk2_ardour:$top/build/gtk2_ardour:. +. test-env.sh f="" if [ "$1" == "--debug" -o "$1" == "--valgrind" ]; then -- cgit v1.2.3 From 025adbe920013e2f8d34569a2e5edf20dc7163af Mon Sep 17 00:00:00 2001 From: Tim Mayberry Date: Fri, 11 Oct 2013 12:01:15 +1000 Subject: Add AudioEngine::set_default_backend --- libs/ardour/ardour/audioengine.h | 1 + libs/ardour/audioengine.cc | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/libs/ardour/ardour/audioengine.h b/libs/ardour/ardour/audioengine.h index ddffd1d5c0..45257d8129 100644 --- a/libs/ardour/ardour/audioengine.h +++ b/libs/ardour/ardour/audioengine.h @@ -70,6 +70,7 @@ public: int discover_backends(); std::vector available_backends() const; std::string current_backend_name () const; + boost::shared_ptr set_default_backend (); boost::shared_ptr set_backend (const std::string&, const std::string& arg1, const std::string& arg2); boost::shared_ptr current_backend() const { return _backend; } bool setup_required () const; diff --git a/libs/ardour/audioengine.cc b/libs/ardour/audioengine.cc index f79c90feea..a9956666d8 100644 --- a/libs/ardour/audioengine.cc +++ b/libs/ardour/audioengine.cc @@ -557,6 +557,16 @@ AudioEngine::drop_backend () } } +boost::shared_ptr +AudioEngine::set_default_backend () +{ + if (_backends.empty()) { + return boost::shared_ptr(); + } + + return set_backend (_backends.begin()->first, "", ""); +} + boost::shared_ptr AudioEngine::set_backend (const std::string& name, const std::string& arg1, const std::string& arg2) { -- cgit v1.2.3 From a0b975186686b2be4e609a70f12f81073b4784de Mon Sep 17 00:00:00 2001 From: Tim Mayberry Date: Fri, 11 Oct 2013 12:02:07 +1000 Subject: Fix ardour tests to work with new AudioEngine/Backends changes --- libs/ardour/test-env.sh | 1 + libs/ardour/test/load_session.cc | 4 +--- libs/ardour/test/profiling/load_session.cc | 4 +--- libs/ardour/test/profiling/runpc.cc | 3 +-- libs/ardour/test/session_test.cc | 16 +++++----------- libs/ardour/test/test_needing_session.cc | 4 +--- libs/ardour/test/test_util.cc | 5 ++++- 7 files changed, 14 insertions(+), 23 deletions(-) diff --git a/libs/ardour/test-env.sh b/libs/ardour/test-env.sh index aa2cff9219..561f54d694 100644 --- a/libs/ardour/test-env.sh +++ b/libs/ardour/test-env.sh @@ -22,3 +22,4 @@ export ARDOUR_SURFACES_PATH=$libs/surfaces/osc:$libs/surfaces/generic_midi:$libs export ARDOUR_MCP_PATH="../mcp" export ARDOUR_DLL_PATH=$libs export ARDOUR_DATA_PATH=$top/gtk2_ardour:$top/build/gtk2_ardour:. +export ARDOUR_BACKEND_PATH=$libs/backends/jack diff --git a/libs/ardour/test/load_session.cc b/libs/ardour/test/load_session.cc index 3f56e63577..f2a2a6922e 100644 --- a/libs/ardour/test/load_session.cc +++ b/libs/ardour/test/load_session.cc @@ -3,7 +3,6 @@ #include "ardour/ardour.h" #include "ardour/audioengine.h" #include "ardour/session.h" -#include "midi++/manager.h" #include #include @@ -41,9 +40,8 @@ int main (int argc, char* argv[]) AudioEngine::instance()->remove_session (); delete s; - AudioEngine::instance()->stop (true); + AudioEngine::instance()->stop (); - MIDI::Manager::destroy (); AudioEngine::destroy (); return 0; diff --git a/libs/ardour/test/profiling/load_session.cc b/libs/ardour/test/profiling/load_session.cc index 3f56e63577..f2a2a6922e 100644 --- a/libs/ardour/test/profiling/load_session.cc +++ b/libs/ardour/test/profiling/load_session.cc @@ -3,7 +3,6 @@ #include "ardour/ardour.h" #include "ardour/audioengine.h" #include "ardour/session.h" -#include "midi++/manager.h" #include #include @@ -41,9 +40,8 @@ int main (int argc, char* argv[]) AudioEngine::instance()->remove_session (); delete s; - AudioEngine::instance()->stop (true); + AudioEngine::instance()->stop (); - MIDI::Manager::destroy (); AudioEngine::destroy (); return 0; diff --git a/libs/ardour/test/profiling/runpc.cc b/libs/ardour/test/profiling/runpc.cc index ddbd463234..6538fcf88a 100644 --- a/libs/ardour/test/profiling/runpc.cc +++ b/libs/ardour/test/profiling/runpc.cc @@ -1,5 +1,4 @@ #include -#include "midi++/manager.h" #include "pbd/textreceiver.h" #include "pbd/compose.h" #include "pbd/enumwriter.h" @@ -31,7 +30,7 @@ main (int argc, char* argv[]) cout << "INFO: " << session->get_routes()->size() << " routes.\n"; for (int i = 0; i < 32768; ++i) { - session->process (session->engine().frames_per_cycle ()); + session->process (session->engine().samples_per_cycle ()); } return 0; diff --git a/libs/ardour/test/session_test.cc b/libs/ardour/test/session_test.cc index 83273b5a2e..ba57b4bd63 100644 --- a/libs/ardour/test/session_test.cc +++ b/libs/ardour/test/session_test.cc @@ -3,7 +3,7 @@ #include #include -#include "midi++/manager.h" + #include "pbd/textreceiver.h" #include "pbd/file_utils.h" #include "ardour/session.h" @@ -33,17 +33,12 @@ SessionTest::setUp () text_receiver.listen_to (fatal); text_receiver.listen_to (warning); - // this is not a good singleton constructor pattern - AudioEngine* engine = 0; - - try { - engine = new AudioEngine ("session_test", ""); - } catch (const AudioEngine::NoBackendAvailable& engine_exception) { - cerr << engine_exception.what (); - } + AudioEngine* engine = AudioEngine::create (); CPPUNIT_ASSERT (engine); + CPPUNIT_ASSERT (engine->set_default_backend()); + init_post_engine (); CPPUNIT_ASSERT (engine->start () == 0); @@ -53,9 +48,8 @@ void SessionTest::tearDown () { // this is needed or there is a crash in MIDI::Manager::destroy - AudioEngine::instance()->stop (true); + AudioEngine::instance()->stop (); - MIDI::Manager::destroy (); AudioEngine::destroy (); } diff --git a/libs/ardour/test/test_needing_session.cc b/libs/ardour/test/test_needing_session.cc index 181d391e01..4525a758b3 100644 --- a/libs/ardour/test/test_needing_session.cc +++ b/libs/ardour/test/test_needing_session.cc @@ -1,6 +1,5 @@ #include -#include "midi++/manager.h" #include "pbd/compose.h" #include "pbd/enumwriter.h" #include "ardour/session.h" @@ -26,8 +25,7 @@ TestNeedingSession::tearDown () { AudioEngine::instance()->remove_session (); delete _session; - AudioEngine::instance()->stop (true); + AudioEngine::instance()->stop (); - MIDI::Manager::destroy (); AudioEngine::destroy (); } diff --git a/libs/ardour/test/test_util.cc b/libs/ardour/test/test_util.cc index 220a57567c..dfbf40d351 100644 --- a/libs/ardour/test/test_util.cc +++ b/libs/ardour/test/test_util.cc @@ -124,7 +124,10 @@ load_session (string dir, string state) */ Config->set_use_lxvst (false); - AudioEngine* engine = new AudioEngine ("test", ""); + AudioEngine* engine = AudioEngine::create (); + + CPPUNIT_ASSERT (engine->set_default_backend ()); + init_post_engine (); CPPUNIT_ASSERT (engine->start () == 0); -- cgit v1.2.3 From 57262331c1d6d512a50a999782054cca97ed715a Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Fri, 11 Oct 2013 15:58:51 -0400 Subject: don't use a possibly non-existent window as a transient parent when showing a dialog about engine failure --- gtk2_ardour/ardour_ui.cc | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc index 3cbdfba019..2da5de6936 100644 --- a/gtk2_ardour/ardour_ui.cc +++ b/gtk2_ardour/ardour_ui.cc @@ -3807,8 +3807,13 @@ int ARDOUR_UI::reconnect_to_engine () { if (AudioEngine::instance()->start ()) { - MessageDialog msg (*editor, _("Could not reconnect to the Audio/MIDI engine")); - msg.run (); + if (editor) { + MessageDialog msg (*editor, _("Could not reconnect to the Audio/MIDI engine")); + msg.run (); + } else { + MessageDialog msg (_("Could not reconnect to the Audio/MIDI engine")); + msg.run (); + } return -1; } -- cgit v1.2.3 From 277b3e8fc947c74fb6d44f5dfd6588502cb34cf4 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Fri, 11 Oct 2013 17:11:44 -0400 Subject: update Linux packaging script to include backends --- tools/linux_packaging/build | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tools/linux_packaging/build b/tools/linux_packaging/build index 72e60257f0..d24aec4f8e 100755 --- a/tools/linux_packaging/build +++ b/tools/linux_packaging/build @@ -150,6 +150,7 @@ Shared=$APPDIR/share Plugins=$APPLIB/plugins Surfaces=$APPLIB/surfaces Panners=$APPLIB/panners +Backends=$APPLIB/backends Modules=$Libraries/modules Loaders=$Libraries/loaders @@ -197,6 +198,7 @@ mkdir -p $PatchFiles mkdir -p $MackieControl mkdir -p $ExportFormats mkdir -p $Panners +mkdir -p $Backends mkdir -p $Templates mkdir -p $Shared/doc @@ -382,6 +384,9 @@ done # Panners cp $BUILD_ROOT/libs/panners/*/lib*.so* $Panners +# Backends +cp $BUILD_ROOT/libs/backends/*/lib*.so* $Backends + # VAMP plugins that we use cp $BUILD_ROOT/libs/vamp-plugins/libardourvampplugins.so* $Libraries -- cgit v1.2.3 From 33f211d999cda936f6cf289964fd5cdc4012186d Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Fri, 11 Oct 2013 17:12:37 -0400 Subject: update OS X packaging script to include backends --- tools/osx_packaging/osx_build | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tools/osx_packaging/osx_build b/tools/osx_packaging/osx_build index 96ed165832..8d4799163e 100755 --- a/tools/osx_packaging/osx_build +++ b/tools/osx_packaging/osx_build @@ -99,6 +99,7 @@ Locale=$Resources/locale Plugins=$APPROOT/Plugins Surfaces=$Frameworks/surfaces Panners=$Frameworks/panners +Backends=$Frameworks/backends MidiMaps=$Shared/midi_maps ExportFormats=$Shared/export Templates=$Shared/templates @@ -132,6 +133,7 @@ mkdir -p $APPROOT/Resources mkdir -p $Plugins mkdir -p $Surfaces mkdir -p $Panners +mkdir -p $Backends mkdir -p $MidiMaps mkdir -p $ExportFormats mkdir -p $Templates @@ -308,6 +310,8 @@ cp $BUILD_ROOT/libs/surfaces/control_protocol/libardourcp*.dylib $Frameworks # Panners cp $BUILD_ROOT/libs/panners/*/lib*.dylib $Panners +# Backends +cp $BUILD_ROOT/libs/backends/*/lib*.dylib $Backends # Export Formats/Presets for f in $BUILD_ROOT/../export/*.preset $BUILD_ROOT/../export/*.format ; do -- cgit v1.2.3 From b688dc802f43c94e9aba1e97d4f1e27b36496bfe Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Sat, 12 Oct 2013 09:59:33 -0400 Subject: remove erroneous ` in string --- gtk2_ardour/ardour_ui.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc index 2da5de6936..050bccd052 100644 --- a/gtk2_ardour/ardour_ui.cc +++ b/gtk2_ardour/ardour_ui.cc @@ -435,7 +435,7 @@ ARDOUR_UI::engine_halted (const char* reason, bool free_reason) msgstr = string_compose (_("The audio backend was shutdown because:\n\n%1"), reason); } else { msgstr = string_compose (_("\ -`The audio backend has either been shutdown or it\n\ +The audio backend has either been shutdown or it\n\ disconnected %1 because %1\n\ was not fast enough. Try to restart\n\ the audio backend and save the session."), PROGRAM_NAME); -- cgit v1.2.3 From 057f06703b22065ac6a6c902d981ca6306ee2dc5 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Sat, 12 Oct 2013 10:02:37 -0400 Subject: slightly change AudioBackend API to allow specifying that the device is being started for latency measurement We don't want any existing latency settings used when re-measuring latency measurements. --- libs/ardour/ardour/audio_backend.h | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/libs/ardour/ardour/audio_backend.h b/libs/ardour/ardour/audio_backend.h index 4f7a153eec..cbe0bfce50 100644 --- a/libs/ardour/ardour/audio_backend.h +++ b/libs/ardour/ardour/audio_backend.h @@ -262,6 +262,16 @@ class AudioBackend : public PortEngine { /* State Control */ + /* non-virtual method to avoid possible overrides of default + * parameters. See Scott Meyers or other books on C++ to + * understand this pattern, or possibly just this: + * + * http://stackoverflow.com/questions/12139786/good-pratice-default-arguments-for-pure-virtual-method + */ + int start (bool for_latency_measurement=false) { + return _start (for_latency_measurement); + } + /** Start using the device named in the most recent call * to set_device(), with the parameters set by various * the most recent calls to set_sample_rate() etc. etc. @@ -271,9 +281,14 @@ class AudioBackend : public PortEngine { * the AudioEngine referenced by @param engine. These calls will * occur in a thread created by and/or under the control of the backend. * + * @param for_latency_measurement if true, the device is being started + * to carry out latency measurements and the backend should this + * take care to return latency numbers that do not reflect + * any existing systemic latency settings. + * * Return zero if successful, negative values otherwise. */ - virtual int start () = 0; + virtual int _start (bool for_latency_measurement) = 0; /** Stop using the device currently in use. * -- cgit v1.2.3 From 589ef168c197c85ab1e557bc2e33ea9462cff430 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Sat, 12 Oct 2013 10:03:15 -0400 Subject: adapt JACK audiobackend to pay attention to new _start() API related to latency measurement --- libs/backends/jack/jack_audiobackend.cc | 8 ++++---- libs/backends/jack/jack_audiobackend.h | 4 ++-- libs/backends/jack/jack_utils.cc | 4 ++-- libs/backends/jack/jack_utils.h | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/libs/backends/jack/jack_audiobackend.cc b/libs/backends/jack/jack_audiobackend.cc index 98ba2d5ff7..7f92152cf7 100644 --- a/libs/backends/jack/jack_audiobackend.cc +++ b/libs/backends/jack/jack_audiobackend.cc @@ -471,7 +471,7 @@ JACKAudioBackend::raw_buffer_size(DataType t) } void -JACKAudioBackend::setup_jack_startup_command () +JACKAudioBackend::setup_jack_startup_command (bool for_latency_measurement) { /* first we map the parameters that have been set onto a * JackCommandLineOptions object. @@ -505,7 +505,7 @@ JACKAudioBackend::setup_jack_startup_command () string cmdline; - if (!get_jack_command_line_string (options, cmdline)) { + if (!get_jack_command_line_string (options, cmdline, for_latency_measurement)) { /* error, somehow - we will still try to start JACK * automatically but it will be without our preferred options */ @@ -520,7 +520,7 @@ JACKAudioBackend::setup_jack_startup_command () /* ---- BASIC STATE CONTROL API: start/stop/pause/freewheel --- */ int -JACKAudioBackend::start () +JACKAudioBackend::_start (bool for_latency_measurement) { if (!available()) { @@ -528,7 +528,7 @@ JACKAudioBackend::start () /* we will be starting JACK, so set up the command that JACK will use when it (auto-)starts */ - setup_jack_startup_command (); + setup_jack_startup_command (for_latency_measurement); } if (_jack_connection->open ()) { diff --git a/libs/backends/jack/jack_audiobackend.h b/libs/backends/jack/jack_audiobackend.h index 67e5e6001a..3c48be5ead 100644 --- a/libs/backends/jack/jack_audiobackend.h +++ b/libs/backends/jack/jack_audiobackend.h @@ -89,7 +89,7 @@ class JACKAudioBackend : public AudioBackend { std::string control_app_name () const; void launch_control_app (); - int start (); + int _start (bool for_latency_measurement); int stop (); int pause (); int freewheel (bool); @@ -225,7 +225,7 @@ class JACKAudioBackend : public AudioBackend { void* process_thread (); static void* _start_process_thread (void*); - void setup_jack_startup_command (); + void setup_jack_startup_command (bool for_latency_measurement); /* pffooo */ diff --git a/libs/backends/jack/jack_utils.cc b/libs/backends/jack/jack_utils.cc index 9fb1e42352..b7149e84b1 100644 --- a/libs/backends/jack/jack_utils.cc +++ b/libs/backends/jack/jack_utils.cc @@ -685,7 +685,7 @@ ARDOUR::JackCommandLineOptions::JackCommandLineOptions () } bool -ARDOUR::get_jack_command_line_string (JackCommandLineOptions& options, string& command_line) +ARDOUR::get_jack_command_line_string (JackCommandLineOptions& options, string& command_line, bool for_latency_measurement) { vector args; @@ -821,7 +821,7 @@ ARDOUR::get_jack_command_line_string (JackCommandLineOptions& options, string& c args.push_back ("-p"); args.push_back (to_string (options.period_size, std::dec)); - if (get_jack_audio_driver_supports_latency_adjustment (options.driver)) { + if (!for_latency_measurement && get_jack_audio_driver_supports_latency_adjustment (options.driver)) { if (options.input_latency) { args.push_back ("-I"); args.push_back (to_string (options.input_latency, std::dec)); diff --git a/libs/backends/jack/jack_utils.h b/libs/backends/jack/jack_utils.h index 5a06fe7ad7..ee8575c5c8 100644 --- a/libs/backends/jack/jack_utils.h +++ b/libs/backends/jack/jack_utils.h @@ -236,5 +236,5 @@ namespace ARDOUR { /** * @return true if able to build a valid command line based on options */ - bool get_jack_command_line_string (JackCommandLineOptions& options, std::string& command_line); + bool get_jack_command_line_string (JackCommandLineOptions& options, std::string& command_line, bool for_latency_measurement); } -- cgit v1.2.3 From fdda8127eff8daad24a64ff9173d5ce4dc1e3f21 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Sat, 12 Oct 2013 10:03:50 -0400 Subject: adapt AudioEngine to new AudioBackend API --- libs/ardour/ardour/audioengine.h | 7 +++-- libs/ardour/audioengine.cc | 67 ++++++++++++++++++++++++++-------------- 2 files changed, 48 insertions(+), 26 deletions(-) diff --git a/libs/ardour/ardour/audioengine.h b/libs/ardour/ardour/audioengine.h index 45257d8129..d5dcbffe2b 100644 --- a/libs/ardour/ardour/audioengine.h +++ b/libs/ardour/ardour/audioengine.h @@ -83,8 +83,8 @@ public: * just forward to a backend implementation. */ - int start (); - int stop (); + int start (bool for_latency_measurement=false); + int stop (bool for_latency_measurement=false); int pause (); int freewheel (bool start_stop); float get_cpu_load() const ; @@ -194,7 +194,7 @@ public: MTDM* mtdm(); int prepare_for_latency_measurement (); - void start_latency_detection (); + int start_latency_detection (); void stop_latency_detection (); void set_latency_input_port (const std::string&); void set_latency_output_port (const std::string&); @@ -229,6 +229,7 @@ public: std::string _latency_input_name; std::string _latency_output_name; framecnt_t _latency_signal_latency; + bool _stopped_for_latency; bool _started_for_latency; bool _in_destructor; diff --git a/libs/ardour/audioengine.cc b/libs/ardour/audioengine.cc index a9956666d8..c2224a8b5e 100644 --- a/libs/ardour/audioengine.cc +++ b/libs/ardour/audioengine.cc @@ -80,7 +80,7 @@ AudioEngine::AudioEngine () , _latency_output_port (0) , _latency_flush_frames (0) , _latency_signal_latency (0) - , _started_for_latency (false) + , _stopped_for_latency (false) , _in_destructor (false) { g_atomic_int_set (&m_meter_exit, 0); @@ -596,7 +596,7 @@ AudioEngine::set_backend (const std::string& name, const std::string& arg1, cons /* BACKEND PROXY WRAPPERS */ int -AudioEngine::start () +AudioEngine::start (bool for_latency) { if (!_backend) { return -1; @@ -609,7 +609,7 @@ AudioEngine::start () _processed_frames = 0; last_monitor_check = 0; - if (_backend->start()) { + if (_backend->start (for_latency)) { return -1; } @@ -625,7 +625,7 @@ AudioEngine::start () start_metering_thread (); - if (!_started_for_latency) { + if (!for_latency) { Running(); /* EMIT SIGNAL */ } @@ -633,7 +633,7 @@ AudioEngine::start () } int -AudioEngine::stop () +AudioEngine::stop (bool for_latency) { if (!_backend) { return 0; @@ -654,7 +654,10 @@ AudioEngine::stop () stop_metering_thread (); Port::PortDrop (); - Stopped (); /* EMIT SIGNAL */ + + if (!for_latency) { + Stopped (); /* EMIT SIGNAL */ + } return 0; } @@ -1018,7 +1021,10 @@ AudioEngine::halted_callback (const char* why) _running = false; Port::PortDrop (); /* EMIT SIGNAL */ - Halted (why); /* EMIT SIGNAL */ + + if (!_started_for_latency) { + Halted (why); /* EMIT SIGNAL */ + } } bool @@ -1047,23 +1053,26 @@ AudioEngine::mtdm() int AudioEngine::prepare_for_latency_measurement () { - if (!running()) { - _started_for_latency = true; + if (running()) { + _stopped_for_latency = true; + stop (true); + } - if (start()) { - _started_for_latency = false; - return -1; - } + if (start (true)) { + _started_for_latency = true; + return -1; } return 0; } -void +int AudioEngine::start_latency_detection () { - if (prepare_for_latency_measurement ()) { - return; + if (!running()) { + if (prepare_for_latency_measurement ()) { + return -1; + } } PortEngine& pe (port_engine()); @@ -1077,27 +1086,32 @@ AudioEngine::start_latency_detection () PortEngine::PortHandle* in = pe.get_port_by_name (_latency_input_name); if (!out || !in) { - return; + stop (true); + return -1; } /* create the ports we will use to read/write data */ if ((_latency_output_port = pe.register_port ("latency_out", DataType::AUDIO, IsOutput)) == 0) { - return; + stop (true); + return -1; } if (pe.connect (_latency_output_port, _latency_output_name)) { pe.unregister_port (_latency_output_port); - return; + stop (true); + return -1; } const string portname ("latency_in"); if ((_latency_input_port = pe.register_port (portname, DataType::AUDIO, IsInput)) == 0) { pe.unregister_port (_latency_output_port); - return; + stop (true); + return -1; } if (pe.connect (_latency_input_name, make_port_name_non_relative (portname))) { pe.unregister_port (_latency_output_port); - return; + stop (true); + return -1; } LatencyRange lr; @@ -1113,6 +1127,7 @@ AudioEngine::start_latency_detection () _measuring_latency = true; _latency_flush_frames = samples_per_cycle(); + return 0; } void @@ -1128,9 +1143,15 @@ AudioEngine::stop_latency_detection () port_engine().unregister_port (_latency_input_port); _latency_input_port = 0; } - if (_started_for_latency) { - stop (); + + stop (true); + + if (_stopped_for_latency) { + start (); } + + _stopped_for_latency = false; + _started_for_latency = false; } void -- cgit v1.2.3 From 949a0d29344b43ad4df998e6041a86b41fbd4869 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Sat, 12 Oct 2013 10:04:20 -0400 Subject: minor adjustments to latency measurement UI stuff --- gtk2_ardour/engine_dialog.cc | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/gtk2_ardour/engine_dialog.cc b/gtk2_ardour/engine_dialog.cc index dccffde949..63c817d70c 100644 --- a/gtk2_ardour/engine_dialog.cc +++ b/gtk2_ardour/engine_dialog.cc @@ -1648,23 +1648,25 @@ EngineControl::start_latency_detection () { ARDOUR::AudioEngine::instance()->set_latency_input_port (lm_input_channel_combo.get_active_text()); ARDOUR::AudioEngine::instance()->set_latency_output_port (lm_output_channel_combo.get_active_text()); - ARDOUR::AudioEngine::instance()->start_latency_detection (); - lm_results.set_text (_("Detecting ...")); - latency_timeout = Glib::signal_timeout().connect (mem_fun (*this, &EngineControl::check_latency_measurement), 250); - lm_start_stop_label.set_text (_("Cancel measurement")); - have_lm_results = false; - lm_input_channel_combo.set_sensitive (false); - lm_output_channel_combo.set_sensitive (false); + + if (ARDOUR::AudioEngine::instance()->start_latency_detection () == 0) { + lm_results.set_text (_("Detecting ...")); + latency_timeout = Glib::signal_timeout().connect (mem_fun (*this, &EngineControl::check_latency_measurement), 100); + lm_start_stop_label.set_text (_("Cancel measurement")); + have_lm_results = false; + lm_input_channel_combo.set_sensitive (false); + lm_output_channel_combo.set_sensitive (false); + } } void EngineControl::end_latency_detection () { - ARDOUR::AudioEngine::instance()->stop_latency_detection (); latency_timeout.disconnect (); + ARDOUR::AudioEngine::instance()->stop_latency_detection (); lm_start_stop_label.set_text (_("Measure latency")); if (!have_lm_results) { - lm_results.set_markup ("No measurement results yet"); + lm_results.set_markup (string_compose ("%1", _("No measurement results yet"))); } lm_input_channel_combo.set_sensitive (true); lm_output_channel_combo.set_sensitive (true); -- cgit v1.2.3 From 7444ac128e80c9221b37889bbd4baf0a844169f3 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Sat, 12 Oct 2013 11:07:57 -0400 Subject: fix inability to export twice --- libs/backends/jack/jack_audiobackend.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/backends/jack/jack_audiobackend.cc b/libs/backends/jack/jack_audiobackend.cc index 7f92152cf7..ff76486bad 100644 --- a/libs/backends/jack/jack_audiobackend.cc +++ b/libs/backends/jack/jack_audiobackend.cc @@ -605,7 +605,7 @@ JACKAudioBackend::freewheel (bool onoff) } if (jack_set_freewheel (_priv_jack, onoff) == 0) { - _freewheeling = true; + _freewheeling = onoff; return 0; } -- cgit v1.2.3 From be8d06f848914a6383e3c3053a2608dfe8aa7142 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Sat, 12 Oct 2013 11:58:22 -0400 Subject: post a dialog about a session being opened in read-only mode (if it happens) --- gtk2_ardour/ardour_ui.cc | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc index 050bccd052..18cba7af9b 100644 --- a/gtk2_ardour/ardour_ui.cc +++ b/gtk2_ardour/ardour_ui.cc @@ -2851,6 +2851,22 @@ ARDOUR_UI::load_session (const std::string& path, const std::string& snap_name, } } + if (!new_session->writable()) { + MessageDialog msg (_("This session has been opened in read-only mode.\n\nYou will not be able to record or save."), + true, + Gtk::MESSAGE_INFO, + BUTTONS_OK); + + msg.set_keep_above (true); + msg.set_title (_("Read-only Session")); + msg.set_position (Gtk::WIN_POS_CENTER); + pop_back_splash (msg); + msg.present (); + (void) msg.run (); + msg.hide (); + } + + /* Now the session been created, add the transport controls */ new_session->add_controllable(roll_controllable); new_session->add_controllable(stop_controllable); -- cgit v1.2.3 From 4091ff175c52049805862dc90e9d195c7ce81742 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Sat, 12 Oct 2013 14:56:57 -0400 Subject: 1 bug fix plus padding control for ArdourButton --- gtk2_ardour/ardour_button.cc | 17 ++++++++++++++--- gtk2_ardour/ardour_button.h | 5 +++++ 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/gtk2_ardour/ardour_button.cc b/gtk2_ardour/ardour_button.cc index 89e6a20385..b9d523e325 100644 --- a/gtk2_ardour/ardour_button.cc +++ b/gtk2_ardour/ardour_button.cc @@ -78,6 +78,8 @@ ArdourButton::ArdourButton (Element e) , _fixed_diameter (true) , _distinct_led_click (false) , _hovering (false) + , _xpad_request (0) + , _ypad_request (0) { ColorsChanged.connect (sigc::mem_fun (*this, &ArdourButton::color_handler)); } @@ -162,7 +164,7 @@ ArdourButton::set_markup (const std::string& str) _layout = Pango::Layout::create (get_pango_context()); } - _layout->set_text (str); + _layout->set_markup (str); queue_resize (); } @@ -431,11 +433,20 @@ ArdourButton::set_corner_radius (float r) set_dirty (); } +void +ArdourButton::set_padding (int x, int y) +{ + _xpad_request = x; + _ypad_request = y; + + queue_resize (); +} + void ArdourButton::on_size_request (Gtk::Requisition* req) { - int xpad = 0; - int ypad = 6; + int xpad = 0 + _xpad_request; + int ypad = 6 + _ypad_request; CairoWidget::on_size_request (req); diff --git a/gtk2_ardour/ardour_button.h b/gtk2_ardour/ardour_button.h index efa956162a..e236f4594e 100644 --- a/gtk2_ardour/ardour_button.h +++ b/gtk2_ardour/ardour_button.h @@ -71,6 +71,8 @@ class ArdourButton : public CairoWidget , public Gtkmm2ext::Activatable void set_rounded_corner_mask (int); void set_diameter (float); + void set_padding (int x, int y); + void set_text (const std::string&); void set_markup (const std::string&); void set_angle (const double); @@ -156,6 +158,9 @@ class ArdourButton : public CairoWidget , public Gtkmm2ext::Activatable bool _fixed_diameter; bool _distinct_led_click; bool _hovering; + + int _xpad_request; + int _ypad_request; static bool _flat_buttons; -- cgit v1.2.3 From e0a3c3f4fa341ad44236d21f6e3c71ae449a5543 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Sat, 12 Oct 2013 14:57:32 -0400 Subject: rework things for Audio/MIDI setup dialog a bit: no tabs being the most noticeable change --- gtk2_ardour/engine_dialog.cc | 2785 +++++++++++++++++++++--------------------- gtk2_ardour/engine_dialog.h | 9 +- 2 files changed, 1420 insertions(+), 1374 deletions(-) diff --git a/gtk2_ardour/engine_dialog.cc b/gtk2_ardour/engine_dialog.cc index 63c817d70c..84cb768096 100644 --- a/gtk2_ardour/engine_dialog.cc +++ b/gtk2_ardour/engine_dialog.cc @@ -61,9 +61,11 @@ using namespace Glib; static const unsigned int midi_tab = -1; /* not currently in use */ static const unsigned int latency_tab = 1; /* zero-based, page zero is the main setup page */ +static const char* results_markup = X_("%1"); + EngineControl::EngineControl () : ArdourDialog (_("Audio/MIDI Setup")) - , basic_packer (9, 3) + , basic_packer (9, 4) , input_latency_adjustment (0, 0, 99999, 1) , input_latency (input_latency_adjustment) , output_latency_adjustment (0, 0, 99999, 1) @@ -75,10 +77,13 @@ EngineControl::EngineControl () , ports_adjustment (128, 8, 1024, 1, 16) , ports_spinner (ports_adjustment) , control_app_button (_("Device Control Panel")) - , lm_start_stop_label (_("Measure latency")) + , lm_measure_button (_("Measure")) , lm_use_button (_("Use results")) - , lm_table (5, 2) + , lm_back_button (_("Back to settings ... (ignore results)")) + , lm_button (_("Calibrate...")) + , lm_table (12, 3) , have_lm_results (false) + , lm_running (false) , midi_refresh_button (_("Refresh list")) , ignore_changes (0) , _desired_sample_rate (0) @@ -118,7 +123,7 @@ EngineControl::EngineControl () basic_packer.set_spacings (6); basic_packer.set_border_width (12); - basic_packer.set_homogeneous (true); + basic_packer.set_homogeneous (false); /* pack it in */ @@ -132,8 +137,10 @@ EngineControl::EngineControl () row = 0; lm_table.set_row_spacings (12); - - lm_table.attach (lm_title, 0, 2, row, row+1, xopt, (AttachOptions) 0); + lm_table.set_col_spacings (6); + lm_table.set_homogeneous (false); + + lm_table.attach (lm_title, 0, 3, row, row+1, xopt, (AttachOptions) 0); row++; Gtk::Label* preamble; @@ -141,17 +148,17 @@ EngineControl::EngineControl () preamble = manage (new Label); preamble->set_width_chars (60); preamble->set_line_wrap (true); - preamble->set_markup (_("Turn down the volume on your hardware to a very low level.")); + preamble->set_markup (_("Turn down the volume on your audio equipment to a very low level.")); - lm_table.attach (*preamble, 0, 2, row, row+1, AttachOptions(FILL|EXPAND), (AttachOptions) 0); + lm_table.attach (*preamble, 0, 3, row, row+1, AttachOptions(FILL|EXPAND), (AttachOptions) 0); row++; preamble = manage (new Label); preamble->set_width_chars (60); preamble->set_line_wrap (true); - preamble->set_markup (_("Select two channels below and connect them using a cable or (less ideally) a speaker and microphone.")); + preamble->set_markup (_("Select two channels below and connect them using a cable.")); - lm_table.attach (*preamble, 0, 2, row, row+1, AttachOptions(FILL|EXPAND), (AttachOptions) 0); + lm_table.attach (*preamble, 0, 3, row, row+1, AttachOptions(FILL|EXPAND), (AttachOptions) 0); row++; label = manage (new Label (_("Output channel"))); @@ -159,7 +166,7 @@ EngineControl::EngineControl () Gtk::Alignment* misc_align = manage (new Alignment (0.0, 0.5)); misc_align->add (lm_output_channel_combo); - lm_table.attach (*misc_align, 1, 2, row, row+1, xopt, (AttachOptions) 0); + lm_table.attach (*misc_align, 1, 3, row, row+1, xopt, (AttachOptions) 0); ++row; label = manage (new Label (_("Input channel"))); @@ -167,41 +174,61 @@ EngineControl::EngineControl () misc_align = manage (new Alignment (0.0, 0.5)); misc_align->add (lm_input_channel_combo); - lm_table.attach (*misc_align, 1, 2, row, row+1, FILL, (AttachOptions) 0); + lm_table.attach (*misc_align, 1, 3, row, row+1, FILL, (AttachOptions) 0); ++row; xopt = AttachOptions(0); - lm_measure_button.add (lm_start_stop_label); - - lm_measure_button.signal_toggled().connect (sigc::mem_fun (*this, &EngineControl::latency_button_toggled)); + lm_measure_button.signal_clicked().connect (sigc::mem_fun (*this, &EngineControl::latency_button_clicked)); lm_use_button.signal_clicked().connect (sigc::mem_fun (*this, &EngineControl::use_latency_button_clicked)); + lm_back_button.signal_clicked().connect (sigc::bind (sigc::mem_fun (notebook, &Gtk::Notebook::set_current_page), 0)); + lm_use_button.set_sensitive (false); + /* Increase the default spacing around the labels of these three + * buttons + */ + + Gtk::Misc* l; + + if ((l = dynamic_cast(lm_measure_button.get_child())) != 0) { + l->set_padding (10, 10); + } + + if ((l = dynamic_cast(lm_use_button.get_child())) != 0) { + l->set_padding (10, 10); + } + + if ((l = dynamic_cast(lm_back_button.get_child())) != 0) { + l->set_padding (10, 10); + } + preamble = manage (new Label); preamble->set_width_chars (60); preamble->set_line_wrap (true); - preamble->set_markup (_("Once the channels are connected, click the \"Measure latency\" button.")); - lm_table.attach (*preamble, 0, 2, row, row+1, AttachOptions(FILL|EXPAND), (AttachOptions) 0); + preamble->set_markup (_("Once the channels are connected, click the \"Measure\" button.")); + lm_table.attach (*preamble, 0, 3, row, row+1, AttachOptions(FILL|EXPAND), (AttachOptions) 0); row++; - lm_table.attach (lm_measure_button, 0, 2, row, row+1, xopt, (AttachOptions) 0); - ++row; - lm_table.attach (lm_results, 0, 2, row, row+1, AttachOptions(FILL|EXPAND), (AttachOptions) 0); - ++row; - - preamble = manage (new Label); preamble->set_width_chars (60); preamble->set_line_wrap (true); preamble->set_markup (_("When satisfied with the results, click the \"Use results\" button.")); - lm_table.attach (*preamble, 0, 2, row, row+1, AttachOptions(FILL|EXPAND), (AttachOptions) 0); - row++; + lm_table.attach (*preamble, 0, 3, row, row+1, AttachOptions(FILL|EXPAND), (AttachOptions) 0); - lm_table.attach (lm_use_button, 0, 2, row, row+1, xopt, (AttachOptions) 0); - ++row; + ++row; // skip a row in the table + ++row; // skip a row in the table + + lm_table.attach (lm_results, 0, 3, row, row+1, AttachOptions(FILL|EXPAND), (AttachOptions) 0); - lm_results.set_markup ("No measurement results yet"); + ++row; // skip a row in the table + ++row; // skip a row in the table + + lm_table.attach (lm_measure_button, 0, 1, row, row+1, AttachOptions(FILL|EXPAND), (AttachOptions) 0); + lm_table.attach (lm_use_button, 1, 2, row, row+1, AttachOptions(FILL|EXPAND), (AttachOptions) 0); + lm_table.attach (lm_back_button, 2, 3, row, row+1, AttachOptions(FILL|EXPAND), (AttachOptions) 0); + + lm_results.set_markup (string_compose (results_markup, _("No measurement results yet"))); lm_vbox.set_border_width (12); lm_vbox.pack_start (lm_table, false, false); @@ -213,7 +240,7 @@ EngineControl::EngineControl () notebook.pages().push_back (TabElem (lm_vbox, _("Latency"))); notebook.set_border_width (12); - notebook.set_tab_pos (POS_RIGHT); + notebook.set_show_tabs (false); notebook.show_all (); notebook.set_name ("SettingsNotebook"); @@ -240,7 +267,7 @@ EngineControl::EngineControl () /* Pick up any existing audio setup configuration, if appropriate */ XMLNode* audio_setup = ARDOUR::Config->extra_xml ("AudioMIDISetup"); - + ARDOUR::AudioEngine::instance()->Running.connect (running_connection, MISSING_INVALIDATOR, boost::bind (&EngineControl::engine_running, this), gui_context()); ARDOUR::AudioEngine::instance()->Stopped.connect (stopped_connection, MISSING_INVALIDATOR, boost::bind (&EngineControl::engine_stopped, this), gui_context()); ARDOUR::AudioEngine::instance()->Halted.connect (stopped_connection, MISSING_INVALIDATOR, boost::bind (&EngineControl::engine_stopped, this), gui_context()); @@ -267,1378 +294,1385 @@ EngineControl::EngineControl () notebook.signal_switch_page().connect (sigc::mem_fun (*this, &EngineControl::on_switch_page)); no_push = false; -} - -void -EngineControl::on_response (int response_id) -{ - ArdourDialog::on_response (response_id); - - switch (response_id) { - case RESPONSE_APPLY: - push_state_to_backend (true); - break; - case RESPONSE_OK: - push_state_to_backend (true); - hide (); - break; - case RESPONSE_DELETE_EVENT: { - GdkEventButton ev; - ev.type = GDK_BUTTON_PRESS; - ev.button = 1; - on_delete_event ((GdkEventAny*) &ev); - break; - } - default: - hide (); - } -} - -void -EngineControl::build_notebook () -{ - Label* label; - AttachOptions xopt = AttachOptions (FILL|EXPAND); - - /* clear the table */ - - Gtkmm2ext::container_clear (basic_vbox); - Gtkmm2ext::container_clear (basic_packer); - - label = manage (left_aligned_label (_("Audio System:"))); - basic_packer.attach (*label, 0, 1, 0, 1, xopt, (AttachOptions) 0); - basic_packer.attach (backend_combo, 1, 2, 0, 1, xopt, (AttachOptions) 0); - - if (_have_control) { - build_full_control_notebook (); - } else { - build_no_control_notebook (); - } - - basic_vbox.pack_start (basic_hbox, false, false); - - if (_have_control) { - Gtk::HBox* hpacker = manage (new HBox); - hpacker->set_border_width (12); - hpacker->pack_start (control_app_button, false, false); - hpacker->show (); - control_app_button.show(); - basic_vbox.pack_start (*hpacker); - } - - basic_vbox.show_all (); -} - -void -EngineControl::build_full_control_notebook () -{ - boost::shared_ptr backend = ARDOUR::AudioEngine::instance()->current_backend(); - assert (backend); - - using namespace Notebook_Helpers; - Label* label; - vector strings; - AttachOptions xopt = AttachOptions (FILL|EXPAND); - int row = 1; // row zero == backend combo - - /* start packing it up */ - - if (backend->requires_driver_selection()) { - label = manage (left_aligned_label (_("Driver:"))); - basic_packer.attach (*label, 0, 1, row, row + 1, xopt, (AttachOptions) 0); - basic_packer.attach (driver_combo, 1, 2, row, row + 1, xopt, (AttachOptions) 0); - row++; - } - - label = manage (left_aligned_label (_("Device:"))); - basic_packer.attach (*label, 0, 1, row, row + 1, xopt, (AttachOptions) 0); - basic_packer.attach (device_combo, 1, 2, row, row + 1, xopt, (AttachOptions) 0); - row++; - - label = manage (left_aligned_label (_("Sample rate:"))); - basic_packer.attach (*label, 0, 1, row, row + 1, xopt, (AttachOptions) 0); - basic_packer.attach (sample_rate_combo, 1, 2, row, row + 1, xopt, (AttachOptions) 0); - row++; - - - label = manage (left_aligned_label (_("Buffer size:"))); - basic_packer.attach (*label, 0, 1, row, row + 1, xopt, (AttachOptions) 0); - basic_packer.attach (buffer_size_combo, 1, 2, row, row + 1, xopt, (AttachOptions) 0); - buffer_size_duration_label.set_alignment (0.0); /* left-align */ - basic_packer.attach (buffer_size_duration_label, 2, 3, row, row+1, xopt, (AttachOptions) 0); - row++; - - input_channels.set_name ("InputChannels"); - input_channels.set_flags(Gtk::CAN_FOCUS); - input_channels.set_digits(0); - input_channels.set_wrap(false); - output_channels.set_editable (true); - - label = manage (left_aligned_label (_("Input Channels:"))); - basic_packer.attach (*label, 0, 1, row, row+1, xopt, (AttachOptions) 0); - basic_packer.attach (input_channels, 1, 2, row, row+1, xopt, (AttachOptions) 0); - ++row; - - output_channels.set_name ("OutputChannels"); - output_channels.set_flags(Gtk::CAN_FOCUS); - output_channels.set_digits(0); - output_channels.set_wrap(false); - output_channels.set_editable (true); - - label = manage (left_aligned_label (_("Output Channels:"))); - basic_packer.attach (*label, 0, 1, row, row+1, xopt, (AttachOptions) 0); - basic_packer.attach (output_channels, 1, 2, row, row+1, xopt, (AttachOptions) 0); - ++row; - - input_latency.set_name ("InputLatency"); - input_latency.set_flags(Gtk::CAN_FOCUS); - input_latency.set_digits(0); - input_latency.set_wrap(false); - input_latency.set_editable (true); - - label = manage (left_aligned_label (_("Hardware input latency:"))); - basic_packer.attach (*label, 0, 1, row, row+1, xopt, (AttachOptions) 0); - basic_packer.attach (input_latency, 1, 2, row, row+1, xopt, (AttachOptions) 0); - label = manage (left_aligned_label (_("samples"))); - basic_packer.attach (*label, 2, 3, row, row+1, xopt, (AttachOptions) 0); - ++row; - - output_latency.set_name ("OutputLatency"); - output_latency.set_flags(Gtk::CAN_FOCUS); - output_latency.set_digits(0); - output_latency.set_wrap(false); - output_latency.set_editable (true); - - label = manage (left_aligned_label (_("Hardware output latency:"))); - basic_packer.attach (*label, 0, 1, row, row+1, xopt, (AttachOptions) 0); - basic_packer.attach (output_latency, 1, 2, row, row+1, xopt, (AttachOptions) 0); - label = manage (left_aligned_label (_("samples"))); - basic_packer.attach (*label, 2, 3, row, row+1, xopt, (AttachOptions) 0); - ++row; - - label = manage (left_aligned_label (_("MIDI System"))); - basic_packer.attach (*label, 0, 1, row, row + 1, xopt, (AttachOptions) 0); - basic_packer.attach (midi_option_combo, 1, 2, row, row + 1, xopt, (AttachOptions) 0); - row++; -} - -void -EngineControl::build_no_control_notebook () -{ - boost::shared_ptr backend = ARDOUR::AudioEngine::instance()->current_backend(); - assert (backend); - - using namespace Notebook_Helpers; - Label* label; - vector strings; - AttachOptions xopt = AttachOptions (FILL|EXPAND); - int row = 1; // row zero == backend combo - const string msg = string_compose (_("The %1 audio backend was configured and started externally.\nThis limits your control over it."), backend->name()); - - label = manage (new Label); - label->set_markup (string_compose ("%1", msg)); - basic_packer.attach (*label, 0, 2, row, row + 1, xopt, (AttachOptions) 0); - row++; - - if (backend->can_change_sample_rate_when_running()) { - label = manage (left_aligned_label (_("Sample rate:"))); - basic_packer.attach (*label, 0, 1, row, row + 1, xopt, (AttachOptions) 0); - basic_packer.attach (sample_rate_combo, 1, 2, row, row + 1, xopt, (AttachOptions) 0); - row++; - } - - if (backend->can_change_buffer_size_when_running()) { - label = manage (left_aligned_label (_("Buffer size:"))); - basic_packer.attach (*label, 0, 1, row, row + 1, xopt, (AttachOptions) 0); - basic_packer.attach (buffer_size_combo, 1, 2, row, row + 1, xopt, (AttachOptions) 0); - buffer_size_duration_label.set_alignment (0.0); /* left-align */ - basic_packer.attach (buffer_size_duration_label, 2, 3, row, row+1, xopt, (AttachOptions) 0); - row++; - } - - connect_disconnect_button.signal_clicked().connect (sigc::mem_fun (*this, &EngineControl::connect_disconnect_click)); - - basic_packer.attach (connect_disconnect_button, 0, 2, row, row+1, FILL, AttachOptions (0)); - row++; -} - -EngineControl::~EngineControl () -{ - -} - -void -EngineControl::disable_latency_tab () -{ - vector empty; - set_popdown_strings (lm_output_channel_combo, empty); - set_popdown_strings (lm_input_channel_combo, empty); - lm_measure_button.set_sensitive (false); - lm_use_button.set_sensitive (false); -} - -void -EngineControl::enable_latency_tab () -{ - vector outputs; - ARDOUR::AudioEngine::instance()->get_physical_outputs (ARDOUR::DataType::AUDIO, outputs); - set_popdown_strings (lm_output_channel_combo, outputs); - lm_output_channel_combo.set_active_text (outputs.front()); - - vector inputs; - ARDOUR::AudioEngine::instance()->get_physical_inputs (ARDOUR::DataType::AUDIO, inputs); - set_popdown_strings (lm_input_channel_combo, inputs); - lm_input_channel_combo.set_active_text (inputs.front()); - - lm_measure_button.set_sensitive (true); -} - -void -EngineControl::setup_midi_tab_for_backend () -{ - string backend = backend_combo.get_active_text (); - - Gtkmm2ext::container_clear (midi_vbox); - - midi_vbox.set_border_width (12); - midi_device_table.set_border_width (12); - - if (backend == "JACK") { - setup_midi_tab_for_jack (); - } - - midi_vbox.pack_start (midi_device_table, true, true); - midi_vbox.pack_start (midi_refresh_button, false, false); - midi_vbox.show_all (); - - midi_refresh_button.signal_clicked().connect (sigc::mem_fun (*this, &EngineControl::refresh_midi_display)); -} - -void -EngineControl::setup_midi_tab_for_jack () -{ -} - -void -EngineControl::refresh_midi_display () -{ - boost::shared_ptr backend = ARDOUR::AudioEngine::instance()->current_backend(); - assert (backend); - - vector midi_inputs; - vector midi_outputs; - int row = 0; - AttachOptions xopt = AttachOptions (FILL|EXPAND); - Gtk::Label* l; - - Gtkmm2ext::container_clear (midi_device_table); - - backend->get_physical_inputs (ARDOUR::DataType::MIDI, midi_inputs); - backend->get_physical_outputs (ARDOUR::DataType::MIDI, midi_outputs); - - midi_device_table.set_spacings (6); - midi_device_table.set_homogeneous (true); - midi_device_table.resize (midi_inputs.size() + midi_outputs.size() + 3, 1); - - l = manage (new Label); - l->set_markup (string_compose ("%1", _("MIDI Inputs"))); - midi_device_table.attach (*l, 0, 1, row, row + 1, xopt, AttachOptions (0)); - l->set_alignment (0, 0.5); - row++; - l->show (); - - for (vector::iterator p = midi_inputs.begin(); p != midi_inputs.end(); ++p) { - l = manage (new Label ((*p).substr ((*p).find_last_of (':') + 1))); - l->set_alignment (0, 0.5); - midi_device_table.attach (*l, 0, 1, row, row + 1, xopt, AttachOptions (0)); - l->show (); - row++; - } - - row++; // extra row of spacing - - l = manage (new Label); - l->set_markup (string_compose ("%1", _("MIDI Outputs"))); - midi_device_table.attach (*l, 0, 1, row, row + 1, xopt, AttachOptions (0)); - l->set_alignment (0, 0.5); - row++; - l->show (); - - for (vector::iterator p = midi_outputs.begin(); p != midi_outputs.end(); ++p) { - l = manage (new Label ((*p).substr ((*p).find_last_of (':') + 1))); - l->set_alignment (0, 0.5); - midi_device_table.attach (*l, 0, 1, row, row + 1, xopt, AttachOptions (0)); - l->show (); - row++; - } -} - -void -EngineControl::update_sensitivity () -{ -} - -void -EngineControl::backend_changed () -{ - if (ignore_changes) { - return; - } - - string backend_name = backend_combo.get_active_text(); - boost::shared_ptr backend; - - if (!(backend = ARDOUR::AudioEngine::instance()->set_backend (backend_name, "ardour", ""))) { - /* eh? setting the backend failed... how ? */ - return; - } - - _have_control = ARDOUR::AudioEngine::instance()->setup_required (); - - build_notebook (); - setup_midi_tab_for_backend (); - - if (backend->requires_driver_selection()) { - vector drivers = backend->enumerate_drivers(); - - if (!drivers.empty()) { - { - PBD::Unwinder protect_ignore_changes (ignore_changes, ignore_changes + 1); - set_popdown_strings (driver_combo, drivers); - driver_combo.set_active_text (drivers.front()); - } - - driver_changed (); - } - - } else { - driver_combo.set_sensitive (false); - /* this will change the device text which will cause a call to - * device changed which will set up parameters + } + + void + EngineControl::on_response (int response_id) + { + ArdourDialog::on_response (response_id); + + switch (response_id) { + case RESPONSE_APPLY: + push_state_to_backend (true); + break; + case RESPONSE_OK: + push_state_to_backend (true); + hide (); + break; + case RESPONSE_DELETE_EVENT: { + GdkEventButton ev; + ev.type = GDK_BUTTON_PRESS; + ev.button = 1; + on_delete_event ((GdkEventAny*) &ev); + break; + } + default: + hide (); + } + } + + void + EngineControl::build_notebook () + { + Label* label; + AttachOptions xopt = AttachOptions (FILL|EXPAND); + + /* clear the table */ + + Gtkmm2ext::container_clear (basic_vbox); + Gtkmm2ext::container_clear (basic_packer); + + label = manage (left_aligned_label (_("Audio System:"))); + basic_packer.attach (*label, 0, 1, 0, 1, xopt, (AttachOptions) 0); + basic_packer.attach (backend_combo, 1, 2, 0, 1, xopt, (AttachOptions) 0); + + lm_button.signal_clicked.connect (sigc::bind (sigc::mem_fun (notebook, &Gtk::Notebook::set_current_page), latency_tab)); + lm_button.set_name ("record enable button"); + if (_have_control) { + build_full_control_notebook (); + } else { + build_no_control_notebook (); + } + + basic_vbox.pack_start (basic_hbox, false, false); + + if (_have_control) { + Gtk::HBox* hpacker = manage (new HBox); + hpacker->set_border_width (12); + hpacker->pack_start (control_app_button, false, false); + hpacker->show (); + control_app_button.show(); + basic_vbox.pack_start (*hpacker); + } + + basic_vbox.show_all (); + } + + void + EngineControl::build_full_control_notebook () + { + boost::shared_ptr backend = ARDOUR::AudioEngine::instance()->current_backend(); + assert (backend); + + using namespace Notebook_Helpers; + Label* label; + vector strings; + AttachOptions xopt = AttachOptions (FILL|EXPAND); + int row = 1; // row zero == backend combo + + /* start packing it up */ + + if (backend->requires_driver_selection()) { + label = manage (left_aligned_label (_("Driver:"))); + basic_packer.attach (*label, 0, 1, row, row + 1, xopt, (AttachOptions) 0); + basic_packer.attach (driver_combo, 1, 2, row, row + 1, xopt, (AttachOptions) 0); + row++; + } + + label = manage (left_aligned_label (_("Device:"))); + basic_packer.attach (*label, 0, 1, row, row + 1, xopt, (AttachOptions) 0); + basic_packer.attach (device_combo, 1, 2, row, row + 1, xopt, (AttachOptions) 0); + row++; + + label = manage (left_aligned_label (_("Sample rate:"))); + basic_packer.attach (*label, 0, 1, row, row + 1, xopt, (AttachOptions) 0); + basic_packer.attach (sample_rate_combo, 1, 2, row, row + 1, xopt, (AttachOptions) 0); + row++; + + + label = manage (left_aligned_label (_("Buffer size:"))); + basic_packer.attach (*label, 0, 1, row, row + 1, xopt, (AttachOptions) 0); + basic_packer.attach (buffer_size_combo, 1, 2, row, row + 1, xopt, (AttachOptions) 0); + buffer_size_duration_label.set_alignment (0.0); /* left-align */ + basic_packer.attach (buffer_size_duration_label, 2, 3, row, row+1, SHRINK, (AttachOptions) 0); + row++; + + input_channels.set_name ("InputChannels"); + input_channels.set_flags(Gtk::CAN_FOCUS); + input_channels.set_digits(0); + input_channels.set_wrap(false); + output_channels.set_editable (true); + + label = manage (left_aligned_label (_("Input Channels:"))); + basic_packer.attach (*label, 0, 1, row, row+1, xopt, (AttachOptions) 0); + basic_packer.attach (input_channels, 1, 2, row, row+1, xopt, (AttachOptions) 0); + ++row; + + output_channels.set_name ("OutputChannels"); + output_channels.set_flags(Gtk::CAN_FOCUS); + output_channels.set_digits(0); + output_channels.set_wrap(false); + output_channels.set_editable (true); + + label = manage (left_aligned_label (_("Output Channels:"))); + basic_packer.attach (*label, 0, 1, row, row+1, xopt, (AttachOptions) 0); + basic_packer.attach (output_channels, 1, 2, row, row+1, xopt, (AttachOptions) 0); + ++row; + + input_latency.set_name ("InputLatency"); + input_latency.set_flags(Gtk::CAN_FOCUS); + input_latency.set_digits(0); + input_latency.set_wrap(false); + input_latency.set_editable (true); + + label = manage (left_aligned_label (_("Hardware input latency:"))); + basic_packer.attach (*label, 0, 1, row, row+1, xopt, (AttachOptions) 0); + basic_packer.attach (input_latency, 1, 2, row, row+1, xopt, (AttachOptions) 0); + label = manage (left_aligned_label (_("samples"))); + basic_packer.attach (*label, 2, 3, row, row+1, SHRINK, (AttachOptions) 0); + ++row; + + output_latency.set_name ("OutputLatency"); + output_latency.set_flags(Gtk::CAN_FOCUS); + output_latency.set_digits(0); + output_latency.set_wrap(false); + output_latency.set_editable (true); + + label = manage (left_aligned_label (_("Hardware output latency:"))); + basic_packer.attach (*label, 0, 1, row, row+1, xopt, (AttachOptions) 0); + basic_packer.attach (output_latency, 1, 2, row, row+1, xopt, (AttachOptions) 0); + label = manage (left_aligned_label (_("samples"))); + basic_packer.attach (*label, 2, 3, row, row+1, SHRINK, (AttachOptions) 0); + + /* button spans 2 rows */ + + basic_packer.attach (lm_button, 3, 4, row-1, row+1, xopt, xopt); + ++row; + + label = manage (left_aligned_label (_("MIDI System"))); + basic_packer.attach (*label, 0, 1, row, row + 1, xopt, (AttachOptions) 0); + basic_packer.attach (midi_option_combo, 1, 2, row, row + 1, SHRINK, (AttachOptions) 0); + row++; + } + + void + EngineControl::build_no_control_notebook () + { + boost::shared_ptr backend = ARDOUR::AudioEngine::instance()->current_backend(); + assert (backend); + + using namespace Notebook_Helpers; + Label* label; + vector strings; + AttachOptions xopt = AttachOptions (FILL|EXPAND); + int row = 1; // row zero == backend combo + const string msg = string_compose (_("The %1 audio backend was configured and started externally.\nThis limits your control over it."), backend->name()); + + label = manage (new Label); + label->set_markup (string_compose ("%1", msg)); + basic_packer.attach (*label, 0, 2, row, row + 1, xopt, (AttachOptions) 0); + row++; + + if (backend->can_change_sample_rate_when_running()) { + label = manage (left_aligned_label (_("Sample rate:"))); + basic_packer.attach (*label, 0, 1, row, row + 1, xopt, (AttachOptions) 0); + basic_packer.attach (sample_rate_combo, 1, 2, row, row + 1, xopt, (AttachOptions) 0); + row++; + } + + if (backend->can_change_buffer_size_when_running()) { + label = manage (left_aligned_label (_("Buffer size:"))); + basic_packer.attach (*label, 0, 1, row, row + 1, xopt, (AttachOptions) 0); + basic_packer.attach (buffer_size_combo, 1, 2, row, row + 1, xopt, (AttachOptions) 0); + buffer_size_duration_label.set_alignment (0.0); /* left-align */ + basic_packer.attach (buffer_size_duration_label, 2, 3, row, row+1, xopt, (AttachOptions) 0); + row++; + } + + connect_disconnect_button.signal_clicked().connect (sigc::mem_fun (*this, &EngineControl::connect_disconnect_click)); + + basic_packer.attach (connect_disconnect_button, 0, 2, row, row+1, FILL, AttachOptions (0)); + row++; + } + + EngineControl::~EngineControl () + { + + } + + void + EngineControl::disable_latency_tab () + { + vector empty; + set_popdown_strings (lm_output_channel_combo, empty); + set_popdown_strings (lm_input_channel_combo, empty); + lm_measure_button.set_sensitive (false); + lm_use_button.set_sensitive (false); + } + + void + EngineControl::enable_latency_tab () + { + vector outputs; + ARDOUR::AudioEngine::instance()->get_physical_outputs (ARDOUR::DataType::AUDIO, outputs); + set_popdown_strings (lm_output_channel_combo, outputs); + lm_output_channel_combo.set_active_text (outputs.front()); + + vector inputs; + ARDOUR::AudioEngine::instance()->get_physical_inputs (ARDOUR::DataType::AUDIO, inputs); + set_popdown_strings (lm_input_channel_combo, inputs); + lm_input_channel_combo.set_active_text (inputs.front()); + + lm_measure_button.set_sensitive (true); + } + + void + EngineControl::setup_midi_tab_for_backend () + { + string backend = backend_combo.get_active_text (); + + Gtkmm2ext::container_clear (midi_vbox); + + midi_vbox.set_border_width (12); + midi_device_table.set_border_width (12); + + if (backend == "JACK") { + setup_midi_tab_for_jack (); + } + + midi_vbox.pack_start (midi_device_table, true, true); + midi_vbox.pack_start (midi_refresh_button, false, false); + midi_vbox.show_all (); + + midi_refresh_button.signal_clicked().connect (sigc::mem_fun (*this, &EngineControl::refresh_midi_display)); + } + + void + EngineControl::setup_midi_tab_for_jack () + { + } + + void + EngineControl::refresh_midi_display () + { + boost::shared_ptr backend = ARDOUR::AudioEngine::instance()->current_backend(); + assert (backend); + + vector midi_inputs; + vector midi_outputs; + int row = 0; + AttachOptions xopt = AttachOptions (FILL|EXPAND); + Gtk::Label* l; + + Gtkmm2ext::container_clear (midi_device_table); + + backend->get_physical_inputs (ARDOUR::DataType::MIDI, midi_inputs); + backend->get_physical_outputs (ARDOUR::DataType::MIDI, midi_outputs); + + midi_device_table.set_spacings (6); + midi_device_table.set_homogeneous (true); + midi_device_table.resize (midi_inputs.size() + midi_outputs.size() + 3, 1); + + l = manage (new Label); + l->set_markup (string_compose ("%1", _("MIDI Inputs"))); + midi_device_table.attach (*l, 0, 1, row, row + 1, xopt, AttachOptions (0)); + l->set_alignment (0, 0.5); + row++; + l->show (); + + for (vector::iterator p = midi_inputs.begin(); p != midi_inputs.end(); ++p) { + l = manage (new Label ((*p).substr ((*p).find_last_of (':') + 1))); + l->set_alignment (0, 0.5); + midi_device_table.attach (*l, 0, 1, row, row + 1, xopt, AttachOptions (0)); + l->show (); + row++; + } + + row++; // extra row of spacing + + l = manage (new Label); + l->set_markup (string_compose ("%1", _("MIDI Outputs"))); + midi_device_table.attach (*l, 0, 1, row, row + 1, xopt, AttachOptions (0)); + l->set_alignment (0, 0.5); + row++; + l->show (); + + for (vector::iterator p = midi_outputs.begin(); p != midi_outputs.end(); ++p) { + l = manage (new Label ((*p).substr ((*p).find_last_of (':') + 1))); + l->set_alignment (0, 0.5); + midi_device_table.attach (*l, 0, 1, row, row + 1, xopt, AttachOptions (0)); + l->show (); + row++; + } + } + + void + EngineControl::update_sensitivity () + { + } + + void + EngineControl::backend_changed () + { + if (ignore_changes) { + return; + } + + string backend_name = backend_combo.get_active_text(); + boost::shared_ptr backend; + + if (!(backend = ARDOUR::AudioEngine::instance()->set_backend (backend_name, "ardour", ""))) { + /* eh? setting the backend failed... how ? */ + return; + } + + _have_control = ARDOUR::AudioEngine::instance()->setup_required (); + + build_notebook (); + setup_midi_tab_for_backend (); + + if (backend->requires_driver_selection()) { + vector drivers = backend->enumerate_drivers(); + + if (!drivers.empty()) { + { + PBD::Unwinder protect_ignore_changes (ignore_changes, ignore_changes + 1); + set_popdown_strings (driver_combo, drivers); + driver_combo.set_active_text (drivers.front()); + } + + driver_changed (); + } + + } else { + driver_combo.set_sensitive (false); + /* this will change the device text which will cause a call to + * device changed which will set up parameters + */ + list_devices (); + } + + vector midi_options = backend->enumerate_midi_options(); + + if (midi_options.size() == 1) { + /* only contains the "none" option */ + midi_option_combo.set_sensitive (false); + } else { + if (_have_control) { + set_popdown_strings (midi_option_combo, midi_options); + midi_option_combo.set_active_text (midi_options.front()); + midi_option_combo.set_sensitive (true); + } else { + midi_option_combo.set_sensitive (false); + } + } + + maybe_display_saved_state (); + } + + bool + EngineControl::print_channel_count (Gtk::SpinButton* sb) + { + uint32_t cnt = (uint32_t) sb->get_value(); + if (cnt == 0) { + sb->set_text (_("all available channels")); + } else { + char buf[32]; + snprintf (buf, sizeof (buf), "%d", cnt); + sb->set_text (buf); + } + return true; + } + + void + EngineControl::list_devices () + { + boost::shared_ptr backend = ARDOUR::AudioEngine::instance()->current_backend(); + assert (backend); + + /* now fill out devices, mark sample rates, buffer sizes insensitive */ + + vector all_devices = backend->enumerate_devices (); + + /* NOTE: Ardour currently does not display the "available" field of the + * returned devices. + * + * Doing so would require a different GUI widget than the combo + * box/popdown that we currently use, since it has no way to list + * items that are not selectable. Something more like a popup menu, + * which could have unselectable items, would be appropriate. + */ + + vector available_devices; + + for (vector::const_iterator i = all_devices.begin(); i != all_devices.end(); ++i) { + available_devices.push_back (i->name); + } + + if (!available_devices.empty()) { + + update_sensitivity (); + + { + PBD::Unwinder protect_ignore_changes (ignore_changes, ignore_changes + 1); + set_popdown_strings (device_combo, available_devices); + device_combo.set_active_text (available_devices.front()); + } + + device_changed (); + + ok_button->set_sensitive (true); + apply_button->set_sensitive (true); + + } else { + sample_rate_combo.set_sensitive (false); + buffer_size_combo.set_sensitive (false); + input_latency.set_sensitive (false); + output_latency.set_sensitive (false); + input_channels.set_sensitive (false); + output_channels.set_sensitive (false); + ok_button->set_sensitive (false); + apply_button->set_sensitive (false); + } + } + + void + EngineControl::driver_changed () + { + if (ignore_changes) { + return; + } + + boost::shared_ptr backend = ARDOUR::AudioEngine::instance()->current_backend(); + assert (backend); + + backend->set_driver (driver_combo.get_active_text()); + list_devices (); + + maybe_display_saved_state (); + } + + void + EngineControl::device_changed () + { + if (ignore_changes) { + return; + } + + boost::shared_ptr backend = ARDOUR::AudioEngine::instance()->current_backend(); + assert (backend); + string device_name = device_combo.get_active_text (); + vector s; + + { + PBD::Unwinder protect_ignore_changes (ignore_changes, ignore_changes + 1); + + /* don't allow programmatic change to combos to cause a + recursive call to this method. */ - list_devices (); - } - - vector midi_options = backend->enumerate_midi_options(); - - if (midi_options.size() == 1) { - /* only contains the "none" option */ - midi_option_combo.set_sensitive (false); - } else { - if (_have_control) { - set_popdown_strings (midi_option_combo, midi_options); - midi_option_combo.set_active_text (midi_options.front()); - midi_option_combo.set_sensitive (true); - } else { - midi_option_combo.set_sensitive (false); - } - } - maybe_display_saved_state (); -} - -bool -EngineControl::print_channel_count (Gtk::SpinButton* sb) -{ - uint32_t cnt = (uint32_t) sb->get_value(); - if (cnt == 0) { - sb->set_text (_("all available channels")); - } else { - char buf[32]; - snprintf (buf, sizeof (buf), "%d", cnt); - sb->set_text (buf); - } - return true; -} - -void -EngineControl::list_devices () -{ - boost::shared_ptr backend = ARDOUR::AudioEngine::instance()->current_backend(); - assert (backend); - - /* now fill out devices, mark sample rates, buffer sizes insensitive */ - - vector all_devices = backend->enumerate_devices (); - - /* NOTE: Ardour currently does not display the "available" field of the - * returned devices. - * - * Doing so would require a different GUI widget than the combo - * box/popdown that we currently use, since it has no way to list - * items that are not selectable. Something more like a popup menu, - * which could have unselectable items, would be appropriate. + /* sample rates */ + + string desired; + + vector sr; + + if (_have_control) { + sr = backend->available_sample_rates (device_name); + } else { + + sr.push_back (8000.0f); + sr.push_back (16000.0f); + sr.push_back (32000.0f); + sr.push_back (44100.0f); + sr.push_back (48000.0f); + sr.push_back (88200.0f); + sr.push_back (96000.0f); + sr.push_back (192000.0f); + sr.push_back (384000.0f); + } + + for (vector::const_iterator x = sr.begin(); x != sr.end(); ++x) { + s.push_back (rate_as_string (*x)); + if (*x == _desired_sample_rate) { + desired = s.back(); + } + } + + if (!s.empty()) { + sample_rate_combo.set_sensitive (true); + set_popdown_strings (sample_rate_combo, s); + + if (desired.empty()) { + sample_rate_combo.set_active_text (s.front()); + } else { + sample_rate_combo.set_active_text (desired); + } + + } else { + sample_rate_combo.set_sensitive (false); + } + + /* buffer sizes */ + + vector bs; + + if (_have_control) { + bs = backend->available_buffer_sizes(device_name); + } else if (backend->can_change_buffer_size_when_running()) { + bs.push_back (8); + bs.push_back (16); + bs.push_back (32); + bs.push_back (64); + bs.push_back (128); + bs.push_back (256); + bs.push_back (512); + bs.push_back (1024); + bs.push_back (2048); + bs.push_back (4096); + bs.push_back (8192); + } + s.clear (); + for (vector::const_iterator x = bs.begin(); x != bs.end(); ++x) { + s.push_back (bufsize_as_string (*x)); + } + + if (!s.empty()) { + buffer_size_combo.set_sensitive (true); + set_popdown_strings (buffer_size_combo, s); + + buffer_size_combo.set_active_text (s.front()); + show_buffer_duration (); + } else { + buffer_size_combo.set_sensitive (false); + } + + /* XXX theoretically need to set min + max channel counts here + */ + + manage_control_app_sensitivity (); + } + + /* pick up any saved state for this device */ + + maybe_display_saved_state (); + + /* and push it to the backend */ + + push_state_to_backend (false); + } + + string + EngineControl::bufsize_as_string (uint32_t sz) + { + /* Translators: "samples" is always plural here, so no + need for plural+singular forms. */ - - vector available_devices; - - for (vector::const_iterator i = all_devices.begin(); i != all_devices.end(); ++i) { - available_devices.push_back (i->name); - } - - if (!available_devices.empty()) { - - update_sensitivity (); - - { - PBD::Unwinder protect_ignore_changes (ignore_changes, ignore_changes + 1); - set_popdown_strings (device_combo, available_devices); - device_combo.set_active_text (available_devices.front()); - } - - device_changed (); - - ok_button->set_sensitive (true); - apply_button->set_sensitive (true); - - } else { - sample_rate_combo.set_sensitive (false); - buffer_size_combo.set_sensitive (false); - input_latency.set_sensitive (false); - output_latency.set_sensitive (false); - input_channels.set_sensitive (false); - output_channels.set_sensitive (false); - ok_button->set_sensitive (false); - apply_button->set_sensitive (false); - } -} - -void -EngineControl::driver_changed () -{ - if (ignore_changes) { - return; - } - - boost::shared_ptr backend = ARDOUR::AudioEngine::instance()->current_backend(); - assert (backend); - - backend->set_driver (driver_combo.get_active_text()); - list_devices (); - - maybe_display_saved_state (); -} - -void -EngineControl::device_changed () -{ - if (ignore_changes) { - return; - } - - boost::shared_ptr backend = ARDOUR::AudioEngine::instance()->current_backend(); - assert (backend); - string device_name = device_combo.get_active_text (); - vector s; - - { - PBD::Unwinder protect_ignore_changes (ignore_changes, ignore_changes + 1); - - /* don't allow programmatic change to combos to cause a - recursive call to this method. - */ - - /* sample rates */ - - string desired; - - vector sr; - - if (_have_control) { - sr = backend->available_sample_rates (device_name); - } else { - - sr.push_back (8000.0f); - sr.push_back (16000.0f); - sr.push_back (32000.0f); - sr.push_back (44100.0f); - sr.push_back (48000.0f); - sr.push_back (88200.0f); - sr.push_back (96000.0f); - sr.push_back (192000.0f); - sr.push_back (384000.0f); - } - - for (vector::const_iterator x = sr.begin(); x != sr.end(); ++x) { - s.push_back (rate_as_string (*x)); - if (*x == _desired_sample_rate) { - desired = s.back(); - } - } - - if (!s.empty()) { - sample_rate_combo.set_sensitive (true); - set_popdown_strings (sample_rate_combo, s); - - if (desired.empty()) { - sample_rate_combo.set_active_text (s.front()); - } else { - sample_rate_combo.set_active_text (desired); - } - - } else { - sample_rate_combo.set_sensitive (false); - } - - /* buffer sizes */ - - vector bs; - - if (_have_control) { - bs = backend->available_buffer_sizes(device_name); - } else if (backend->can_change_buffer_size_when_running()) { - bs.push_back (8); - bs.push_back (16); - bs.push_back (32); - bs.push_back (64); - bs.push_back (128); - bs.push_back (256); - bs.push_back (512); - bs.push_back (1024); - bs.push_back (2048); - bs.push_back (4096); - bs.push_back (8192); - } - s.clear (); - for (vector::const_iterator x = bs.begin(); x != bs.end(); ++x) { - s.push_back (bufsize_as_string (*x)); - } - - if (!s.empty()) { - buffer_size_combo.set_sensitive (true); - set_popdown_strings (buffer_size_combo, s); - - buffer_size_combo.set_active_text (s.front()); - show_buffer_duration (); - } else { - buffer_size_combo.set_sensitive (false); - } - - /* XXX theoretically need to set min + max channel counts here - */ - - manage_control_app_sensitivity (); - } - - /* pick up any saved state for this device */ - - maybe_display_saved_state (); - - /* and push it to the backend */ - - push_state_to_backend (false); -} - -string -EngineControl::bufsize_as_string (uint32_t sz) -{ - /* Translators: "samples" is always plural here, so no - need for plural+singular forms. - */ - char buf[32]; - snprintf (buf, sizeof (buf), _("%u samples"), sz); - return buf; -} - -void -EngineControl::sample_rate_changed () -{ - if (ignore_changes) { - return; - } - - /* reset the strings for buffer size to show the correct msec value - (reflecting the new sample rate). - */ - - show_buffer_duration (); - save_state (); - -} - -void -EngineControl::buffer_size_changed () -{ - if (ignore_changes) { - return; - } - - show_buffer_duration (); - save_state (); -} - -void -EngineControl::show_buffer_duration () -{ - - /* buffer sizes - convert from just samples to samples + msecs for - * the displayed string + char buf[32]; + snprintf (buf, sizeof (buf), _("%u samples"), sz); + return buf; + } + + void + EngineControl::sample_rate_changed () + { + if (ignore_changes) { + return; + } + + /* reset the strings for buffer size to show the correct msec value + (reflecting the new sample rate). */ - string bs_text = buffer_size_combo.get_active_text (); - uint32_t samples = atoi (bs_text); /* will ignore trailing text */ - uint32_t rate = get_rate(); - - /* Translators: "msecs" is ALWAYS plural here, so we do not - need singular form as well. - */ - /* Developers: note the hard-coding of a double buffered model - in the (2 * samples) computation of latency. we always start - the audiobackend in this configuration. - */ - char buf[32]; - snprintf (buf, sizeof (buf), _("(%.1f msecs)"), (2 * samples) / (rate/1000.0)); - buffer_size_duration_label.set_text (buf); -} - -void -EngineControl::midi_option_changed () -{ - if (!ignore_changes) { - save_state (); - } -} - -void -EngineControl::parameter_changed () -{ - if (!ignore_changes) { - save_state (); - } -} - -EngineControl::State* -EngineControl::get_matching_state (const string& backend, - const string& driver, - const string& device) -{ - for (StateList::iterator i = states.begin(); i != states.end(); ++i) { - if ((*i).backend == backend && - (*i).driver == driver && - (*i).device == device) { - return &(*i); - } - } - return 0; -} - -EngineControl::State* -EngineControl::get_saved_state_for_currently_displayed_backend_and_device () -{ - boost::shared_ptr backend = ARDOUR::AudioEngine::instance()->current_backend(); - - if (backend) { - return get_matching_state (backend_combo.get_active_text(), - (backend->requires_driver_selection() ? (std::string) driver_combo.get_active_text() : string()), - device_combo.get_active_text()); - } - - - return get_matching_state (backend_combo.get_active_text(), - string(), - device_combo.get_active_text()); -} - -EngineControl::State* -EngineControl::save_state () -{ - if (!_have_control) { - return 0; - } - - bool existing = true; - State* state = get_saved_state_for_currently_displayed_backend_and_device (); - - if (!state) { - existing = false; - state = new State; - } - - store_state (*state); - - if (!existing) { - states.push_back (*state); - } - - return state; -} - -void -EngineControl::store_state (State& state) -{ - state.backend = get_backend (); - state.driver = get_driver (); - state.device = get_device_name (); - state.sample_rate = get_rate (); - state.buffer_size = get_buffer_size (); - state.input_latency = get_input_latency (); - state.output_latency = get_output_latency (); - state.input_channels = get_input_channels (); - state.output_channels = get_output_channels (); - state.midi_option = get_midi_option (); -} - -void -EngineControl::maybe_display_saved_state () -{ - if (!_have_control) { - return; - } - - State* state = get_saved_state_for_currently_displayed_backend_and_device (); - - if (state) { - PBD::Unwinder protect_ignore_changes (ignore_changes, ignore_changes + 1); - - if (!_desired_sample_rate) { - sample_rate_combo.set_active_text (rate_as_string (state->sample_rate)); - } - buffer_size_combo.set_active_text (bufsize_as_string (state->buffer_size)); - /* call this explicitly because we're ignoring changes to - the controls at this point. - */ - show_buffer_duration (); - input_latency.set_value (state->input_latency); - output_latency.set_value (state->output_latency); - - if (!state->midi_option.empty()) { - midi_option_combo.set_active_text (state->midi_option); - } - } -} - -XMLNode& -EngineControl::get_state () -{ - XMLNode* root = new XMLNode ("AudioMIDISetup"); - std::string path; - - if (!states.empty()) { - XMLNode* state_nodes = new XMLNode ("EngineStates"); - - for (StateList::const_iterator i = states.begin(); i != states.end(); ++i) { - - XMLNode* node = new XMLNode ("State"); - - node->add_property ("backend", (*i).backend); - node->add_property ("driver", (*i).driver); - node->add_property ("device", (*i).device); - node->add_property ("sample-rate", (*i).sample_rate); - node->add_property ("buffer-size", (*i).buffer_size); - node->add_property ("input-latency", (*i).input_latency); - node->add_property ("output-latency", (*i).output_latency); - node->add_property ("input-channels", (*i).input_channels); - node->add_property ("output-channels", (*i).output_channels); - node->add_property ("active", (*i).active ? "yes" : "no"); - node->add_property ("midi-option", (*i).midi_option); - - state_nodes->add_child_nocopy (*node); - } - - root->add_child_nocopy (*state_nodes); - } - - return *root; -} - -void -EngineControl::set_state (const XMLNode& root) -{ - XMLNodeList clist, cclist; - XMLNodeConstIterator citer, cciter; - XMLNode* child; - XMLNode* grandchild; - XMLProperty* prop = NULL; - - if (root.name() != "AudioMIDISetup") { - return; - } - - clist = root.children(); - - states.clear (); - - for (citer = clist.begin(); citer != clist.end(); ++citer) { - - child = *citer; - - if (child->name() != "EngineStates") { - continue; - } - - cclist = child->children(); - - for (cciter = cclist.begin(); cciter != cclist.end(); ++cciter) { - State state; - - grandchild = *cciter; - - if (grandchild->name() != "State") { - continue; - } - - if ((prop = grandchild->property ("backend")) == 0) { - continue; - } - state.backend = prop->value (); - - if ((prop = grandchild->property ("driver")) == 0) { - continue; - } - state.driver = prop->value (); - - if ((prop = grandchild->property ("device")) == 0) { - continue; - } - state.device = prop->value (); - - if ((prop = grandchild->property ("sample-rate")) == 0) { - continue; - } - state.sample_rate = atof (prop->value ()); - - if ((prop = grandchild->property ("buffer-size")) == 0) { - continue; - } - state.buffer_size = atoi (prop->value ()); - - if ((prop = grandchild->property ("input-latency")) == 0) { - continue; - } - state.input_latency = atoi (prop->value ()); - - if ((prop = grandchild->property ("output-latency")) == 0) { - continue; - } - state.output_latency = atoi (prop->value ()); - - if ((prop = grandchild->property ("input-channels")) == 0) { - continue; - } - state.input_channels = atoi (prop->value ()); - - if ((prop = grandchild->property ("output-channels")) == 0) { - continue; - } - state.output_channels = atoi (prop->value ()); - - if ((prop = grandchild->property ("active")) == 0) { - continue; - } - state.active = string_is_affirmative (prop->value ()); - - if ((prop = grandchild->property ("midi-option")) == 0) { - continue; - } - state.midi_option = prop->value (); - - states.push_back (state); - } - } - - /* now see if there was an active state and switch the setup to it */ - - for (StateList::const_iterator i = states.begin(); i != states.end(); ++i) { - - if ((*i).active) { - ignore_changes++; - backend_combo.set_active_text ((*i).backend); - driver_combo.set_active_text ((*i).driver); - device_combo.set_active_text ((*i).device); - sample_rate_combo.set_active_text (rate_as_string ((*i).sample_rate)); - buffer_size_combo.set_active_text (bufsize_as_string ((*i).buffer_size)); - input_latency.set_value ((*i).input_latency); - output_latency.set_value ((*i).output_latency); - midi_option_combo.set_active_text ((*i).midi_option); - ignore_changes--; - break; - } - } -} - - -int -EngineControl::push_state_to_backend (bool start) -{ - if (no_push) { - return 0; - } - - boost::shared_ptr backend = ARDOUR::AudioEngine::instance()->current_backend(); - - if (!backend) { - return 0; - } - - /* figure out what is going to change */ - - bool restart_required = false; - bool was_running = ARDOUR::AudioEngine::instance()->running(); - bool change_driver = false; - bool change_device = false; - bool change_rate = false; - bool change_bufsize = false; - bool change_latency = false; - bool change_channels = false; - bool change_midi = false; - - uint32_t ochan = get_output_channels (); - uint32_t ichan = get_input_channels (); - - if (_have_control) { - - if (started_at_least_once) { - - /* we can control the backend */ - - if (backend->requires_driver_selection()) { - if (get_driver() != backend->driver_name()) { - change_driver = true; - } - } - - if (get_device_name() != backend->device_name()) { - change_device = true; - } - - if (get_rate() != backend->sample_rate()) { - change_rate = true; - } - - if (get_buffer_size() != backend->buffer_size()) { - change_bufsize = true; - } - - if (get_midi_option() != backend->midi_option()) { - change_midi = true; - } - - /* zero-requested channels means "all available" */ - - if (ichan == 0) { - ichan = backend->input_channels(); - } - - if (ochan == 0) { - ochan = backend->output_channels(); - } - - if (ichan != backend->input_channels()) { - change_channels = true; - } - - if (ochan != backend->output_channels()) { - change_channels = true; - } - - if (get_input_latency() != backend->systemic_input_latency() || - get_output_latency() != backend->systemic_output_latency()) { - change_latency = true; - } - } else { - /* backend never started, so we have to force a group - of settings. - */ - change_driver = true; - change_device = true; - change_rate = true; - change_bufsize = true; - change_channels = true; - change_latency = true; - change_midi = true; - } - - } else { - - /* we have no control over the backend, meaning that we can - * only possibly change sample rate and buffer size. - */ - - - if (get_rate() != backend->sample_rate()) { - change_bufsize = true; - } - - if (get_buffer_size() != backend->buffer_size()) { - change_bufsize = true; - } - } - - if (!_have_control) { - - /* We do not have control over the backend, so the best we can - * do is try to change the sample rate and/or bufsize and get - * out of here. - */ - - if (change_rate && !backend->can_change_sample_rate_when_running()) { - return 1; - } - - if (change_bufsize && !backend->can_change_buffer_size_when_running()) { - return 1; - } - - if (change_rate) { - backend->set_sample_rate (get_rate()); - } - - if (change_bufsize) { - backend->set_buffer_size (get_buffer_size()); - } - - post_push (); - - return 0; - } - - /* determine if we need to stop the backend before changing parameters */ - - if (change_driver || change_device || change_channels || change_latency || - (change_rate && !backend->can_change_sample_rate_when_running()) || - change_midi || - (change_bufsize && !backend->can_change_buffer_size_when_running())) { - restart_required = true; - } else { - restart_required = false; - } - - if (was_running) { + show_buffer_duration (); + save_state (); - if (!change_driver && !change_device && !change_channels && !change_latency && !change_midi) { - /* no changes in any parameters that absolutely require a - * restart, so check those that might be changeable without a - * restart - */ - - if (change_rate && !backend->can_change_sample_rate_when_running()) { - /* can't do this while running ... */ - restart_required = true; - } - - if (change_bufsize && !backend->can_change_buffer_size_when_running()) { - /* can't do this while running ... */ - restart_required = true; - } - } - } + } - if (was_running) { - if (restart_required) { - if (ARDOUR_UI::instance()->disconnect_from_engine ()) { - return -1; - } - } - } - + void + EngineControl::buffer_size_changed () + { + if (ignore_changes) { + return; + } - if (change_driver && backend->set_driver (get_driver())) { - error << string_compose (_("Cannot set driver to %1"), get_driver()) << endmsg; - return -1; - } - if (change_device && backend->set_device_name (get_device_name())) { - error << string_compose (_("Cannot set device name to %1"), get_device_name()) << endmsg; - return -1; - } - if (change_rate && backend->set_sample_rate (get_rate())) { - error << string_compose (_("Cannot set sample rate to %1"), get_rate()) << endmsg; - return -1; - } - if (change_bufsize && backend->set_buffer_size (get_buffer_size())) { - error << string_compose (_("Cannot set buffer size to %1"), get_buffer_size()) << endmsg; - return -1; - } + show_buffer_duration (); + save_state (); + } - if (change_channels || get_input_channels() == 0 || get_output_channels() == 0) { - if (backend->set_input_channels (get_input_channels())) { - error << string_compose (_("Cannot set input channels to %1"), get_input_channels()) << endmsg; - return -1; - } - if (backend->set_output_channels (get_output_channels())) { - error << string_compose (_("Cannot set output channels to %1"), get_output_channels()) << endmsg; - return -1; - } - } - if (change_latency) { - if (backend->set_systemic_input_latency (get_input_latency())) { - error << string_compose (_("Cannot set input latency to %1"), get_input_latency()) << endmsg; - return -1; - } - if (backend->set_systemic_output_latency (get_output_latency())) { - error << string_compose (_("Cannot set output latency to %1"), get_output_latency()) << endmsg; - return -1; - } - } + void + EngineControl::show_buffer_duration () + { - if (change_midi) { - backend->set_midi_option (get_midi_option()); - } - - if (start || (was_running && restart_required)) { - if (ARDOUR_UI::instance()->reconnect_to_engine()) { - return -1; - } - } - - post_push (); + /* buffer sizes - convert from just samples to samples + msecs for + * the displayed string + */ - return 0; -} + string bs_text = buffer_size_combo.get_active_text (); + uint32_t samples = atoi (bs_text); /* will ignore trailing text */ + uint32_t rate = get_rate(); -void -EngineControl::post_push () -{ - /* get a pointer to the current state object, creating one if - * necessary + /* Translators: "msecs" is ALWAYS plural here, so we do not + need singular form as well. */ - - if (_have_control) { - State* state = get_saved_state_for_currently_displayed_backend_and_device (); - - if (!state) { - state = save_state (); - assert (state); - } - - /* all off */ - - for (StateList::iterator i = states.begin(); i != states.end(); ++i) { - (*i).active = false; - } - - /* mark this one active (to be used next time the dialog is - * shown) - */ - - state->active = true; - - manage_control_app_sensitivity (); - } - - /* schedule a redisplay of MIDI ports */ - - Glib::signal_timeout().connect (sigc::bind_return (sigc::mem_fun (*this, &EngineControl::refresh_midi_display), false), 1000); -} - - -float -EngineControl::get_rate () const -{ - float r = atof (sample_rate_combo.get_active_text ()); - /* the string may have been translated with an abbreviation for - * thousands, so use a crude heuristic to fix this. + /* Developers: note the hard-coding of a double buffered model + in the (2 * samples) computation of latency. we always start + the audiobackend in this configuration. */ - if (r < 1000.0) { - r *= 1000.0; - } - return r; -} - - -uint32_t -EngineControl::get_buffer_size () const -{ - string txt = buffer_size_combo.get_active_text (); - uint32_t samples; - - if (sscanf (txt.c_str(), "%d", &samples) != 1) { - throw exception (); - } - - return samples; -} - -string -EngineControl::get_midi_option () const -{ - return midi_option_combo.get_active_text(); -} - -uint32_t -EngineControl::get_input_channels() const -{ - return (uint32_t) input_channels_adjustment.get_value(); -} - -uint32_t -EngineControl::get_output_channels() const -{ - return (uint32_t) output_channels_adjustment.get_value(); -} - -uint32_t -EngineControl::get_input_latency() const -{ - return (uint32_t) input_latency_adjustment.get_value(); -} - -uint32_t -EngineControl::get_output_latency() const -{ - return (uint32_t) output_latency_adjustment.get_value(); -} - -string -EngineControl::get_backend () const -{ - return backend_combo.get_active_text (); -} - -string -EngineControl::get_driver () const -{ - return driver_combo.get_active_text (); -} - -string -EngineControl::get_device_name () const -{ - return device_combo.get_active_text (); -} - -void -EngineControl::control_app_button_clicked () -{ - boost::shared_ptr backend = ARDOUR::AudioEngine::instance()->current_backend(); - - if (!backend) { - return; - } - - backend->launch_control_app (); -} - -void -EngineControl::manage_control_app_sensitivity () -{ - boost::shared_ptr backend = ARDOUR::AudioEngine::instance()->current_backend(); - - if (!backend) { - return; - } - - string appname = backend->control_app_name(); - - if (appname.empty()) { - control_app_button.set_sensitive (false); - } else { - control_app_button.set_sensitive (true); - } -} - -void -EngineControl::set_desired_sample_rate (uint32_t sr) -{ - _desired_sample_rate = sr; - device_changed (); -} + char buf[32]; + snprintf (buf, sizeof (buf), _("(%.1f msecs)"), (2 * samples) / (rate/1000.0)); + buffer_size_duration_label.set_text (buf); + } + + void + EngineControl::midi_option_changed () + { + if (!ignore_changes) { + save_state (); + } + } + + void + EngineControl::parameter_changed () + { + if (!ignore_changes) { + save_state (); + } + } + + EngineControl::State* + EngineControl::get_matching_state (const string& backend, + const string& driver, + const string& device) + { + for (StateList::iterator i = states.begin(); i != states.end(); ++i) { + if ((*i).backend == backend && + (*i).driver == driver && + (*i).device == device) { + return &(*i); + } + } + return 0; + } + + EngineControl::State* + EngineControl::get_saved_state_for_currently_displayed_backend_and_device () + { + boost::shared_ptr backend = ARDOUR::AudioEngine::instance()->current_backend(); + + if (backend) { + return get_matching_state (backend_combo.get_active_text(), + (backend->requires_driver_selection() ? (std::string) driver_combo.get_active_text() : string()), + device_combo.get_active_text()); + } + + + return get_matching_state (backend_combo.get_active_text(), + string(), + device_combo.get_active_text()); + } + + EngineControl::State* + EngineControl::save_state () + { + if (!_have_control) { + return 0; + } + + bool existing = true; + State* state = get_saved_state_for_currently_displayed_backend_and_device (); + + if (!state) { + existing = false; + state = new State; + } + + store_state (*state); + + if (!existing) { + states.push_back (*state); + } + + return state; + } + + void + EngineControl::store_state (State& state) + { + state.backend = get_backend (); + state.driver = get_driver (); + state.device = get_device_name (); + state.sample_rate = get_rate (); + state.buffer_size = get_buffer_size (); + state.input_latency = get_input_latency (); + state.output_latency = get_output_latency (); + state.input_channels = get_input_channels (); + state.output_channels = get_output_channels (); + state.midi_option = get_midi_option (); + } + + void + EngineControl::maybe_display_saved_state () + { + if (!_have_control) { + return; + } + + State* state = get_saved_state_for_currently_displayed_backend_and_device (); + + if (state) { + PBD::Unwinder protect_ignore_changes (ignore_changes, ignore_changes + 1); + + if (!_desired_sample_rate) { + sample_rate_combo.set_active_text (rate_as_string (state->sample_rate)); + } + buffer_size_combo.set_active_text (bufsize_as_string (state->buffer_size)); + /* call this explicitly because we're ignoring changes to + the controls at this point. + */ + show_buffer_duration (); + input_latency.set_value (state->input_latency); + output_latency.set_value (state->output_latency); + + if (!state->midi_option.empty()) { + midi_option_combo.set_active_text (state->midi_option); + } + } + } -void -EngineControl::on_switch_page (GtkNotebookPage*, guint page_num) -{ - if (page_num == 0) { - cancel_button->set_sensitive (true); - ok_button->set_sensitive (true); - apply_button->set_sensitive (true); - } else { - cancel_button->set_sensitive (false); - ok_button->set_sensitive (false); - apply_button->set_sensitive (false); - } + XMLNode& + EngineControl::get_state () + { + XMLNode* root = new XMLNode ("AudioMIDISetup"); + std::string path; + + if (!states.empty()) { + XMLNode* state_nodes = new XMLNode ("EngineStates"); + + for (StateList::const_iterator i = states.begin(); i != states.end(); ++i) { + + XMLNode* node = new XMLNode ("State"); + + node->add_property ("backend", (*i).backend); + node->add_property ("driver", (*i).driver); + node->add_property ("device", (*i).device); + node->add_property ("sample-rate", (*i).sample_rate); + node->add_property ("buffer-size", (*i).buffer_size); + node->add_property ("input-latency", (*i).input_latency); + node->add_property ("output-latency", (*i).output_latency); + node->add_property ("input-channels", (*i).input_channels); + node->add_property ("output-channels", (*i).output_channels); + node->add_property ("active", (*i).active ? "yes" : "no"); + node->add_property ("midi-option", (*i).midi_option); + + state_nodes->add_child_nocopy (*node); + } + + root->add_child_nocopy (*state_nodes); + } + + return *root; + } + + void + EngineControl::set_state (const XMLNode& root) + { + XMLNodeList clist, cclist; + XMLNodeConstIterator citer, cciter; + XMLNode* child; + XMLNode* grandchild; + XMLProperty* prop = NULL; + + if (root.name() != "AudioMIDISetup") { + return; + } + + clist = root.children(); + + states.clear (); + + for (citer = clist.begin(); citer != clist.end(); ++citer) { + + child = *citer; + + if (child->name() != "EngineStates") { + continue; + } + + cclist = child->children(); + + for (cciter = cclist.begin(); cciter != cclist.end(); ++cciter) { + State state; + + grandchild = *cciter; + + if (grandchild->name() != "State") { + continue; + } + + if ((prop = grandchild->property ("backend")) == 0) { + continue; + } + state.backend = prop->value (); + + if ((prop = grandchild->property ("driver")) == 0) { + continue; + } + state.driver = prop->value (); + + if ((prop = grandchild->property ("device")) == 0) { + continue; + } + state.device = prop->value (); + + if ((prop = grandchild->property ("sample-rate")) == 0) { + continue; + } + state.sample_rate = atof (prop->value ()); + + if ((prop = grandchild->property ("buffer-size")) == 0) { + continue; + } + state.buffer_size = atoi (prop->value ()); + + if ((prop = grandchild->property ("input-latency")) == 0) { + continue; + } + state.input_latency = atoi (prop->value ()); + + if ((prop = grandchild->property ("output-latency")) == 0) { + continue; + } + state.output_latency = atoi (prop->value ()); + + if ((prop = grandchild->property ("input-channels")) == 0) { + continue; + } + state.input_channels = atoi (prop->value ()); + + if ((prop = grandchild->property ("output-channels")) == 0) { + continue; + } + state.output_channels = atoi (prop->value ()); + + if ((prop = grandchild->property ("active")) == 0) { + continue; + } + state.active = string_is_affirmative (prop->value ()); + + if ((prop = grandchild->property ("midi-option")) == 0) { + continue; + } + state.midi_option = prop->value (); - if (page_num == midi_tab) { - /* MIDI tab */ - refresh_midi_display (); - } + states.push_back (state); + } + } + + /* now see if there was an active state and switch the setup to it */ + + for (StateList::const_iterator i = states.begin(); i != states.end(); ++i) { + + if ((*i).active) { + ignore_changes++; + backend_combo.set_active_text ((*i).backend); + driver_combo.set_active_text ((*i).driver); + device_combo.set_active_text ((*i).device); + sample_rate_combo.set_active_text (rate_as_string ((*i).sample_rate)); + buffer_size_combo.set_active_text (bufsize_as_string ((*i).buffer_size)); + input_latency.set_value ((*i).input_latency); + output_latency.set_value ((*i).output_latency); + midi_option_combo.set_active_text ((*i).midi_option); + ignore_changes--; + break; + } + } + } + + + int + EngineControl::push_state_to_backend (bool start) + { + if (no_push) { + return 0; + } + + boost::shared_ptr backend = ARDOUR::AudioEngine::instance()->current_backend(); + + if (!backend) { + return 0; + } + + /* figure out what is going to change */ + + bool restart_required = false; + bool was_running = ARDOUR::AudioEngine::instance()->running(); + bool change_driver = false; + bool change_device = false; + bool change_rate = false; + bool change_bufsize = false; + bool change_latency = false; + bool change_channels = false; + bool change_midi = false; + + uint32_t ochan = get_output_channels (); + uint32_t ichan = get_input_channels (); + + if (_have_control) { + + if (started_at_least_once) { + + /* we can control the backend */ + + if (backend->requires_driver_selection()) { + if (get_driver() != backend->driver_name()) { + change_driver = true; + } + } + + if (get_device_name() != backend->device_name()) { + change_device = true; + } + + if (get_rate() != backend->sample_rate()) { + change_rate = true; + } + + if (get_buffer_size() != backend->buffer_size()) { + change_bufsize = true; + } + + if (get_midi_option() != backend->midi_option()) { + change_midi = true; + } + + /* zero-requested channels means "all available" */ + + if (ichan == 0) { + ichan = backend->input_channels(); + } + + if (ochan == 0) { + ochan = backend->output_channels(); + } + + if (ichan != backend->input_channels()) { + change_channels = true; + } + + if (ochan != backend->output_channels()) { + change_channels = true; + } + + if (get_input_latency() != backend->systemic_input_latency() || + get_output_latency() != backend->systemic_output_latency()) { + change_latency = true; + } + } else { + /* backend never started, so we have to force a group + of settings. + */ + change_driver = true; + change_device = true; + change_rate = true; + change_bufsize = true; + change_channels = true; + change_latency = true; + change_midi = true; + } + + } else { + + /* we have no control over the backend, meaning that we can + * only possibly change sample rate and buffer size. + */ + + + if (get_rate() != backend->sample_rate()) { + change_bufsize = true; + } + + if (get_buffer_size() != backend->buffer_size()) { + change_bufsize = true; + } + } + + if (!_have_control) { + + /* We do not have control over the backend, so the best we can + * do is try to change the sample rate and/or bufsize and get + * out of here. + */ + + if (change_rate && !backend->can_change_sample_rate_when_running()) { + return 1; + } + + if (change_bufsize && !backend->can_change_buffer_size_when_running()) { + return 1; + } + + if (change_rate) { + backend->set_sample_rate (get_rate()); + } + + if (change_bufsize) { + backend->set_buffer_size (get_buffer_size()); + } + + post_push (); + + return 0; + } + + /* determine if we need to stop the backend before changing parameters */ + + if (change_driver || change_device || change_channels || change_latency || + (change_rate && !backend->can_change_sample_rate_when_running()) || + change_midi || + (change_bufsize && !backend->can_change_buffer_size_when_running())) { + restart_required = true; + } else { + restart_required = false; + } + + if (was_running) { + + if (!change_driver && !change_device && !change_channels && !change_latency && !change_midi) { + /* no changes in any parameters that absolutely require a + * restart, so check those that might be changeable without a + * restart + */ + + if (change_rate && !backend->can_change_sample_rate_when_running()) { + /* can't do this while running ... */ + restart_required = true; + } + + if (change_bufsize && !backend->can_change_buffer_size_when_running()) { + /* can't do this while running ... */ + restart_required = true; + } + } + } + + if (was_running) { + if (restart_required) { + if (ARDOUR_UI::instance()->disconnect_from_engine ()) { + return -1; + } + } + } + + + if (change_driver && backend->set_driver (get_driver())) { + error << string_compose (_("Cannot set driver to %1"), get_driver()) << endmsg; + return -1; + } + if (change_device && backend->set_device_name (get_device_name())) { + error << string_compose (_("Cannot set device name to %1"), get_device_name()) << endmsg; + return -1; + } + if (change_rate && backend->set_sample_rate (get_rate())) { + error << string_compose (_("Cannot set sample rate to %1"), get_rate()) << endmsg; + return -1; + } + if (change_bufsize && backend->set_buffer_size (get_buffer_size())) { + error << string_compose (_("Cannot set buffer size to %1"), get_buffer_size()) << endmsg; + return -1; + } + + if (change_channels || get_input_channels() == 0 || get_output_channels() == 0) { + if (backend->set_input_channels (get_input_channels())) { + error << string_compose (_("Cannot set input channels to %1"), get_input_channels()) << endmsg; + return -1; + } + if (backend->set_output_channels (get_output_channels())) { + error << string_compose (_("Cannot set output channels to %1"), get_output_channels()) << endmsg; + return -1; + } + } + if (change_latency) { + if (backend->set_systemic_input_latency (get_input_latency())) { + error << string_compose (_("Cannot set input latency to %1"), get_input_latency()) << endmsg; + return -1; + } + if (backend->set_systemic_output_latency (get_output_latency())) { + error << string_compose (_("Cannot set output latency to %1"), get_output_latency()) << endmsg; + return -1; + } + } + + if (change_midi) { + backend->set_midi_option (get_midi_option()); + } + + if (start || (was_running && restart_required)) { + if (ARDOUR_UI::instance()->reconnect_to_engine()) { + return -1; + } + } + + post_push (); + + return 0; + } + + void + EngineControl::post_push () + { + /* get a pointer to the current state object, creating one if + * necessary + */ + + if (_have_control) { + State* state = get_saved_state_for_currently_displayed_backend_and_device (); + + if (!state) { + state = save_state (); + assert (state); + } + + /* all off */ + + for (StateList::iterator i = states.begin(); i != states.end(); ++i) { + (*i).active = false; + } + + /* mark this one active (to be used next time the dialog is + * shown) + */ + + state->active = true; + + manage_control_app_sensitivity (); + } + + /* schedule a redisplay of MIDI ports */ + + Glib::signal_timeout().connect (sigc::bind_return (sigc::mem_fun (*this, &EngineControl::refresh_midi_display), false), 1000); + } + + + float + EngineControl::get_rate () const + { + float r = atof (sample_rate_combo.get_active_text ()); + /* the string may have been translated with an abbreviation for + * thousands, so use a crude heuristic to fix this. + */ + if (r < 1000.0) { + r *= 1000.0; + } + return r; + } + + + uint32_t + EngineControl::get_buffer_size () const + { + string txt = buffer_size_combo.get_active_text (); + uint32_t samples; + + if (sscanf (txt.c_str(), "%d", &samples) != 1) { + throw exception (); + } + + return samples; + } + + string + EngineControl::get_midi_option () const + { + return midi_option_combo.get_active_text(); + } + + uint32_t + EngineControl::get_input_channels() const + { + return (uint32_t) input_channels_adjustment.get_value(); + } + + uint32_t + EngineControl::get_output_channels() const + { + return (uint32_t) output_channels_adjustment.get_value(); + } + + uint32_t + EngineControl::get_input_latency() const + { + return (uint32_t) input_latency_adjustment.get_value(); + } + + uint32_t + EngineControl::get_output_latency() const + { + return (uint32_t) output_latency_adjustment.get_value(); + } + + string + EngineControl::get_backend () const + { + return backend_combo.get_active_text (); + } + + string + EngineControl::get_driver () const + { + return driver_combo.get_active_text (); + } + + string + EngineControl::get_device_name () const + { + return device_combo.get_active_text (); + } + + void + EngineControl::control_app_button_clicked () + { + boost::shared_ptr backend = ARDOUR::AudioEngine::instance()->current_backend(); + + if (!backend) { + return; + } + + backend->launch_control_app (); + } + + void + EngineControl::manage_control_app_sensitivity () + { + boost::shared_ptr backend = ARDOUR::AudioEngine::instance()->current_backend(); + + if (!backend) { + return; + } + + string appname = backend->control_app_name(); + + if (appname.empty()) { + control_app_button.set_sensitive (false); + } else { + control_app_button.set_sensitive (true); + } + } + + void + EngineControl::set_desired_sample_rate (uint32_t sr) + { + _desired_sample_rate = sr; + device_changed (); + } + + void + EngineControl::on_switch_page (GtkNotebookPage*, guint page_num) + { + if (page_num == 0) { + cancel_button->set_sensitive (true); + ok_button->set_sensitive (true); + apply_button->set_sensitive (true); + } else { + cancel_button->set_sensitive (false); + ok_button->set_sensitive (false); + apply_button->set_sensitive (false); + } + + if (page_num == midi_tab) { + /* MIDI tab */ + refresh_midi_display (); + } + + if (page_num == latency_tab) { + /* latency tab */ + + if (!ARDOUR::AudioEngine::instance()->running()) { + + PBD::Unwinder protect_ignore_changes (ignore_changes, ignore_changes + 1); + + /* save any existing latency values */ + + uint32_t il = (uint32_t) input_latency.get_value (); + uint32_t ol = (uint32_t) input_latency.get_value (); + + /* reset to zero so that our new test instance of JACK + will be clean of any existing latency measures. + */ - if (page_num == latency_tab) { - /* latency tab */ + input_latency.set_value (0); + output_latency.set_value (0); - if (!ARDOUR::AudioEngine::instance()->running()) { - - PBD::Unwinder protect_ignore_changes (ignore_changes, ignore_changes + 1); - - /* save any existing latency values */ - - uint32_t il = (uint32_t) input_latency.get_value (); - uint32_t ol = (uint32_t) input_latency.get_value (); + /* reset control */ - /* reset to zero so that our new test instance of JACK - will be clean of any existing latency measures. - */ - - input_latency.set_value (0); - output_latency.set_value (0); - - /* reset control */ + input_latency.set_value (il); + output_latency.set_value (ol); - input_latency.set_value (il); - output_latency.set_value (ol); + } - } + if (ARDOUR::AudioEngine::instance()->prepare_for_latency_measurement()) { + disable_latency_tab (); + } - if (ARDOUR::AudioEngine::instance()->prepare_for_latency_measurement()) { - disable_latency_tab (); - } + enable_latency_tab (); - enable_latency_tab (); + } else { + ARDOUR::AudioEngine::instance()->stop_latency_detection(); + } + } - } else { - ARDOUR::AudioEngine::instance()->stop_latency_detection(); - } -} + /* latency measurement */ -/* latency measurement */ + bool + EngineControl::check_latency_measurement () + { + MTDM* mtdm = ARDOUR::AudioEngine::instance()->mtdm (); -bool -EngineControl::check_latency_measurement () -{ - MTDM* mtdm = ARDOUR::AudioEngine::instance()->mtdm (); + if (mtdm->resolve () < 0) { + lm_results.set_markup (string_compose (results_markup, _("No signal detected "))); + return true; + } - if (mtdm->resolve () < 0) { - lm_results.set_markup (string_compose ("%1", _("No signal detected "))); - return true; - } + if (mtdm->err () > 0.3) { + mtdm->invert (); + mtdm->resolve (); + } - if (mtdm->err () > 0.3) { - mtdm->invert (); - mtdm->resolve (); - } + char buf[128]; + ARDOUR::framecnt_t const sample_rate = ARDOUR::AudioEngine::instance()->sample_rate(); - char buf[128]; - ARDOUR::framecnt_t const sample_rate = ARDOUR::AudioEngine::instance()->sample_rate(); + if (sample_rate == 0) { + lm_results.set_markup (string_compose (results_markup, _("Disconnected from audio engine"))); + ARDOUR::AudioEngine::instance()->stop_latency_detection (); + return false; + } - if (sample_rate == 0) { - lm_results.set_text (_("Disconnected from audio engine")); - ARDOUR::AudioEngine::instance()->stop_latency_detection (); - return false; - } + uint32_t frames_total = mtdm->del(); + uint32_t extra = frames_total - ARDOUR::AudioEngine::instance()->latency_signal_delay(); - uint32_t frames_total = mtdm->del(); - uint32_t extra = frames_total - ARDOUR::AudioEngine::instance()->latency_signal_delay(); + snprintf (buf, sizeof (buf), "%u samples / %.3lf ms", extra, extra * 1000.0f/sample_rate); - snprintf (buf, sizeof (buf), "%u samples %10.3lf ms", extra, extra * 1000.0f/sample_rate); + bool solid = true; - bool solid = true; + if (mtdm->err () > 0.2) { + strcat (buf, " "); + strcat (buf, _("(signal detection error)")); + solid = false; + } - if (mtdm->err () > 0.2) { - strcat (buf, " ??"); - solid = false; - } - - if (mtdm->inv ()) { - strcat (buf, " (Inv)"); - solid = false; - } + if (mtdm->inv ()) { + strcat (buf, " "); + strcat (buf, _("(inverted - bad wiring)")); + solid = false; + } - if (solid) { - lm_measure_button.set_active (false); - lm_use_button.set_sensitive (true); - strcat (buf, " (set)"); - have_lm_results = true; + if (solid) { + end_latency_detection (); + lm_use_button.set_sensitive (true); + have_lm_results = true; } - lm_results.set_text (buf); + lm_results.set_markup (string_compose (results_markup, string_compose (_("Detected roundtrip latency: %1"), buf))); return true; } @@ -1650,12 +1684,14 @@ EngineControl::start_latency_detection () ARDOUR::AudioEngine::instance()->set_latency_output_port (lm_output_channel_combo.get_active_text()); if (ARDOUR::AudioEngine::instance()->start_latency_detection () == 0) { - lm_results.set_text (_("Detecting ...")); + lm_results.set_markup (string_compose (results_markup, _("Detecting ..."))); latency_timeout = Glib::signal_timeout().connect (mem_fun (*this, &EngineControl::check_latency_measurement), 100); - lm_start_stop_label.set_text (_("Cancel measurement")); + lm_measure_button.set_label (_("Cancel")); have_lm_results = false; + lm_use_button.set_sensitive (false); lm_input_channel_combo.set_sensitive (false); lm_output_channel_combo.set_sensitive (false); + lm_running = true; } } @@ -1664,18 +1700,21 @@ EngineControl::end_latency_detection () { latency_timeout.disconnect (); ARDOUR::AudioEngine::instance()->stop_latency_detection (); - lm_start_stop_label.set_text (_("Measure latency")); + lm_measure_button.set_label (_("Measure")); if (!have_lm_results) { - lm_results.set_markup (string_compose ("%1", _("No measurement results yet"))); + lm_results.set_markup (string_compose (results_markup, _("No measurement results yet"))); + } else { + lm_use_button.set_sensitive (false); } lm_input_channel_combo.set_sensitive (true); lm_output_channel_combo.set_sensitive (true); + lm_running = false; } void -EngineControl::latency_button_toggled () +EngineControl::latency_button_clicked () { - if (lm_measure_button.get_active ()) { + if (!lm_running) { start_latency_detection (); } else { end_latency_detection (); @@ -1697,6 +1736,10 @@ EngineControl::use_latency_button_clicked () input_latency_adjustment.set_value (one_way); output_latency_adjustment.set_value (one_way); + + /* back to settings page */ + + notebook.set_current_page (0); } bool diff --git a/gtk2_ardour/engine_dialog.h b/gtk2_ardour/engine_dialog.h index 5ecd840e98..0bf1c3a507 100644 --- a/gtk2_ardour/engine_dialog.h +++ b/gtk2_ardour/engine_dialog.h @@ -36,6 +36,7 @@ #include "pbd/signals.h" #include "ardour_dialog.h" +#include "ardour_button.h" class EngineControl : public ArdourDialog, public PBD::ScopedConnectionList { public: @@ -85,14 +86,16 @@ class EngineControl : public ArdourDialog, public PBD::ScopedConnectionList { Gtk::ComboBoxText lm_output_channel_combo; Gtk::ComboBoxText lm_input_channel_combo; - Gtk::Label lm_start_stop_label; - Gtk::ToggleButton lm_measure_button; + Gtk::Button lm_measure_button; Gtk::Button lm_use_button; + Gtk::Button lm_back_button; + ArdourButton lm_button; Gtk::Label lm_title; Gtk::Label lm_results; Gtk::Table lm_table; Gtk::VBox lm_vbox; bool have_lm_results; + bool lm_running; Gtk::Button* cancel_button; Gtk::Button* ok_button; @@ -192,7 +195,7 @@ class EngineControl : public ArdourDialog, public PBD::ScopedConnectionList { void update_sensitivity (); /* latency measurement */ - void latency_button_toggled (); + void latency_button_clicked (); bool check_latency_measurement (); sigc::connection latency_timeout; void enable_latency_tab (); -- cgit v1.2.3 From 37522a2f5ebd4cad79bf70f5f0a9a5c64e43b48c Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Sat, 12 Oct 2013 15:37:55 -0400 Subject: revert part of 4091ff175c5204 that caused window/sizing chaos. silly paul --- gtk2_ardour/ardour_button.cc | 15 ++------------- gtk2_ardour/ardour_button.h | 5 ----- 2 files changed, 2 insertions(+), 18 deletions(-) diff --git a/gtk2_ardour/ardour_button.cc b/gtk2_ardour/ardour_button.cc index b9d523e325..3f118921d6 100644 --- a/gtk2_ardour/ardour_button.cc +++ b/gtk2_ardour/ardour_button.cc @@ -78,8 +78,6 @@ ArdourButton::ArdourButton (Element e) , _fixed_diameter (true) , _distinct_led_click (false) , _hovering (false) - , _xpad_request (0) - , _ypad_request (0) { ColorsChanged.connect (sigc::mem_fun (*this, &ArdourButton::color_handler)); } @@ -433,20 +431,11 @@ ArdourButton::set_corner_radius (float r) set_dirty (); } -void -ArdourButton::set_padding (int x, int y) -{ - _xpad_request = x; - _ypad_request = y; - - queue_resize (); -} - void ArdourButton::on_size_request (Gtk::Requisition* req) { - int xpad = 0 + _xpad_request; - int ypad = 6 + _ypad_request; + int xpad = 0; + int ypad = 6; CairoWidget::on_size_request (req); diff --git a/gtk2_ardour/ardour_button.h b/gtk2_ardour/ardour_button.h index e236f4594e..65ea10b201 100644 --- a/gtk2_ardour/ardour_button.h +++ b/gtk2_ardour/ardour_button.h @@ -71,8 +71,6 @@ class ArdourButton : public CairoWidget , public Gtkmm2ext::Activatable void set_rounded_corner_mask (int); void set_diameter (float); - void set_padding (int x, int y); - void set_text (const std::string&); void set_markup (const std::string&); void set_angle (const double); @@ -159,9 +157,6 @@ class ArdourButton : public CairoWidget , public Gtkmm2ext::Activatable bool _distinct_led_click; bool _hovering; - int _xpad_request; - int _ypad_request; - static bool _flat_buttons; void setup_led_rect (); -- cgit v1.2.3 From a90858897ec9bf3bb3b8300119de70ed59f02227 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Sat, 12 Oct 2013 16:44:50 -0400 Subject: do not use delete_when_idle() to delete a plugin UI because an entirely separate mechanism exists for that --- gtk2_ardour/engine_dialog.cc | 2 +- gtk2_ardour/plugin_ui.cc | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/gtk2_ardour/engine_dialog.cc b/gtk2_ardour/engine_dialog.cc index 84cb768096..47a2506f92 100644 --- a/gtk2_ardour/engine_dialog.cc +++ b/gtk2_ardour/engine_dialog.cc @@ -497,7 +497,7 @@ EngineControl::EngineControl () EngineControl::~EngineControl () { - + ignore_changes = true; } void diff --git a/gtk2_ardour/plugin_ui.cc b/gtk2_ardour/plugin_ui.cc index 713b98cdaf..86028794d9 100644 --- a/gtk2_ardour/plugin_ui.cc +++ b/gtk2_ardour/plugin_ui.cc @@ -405,8 +405,6 @@ PluginUIWindow::plugin_going_away () } death_connection.disconnect (); - - delete_when_idle (this); } PlugUIBase::PlugUIBase (boost::shared_ptr pi) -- cgit v1.2.3 From f7c54f1435da2f87a40bf8549b8d732995b84bfc Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Sat, 12 Oct 2013 21:25:05 +0200 Subject: video-range export tweaks: * quantize range to video-frame boundaries * warn if range is empty or does not include video --- gtk2_ardour/export_video_dialog.cc | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/gtk2_ardour/export_video_dialog.cc b/gtk2_ardour/export_video_dialog.cc index dd08b58661..eacc32bde2 100644 --- a/gtk2_ardour/export_video_dialog.cc +++ b/gtk2_ardour/export_video_dialog.cc @@ -510,9 +510,8 @@ ExportVideoDialog::launch_export () end += av_offset; } else if (insnd_combo.get_active_row_number() == 2) { - // TODO quantize to video-frame ?! - start = export_range.start(); - end = export_range.end_frame(); + start = ARDOUR_UI::instance()->video_timeline->quantify_frames_to_apv(export_range.start()); + end = ARDOUR_UI::instance()->video_timeline->quantify_frames_to_apv(export_range.end_frame()); } if (end <= 0) { start = _session->current_start_frame(); @@ -522,6 +521,15 @@ ExportVideoDialog::launch_export () printf("audio export-range %lld -> %lld\n", start, end); #endif + const frameoffset_t vstart = ARDOUR_UI::instance()->video_timeline->get_offset(); + const frameoffset_t vend = vstart + ARDOUR_UI::instance()->video_timeline->get_duration(); + + if ( (start >= end) || (end < vstart) || (start > vend)) { + warning << _("Export Video: export-range does not include video.") << endmsg; + Gtk::Dialog::response(RESPONSE_CANCEL); + return; + } + tsp->set_range (start, end); tsp->set_name ("mysession"); tsp->set_range_id ("session"); -- cgit v1.2.3 From c2b2953f8c051743729bfa3328336abf19a25587 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Sat, 12 Oct 2013 22:55:54 +0200 Subject: export video-range: add to context menu --- gtk2_ardour/ardour_ui_ed.cc | 2 +- gtk2_ardour/editor.cc | 3 +++ gtk2_ardour/editor.h | 2 +- gtk2_ardour/editor_videotimeline.cc | 4 ++-- gtk2_ardour/export_video_dialog.cc | 8 ++++++-- gtk2_ardour/export_video_dialog.h | 2 +- gtk2_ardour/public_editor.h | 2 +- 7 files changed, 15 insertions(+), 8 deletions(-) diff --git a/gtk2_ardour/ardour_ui_ed.cc b/gtk2_ardour/ardour_ui_ed.cc index 251fc8f6fc..0ed7a95df3 100644 --- a/gtk2_ardour/ardour_ui_ed.cc +++ b/gtk2_ardour/ardour_ui_ed.cc @@ -139,7 +139,7 @@ ARDOUR_UI::install_actions () sigc::mem_fun (*this, &ARDOUR_UI::remove_video)); act->set_sensitive (false); act = ActionManager::register_action (main_actions, X_("ExportVideo"), _("Export To Video File"), - sigc::mem_fun (*editor, &PublicEditor::export_video)); + hide_return (sigc::bind (sigc::mem_fun(*editor, &PublicEditor::export_video), false))); ActionManager::session_sensitive_actions.push_back (act); act = ActionManager::register_action (main_actions, X_("Snapshot"), _("Snapshot..."), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::snapshot_session), false)); diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc index fc4b6f4d6c..cf3eab5724 100644 --- a/gtk2_ardour/editor.cc +++ b/gtk2_ardour/editor.cc @@ -1911,6 +1911,9 @@ Editor::add_selection_context_items (Menu_Helpers::MenuList& edit_items) edit_items.push_back (MenuElem (_("Bounce Range to Region List"), sigc::bind (sigc::mem_fun(*this, &Editor::bounce_range_selection), false, false))); edit_items.push_back (MenuElem (_("Bounce Range to Region List With Processing"), sigc::bind (sigc::mem_fun(*this, &Editor::bounce_range_selection), false, true))); edit_items.push_back (MenuElem (_("Export Range..."), sigc::mem_fun(*this, &Editor::export_selection))); + if (ARDOUR_UI::instance()->video_timeline->get_duration() > 0) { + edit_items.push_back (MenuElem (_("Export Video Range..."), sigc::bind (sigc::mem_fun(*this, &Editor::export_video), true))); + } } diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h index 033888c4b6..e9269841ff 100644 --- a/gtk2_ardour/editor.h +++ b/gtk2_ardour/editor.h @@ -924,7 +924,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void toggle_ruler_video (bool onoff) {ruler_video_action->set_active(onoff);} int videotl_bar_height; /* in units of timebar_height; default: 4 */ int get_videotl_bar_height () const { return videotl_bar_height; } - void export_video (); + void export_video (bool range = false); void toggle_region_video_lock (); Gtk::VBox time_button_vbox; diff --git a/gtk2_ardour/editor_videotimeline.cc b/gtk2_ardour/editor_videotimeline.cc index 6f3317eabd..7d1c009d58 100644 --- a/gtk2_ardour/editor_videotimeline.cc +++ b/gtk2_ardour/editor_videotimeline.cc @@ -122,7 +122,7 @@ Editor::embed_audio_from_video (std::string path, framepos_t n) } void -Editor::export_video () +Editor::export_video (bool range) { if (ARDOUR::Config->get_show_video_export_info()) { ExportVideoInfobox infobox (_session); @@ -138,7 +138,7 @@ Editor::export_video () break; } } - ExportVideoDialog dialog (_session, get_selection().time); + ExportVideoDialog dialog (_session, get_selection().time, range); Gtk::ResponseType r = (Gtk::ResponseType) dialog.run(); dialog.hide(); #if 0 diff --git a/gtk2_ardour/export_video_dialog.cc b/gtk2_ardour/export_video_dialog.cc index eacc32bde2..2f9df2fb1c 100644 --- a/gtk2_ardour/export_video_dialog.cc +++ b/gtk2_ardour/export_video_dialog.cc @@ -61,7 +61,7 @@ using namespace PBD; using namespace ARDOUR; using namespace VideoUtils; -ExportVideoDialog::ExportVideoDialog (Session* s, TimeSelection &tme) +ExportVideoDialog::ExportVideoDialog (Session* s, TimeSelection &tme, bool range) : ArdourDialog (_("Export Video File ")) , export_range (tme) , outfn_path_label (_("File:"), Gtk::ALIGN_LEFT) @@ -152,7 +152,11 @@ ExportVideoDialog::ExportVideoDialog (Session* s, TimeSelection &tme) if (!export_range.empty()) { insnd_combo.append_text (_("Selected range")); // TODO show export_range.start() -> export_range.end_frame() } - insnd_combo.set_active(0); + if (range) { + insnd_combo.set_active(2); + } else { + insnd_combo.set_active(0); + } outfn_path_entry.set_width_chars(38); outfn_path_entry.set_text (_session->session_directory().export_path() + G_DIR_SEPARATOR +"export.avi"); diff --git a/gtk2_ardour/export_video_dialog.h b/gtk2_ardour/export_video_dialog.h index 7e3cf442a7..5ebcf3258d 100644 --- a/gtk2_ardour/export_video_dialog.h +++ b/gtk2_ardour/export_video_dialog.h @@ -41,7 +41,7 @@ class ExportVideoDialog : public ArdourDialog , public PBD::ScopedConnectionList { public: - ExportVideoDialog (ARDOUR::Session*, TimeSelection &tme); + ExportVideoDialog (ARDOUR::Session*, TimeSelection &tme, bool range = false); ~ExportVideoDialog (); std::string get_exported_filename () { return outfn_path_entry.get_text(); } diff --git a/gtk2_ardour/public_editor.h b/gtk2_ardour/public_editor.h index b5f8503458..1905875141 100644 --- a/gtk2_ardour/public_editor.h +++ b/gtk2_ardour/public_editor.h @@ -300,7 +300,7 @@ class PublicEditor : public Gtk::Window, public PBD::StatefulDestructible, publi virtual int get_videotl_bar_height () const = 0; virtual void set_video_timeline_height (const int h) = 0; virtual void embed_audio_from_video (std::string, framepos_t n = 0) = 0; - virtual void export_video () = 0; + virtual void export_video (bool range = false) = 0; virtual RouteTimeAxisView* get_route_view_by_route_id (const PBD::ID& id) const = 0; -- cgit v1.2.3 From 44b359b70ac85f88aa72ecddb73380afc79265dd Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Sat, 12 Oct 2013 23:04:37 +0200 Subject: enable videotimeline on OSX --- gtk2_ardour/ardour.menus.in | 11 +---------- gtk2_ardour/wscript | 2 +- tools/osx_packaging/osx_build | 4 ++-- 3 files changed, 4 insertions(+), 13 deletions(-) diff --git a/gtk2_ardour/ardour.menus.in b/gtk2_ardour/ardour.menus.in index 9694556e56..6068055324 100644 --- a/gtk2_ardour/ardour.menus.in +++ b/gtk2_ardour/ardour.menus.in @@ -35,10 +35,9 @@ -#ifndef NOVIDEOTIMELINE -#endif + @@ -282,9 +281,7 @@ -#ifndef NOVIDEOTIMELINE -#endif @@ -437,9 +434,7 @@ -#ifndef NOVIDEOTIMELINE -#endif @@ -543,10 +538,8 @@ -#ifndef NOVIDEOTIMELINE -#endif @@ -642,9 +635,7 @@ -#ifndef NOVIDEOTIMELINE -#endif diff --git a/gtk2_ardour/wscript b/gtk2_ardour/wscript index be7164cf05..311ed6ca03 100644 --- a/gtk2_ardour/wscript +++ b/gtk2_ardour/wscript @@ -646,7 +646,7 @@ def build(bld): # Menus menus_argv = [] if bld.is_defined('GTKOSX'): - menus_argv = [ '-E', '-P', '-DGTKOSX', '-DNOVIDEOTIMELINE' ] + menus_argv = [ '-E', '-P', '-DGTKOSX' ] else: menus_argv = [ '-E', '-P' ] diff --git a/tools/osx_packaging/osx_build b/tools/osx_packaging/osx_build index 8d4799163e..0afb984d73 100755 --- a/tools/osx_packaging/osx_build +++ b/tools/osx_packaging/osx_build @@ -13,7 +13,7 @@ fi SAE= MIXBUS= -WITH_HARVID= +WITH_HARVID=1 WITH_LADSPA=1 STRIP=1 PRINT_SYSDEPS= @@ -61,7 +61,7 @@ while [ $# -gt 0 ] ; do # specific build flags # - --harvid) WITH_HARVID=1 ; shift ;; + --noharvid) WITH_HARVID= ; shift ;; --noladspa) WITH_LADSPA= ; shift ;; --nostrip) STRIP= ; shift ;; --sysdeps) PRINT_SYSDEPS=1; shift ;; -- cgit v1.2.3 From 09c7c5fb950c94d0a4db1cc2f9f46d5690c751f9 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Sun, 13 Oct 2013 22:40:39 -0400 Subject: tweak API of WindowProxy, and remove all unnecessary get() calls in functions where, if we have no window, there is nothing to do --- gtk2_ardour/window_manager.cc | 35 ++++++++++++++++++----------------- gtk2_ardour/window_manager.h | 2 +- 2 files changed, 19 insertions(+), 18 deletions(-) diff --git a/gtk2_ardour/window_manager.cc b/gtk2_ardour/window_manager.cc index 4a44dc4691..01baf3e1fd 100644 --- a/gtk2_ardour/window_manager.cc +++ b/gtk2_ardour/window_manager.cc @@ -349,7 +349,7 @@ ProxyBase::setup () assert (_window); vistracker = new Gtkmm2ext::VisibilityTracker (*_window); - _window->signal_delete_event().connect (sigc::mem_fun (*this, &ProxyBase::handle_win_event)); + _window->signal_delete_event().connect (sigc::mem_fun (*this, &ProxyBase::delete_event_handler)); if (_width != -1 || _height != -1 || _x_off != -1 || _y_off != -1) { /* cancel any mouse-based positioning */ @@ -369,8 +369,9 @@ ProxyBase::setup () void ProxyBase::show () { - Gtk::Window* win = get (true); - win->show (); + get (true); + assert (_window); + _window->show (); } void @@ -384,17 +385,19 @@ ProxyBase::maybe_show () void ProxyBase::show_all () { - Gtk::Window* win = get (true); - win->show_all (); + get (true); + assert (_window); + _window->show_all (); } - void ProxyBase::present () { - Gtk::Window* win = get (true); - win->show_all (); - win->present (); + get (true); + assert (_window); + + _window->show_all (); + _window->present (); /* turn off any mouse-based positioning */ _window->set_position (Gtk::WIN_POS_NONE); @@ -403,15 +406,14 @@ ProxyBase::present () void ProxyBase::hide () { - Gtk::Window* win = get (false); - if (win) { + if (_window) { save_pos_and_size(); - win->hide (); + _window->hide (); } } bool -ProxyBase::handle_win_event (GdkEventAny* /*ev*/) +ProxyBase::delete_event_handler (GdkEventAny* /*ev*/) { hide(); return true; @@ -420,10 +422,9 @@ ProxyBase::handle_win_event (GdkEventAny* /*ev*/) void ProxyBase::save_pos_and_size () { - Gtk::Window* win = get (false); - if (win) { - win->get_position (_x_off, _y_off); - win->get_size (_width, _height); + if (_window) { + _window->get_position (_x_off, _y_off); + _window->get_size (_width, _height); } } /*-----------------------*/ diff --git a/gtk2_ardour/window_manager.h b/gtk2_ardour/window_manager.h index ca33b30234..0dbe66b1b1 100644 --- a/gtk2_ardour/window_manager.h +++ b/gtk2_ardour/window_manager.h @@ -122,7 +122,7 @@ class ProxyBase : public ARDOUR::SessionHandlePtr, public sigc::trackable { Gtkmm2ext::VisibilityTracker* vistracker; void save_pos_and_size (); - bool handle_win_event (GdkEventAny *ev); + bool delete_event_handler (GdkEventAny *ev); void setup (); }; -- cgit v1.2.3 From a244075fb31868a9108202763dbd304ddc853a75 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Sun, 13 Oct 2013 22:41:17 -0400 Subject: changes that will help fix a crash related to plugin window visibility. some work still to be done --- gtk2_ardour/plugin_ui.cc | 1 + gtk2_ardour/processor_box.cc | 77 ++++++++++++++++++++++++++++++++++++++++---- gtk2_ardour/processor_box.h | 12 ++++++- 3 files changed, 83 insertions(+), 7 deletions(-) diff --git a/gtk2_ardour/plugin_ui.cc b/gtk2_ardour/plugin_ui.cc index 86028794d9..3f523a82d2 100644 --- a/gtk2_ardour/plugin_ui.cc +++ b/gtk2_ardour/plugin_ui.cc @@ -161,6 +161,7 @@ PluginUIWindow::PluginUIWindow ( PluginUIWindow::~PluginUIWindow () { + cerr << "PluginWindow deleted for " << this << endl; delete _pluginui; } diff --git a/gtk2_ardour/processor_box.cc b/gtk2_ardour/processor_box.cc index 17f548c0e3..0585d3792d 100644 --- a/gtk2_ardour/processor_box.cc +++ b/gtk2_ardour/processor_box.cc @@ -1392,7 +1392,7 @@ ProcessorBox::redisplay_processors () _route->foreach_processor (sigc::mem_fun (*this, &ProcessorBox::add_processor_to_display)); - for (list::iterator i = _processor_window_info.begin(); i != _processor_window_info.end(); ++i) { + for (ProcessorWindowProxies::iterator i = _processor_window_info.begin(); i != _processor_window_info.end(); ++i) { (*i)->marked = false; } @@ -1400,16 +1400,43 @@ ProcessorBox::redisplay_processors () /* trim dead wood from the processor window proxy list */ - list::iterator i = _processor_window_info.begin(); + ProcessorWindowProxies::iterator i = _processor_window_info.begin(); while (i != _processor_window_info.end()) { - list::iterator j = i; + ProcessorWindowProxies::iterator j = i; ++j; - if (!(*i)->marked) { + if (!(*i)->valid()) { + WM::Manager::instance().remove (*i); delete *i; _processor_window_info.erase (i); - } + + } else if (!(*i)->marked) { + + /* this processor is no longer part of this processor + * box. + * + * that could be because it was deleted or it could be + * because the route being displayed in the parent + * strip changed. + * + * The latter only happens with the editor mixer strip. + */ + + if (is_editor_mixer_strip()) { + + /* editor mixer strip .. DO NOTHING + * + * note: the processor window stays visible if + * it is already visible + */ + } else { + (*i)->hide (); + WM::Manager::instance().remove (*i); + delete *i; + _processor_window_info.erase (i); + } + } i = j; } @@ -1428,7 +1455,7 @@ ProcessorBox::maybe_add_processor_to_ui_list (boost::weak_ptr w) return; } - list::iterator i = _processor_window_info.begin (); + ProcessorWindowProxies::iterator i = _processor_window_info.begin (); while (i != _processor_window_info.end()) { boost::shared_ptr t = (*i)->processor().lock (); @@ -2667,6 +2694,12 @@ ProcessorBox::update_gui_object_state (ProcessorEntry* entry) entry->add_control_state (proc); } +bool +ProcessorBox::is_editor_mixer_strip() const +{ + return _parent_strip && !_parent_strip->mixer_owned(); +} + ProcessorWindowProxy::ProcessorWindowProxy (string const & name, ProcessorBox* box, boost::weak_ptr processor) : WM::ProxyBase (name, string()) , marked (false) @@ -2674,8 +2707,34 @@ ProcessorWindowProxy::ProcessorWindowProxy (string const & name, ProcessorBox* b , _processor (processor) , is_custom (false) , want_custom (false) + , _valid (true) +{ + boost::shared_ptr p = _processor.lock (); + if (!p) { + return; + } + p->DropReferences.connect (going_away_connection, MISSING_INVALIDATOR, boost::bind (&ProcessorWindowProxy::processor_going_away, this), gui_context()); +} + +ProcessorWindowProxy::~ProcessorWindowProxy() { + /* processor window proxies do not own the windows they create with + * ::get(), so set _window to null before the normal WindowProxy method + * deletes it. + */ + _window = 0; +} +void +ProcessorWindowProxy::processor_going_away () +{ + delete _window; + _window = 0; + _valid = false; + /* should be no real reason to do this, since the object that would + send DropReferences is about to be deleted, but lets do it anyway. + */ + going_away_connection.disconnect(); } ARDOUR::SessionHandlePtr* @@ -2685,6 +2744,12 @@ ProcessorWindowProxy::session_handle() return 0; } +bool +ProcessorWindowProxy::valid() const +{ + return _valid; +} + XMLNode& ProcessorWindowProxy::get_state () const { diff --git a/gtk2_ardour/processor_box.h b/gtk2_ardour/processor_box.h index a72eb3223d..41bc68281f 100644 --- a/gtk2_ardour/processor_box.h +++ b/gtk2_ardour/processor_box.h @@ -79,6 +79,7 @@ class ProcessorWindowProxy : public WM::ProxyBase { public: ProcessorWindowProxy (std::string const &, ProcessorBox *, boost::weak_ptr); + ~ProcessorWindowProxy(); Gtk::Window* get (bool create = false); @@ -91,6 +92,7 @@ class ProcessorWindowProxy : public WM::ProxyBase void set_custom_ui_mode(bool use_custom) { want_custom = use_custom; } bool marked; + bool valid () const; void set_state (const XMLNode&); XMLNode& get_state () const; @@ -100,6 +102,10 @@ class ProcessorWindowProxy : public WM::ProxyBase boost::weak_ptr _processor; bool is_custom; bool want_custom; + bool _valid; + + void processor_going_away (); + PBD::ScopedConnection going_away_connection; }; class ProcessorEntry : public Gtkmm2ext::DnDVBoxChild, public sigc::trackable @@ -303,6 +309,8 @@ class ProcessorBox : public Gtk::HBox, public PluginInterestedObject, public ARD void route_going_away (); + bool is_editor_mixer_strip() const; + Gtkmm2ext::DnDVBox processor_display; Gtk::ScrolledWindow processor_scroller; @@ -404,7 +412,9 @@ class ProcessorBox : public Gtk::HBox, public PluginInterestedObject, public ARD void route_property_changed (const PBD::PropertyChange&); std::string generate_processor_title (boost::shared_ptr pi); - std::list _processor_window_info; + typedef std::list ProcessorWindowProxies; + ProcessorWindowProxies _processor_window_info; + ProcessorWindowProxy* find_window_proxy (boost::shared_ptr) const; void set_processor_ui (boost::shared_ptr, Gtk::Window *); -- cgit v1.2.3 From d9058499afa3fc84a6746f290c4b87501a4dcb4b Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Mon, 14 Oct 2013 11:12:50 -0400 Subject: add a back-pointer to the owner of a Processor Use SessionObject* rather than Route so that per-region plugins will be possible in the future. --- libs/ardour/ardour/processor.h | 4 ++++ libs/ardour/processor.cc | 12 ++++++++++++ libs/ardour/route.cc | 4 ++++ 3 files changed, 20 insertions(+) diff --git a/libs/ardour/ardour/processor.h b/libs/ardour/ardour/processor.h index 772ae3520d..18f13dbc78 100644 --- a/libs/ardour/ardour/processor.h +++ b/libs/ardour/ardour/processor.h @@ -113,6 +113,9 @@ class Processor : public SessionObject, public Automatable, public Latent void set_ui (void*); void* get_ui () const { return _ui_pointer; } + void set_owner (SessionObject*); + SessionObject* owner() const; + protected: virtual int set_state_2X (const XMLNode&, int version); @@ -125,6 +128,7 @@ protected: bool _display_to_user; bool _pre_fader; ///< true if this processor is currently placed before the Amp, otherwise false void* _ui_pointer; + SessionObject* _owner; }; } // namespace ARDOUR diff --git a/libs/ardour/processor.cc b/libs/ardour/processor.cc index 3f8fdf509d..f9590bee11 100644 --- a/libs/ardour/processor.cc +++ b/libs/ardour/processor.cc @@ -269,3 +269,15 @@ Processor::set_ui (void* p) { _ui_pointer = p; } + +void +Processor::set_owner (SessionObject* o) +{ + _owner = o; +} + +SessionObject* +Processor::owner() const +{ + return _owner; +} diff --git a/libs/ardour/route.cc b/libs/ardour/route.cc index d0b2260c3d..f6af17b1b8 100644 --- a/libs/ardour/route.cc +++ b/libs/ardour/route.cc @@ -149,6 +149,7 @@ Route::init () */ _meter.reset (new PeakMeter (_session, _name)); + _meter->set_owner (this); _meter->set_display_to_user (false); _meter->activate (); @@ -1011,6 +1012,7 @@ Route::add_processor (boost::shared_ptr processor, boost::shared_ptr< } _processors.insert (loc, processor); + processor->set_owner (this); // Set up processor list channels. This will set processor->[input|output]_streams(), // configure redirect ports properly, etc. @@ -1161,6 +1163,7 @@ Route::add_processors (const ProcessorList& others, boost::shared_ptr } _processors.insert (loc, *i); + (*i)->set_owner (this); if ((*i)->active()) { (*i)->activate (); @@ -2616,6 +2619,7 @@ Route::set_processor_state (const XMLNode& node) for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) { + (*i)->set_owner (this); (*i)->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false)); boost::shared_ptr pi; -- cgit v1.2.3 From a901f28c6287ff99444d6a8afe67b71531a5f7d0 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Mon, 14 Oct 2013 11:14:38 -0400 Subject: use processor owner to set GUIs opened by a ProcessorBox, not current route name Since the GUIs remain open across changes in track selection for the editor mixer now, the current route name is not always correct as the owner/location of the Processor. --- gtk2_ardour/processor_box.cc | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/gtk2_ardour/processor_box.cc b/gtk2_ardour/processor_box.cc index 0585d3792d..a22e991752 100644 --- a/gtk2_ardour/processor_box.cc +++ b/gtk2_ardour/processor_box.cc @@ -2104,6 +2104,18 @@ ProcessorBox::get_editor_window (boost::shared_ptr processor, bool us boost::shared_ptr port_insert; Window* gidget = 0; + /* This method may or may not return a Window, but if it does not it + * will modify the parent mixer strip appearance layout to allow + * "editing" the @param processor that was passed in. + * + * So for example, if the processor is an Amp (gain), the parent strip + * will be forced back into a model where the fader controls the main gain. + * If the processor is a send, then we map the send controls onto the + * strip. + * + * Plugins and others will return a window for control. + */ + if (boost::dynamic_pointer_cast(_route) != 0) { if (boost::dynamic_pointer_cast (_route)->freeze_state() == AudioTrack::Frozen) { @@ -2581,7 +2593,13 @@ ProcessorBox::generate_processor_title (boost::shared_ptr pi) maker += " ..."; } - return string_compose(_("%1: %2 (by %3)"), _route->name(), pi->name(), maker); + SessionObject* owner = pi->owner(); + + if (owner) { + return string_compose(_("%1: %2 (by %3)"), owner->name(), pi->name(), maker); + } else { + return string_compose(_("%2 (by %3)"), pi->name(), maker); + } } /** @param p Processor. -- cgit v1.2.3 From fdbb9d240d870dd7ddf9c04dcfe5b1d5c7211639 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Tue, 15 Oct 2013 01:53:29 +0200 Subject: update osx dmg packaging to new pango --- tools/osx_packaging/osx_build | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/osx_packaging/osx_build b/tools/osx_packaging/osx_build index 0afb984d73..2fec6965e8 100755 --- a/tools/osx_packaging/osx_build +++ b/tools/osx_packaging/osx_build @@ -258,7 +258,7 @@ fi cp -R $GTKSTACK_ROOT/etc/* $Etc echo "Copying all Pango modules ..." -cp -R $GTKSTACK_ROOT/lib/pango/1.6.0/modules/*.so $Frameworks/modules +cp -R $GTKSTACK_ROOT/lib/pango/1.8.0/modules/*.so $Frameworks/modules echo "Copying all GDK Pixbuf loaders ..." cp -R $GTKSTACK_ROOT/lib/gdk-pixbuf-2.0/2.10.0/loaders/*.so $Frameworks/modules # charset alias file @@ -269,7 +269,7 @@ cat > pangorc < $Resources/pango.modules +env PANGO_RC_FILE=pangorc $GTKSTACK_ROOT/bin/pango-querymodules | sed "s?$GTKSTACK_ROOT/lib/pango/1.8.0/modules/?@executable_path/../lib/modules/?" > $Resources/pango.modules rm pangorc # generate a new GDK pixbufs loaders file -- cgit v1.2.3 From 1735d791dd6ae8bd795872bd87645511640a9751 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Tue, 15 Oct 2013 01:57:38 +0200 Subject: amend to prev commit. --- tools/osx_packaging/osx_build | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/osx_packaging/osx_build b/tools/osx_packaging/osx_build index 2fec6965e8..8cce6423d6 100755 --- a/tools/osx_packaging/osx_build +++ b/tools/osx_packaging/osx_build @@ -267,7 +267,7 @@ cp -R $GTKSTACK_ROOT/lib/charset.alias $Resources # generate new Pango module file cat > pangorc < $Resources/pango.modules rm pangorc -- cgit v1.2.3 From 89738cc3c230cfad84dd38bfa1477b40146010a2 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Tue, 15 Oct 2013 10:32:36 -0400 Subject: fix typo in PBD::demangle() for systems without execinfo.h --- libs/pbd/stacktrace.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/pbd/stacktrace.cc b/libs/pbd/stacktrace.cc index b78f0e9338..021c9b7c04 100644 --- a/libs/pbd/stacktrace.cc +++ b/libs/pbd/stacktrace.cc @@ -99,7 +99,7 @@ PBD::stacktrace (std::ostream& out, int levels) std::string PBD::demangle (std::string const & l) { - return string; + return string(); } void -- cgit v1.2.3 From a29b83c1244f3934511421fd9e772badb57c3727 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Tue, 15 Oct 2013 10:41:42 -0400 Subject: fix namespace issue with demangle on systems without execinfo.h --- libs/pbd/stacktrace.cc | 2 +- tools/linux_packaging/build | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/libs/pbd/stacktrace.cc b/libs/pbd/stacktrace.cc index 021c9b7c04..b89ebcc8a9 100644 --- a/libs/pbd/stacktrace.cc +++ b/libs/pbd/stacktrace.cc @@ -97,7 +97,7 @@ PBD::stacktrace (std::ostream& out, int levels) #else std::string -PBD::demangle (std::string const & l) +demangle (std::string const & l) { return string(); } diff --git a/tools/linux_packaging/build b/tools/linux_packaging/build index d24aec4f8e..37d2dfe403 100755 --- a/tools/linux_packaging/build +++ b/tools/linux_packaging/build @@ -304,7 +304,7 @@ fi cp -R $GTKSTACK_ROOT/etc/* $Etc echo "Copying all Pango modules ..." -cp -R $GTKSTACK_ROOT/lib/pango/1.6.0/modules/*.so $Modules +cp -R $GTKSTACK_ROOT/lib/pango/1.8.0/modules/*.so $Modules echo "Copying all GDK Pixbuf loaders ..." cp -R $GTKSTACK_ROOT/lib/gdk-pixbuf-2.0/2.10.0/loaders/*.so $Loaders @@ -314,7 +314,7 @@ cat > pangorc < $Etc/pango.modules.in +env PANGO_RC_FILE=pangorc $GTKSTACK_ROOT/bin/pango-querymodules | sed "s?$GTKSTACK_ROOT/lib/pango/1.8.0/?@ROOTDIR@/?" > $Etc/pango.modules.in rm pangorc # Ditto for gdk-pixbuf loaders -- cgit v1.2.3 From 130a65224763cd6eb75b4d4cad05abfdf557c4e0 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Tue, 15 Oct 2013 10:51:13 -0400 Subject: additional pango version update --- tools/linux_packaging/build | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/linux_packaging/build b/tools/linux_packaging/build index 37d2dfe403..3d8b58c97c 100755 --- a/tools/linux_packaging/build +++ b/tools/linux_packaging/build @@ -312,7 +312,7 @@ cp -R $GTKSTACK_ROOT/lib/gdk-pixbuf-2.0/2.10.0/loaders/*.so $Loaders cat > pangorc < $Etc/pango.modules.in rm pangorc -- cgit v1.2.3 From 8a76441b0f95ea49aaffea43bfe9194becbb914a Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Tue, 15 Oct 2013 10:52:29 -0400 Subject: re-fix typo in PBD::demangle() for systems without execinfo.h --- libs/pbd/stacktrace.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/pbd/stacktrace.cc b/libs/pbd/stacktrace.cc index b89ebcc8a9..4fafb6120c 100644 --- a/libs/pbd/stacktrace.cc +++ b/libs/pbd/stacktrace.cc @@ -99,7 +99,7 @@ PBD::stacktrace (std::ostream& out, int levels) std::string demangle (std::string const & l) { - return string(); + return std::string(); } void -- cgit v1.2.3 From f6ba1d2271aae8a9d5ff537380d4db718120338b Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Tue, 15 Oct 2013 10:58:46 -0400 Subject: fix signed/unsigned issue pointed out by old apple gcc --- libs/surfaces/mackie/mackie_control_protocol.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/surfaces/mackie/mackie_control_protocol.cc b/libs/surfaces/mackie/mackie_control_protocol.cc index 32be851247..b55ac74c35 100644 --- a/libs/surfaces/mackie/mackie_control_protocol.cc +++ b/libs/surfaces/mackie/mackie_control_protocol.cc @@ -1382,7 +1382,7 @@ MackieControlProtocol::add_down_select_button (int surface, int strip) void MackieControlProtocol::remove_down_select_button (int surface, int strip) { - DownButtonList::iterator x = find (_down_select_buttons.begin(), _down_select_buttons.end(), (surface<<8)|(strip&0xf)); + DownButtonList::iterator x = find (_down_select_buttons.begin(), _down_select_buttons.end(), (uint32_t) (surface<<8)|(strip&0xf)); DEBUG_TRACE (DEBUG::MackieControl, string_compose ("removing surface %1 strip %2 from down select buttons\n", surface, strip)); if (x != _down_select_buttons.end()) { _down_select_buttons.erase (x); -- cgit v1.2.3 From fb1eefdd5e0fb4bce89634aba61196263cc91979 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Tue, 15 Oct 2013 11:08:51 -0400 Subject: do not call AudioEngine::set_driver() when the backend does not require driver selection --- gtk2_ardour/engine_dialog.cc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/gtk2_ardour/engine_dialog.cc b/gtk2_ardour/engine_dialog.cc index 47a2506f92..d20cbd3da9 100644 --- a/gtk2_ardour/engine_dialog.cc +++ b/gtk2_ardour/engine_dialog.cc @@ -1273,7 +1273,9 @@ EngineControl::EngineControl () of settings. */ change_driver = true; - change_device = true; + if (backend->requires_driver_selection()) { + change_device = true; + } change_rate = true; change_bufsize = true; change_channels = true; -- cgit v1.2.3 From fa03eee79e830a54f63da9f8375c5168ba5928d9 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Tue, 15 Oct 2013 12:37:13 -0400 Subject: make the startup -> session dialog flow more sensible for brand new users --- gtk2_ardour/ardour_ui.cc | 15 +++++++++------ gtk2_ardour/startup.cc | 1 + 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc index 18cba7af9b..3ee2c95689 100644 --- a/gtk2_ardour/ardour_ui.cc +++ b/gtk2_ardour/ardour_ui.cc @@ -718,6 +718,7 @@ ARDOUR_UI::starting () { Application* app = Application::instance (); char *nsm_url; + bool brand_new_user = ArdourStartup::required (); app->ShouldQuit.connect (sigc::mem_fun (*this, &ARDOUR_UI::queue_finish)); app->ShouldLoad.connect (sigc::mem_fun (*this, &ARDOUR_UI::idle_load)); @@ -778,17 +779,17 @@ ARDOUR_UI::starting () } } else { - - if (ArdourStartup::required()) { + + if (brand_new_user) { ArdourStartup s; s.present (); main().run(); s.hide (); switch (s.response ()) { - case Gtk::RESPONSE_REJECT: - return -1; - default: + case Gtk::RESPONSE_OK: break; + default: + return -1; } } @@ -804,7 +805,9 @@ ARDOUR_UI::starting () /* go get a session */ - if (get_session_parameters (false, ARDOUR_COMMAND_LINE::new_session, ARDOUR_COMMAND_LINE::load_template)) { + const bool new_session_required = (ARDOUR_COMMAND_LINE::new_session || brand_new_user); + + if (get_session_parameters (false, new_session_required, ARDOUR_COMMAND_LINE::load_template)) { return -1; } } diff --git a/gtk2_ardour/startup.cc b/gtk2_ardour/startup.cc index 7bb9b2e295..8482a6cb22 100644 --- a/gtk2_ardour/startup.cc +++ b/gtk2_ardour/startup.cc @@ -243,6 +243,7 @@ Where would you like new %1 sessions to be stored by default?\n\n\ vbox->pack_start (*txt, false, false); vbox->pack_start (*hbox, false, true); + cerr << "set default folder to " << poor_mans_glob (Config->get_default_session_parent_dir()) << endl; default_dir_chooser->set_current_folder (poor_mans_glob (Config->get_default_session_parent_dir())); default_dir_chooser->signal_current_folder_changed().connect (sigc::mem_fun (*this, &ArdourStartup::default_dir_changed)); default_dir_chooser->show (); -- cgit v1.2.3 From df13a8c0b12c287cef7210f7cf98af9df6991c82 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Tue, 15 Oct 2013 12:48:58 -0400 Subject: fix crash when opening audio/MIDI setup while playing etc. --- gtk2_ardour/engine_dialog.cc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/gtk2_ardour/engine_dialog.cc b/gtk2_ardour/engine_dialog.cc index d20cbd3da9..aff1e22508 100644 --- a/gtk2_ardour/engine_dialog.cc +++ b/gtk2_ardour/engine_dialog.cc @@ -1619,7 +1619,9 @@ EngineControl::EngineControl () enable_latency_tab (); } else { - ARDOUR::AudioEngine::instance()->stop_latency_detection(); + if (lm_running) { + ARDOUR::AudioEngine::instance()->stop_latency_detection(); + } } } -- cgit v1.2.3 From 6e0a3c4853ae94aebe487161f2c1f2ad9bb8a875 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Tue, 15 Oct 2013 13:15:03 -0400 Subject: try to prevent crash if running latency calibration with JACK setup that is lacking input or output ports (re: #5721 and #5719) --- gtk2_ardour/engine_dialog.cc | 41 ++++++++++++++++++++++++++++++++++------- gtk2_ardour/engine_dialog.h | 1 + 2 files changed, 35 insertions(+), 7 deletions(-) diff --git a/gtk2_ardour/engine_dialog.cc b/gtk2_ardour/engine_dialog.cc index aff1e22508..c7d996ae55 100644 --- a/gtk2_ardour/engine_dialog.cc +++ b/gtk2_ardour/engine_dialog.cc @@ -336,7 +336,7 @@ EngineControl::EngineControl () basic_packer.attach (*label, 0, 1, 0, 1, xopt, (AttachOptions) 0); basic_packer.attach (backend_combo, 1, 2, 0, 1, xopt, (AttachOptions) 0); - lm_button.signal_clicked.connect (sigc::bind (sigc::mem_fun (notebook, &Gtk::Notebook::set_current_page), latency_tab)); + lm_button.signal_clicked.connect (sigc::mem_fun (*this, &EngineControl::calibrate_latency)); lm_button.set_name ("record enable button"); if (_have_control) { build_full_control_notebook (); @@ -514,14 +514,34 @@ EngineControl::EngineControl () EngineControl::enable_latency_tab () { vector outputs; - ARDOUR::AudioEngine::instance()->get_physical_outputs (ARDOUR::DataType::AUDIO, outputs); - set_popdown_strings (lm_output_channel_combo, outputs); - lm_output_channel_combo.set_active_text (outputs.front()); - vector inputs; + + ARDOUR::AudioEngine::instance()->get_physical_outputs (ARDOUR::DataType::AUDIO, outputs); ARDOUR::AudioEngine::instance()->get_physical_inputs (ARDOUR::DataType::AUDIO, inputs); - set_popdown_strings (lm_input_channel_combo, inputs); - lm_input_channel_combo.set_active_text (inputs.front()); + + if (inputs.empty() || outputs.empty()) { + MessageDialog msg (_("Your selected audio configuration is playback- or capture-only.\n\nLatency calibration requires playback and capture")); + lm_measure_button.set_sensitive (false); + notebook.set_current_page (0); + msg.run (); + return; + } + + if (!outputs.empty()) { + set_popdown_strings (lm_output_channel_combo, outputs); + lm_output_channel_combo.set_active_text (outputs.front()); + lm_output_channel_combo.set_sensitive (true); + } else { + lm_output_channel_combo.set_sensitive (false); + } + + if (!inputs.empty()) { + set_popdown_strings (lm_input_channel_combo, inputs); + lm_input_channel_combo.set_active_text (inputs.front()); + lm_input_channel_combo.set_sensitive (true); + } else { + lm_input_channel_combo.set_sensitive (false); + } lm_measure_button.set_sensitive (true); } @@ -1795,3 +1815,10 @@ EngineControl::connect_disconnect_click() ARDOUR_UI::instance()->reconnect_to_engine (); } } + +void +EngineControl::calibrate_latency () +{ + notebook.set_current_page (latency_tab); +} + diff --git a/gtk2_ardour/engine_dialog.h b/gtk2_ardour/engine_dialog.h index 0bf1c3a507..1bf15c2111 100644 --- a/gtk2_ardour/engine_dialog.h +++ b/gtk2_ardour/engine_dialog.h @@ -212,6 +212,7 @@ class EngineControl : public ArdourDialog, public PBD::ScopedConnectionList { PBD::ScopedConnection stopped_connection; void connect_disconnect_click (); + void calibrate_latency (); }; #endif /* __gtk2_ardour_engine_dialog_h__ */ -- cgit v1.2.3 From 019cd26ba4312a7a737b458e61ec69c89f2a030e Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Tue, 15 Oct 2013 13:18:13 -0400 Subject: update russian translation (from alexandre prokoudine) --- gtk2_ardour/po/ru.po | 2763 ++++++++++++++++++++++++++------------------------ libs/ardour/po/ru.po | 559 +++++----- 2 files changed, 1733 insertions(+), 1589 deletions(-) diff --git a/gtk2_ardour/po/ru.po b/gtk2_ardour/po/ru.po index 1891a32bf1..e7d01fd622 100644 --- a/gtk2_ardour/po/ru.po +++ b/gtk2_ardour/po/ru.po @@ -10,8 +10,8 @@ msgid "" msgstr "" "Project-Id-Version: Ardour 3\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-09-03 07:59-0400\n" -"PO-Revision-Date: 2013-07-14 18:04+0300\n" +"POT-Creation-Date: 2013-10-15 10:13+0400\n" +"PO-Revision-Date: 2013-10-15 10:48+0300\n" "Last-Translator: Александр Прокудин \n" "Language-Team: русский <>\n" "Language: ru\n" @@ -449,8 +449,8 @@ msgstr "Шины" msgid "Add:" msgstr "Добавить:" -#: add_route_dialog.cc:114 startup.cc:841 time_fx_dialog.cc:91 -#: add_video_dialog.cc:150 video_server_dialog.cc:112 +#: add_route_dialog.cc:114 time_fx_dialog.cc:91 add_video_dialog.cc:150 +#: video_server_dialog.cc:112 msgid "Options" msgstr "Параметры" @@ -464,21 +464,22 @@ msgid "Group:" msgstr "Группа:" #: add_route_dialog.cc:215 add_route_dialog.cc:224 add_route_dialog.cc:298 -#: rc_option_editor.cc:1456 rc_option_editor.cc:1458 rc_option_editor.cc:1460 -#: rc_option_editor.cc:1478 rc_option_editor.cc:1480 rc_option_editor.cc:1488 -#: rc_option_editor.cc:1490 rc_option_editor.cc:1508 rc_option_editor.cc:1521 -#: rc_option_editor.cc:1523 rc_option_editor.cc:1525 rc_option_editor.cc:1556 -#: rc_option_editor.cc:1558 rc_option_editor.cc:1560 rc_option_editor.cc:1568 -#: rc_option_editor.cc:1576 rc_option_editor.cc:1584 +#: ardour_ui_ed.cc:476 engine_dialog.cc:238 rc_option_editor.cc:1454 +#: rc_option_editor.cc:1456 rc_option_editor.cc:1458 rc_option_editor.cc:1474 +#: rc_option_editor.cc:1476 rc_option_editor.cc:1484 rc_option_editor.cc:1486 +#: rc_option_editor.cc:1504 rc_option_editor.cc:1517 rc_option_editor.cc:1519 +#: rc_option_editor.cc:1521 rc_option_editor.cc:1552 rc_option_editor.cc:1554 +#: rc_option_editor.cc:1556 rc_option_editor.cc:1564 rc_option_editor.cc:1572 +#: rc_option_editor.cc:1580 msgid "Audio" msgstr "Audio" #: add_route_dialog.cc:216 add_route_dialog.cc:227 add_route_dialog.cc:299 -#: editor_actions.cc:105 missing_file_dialog.cc:55 rc_option_editor.cc:1707 -#: rc_option_editor.cc:1715 rc_option_editor.cc:1723 rc_option_editor.cc:1732 -#: rc_option_editor.cc:1740 rc_option_editor.cc:1748 rc_option_editor.cc:1756 -#: rc_option_editor.cc:1765 rc_option_editor.cc:1774 rc_option_editor.cc:1783 -#: rc_option_editor.cc:1791 rc_option_editor.cc:1799 +#: editor_actions.cc:105 missing_file_dialog.cc:55 rc_option_editor.cc:1703 +#: rc_option_editor.cc:1711 rc_option_editor.cc:1719 rc_option_editor.cc:1728 +#: rc_option_editor.cc:1736 rc_option_editor.cc:1744 rc_option_editor.cc:1752 +#: rc_option_editor.cc:1761 rc_option_editor.cc:1770 rc_option_editor.cc:1779 +#: rc_option_editor.cc:1787 rc_option_editor.cc:1795 msgid "MIDI" msgstr "MIDI" @@ -628,7 +629,7 @@ msgstr "Нормировать значения" msgid "FFT analysis window" msgstr "Спектральный анализ" -#: analysis_window.cc:60 editor.cc:1856 +#: analysis_window.cc:60 editor.cc:1857 msgid "Spectral Analysis" msgstr "Спектральный анализ" @@ -650,50 +651,54 @@ msgstr "Повторно проанализировать данные" msgid "button cannot watch state of non-existing Controllable\n" msgstr "" -#: ardour_ui.cc:180 +#: ardour_ui.cc:179 msgid "audition" msgstr "прослушивание" -#: ardour_ui.cc:181 +#: ardour_ui.cc:180 msgid "solo" msgstr "солирование" -#: ardour_ui.cc:182 +#: ardour_ui.cc:181 msgid "feedback" msgstr "отклик" -#: ardour_ui.cc:187 speaker_dialog.cc:36 +#: ardour_ui.cc:186 speaker_dialog.cc:36 msgid "Speaker Configuration" msgstr "Конфигурация громкоговорителей" -#: ardour_ui.cc:188 theme_manager.cc:56 theme_manager.cc:64 +#: ardour_ui.cc:187 theme_manager.cc:56 theme_manager.cc:64 msgid "Theme Manager" msgstr "Стиль оформления" -#: ardour_ui.cc:189 keyeditor.cc:53 +#: ardour_ui.cc:188 keyeditor.cc:53 msgid "Key Bindings" msgstr "Клавиатурные комбинации" -#: ardour_ui.cc:190 +#: ardour_ui.cc:189 msgid "Preferences" msgstr "Параметры" -#: ardour_ui.cc:191 ardour_ui.cc:196 +#: ardour_ui.cc:190 ardour_ui.cc:196 msgid "Add Tracks/Busses" msgstr "Добавить дорожки/шины" -#: ardour_ui.cc:192 +#: ardour_ui.cc:191 msgid "About" msgstr "О программе" -#: ardour_ui.cc:193 location_ui.cc:1146 +#: ardour_ui.cc:192 location_ui.cc:1146 msgid "Locations" msgstr "Позиции" -#: ardour_ui.cc:194 route_params_ui.cc:58 route_params_ui.cc:606 +#: ardour_ui.cc:193 route_params_ui.cc:58 route_params_ui.cc:606 msgid "Tracks and Busses" msgstr "Дорожки и шины" +#: ardour_ui.cc:194 engine_dialog.cc:67 +msgid "Audio/MIDI Setup" +msgstr "Настройка звука и MIDI" + #: ardour_ui.cc:195 msgid "Properties" msgstr "Свойства" @@ -718,15 +723,29 @@ msgstr "Соединения MIDI" msgid "Errors" msgstr "Ошибки" -#: ardour_ui.cc:388 -msgid "Starting audio engine" -msgstr "Запускается звуковой движок" +#: ardour_ui.cc:435 +msgid "" +"The audio backend was shutdown because:\n" +"\n" +"%1" +msgstr "" + +#: ardour_ui.cc:437 +msgid "" +"The audio backend has either been shutdown or it\n" +"disconnected %1 because %1\n" +"was not fast enough. Try to restart\n" +"the audio backend and save the session." +msgstr "" +"Звуковая подсистема либо завершила работу, либо отсоединила\n" +" %1, потому что %1 работал недостаточно быстро.\n" +"Попробуйте снова запустить подсистему и сохранить сеанс." -#: ardour_ui.cc:758 startup.cc:638 +#: ardour_ui.cc:823 startup.cc:378 msgid "%1 is ready for use" msgstr "%1 готов к работе" -#: ardour_ui.cc:806 +#: ardour_ui.cc:872 msgid "" "WARNING: Your system has a limit for maximum amount of locked memory. This " "might cause %1 to run out of memory before your system runs out of memory. \n" @@ -741,23 +760,23 @@ msgstr "" "Вы можете узнать установленный предел при помощи команды 'ulimit -l'. Обычно " "это контролируется в %2." -#: ardour_ui.cc:823 +#: ardour_ui.cc:889 msgid "Do not show this window again" msgstr "Больше не показывать это окно" -#: ardour_ui.cc:865 +#: ardour_ui.cc:931 msgid "Don't quit" msgstr "Не выходить" -#: ardour_ui.cc:866 +#: ardour_ui.cc:932 msgid "Just quit" msgstr "Просто выйти" -#: ardour_ui.cc:867 +#: ardour_ui.cc:933 msgid "Save and quit" msgstr "Сохранить и выйти" -#: ardour_ui.cc:877 +#: ardour_ui.cc:943 msgid "" "%1 was unable to save your session.\n" "\n" @@ -772,15 +791,15 @@ msgstr "" "\n" "«Просто выйти»." -#: ardour_ui.cc:908 +#: ardour_ui.cc:974 msgid "Please wait while %1 cleans up..." msgstr "Дождитесь завершения подчистки сеанса в %1..." -#: ardour_ui.cc:925 +#: ardour_ui.cc:992 msgid "Unsaved Session" msgstr "Сеанс не сохранён" -#: ardour_ui.cc:946 +#: ardour_ui.cc:1013 msgid "" "The session \"%1\"\n" "has not been saved.\n" @@ -798,7 +817,7 @@ msgstr "" "\n" "Что вы хотите сделать?" -#: ardour_ui.cc:949 +#: ardour_ui.cc:1016 msgid "" "The snapshot \"%1\"\n" "has not been saved.\n" @@ -816,74 +835,75 @@ msgstr "" "\n" "Что вы хотите сделать?" -#: ardour_ui.cc:963 +#: ardour_ui.cc:1030 msgid "Prompter" msgstr "" -#: ardour_ui.cc:1049 -msgid "disconnected" -msgstr "отсоединено" +#: ardour_ui.cc:1116 ardour_ui.cc:1124 +#, c-format +msgid "Audio: none" +msgstr "Звук: нет" -#: ardour_ui.cc:1056 +#: ardour_ui.cc:1128 #, c-format -msgid "JACK: %.1f kHz / %4.1f ms" -msgstr "JACK: %.1f КГц / %4.1f мс" +msgid "Audio: %.1f kHz / %4.1f ms" +msgstr "Звук: %.1f КГц / %4.1f мс" -#: ardour_ui.cc:1060 +#: ardour_ui.cc:1132 #, c-format -msgid "JACK: % kHz / %4.1f ms" -msgstr "JACK: % КГц / %4.1f мс" +msgid "Audio: % kHz / %4.1f ms" +msgstr "Звук: % КГц / %4.1f мс" -#: ardour_ui.cc:1078 export_video_dialog.cc:68 +#: ardour_ui.cc:1150 export_video_dialog.cc:67 msgid "File:" msgstr "Файл:" -#: ardour_ui.cc:1082 +#: ardour_ui.cc:1154 msgid "BWF" msgstr "BWF" -#: ardour_ui.cc:1085 +#: ardour_ui.cc:1157 msgid "WAV" msgstr "WAV" -#: ardour_ui.cc:1088 +#: ardour_ui.cc:1160 msgid "WAV64" msgstr "WAV64" -#: ardour_ui.cc:1091 session_option_editor.cc:197 +#: ardour_ui.cc:1163 session_option_editor.cc:197 msgid "CAF" msgstr "CAF" -#: ardour_ui.cc:1094 +#: ardour_ui.cc:1166 msgid "AIFF" msgstr "AIFF" -#: ardour_ui.cc:1097 +#: ardour_ui.cc:1169 msgid "iXML" msgstr "iXML" -#: ardour_ui.cc:1100 +#: ardour_ui.cc:1172 msgid "RF64" msgstr "RF64" -#: ardour_ui.cc:1108 +#: ardour_ui.cc:1180 msgid "32-float" msgstr "32-float" -#: ardour_ui.cc:1111 +#: ardour_ui.cc:1183 msgid "24-int" msgstr "24-int" -#: ardour_ui.cc:1114 +#: ardour_ui.cc:1186 msgid "16-int" msgstr "16-int" -#: ardour_ui.cc:1133 +#: ardour_ui.cc:1205 #, c-format msgid "DSP: %5.1f%%" msgstr "ЦП: %5.1f%%" -#: ardour_ui.cc:1152 +#: ardour_ui.cc:1224 #, c-format msgid "" "Buffers: p:" @@ -894,61 +914,62 @@ msgstr "" "%% c:" "%%%" -#: ardour_ui.cc:1188 +#: ardour_ui.cc:1265 msgid "Disk: Unknown" msgstr "На диске: неизвестно" -#: ardour_ui.cc:1190 +#: ardour_ui.cc:1267 msgid "Disk: 24hrs+" msgstr "На диске: 24ч+" -#: ardour_ui.cc:1208 +#: ardour_ui.cc:1285 msgid "Disk: >24 hrs" msgstr "На диске: >24ч" -#: ardour_ui.cc:1219 +#: ardour_ui.cc:1296 #, c-format msgid "Disk: %02dh:%02dm:%02ds" msgstr "На диске: %02dч:%02dм:%02dс" -#: ardour_ui.cc:1245 +#: ardour_ui.cc:1322 #, c-format msgid "Timecode|TC: %s" msgstr "ТК: %s" -#: ardour_ui.cc:1362 ardour_ui.cc:1371 startup.cc:1054 +#: ardour_ui.cc:1439 ardour_ui.cc:1448 session_dialog.cc:322 +#: session_dialog.cc:327 msgid "Recent Sessions" msgstr "Недавние сеансы" -#: ardour_ui.cc:1451 +#: ardour_ui.cc:1527 msgid "" -"%1 is not connected to JACK\n" +"%1 is not connected to any audio backend.\n" "You cannot open or close sessions in this condition" msgstr "" -"%1 не соединен с JACK.\n" +"%1 не соединен с какой-либо звуковой подсистемой.\n" "Открытие и закрытие сеансов невозможно." -#: ardour_ui.cc:1478 +#: ardour_ui.cc:1551 msgid "Open Session" msgstr "Открыть сеанс" -#: ardour_ui.cc:1503 session_import_dialog.cc:169 -#: session_metadata_dialog.cc:729 startup.cc:1083 +#: ardour_ui.cc:1576 session_dialog.cc:353 session_import_dialog.cc:169 +#: session_metadata_dialog.cc:729 msgid "%1 sessions" msgstr "Cеансы %1" -#: ardour_ui.cc:1540 +#: ardour_ui.cc:1613 msgid "You cannot add a track without a session already loaded." msgstr "Вы не можете добавить дорожку без загруженного сеанса." -#: ardour_ui.cc:1548 +#: ardour_ui.cc:1621 msgid "could not create %1 new mixed track" msgid_plural "could not create %1 new mixed tracks" msgstr[0] "Не удалось создать %1 новую смешанную дорожку" msgstr[1] "Не удалось создать %1 новых смешанных дорожки" msgstr[2] "Не удалось создать %1 новых смешанных дорожек" -#: ardour_ui.cc:1554 ardour_ui.cc:1615 +#: ardour_ui.cc:1627 ardour_ui.cc:1688 msgid "" "There are insufficient JACK ports available\n" "to create a new track or bus.\n" @@ -960,25 +981,25 @@ msgstr "" "Необходимо сохранить %1, выйти и запустить\n" "JACK с увеличенным количеством портов." -#: ardour_ui.cc:1589 +#: ardour_ui.cc:1662 msgid "You cannot add a track or bus without a session already loaded." msgstr "Вы не можете добавить дорожку или шину без открытого сеанса." -#: ardour_ui.cc:1598 +#: ardour_ui.cc:1671 msgid "could not create %1 new audio track" msgid_plural "could not create %1 new audio tracks" msgstr[0] "Не удалось создать %1 новую звуковую дорожку" msgstr[1] "Не удалось создать %2 новых звуковых дорожки" msgstr[2] "Не удалось создать %2 новых звуковых дорожек" -#: ardour_ui.cc:1607 +#: ardour_ui.cc:1680 msgid "could not create %1 new audio bus" msgid_plural "could not create %1 new audio busses" msgstr[0] "Не удалось создать %1 новую звуковую шину" msgstr[1] "Не удалось создать %1 новых звуковых шины" msgstr[2] "Не удалось создать %1 новых звуковых шин" -#: ardour_ui.cc:1724 +#: ardour_ui.cc:1804 msgid "" "Please create one or more tracks before trying to record.\n" "You can do this with the \"Add Track or Bus\" option in the Session menu." @@ -987,37 +1008,15 @@ msgstr "" "как пытаться что-либо записать.\n" "Используйте меню «Сеанс > Добавить дорожку/шину»." -#: ardour_ui.cc:2114 -msgid "" -"The audio backend (JACK) was shutdown because:\n" -"\n" -"%1" -msgstr "" - -#: ardour_ui.cc:2116 -msgid "" -"JACK has either been shutdown or it\n" -"disconnected %1 because %1\n" -"was not fast enough. Try to restart\n" -"JACK, reconnect and save the session." -msgstr "" -"JACK завершил работу или потерял синхронизацию\n" -"с %1 и отсоединил его. Необходимо перезапустить \n" -"JACK, восстановить соединение и сохранить сеанс." - -#: ardour_ui.cc:2142 -msgid "Unable to start the session running" -msgstr "Невозможно запустить уже выполняемый сеанс" - -#: ardour_ui.cc:2222 +#: ardour_ui.cc:2181 msgid "Take Snapshot" msgstr "Создать снимок" -#: ardour_ui.cc:2223 +#: ardour_ui.cc:2182 msgid "Name of new snapshot" msgstr "Название нового снимка" -#: ardour_ui.cc:2247 +#: ardour_ui.cc:2206 msgid "" "To ensure compatibility with various systems\n" "snapshot names may not contain a '%1' character" @@ -1025,27 +1024,27 @@ msgstr "" "Для обеспечения совместимости с различными системами\n" "названия снимков не могут содержать символ '%1'." -#: ardour_ui.cc:2259 +#: ardour_ui.cc:2218 msgid "Confirm Snapshot Overwrite" msgstr "Подтвердите перезапись снимка" -#: ardour_ui.cc:2260 +#: ardour_ui.cc:2219 msgid "A snapshot already exists with that name. Do you want to overwrite it?" msgstr "Снимок с таким названием уже есть. Перезаписать его?" -#: ardour_ui.cc:2263 utils_videotl.cc:67 +#: ardour_ui.cc:2222 utils_videotl.cc:67 msgid "Overwrite" msgstr "Перезаписать" -#: ardour_ui.cc:2297 +#: ardour_ui.cc:2256 msgid "Rename Session" msgstr "Переименовать сеанс" -#: ardour_ui.cc:2298 +#: ardour_ui.cc:2257 msgid "New session name" msgstr "Новое название сеанса" -#: ardour_ui.cc:2312 ardour_ui.cc:2692 ardour_ui.cc:2737 +#: ardour_ui.cc:2271 ardour_ui.cc:2672 ardour_ui.cc:2710 msgid "" "To ensure compatibility with various systems\n" "session names may not contain a '%1' character" @@ -1053,12 +1052,12 @@ msgstr "" "Для обеспечения совместимости с различными системами\n" "названия сеансов не могут содержать символ '%1'." -#: ardour_ui.cc:2320 +#: ardour_ui.cc:2279 msgid "" "That name is already in use by another directory/folder. Please try again." msgstr "" -#: ardour_ui.cc:2329 +#: ardour_ui.cc:2288 msgid "" "Renaming this session failed.\n" "Things could be seriously messed up at this point" @@ -1066,19 +1065,19 @@ msgstr "" "Не удалось переименовать этот сеанс.\n" "Очень может быть, что всё испортилось." -#: ardour_ui.cc:2440 +#: ardour_ui.cc:2399 msgid "Save Template" msgstr "Сохранить шаблон" -#: ardour_ui.cc:2441 +#: ardour_ui.cc:2400 msgid "Name for template:" msgstr "Название шаблона:" -#: ardour_ui.cc:2442 +#: ardour_ui.cc:2401 msgid "-template" msgstr "-шаблон" -#: ardour_ui.cc:2480 +#: ardour_ui.cc:2439 msgid "" "This session\n" "%1\n" @@ -1088,52 +1087,62 @@ msgstr "" "%1\n" "уже существует. Открыть его?" -#: ardour_ui.cc:2490 +#: ardour_ui.cc:2449 msgid "Open Existing Session" msgstr "Открыть существующий сеанс" -#: ardour_ui.cc:2728 +#: ardour_ui.cc:2700 msgid "There is no existing session at \"%1\"" msgstr "По адресу \"%1\" не существующего сеанса" -#: ardour_ui.cc:2815 +#: ardour_ui.cc:2792 msgid "Please wait while %1 loads your session" msgstr "Дождитесь завершения загрузки сеанса в %1" -#: ardour_ui.cc:2830 +#: ardour_ui.cc:2807 msgid "Port Registration Error" msgstr "Ошибка регистрации порта" -#: ardour_ui.cc:2831 +#: ardour_ui.cc:2808 msgid "Click the Close button to try again." msgstr "Щелкните кнопку «Закрыть» для возврата к предыдущему диалогу." -#: ardour_ui.cc:2852 +#: ardour_ui.cc:2829 msgid "Session \"%1 (snapshot %2)\" did not load successfully" msgstr "Не удалось загрузить сеанс \"%1 (снимок %2)\"" -#: ardour_ui.cc:2858 +#: ardour_ui.cc:2836 msgid "Loading Error" msgstr "Ошибка при загрузке" -#: ardour_ui.cc:2859 -msgid "Click the Refresh button to try again." -msgstr "Щёлкните кнопку «Обновить» для повторной попытки." +#: ardour_ui.cc:2855 +msgid "" +"This session has been opened in read-only mode.\n" +"\n" +"You will not be able to record or save." +msgstr "" +"Этот сеанс открыт в режиме только чтения.\n" +"\n" +"Вы не сможете записывать или сохранять." + +#: ardour_ui.cc:2861 +msgid "Read-only Session" +msgstr "Сеанс в режиме чтения" -#: ardour_ui.cc:2941 +#: ardour_ui.cc:2919 msgid "Could not create session in \"%1\"" msgstr "Не удалось создать сеанс «%1»" -#: ardour_ui.cc:3041 +#: ardour_ui.cc:3019 msgid "No files were ready for clean-up" msgstr "Нет готовых к удалению звуковых файлов" -#: ardour_ui.cc:3045 ardour_ui.cc:3055 ardour_ui.cc:3188 ardour_ui.cc:3195 +#: ardour_ui.cc:3023 ardour_ui.cc:3033 ardour_ui.cc:3166 ardour_ui.cc:3173 #: ardour_ui_ed.cc:104 msgid "Clean-up" msgstr "Очистить" -#: ardour_ui.cc:3046 +#: ardour_ui.cc:3024 msgid "" "If this seems suprising, \n" "check for any existing snapshots.\n" @@ -1145,19 +1154,19 @@ msgstr "" "Они могут включать области, которым\n" "нужны неиспользуемые файлы." -#: ardour_ui.cc:3105 +#: ardour_ui.cc:3083 msgid "kilo" msgstr "кило" -#: ardour_ui.cc:3108 +#: ardour_ui.cc:3086 msgid "mega" msgstr "мега" -#: ardour_ui.cc:3111 +#: ardour_ui.cc:3089 msgid "giga" msgstr "гига" -#: ardour_ui.cc:3116 +#: ardour_ui.cc:3094 msgid "" "The following file was deleted from %2,\n" "releasing %3 %4bytes of disk space" @@ -1177,7 +1186,7 @@ msgstr[2] "" "освободив при этом %3 %4байт\n" "дискового пространства." -#: ardour_ui.cc:3123 +#: ardour_ui.cc:3101 msgid "" "The following file was not in use and \n" "has been moved to: %2\n" @@ -1224,11 +1233,11 @@ msgstr[2] "" "\n" "дополнительно освободит %3 %4байт дискового пространства.\n" -#: ardour_ui.cc:3183 +#: ardour_ui.cc:3161 msgid "Are you sure you want to clean-up?" msgstr "Вы уверены, что хотите выполнить очистку?" -#: ardour_ui.cc:3190 +#: ardour_ui.cc:3168 msgid "" "Clean-up is a destructive operation.\n" "ALL undo/redo information will be lost if you clean-up.\n" @@ -1239,80 +1248,81 @@ msgstr "" "неиспользуемые звуковые файлы\n" "будут перемещены в «мертвую» зону." -#: ardour_ui.cc:3198 +#: ardour_ui.cc:3176 msgid "CleanupDialog" msgstr "Очистка" -#: ardour_ui.cc:3228 +#: ardour_ui.cc:3206 msgid "Cleaned Files" msgstr "Очищенные файлы" -#: ardour_ui.cc:3245 +#: ardour_ui.cc:3223 msgid "deleted file" msgstr "удалён файл" -#: ardour_ui.cc:3337 +#: ardour_ui.cc:3315 msgid "" "Video-Server was not launched by Ardour. The request to stop it is ignored." msgstr "" +"Видеосервер не был запущен Ardour. Запрос на его остановку проигнорирован." -#: ardour_ui.cc:3341 +#: ardour_ui.cc:3319 msgid "Stop Video-Server" -msgstr "" +msgstr "Остановить видеосервер" -#: ardour_ui.cc:3342 +#: ardour_ui.cc:3320 msgid "Do you really want to stop the Video Server?" msgstr "Вы действительно хотите остановить видеосервер?" -#: ardour_ui.cc:3345 +#: ardour_ui.cc:3323 msgid "Yes, Stop It" msgstr "Да, остановить" -#: ardour_ui.cc:3371 +#: ardour_ui.cc:3349 msgid "The Video Server is already started." msgstr "" -#: ardour_ui.cc:3373 +#: ardour_ui.cc:3351 msgid "" "An external Video Server is configured and can be reached. Not starting a " "new instance." msgstr "" -#: ardour_ui.cc:3381 ardour_ui.cc:3471 +#: ardour_ui.cc:3359 ardour_ui.cc:3449 msgid "" "Could not connect to the Video Server. Start it or configure its access URL " "in Edit -> Preferences." msgstr "" -#: ardour_ui.cc:3405 +#: ardour_ui.cc:3383 msgid "Specified docroot is not an existing directory." msgstr "" -#: ardour_ui.cc:3410 +#: ardour_ui.cc:3388 msgid "Given Video Server is not an executable file." msgstr "" -#: ardour_ui.cc:3443 +#: ardour_ui.cc:3421 msgid "Cannot launch the video-server" msgstr "Не удалось запустить видеосервер" -#: ardour_ui.cc:3452 +#: ardour_ui.cc:3430 msgid "Video-server was started but does not respond to requests..." msgstr "" -#: ardour_ui.cc:3497 editor_audio_import.cc:632 +#: ardour_ui.cc:3475 editor_audio_import.cc:632 msgid "could not open %1" msgstr "не удалось открыть %1" -#: ardour_ui.cc:3501 +#: ardour_ui.cc:3479 msgid "no video-file selected" msgstr "" -#: ardour_ui.cc:3673 +#: ardour_ui.cc:3651 msgid "Recording was stopped because your system could not keep up." msgstr "Запись остановлена из-за недостаточного быстродействия системы" -#: ardour_ui.cc:3702 +#: ardour_ui.cc:3680 msgid "" "The disk system on your computer\n" "was not able to keep up with %1.\n" @@ -1326,7 +1336,7 @@ msgstr "" "В частности ей не удалось записать данные на диск\n" "достаточно быстро для фиксации захваченных данных.\n" -#: ardour_ui.cc:3721 +#: ardour_ui.cc:3699 msgid "" "The disk system on your computer\n" "was not able to keep up with %1.\n" @@ -1340,11 +1350,11 @@ msgstr "" "В частности ей не удалось прочитать данные\n" "с диска достаточно быстро для воспроизведения.\n" -#: ardour_ui.cc:3761 +#: ardour_ui.cc:3739 msgid "Crash Recovery" msgstr "Восстановление данных" -#: ardour_ui.cc:3762 +#: ardour_ui.cc:3740 msgid "" "This session appears to have been in the\n" "middle of recording when %1 or\n" @@ -1360,19 +1370,19 @@ msgstr "" "%1 может восстановить записанные данные,\n" "либо проигнорировать их. Примите решение.\n" -#: ardour_ui.cc:3774 +#: ardour_ui.cc:3752 msgid "Ignore crash data" msgstr "Проигнорировать" -#: ardour_ui.cc:3775 +#: ardour_ui.cc:3753 msgid "Recover from crash" msgstr "Восстановить данные" -#: ardour_ui.cc:3795 +#: ardour_ui.cc:3773 msgid "Sample Rate Mismatch" msgstr "Несовпадение частот сэмплирования" -#: ardour_ui.cc:3796 +#: ardour_ui.cc:3774 msgid "" "This session was created with a sample rate of %1 Hz, but\n" "%2 is currently running at %3 Hz. If you load this session,\n" @@ -1384,23 +1394,23 @@ msgstr "" "Если вы загрузите этот сеанс, звуковые данные могут быть\n" "воспроизведены с некорректной частотой сэмплирования.\n" -#: ardour_ui.cc:3805 +#: ardour_ui.cc:3783 msgid "Do not load session" msgstr "Не загружать сеанс" -#: ardour_ui.cc:3806 +#: ardour_ui.cc:3784 msgid "Load session anyway" msgstr "Все равно загрузить" -#: ardour_ui.cc:3829 -msgid "Could not disconnect from JACK" -msgstr "Не удалось отсоединиться от сервера JACK" +#: ardour_ui.cc:3811 +msgid "Could not disconnect from Audio/MIDI engine" +msgstr "Не удалось отсоединиться от аудио/MIDI-подсистемы." -#: ardour_ui.cc:3842 -msgid "Could not reconnect to JACK" -msgstr "Не удалось соединиться с сервером JACK" +#: ardour_ui.cc:3827 ardour_ui.cc:3830 +msgid "Could not reconnect to the Audio/MIDI engine" +msgstr "Не удалось повторно соединиться с аудио/MIDI-подсистемой." -#: ardour_ui.cc:4116 +#: ardour_ui.cc:4106 msgid "" "%4This is a session from an older version of %3%5\n" "\n" @@ -1524,9 +1534,8 @@ msgstr "" "'+' или '-' вводит разницу во времени.\n" #: ardour_ui2.cc:147 -#, fuzzy msgid "Reset Level Meter" -msgstr "Сбросить огибающую" +msgstr "Сбросить индикатор громкости" #: ardour_ui2.cc:179 msgid "[ERROR]: " @@ -1540,51 +1549,51 @@ msgstr "[ПРЕДУПРЕЖДЕНИЕ]:" msgid "[INFO]: " msgstr "[СПРАВКА]:" -#: ardour_ui2.cc:247 ardour_ui_ed.cc:377 +#: ardour_ui2.cc:247 ardour_ui_ed.cc:344 msgid "Auto Return" msgstr "Автовозврат" -#: ardour_ui2.cc:249 ardour_ui_ed.cc:380 +#: ardour_ui2.cc:249 ardour_ui_ed.cc:347 msgid "Follow Edits" msgstr "Следовать правкам" -#: ardour_ui2.cc:628 rc_option_editor.cc:1004 rc_option_editor.cc:1022 -#: rc_option_editor.cc:1025 rc_option_editor.cc:1027 rc_option_editor.cc:1029 -#: rc_option_editor.cc:1037 rc_option_editor.cc:1045 rc_option_editor.cc:1047 -#: rc_option_editor.cc:1055 rc_option_editor.cc:1062 rc_option_editor.cc:1071 -#: rc_option_editor.cc:1073 rc_option_editor.cc:1075 rc_option_editor.cc:1083 -#: rc_option_editor.cc:1085 rc_option_editor.cc:1094 +#: ardour_ui2.cc:628 rc_option_editor.cc:1002 rc_option_editor.cc:1020 +#: rc_option_editor.cc:1023 rc_option_editor.cc:1025 rc_option_editor.cc:1027 +#: rc_option_editor.cc:1035 rc_option_editor.cc:1043 rc_option_editor.cc:1045 +#: rc_option_editor.cc:1053 rc_option_editor.cc:1060 rc_option_editor.cc:1069 +#: rc_option_editor.cc:1071 rc_option_editor.cc:1073 rc_option_editor.cc:1081 +#: rc_option_editor.cc:1083 rc_option_editor.cc:1092 #: session_option_editor.cc:234 session_option_editor.cc:236 #: session_option_editor.cc:257 session_option_editor.cc:259 #: session_option_editor.cc:261 session_option_editor.cc:268 msgid "Misc" msgstr "Прочее" -#: ardour_ui_dependents.cc:77 +#: ardour_ui_dependents.cc:69 msgid "Setup Editor" msgstr "Настройка редактора" -#: ardour_ui_dependents.cc:79 +#: ardour_ui_dependents.cc:71 msgid "Setup Mixer" msgstr "Настройка микшера" -#: ardour_ui_dependents.cc:85 +#: ardour_ui_dependents.cc:77 msgid "Reload Session History" msgstr "Повторная загрузка истории сеансов" -#: ardour_ui_dialogs.cc:242 +#: ardour_ui_dialogs.cc:238 msgid "Don't close" msgstr "Не закрывать" -#: ardour_ui_dialogs.cc:243 +#: ardour_ui_dialogs.cc:239 msgid "Just close" msgstr "Просто закрыть" -#: ardour_ui_dialogs.cc:244 +#: ardour_ui_dialogs.cc:240 msgid "Save and close" msgstr "Сохранить и закрыть" -#: ardour_ui_dialogs.cc:340 +#: ardour_ui_dialogs.cc:339 msgid "This screen is not tall enough to display the mixer window" msgstr "Размеров экрана недостаточно, чтобы показать окно микшера" @@ -1593,11 +1602,11 @@ msgid "Session" msgstr "Сеанс" #: ardour_ui_ed.cc:106 editor_actions.cc:134 editor_regions.cc:115 -#: port_group.cc:457 session_option_editor.cc:82 session_option_editor.cc:89 +#: port_group.cc:458 session_option_editor.cc:82 session_option_editor.cc:89 msgid "Sync" msgstr "Синхронизация" -#: ardour_ui_ed.cc:107 engine_dialog.cc:369 +#: ardour_ui_ed.cc:107 msgid "Options" msgstr "Параметры" @@ -1625,15 +1634,15 @@ msgstr "Тип файла" msgid "Sample Format" msgstr "Формат сэмпла" -#: ardour_ui_ed.cc:114 rc_option_editor.cc:1826 rc_option_editor.cc:1839 +#: ardour_ui_ed.cc:114 rc_option_editor.cc:1822 rc_option_editor.cc:1835 msgid "Control Surfaces" msgstr "Устройства управления" -#: ardour_ui_ed.cc:115 rc_option_editor.cc:1558 +#: ardour_ui_ed.cc:115 rc_option_editor.cc:1554 msgid "Plugins" msgstr "Модули" -#: ardour_ui_ed.cc:116 rc_option_editor.cc:1902 +#: ardour_ui_ed.cc:116 rc_option_editor.cc:1898 msgid "Metering" msgstr "Индикаторы" @@ -1719,7 +1728,7 @@ msgid "Stem export..." msgstr "Каждую дорожку в свой файл..." #: ardour_ui_ed.cc:175 editor_export_audio.cc:63 export_dialog.cc:129 -#: export_video_dialog.cc:72 +#: export_video_dialog.cc:71 msgid "Export" msgstr "Экспортировать" @@ -1731,170 +1740,153 @@ msgstr "Очистить неиспользуемые источники..." msgid "Flush Wastebasket" msgstr "Очистить корзину" -#: ardour_ui_ed.cc:189 keyeditor.cc:253 rc_option_editor.cc:1472 -msgid "JACK" -msgstr "JACK" - -#: ardour_ui_ed.cc:190 route_params_ui.cc:105 -msgid "Latency" -msgstr "Задержка отклика" - -#: ardour_ui_ed.cc:192 -msgid "Reconnect" -msgstr "Пересоединить" - -#: ardour_ui_ed.cc:195 global_port_matrix.cc:207 io_selector.cc:210 -#: mixer_strip.cc:719 mixer_strip.cc:845 -msgid "Disconnect" -msgstr "Отсоединить" - -#: ardour_ui_ed.cc:222 +#: ardour_ui_ed.cc:189 msgid "Quit" msgstr "Выход" -#: ardour_ui_ed.cc:226 +#: ardour_ui_ed.cc:193 msgid "Maximise Editor Space" msgstr "Редактор на полный экран" -#: ardour_ui_ed.cc:227 +#: ardour_ui_ed.cc:194 msgid "Show Toolbars" msgstr "Показывать панели" -#: ardour_ui_ed.cc:230 mixer_ui.cc:1865 mixer_ui.cc:1871 +#: ardour_ui_ed.cc:197 mixer_ui.cc:1865 mixer_ui.cc:1871 msgid "Window|Mixer" msgstr "Микшер" -#: ardour_ui_ed.cc:231 +#: ardour_ui_ed.cc:198 msgid "Toggle Editor+Mixer" msgstr "Редактор или микшер на переднем плане" -#: ardour_ui_ed.cc:232 meterbridge.cc:230 meterbridge.cc:236 +#: ardour_ui_ed.cc:199 meterbridge.cc:230 meterbridge.cc:236 msgid "Window|Meterbridge" msgstr "Панель индикаторов" -#: ardour_ui_ed.cc:234 midi_tracer.cc:39 +#: ardour_ui_ed.cc:201 midi_tracer.cc:42 msgid "MIDI Tracer" msgstr "Журнал MIDI-событий" -#: ardour_ui_ed.cc:236 +#: ardour_ui_ed.cc:203 msgid "Chat" msgstr "Пообщаться" -#: ardour_ui_ed.cc:238 +#: ardour_ui_ed.cc:205 msgid "Help|Manual" msgstr "Справка" -#: ardour_ui_ed.cc:239 +#: ardour_ui_ed.cc:206 msgid "Reference" msgstr "Справка в Интернете" -#: ardour_ui_ed.cc:241 plugin_ui.cc:418 +#: ardour_ui_ed.cc:208 plugin_ui.cc:415 msgid "Save" msgstr "Сохранить" -#: ardour_ui_ed.cc:249 rc_option_editor.cc:1114 rc_option_editor.cc:1125 -#: rc_option_editor.cc:1134 rc_option_editor.cc:1147 rc_option_editor.cc:1160 -#: rc_option_editor.cc:1169 rc_option_editor.cc:1179 rc_option_editor.cc:1181 -#: rc_option_editor.cc:1191 rc_option_editor.cc:1207 rc_option_editor.cc:1220 -#: rc_option_editor.cc:1238 rc_option_editor.cc:1240 rc_option_editor.cc:1254 -#: rc_option_editor.cc:1257 rc_option_editor.cc:1259 rc_option_editor.cc:1276 -#: rc_option_editor.cc:1287 +#: ardour_ui_ed.cc:216 rc_option_editor.cc:1112 rc_option_editor.cc:1123 +#: rc_option_editor.cc:1132 rc_option_editor.cc:1145 rc_option_editor.cc:1158 +#: rc_option_editor.cc:1167 rc_option_editor.cc:1177 rc_option_editor.cc:1179 +#: rc_option_editor.cc:1189 rc_option_editor.cc:1205 rc_option_editor.cc:1218 +#: rc_option_editor.cc:1236 rc_option_editor.cc:1238 rc_option_editor.cc:1252 +#: rc_option_editor.cc:1255 rc_option_editor.cc:1257 rc_option_editor.cc:1274 +#: rc_option_editor.cc:1285 msgid "Transport" msgstr "Транспорт" -#: ardour_ui_ed.cc:255 engine_dialog.cc:85 +#: ardour_ui_ed.cc:222 msgid "Stop" msgstr "Стоп" -#: ardour_ui_ed.cc:258 +#: ardour_ui_ed.cc:225 msgid "Roll" msgstr "" -#: ardour_ui_ed.cc:262 +#: ardour_ui_ed.cc:229 msgid "Start/Stop" msgstr "Старт/Стоп" -#: ardour_ui_ed.cc:265 +#: ardour_ui_ed.cc:232 msgid "Start/Continue/Stop" msgstr "Старт/Продолжить/Стоп" -#: ardour_ui_ed.cc:268 +#: ardour_ui_ed.cc:235 msgid "Stop and Forget Capture" msgstr "Остановиться и забыть захват" -#: ardour_ui_ed.cc:278 +#: ardour_ui_ed.cc:245 msgid "Transition To Roll" msgstr "В обычном направлении" -#: ardour_ui_ed.cc:282 +#: ardour_ui_ed.cc:249 msgid "Transition To Reverse" msgstr "В обратном направлении" -#: ardour_ui_ed.cc:286 +#: ardour_ui_ed.cc:253 msgid "Play Loop Range" msgstr "Воспроизвести петлю" -#: ardour_ui_ed.cc:289 +#: ardour_ui_ed.cc:256 msgid "Play Selected Range" msgstr "" -#: ardour_ui_ed.cc:292 +#: ardour_ui_ed.cc:259 msgid "Play Selection w/Preroll" msgstr "" -#: ardour_ui_ed.cc:296 +#: ardour_ui_ed.cc:263 msgid "Enable Record" msgstr "Разрешить запись" -#: ardour_ui_ed.cc:299 +#: ardour_ui_ed.cc:266 msgid "Start Recording" msgstr "Начать запись" -#: ardour_ui_ed.cc:303 +#: ardour_ui_ed.cc:270 msgid "Rewind" msgstr "Перемотать назад" -#: ardour_ui_ed.cc:306 +#: ardour_ui_ed.cc:273 msgid "Rewind (Slow)" msgstr "Перемотать назад (медленно)" -#: ardour_ui_ed.cc:309 +#: ardour_ui_ed.cc:276 msgid "Rewind (Fast)" msgstr "Перемотать назад (быстро)" -#: ardour_ui_ed.cc:312 startup.cc:727 +#: ardour_ui_ed.cc:279 msgid "Forward" msgstr "Перемотать вперёд" -#: ardour_ui_ed.cc:315 +#: ardour_ui_ed.cc:282 msgid "Forward (Slow)" msgstr "Перемотать вперёд (медленно)" -#: ardour_ui_ed.cc:318 +#: ardour_ui_ed.cc:285 msgid "Forward (Fast)" msgstr "Перемотать вперёд (быстро)" -#: ardour_ui_ed.cc:321 +#: ardour_ui_ed.cc:288 msgid "Goto Zero" msgstr "К нулевой отметке" -#: ardour_ui_ed.cc:324 +#: ardour_ui_ed.cc:291 msgid "Goto Start" msgstr "К началу" -#: ardour_ui_ed.cc:327 +#: ardour_ui_ed.cc:294 msgid "Goto End" msgstr "В конец" -#: ardour_ui_ed.cc:330 +#: ardour_ui_ed.cc:297 msgid "Goto Wall Clock" msgstr "К текущему времени" -#: ardour_ui_ed.cc:334 +#: ardour_ui_ed.cc:301 msgid "Focus On Clock" msgstr "" -#: ardour_ui_ed.cc:338 ardour_ui_ed.cc:347 audio_clock.cc:2046 editor.cc:237 +#: ardour_ui_ed.cc:305 ardour_ui_ed.cc:314 audio_clock.cc:2046 editor.cc:237 #: editor_actions.cc:544 editor_actions.cc:553 export_timespan_selector.cc:88 #: session_option_editor.cc:41 session_option_editor.cc:61 #: session_option_editor.cc:80 session_option_editor.cc:96 @@ -1903,143 +1895,139 @@ msgstr "" msgid "Timecode" msgstr "Тайм-код" -#: ardour_ui_ed.cc:340 ardour_ui_ed.cc:349 editor_actions.cc:542 +#: ardour_ui_ed.cc:307 ardour_ui_ed.cc:316 editor_actions.cc:542 msgid "Bars & Beats" msgstr "Такты и доли" -#: ardour_ui_ed.cc:342 ardour_ui_ed.cc:351 +#: ardour_ui_ed.cc:309 ardour_ui_ed.cc:318 msgid "Minutes & Seconds" msgstr "Минуты и секунды" -#: ardour_ui_ed.cc:344 ardour_ui_ed.cc:353 audio_clock.cc:2050 editor.cc:238 +#: ardour_ui_ed.cc:311 ardour_ui_ed.cc:320 audio_clock.cc:2050 editor.cc:238 #: editor_actions.cc:543 msgid "Samples" msgstr "Сэмплы" -#: ardour_ui_ed.cc:356 +#: ardour_ui_ed.cc:323 msgid "Punch In" msgstr "Начало врезки" -#: ardour_ui_ed.cc:357 mixer_strip.cc:1905 route_ui.cc:137 +#: ardour_ui_ed.cc:324 mixer_strip.cc:1905 route_ui.cc:137 #: time_info_box.cc:113 msgid "In" msgstr "Вход" -#: ardour_ui_ed.cc:360 +#: ardour_ui_ed.cc:327 msgid "Punch Out" msgstr "Конец врезки" -#: ardour_ui_ed.cc:361 time_info_box.cc:114 +#: ardour_ui_ed.cc:328 time_info_box.cc:114 msgid "Out" msgstr "Выход" -#: ardour_ui_ed.cc:364 +#: ardour_ui_ed.cc:331 msgid "Punch In/Out" msgstr "Врезка" -#: ardour_ui_ed.cc:365 +#: ardour_ui_ed.cc:332 msgid "In/Out" msgstr "Вх/Вых" -#: ardour_ui_ed.cc:368 rc_option_editor.cc:1071 +#: ardour_ui_ed.cc:335 rc_option_editor.cc:1069 msgid "Click" msgstr "Метроном" -#: ardour_ui_ed.cc:371 +#: ardour_ui_ed.cc:338 msgid "Auto Input" msgstr "Автовход" -#: ardour_ui_ed.cc:374 +#: ardour_ui_ed.cc:341 msgid "Auto Play" msgstr "Автовоспр." -#: ardour_ui_ed.cc:385 +#: ardour_ui_ed.cc:352 msgid "Sync Startup to Video" msgstr "Синхронизировать начало с видео" -#: ardour_ui_ed.cc:387 +#: ardour_ui_ed.cc:354 msgid "Time Master" msgstr "Ведущий времени" -#: ardour_ui_ed.cc:394 +#: ardour_ui_ed.cc:361 msgid "Toggle Record Enable Track %1" msgstr "Переключить записываемость дорожки %1" -#: ardour_ui_ed.cc:401 +#: ardour_ui_ed.cc:368 msgid "Percentage" msgstr "Проценты" -#: ardour_ui_ed.cc:402 shuttle_control.cc:169 +#: ardour_ui_ed.cc:369 shuttle_control.cc:169 msgid "Semitones" msgstr "Полутона" -#: ardour_ui_ed.cc:406 +#: ardour_ui_ed.cc:373 msgid "Send MTC" msgstr "Передавать MTC" -#: ardour_ui_ed.cc:408 +#: ardour_ui_ed.cc:375 msgid "Send MMC" msgstr "Передавать MMC" -#: ardour_ui_ed.cc:410 +#: ardour_ui_ed.cc:377 msgid "Use MMC" msgstr "Использовать MMC" -#: ardour_ui_ed.cc:412 rc_option_editor.cc:1710 +#: ardour_ui_ed.cc:379 rc_option_editor.cc:1706 msgid "Send MIDI Clock" msgstr "Отправлять MIDI Clock" -#: ardour_ui_ed.cc:414 +#: ardour_ui_ed.cc:381 msgid "Send MIDI Feedback" msgstr "Отправлять MIDI Feedback" -#: ardour_ui_ed.cc:420 +#: ardour_ui_ed.cc:387 msgid "Panic" msgstr "" -#: ardour_ui_ed.cc:560 +#: ardour_ui_ed.cc:472 msgid "Wall Clock" msgstr "Текущее время" -#: ardour_ui_ed.cc:561 +#: ardour_ui_ed.cc:473 msgid "Disk Space" msgstr "Диск. пространство" -#: ardour_ui_ed.cc:562 +#: ardour_ui_ed.cc:474 msgid "DSP" msgstr "DSP" -#: ardour_ui_ed.cc:563 +#: ardour_ui_ed.cc:475 msgid "Buffers" msgstr "Буферы" -#: ardour_ui_ed.cc:564 -msgid "JACK Sampling Rate and Latency" -msgstr "Частота сэмплирования и задержка JACK" - -#: ardour_ui_ed.cc:565 +#: ardour_ui_ed.cc:477 msgid "Timecode Format" msgstr "Формат тайм-кода" -#: ardour_ui_ed.cc:566 +#: ardour_ui_ed.cc:478 msgid "File Format" msgstr "Формат файлов" -#: ardour_ui_options.cc:65 +#: ardour_ui_options.cc:61 msgid "" "It is not possible to use JACK as the the sync source\n" "when the pull up/down setting is non-zero." msgstr "" -#: ardour_ui_options.cc:321 +#: ardour_ui_options.cc:317 msgid "Internal" msgstr "Внутр. синхронизация" -#: ardour_ui_options.cc:482 +#: ardour_ui_options.cc:468 msgid "Enable/Disable external positional sync" msgstr "Включить или выключить внешнюю синхронизацию позиционирования" -#: ardour_ui_options.cc:484 +#: ardour_ui_options.cc:470 msgid "Sync to JACK is not possible: video pull up/down is set" msgstr "" @@ -2158,32 +2146,32 @@ msgid "hide track" msgstr "Скрыть дорожку" #: automation_time_axis.cc:255 automation_time_axis.cc:307 -#: automation_time_axis.cc:496 gain_meter.cc:195 generic_pluginui.cc:456 -#: generic_pluginui.cc:746 panner_ui.cc:150 +#: automation_time_axis.cc:496 gain_meter.cc:194 generic_pluginui.cc:454 +#: generic_pluginui.cc:744 panner_ui.cc:149 msgid "Automation|Manual" msgstr "Вручную" #: automation_time_axis.cc:257 automation_time_axis.cc:318 -#: automation_time_axis.cc:501 editor.cc:1933 editor.cc:2010 -#: editor_actions.cc:118 editor_actions.cc:1865 gain_meter.cc:198 -#: generic_pluginui.cc:459 generic_pluginui.cc:748 midi_time_axis.cc:1488 -#: midi_time_axis.cc:1491 midi_time_axis.cc:1494 panner_ui.cc:153 +#: automation_time_axis.cc:501 editor.cc:1937 editor.cc:2014 +#: editor_actions.cc:118 editor_actions.cc:1865 gain_meter.cc:197 +#: generic_pluginui.cc:457 generic_pluginui.cc:746 midi_time_axis.cc:1488 +#: midi_time_axis.cc:1491 midi_time_axis.cc:1494 panner_ui.cc:152 msgid "Play" msgstr "Воспр." #: automation_time_axis.cc:259 automation_time_axis.cc:329 -#: automation_time_axis.cc:506 gain_meter.cc:201 generic_pluginui.cc:462 -#: generic_pluginui.cc:750 panner_ui.cc:156 +#: automation_time_axis.cc:506 gain_meter.cc:200 generic_pluginui.cc:460 +#: generic_pluginui.cc:748 panner_ui.cc:155 msgid "Write" msgstr "Запись" #: automation_time_axis.cc:261 automation_time_axis.cc:340 -#: automation_time_axis.cc:511 gain_meter.cc:204 generic_pluginui.cc:465 -#: generic_pluginui.cc:752 panner_ui.cc:159 +#: automation_time_axis.cc:511 gain_meter.cc:203 generic_pluginui.cc:463 +#: generic_pluginui.cc:750 panner_ui.cc:158 msgid "Touch" msgstr "Касание" -#: automation_time_axis.cc:351 generic_pluginui.cc:468 meter_patterns.cc:108 +#: automation_time_axis.cc:351 generic_pluginui.cc:466 meter_patterns.cc:108 msgid "???" msgstr "???" @@ -2208,8 +2196,8 @@ msgstr "Состояние" msgid "Discrete" msgstr "Дискретный" -#: automation_time_axis.cc:537 editor.cc:1457 editor.cc:1464 editor.cc:1520 -#: editor.cc:1526 export_format_dialog.cc:476 +#: automation_time_axis.cc:537 editor.cc:1458 editor.cc:1465 editor.cc:1521 +#: editor.cc:1527 export_format_dialog.cc:476 msgid "Linear" msgstr "Линейная" @@ -2240,13 +2228,13 @@ msgstr "Вход" msgid "Output" msgstr "Выход" -#: bundle_manager.cc:264 editor.cc:1974 editor_actions.cc:90 +#: bundle_manager.cc:264 editor.cc:1978 editor_actions.cc:90 #: editor_actions.cc:100 msgid "Edit" msgstr "Правка" -#: bundle_manager.cc:265 editor.cc:5493 editor_actions.cc:310 -#: editor_actions.cc:368 plugin_ui.cc:419 processor_box.cc:2229 +#: bundle_manager.cc:265 editor.cc:5497 editor_actions.cc:310 +#: editor_actions.cc:368 plugin_ui.cc:416 processor_box.cc:2268 #: route_time_axis.cc:713 msgid "Delete" msgstr "Удалить" @@ -2423,164 +2411,164 @@ msgstr "Длительность" msgid "edit note" msgstr "правка ноты" -#: editor.cc:137 editor.cc:3429 +#: editor.cc:137 editor.cc:3433 msgid "CD Frames" msgstr "Выборки CD" -#: editor.cc:138 editor.cc:3431 +#: editor.cc:138 editor.cc:3435 msgid "Timecode Frames" msgstr "" -#: editor.cc:139 editor.cc:3433 +#: editor.cc:139 editor.cc:3437 msgid "Timecode Seconds" msgstr "" -#: editor.cc:140 editor.cc:3435 +#: editor.cc:140 editor.cc:3439 msgid "Timecode Minutes" msgstr "" -#: editor.cc:141 editor.cc:3437 +#: editor.cc:141 editor.cc:3441 msgid "Seconds" msgstr "Секунды" -#: editor.cc:142 editor.cc:3439 +#: editor.cc:142 editor.cc:3443 msgid "Minutes" msgstr "Минуты" -#: editor.cc:143 editor.cc:3413 quantize_dialog.cc:37 quantize_dialog.cc:141 +#: editor.cc:143 editor.cc:3417 quantize_dialog.cc:37 quantize_dialog.cc:141 msgid "Beats/128" msgstr "Доли/128" -#: editor.cc:144 editor.cc:3411 quantize_dialog.cc:38 quantize_dialog.cc:143 +#: editor.cc:144 editor.cc:3415 quantize_dialog.cc:38 quantize_dialog.cc:143 msgid "Beats/64" msgstr "Доли/64" -#: editor.cc:145 editor.cc:3409 quantize_dialog.cc:39 quantize_dialog.cc:145 +#: editor.cc:145 editor.cc:3413 quantize_dialog.cc:39 quantize_dialog.cc:145 msgid "Beats/32" msgstr "Доли/32" -#: editor.cc:146 editor.cc:3407 +#: editor.cc:146 editor.cc:3411 msgid "Beats/28" msgstr "Доли/28" -#: editor.cc:147 editor.cc:3405 +#: editor.cc:147 editor.cc:3409 msgid "Beats/24" msgstr "Доли/24" -#: editor.cc:148 editor.cc:3403 +#: editor.cc:148 editor.cc:3407 msgid "Beats/20" msgstr "Доли/20" -#: editor.cc:149 editor.cc:3401 quantize_dialog.cc:40 quantize_dialog.cc:147 +#: editor.cc:149 editor.cc:3405 quantize_dialog.cc:40 quantize_dialog.cc:147 msgid "Beats/16" msgstr "Доли/16" -#: editor.cc:150 editor.cc:3399 +#: editor.cc:150 editor.cc:3403 msgid "Beats/14" msgstr "Доли/14" -#: editor.cc:151 editor.cc:3397 +#: editor.cc:151 editor.cc:3401 msgid "Beats/12" msgstr "Доли/12" -#: editor.cc:152 editor.cc:3395 +#: editor.cc:152 editor.cc:3399 msgid "Beats/10" msgstr "Доли/10" -#: editor.cc:153 editor.cc:3393 quantize_dialog.cc:41 quantize_dialog.cc:149 +#: editor.cc:153 editor.cc:3397 quantize_dialog.cc:41 quantize_dialog.cc:149 msgid "Beats/8" msgstr "Доли/8" -#: editor.cc:154 editor.cc:3391 +#: editor.cc:154 editor.cc:3395 msgid "Beats/7" msgstr "Доли/7" -#: editor.cc:155 editor.cc:3389 +#: editor.cc:155 editor.cc:3393 msgid "Beats/6" msgstr "Доли/6" -#: editor.cc:156 editor.cc:3387 +#: editor.cc:156 editor.cc:3391 msgid "Beats/5" msgstr "Доли/5" -#: editor.cc:157 editor.cc:3385 quantize_dialog.cc:42 quantize_dialog.cc:151 +#: editor.cc:157 editor.cc:3389 quantize_dialog.cc:42 quantize_dialog.cc:151 msgid "Beats/4" msgstr "Доли/4" -#: editor.cc:158 editor.cc:3383 quantize_dialog.cc:43 quantize_dialog.cc:153 +#: editor.cc:158 editor.cc:3387 quantize_dialog.cc:43 quantize_dialog.cc:153 msgid "Beats/3" msgstr "Доли/3" -#: editor.cc:159 editor.cc:3381 quantize_dialog.cc:44 quantize_dialog.cc:155 +#: editor.cc:159 editor.cc:3385 quantize_dialog.cc:44 quantize_dialog.cc:155 msgid "Beats/2" msgstr "Доли/2" -#: editor.cc:160 editor.cc:3415 quantize_dialog.cc:45 quantize_dialog.cc:157 +#: editor.cc:160 editor.cc:3419 quantize_dialog.cc:45 quantize_dialog.cc:157 msgid "Beats" msgstr "Доли" -#: editor.cc:161 editor.cc:3417 +#: editor.cc:161 editor.cc:3421 msgid "Bars" msgstr "Такты" -#: editor.cc:162 editor.cc:3419 +#: editor.cc:162 editor.cc:3423 msgid "Marks" msgstr "Маркеры" -#: editor.cc:163 editor.cc:3421 +#: editor.cc:163 editor.cc:3425 msgid "Region starts" msgstr "Начала областей" -#: editor.cc:164 editor.cc:3423 +#: editor.cc:164 editor.cc:3427 msgid "Region ends" msgstr "Концы областей" -#: editor.cc:165 editor.cc:3427 +#: editor.cc:165 editor.cc:3431 msgid "Region syncs" msgstr "Синхр. областей" -#: editor.cc:166 editor.cc:3425 +#: editor.cc:166 editor.cc:3429 msgid "Region bounds" msgstr "Границы областей" -#: editor.cc:171 editor.cc:3455 editor_actions.cc:485 +#: editor.cc:171 editor.cc:3459 editor_actions.cc:485 msgid "No Grid" msgstr "Без сетки" -#: editor.cc:172 editor.cc:3457 editor_actions.cc:486 +#: editor.cc:172 editor.cc:3461 editor_actions.cc:486 msgid "Grid" msgstr "По сетке" -#: editor.cc:173 editor.cc:3459 editor_actions.cc:487 +#: editor.cc:173 editor.cc:3463 editor_actions.cc:487 msgid "Magnetic" msgstr "Магнит" -#: editor.cc:178 editor.cc:188 editor.cc:3498 editor.cc:3523 +#: editor.cc:178 editor.cc:188 editor.cc:3502 editor.cc:3527 #: editor_actions.cc:117 editor_actions.cc:468 msgid "Playhead" msgstr "Указатель воспроизведения" -#: editor.cc:179 editor.cc:3496 editor_actions.cc:470 +#: editor.cc:179 editor.cc:3500 editor_actions.cc:470 msgid "Marker" msgstr "Маркер" -#: editor.cc:180 editor.cc:189 editor.cc:3525 editor_actions.cc:469 +#: editor.cc:180 editor.cc:189 editor.cc:3529 editor_actions.cc:469 msgid "Mouse" msgstr "Мышь" -#: editor.cc:185 editor.cc:3517 mono_panner_editor.cc:42 +#: editor.cc:185 editor.cc:3521 mono_panner_editor.cc:42 msgid "Left" msgstr "Влево" -#: editor.cc:186 editor.cc:3519 mono_panner_editor.cc:47 +#: editor.cc:186 editor.cc:3523 mono_panner_editor.cc:47 msgid "Right" msgstr "Вправо" -#: editor.cc:187 editor.cc:3521 +#: editor.cc:187 editor.cc:3525 msgid "Center" msgstr "По центру" -#: editor.cc:190 editor.cc:3090 editor.cc:3527 +#: editor.cc:190 editor.cc:3094 editor.cc:3531 msgid "Edit point" msgstr "Курсор редактора" @@ -2640,337 +2628,341 @@ msgstr "Видеолинейка" msgid "mode" msgstr "Режим" -#: editor.cc:542 +#: editor.cc:541 msgid "Regions" msgstr "Области" -#: editor.cc:543 +#: editor.cc:542 msgid "Tracks & Busses" msgstr "Дорожки и шины" -#: editor.cc:544 +#: editor.cc:543 msgid "Snapshots" msgstr "Снимки" -#: editor.cc:545 +#: editor.cc:544 msgid "Track & Bus Groups" msgstr "Группы дорожек и шин" -#: editor.cc:546 +#: editor.cc:545 msgid "Ranges & Marks" msgstr "Области и маркеры" -#: editor.cc:690 editor.cc:5345 rc_option_editor.cc:1294 -#: rc_option_editor.cc:1302 rc_option_editor.cc:1310 rc_option_editor.cc:1318 -#: rc_option_editor.cc:1335 rc_option_editor.cc:1337 rc_option_editor.cc:1345 -#: rc_option_editor.cc:1353 rc_option_editor.cc:1373 rc_option_editor.cc:1385 -#: rc_option_editor.cc:1387 rc_option_editor.cc:1395 rc_option_editor.cc:1403 -#: rc_option_editor.cc:1411 rc_option_editor.cc:1419 rc_option_editor.cc:1427 -#: rc_option_editor.cc:1442 rc_option_editor.cc:1446 +#: editor.cc:690 editor.cc:5349 rc_option_editor.cc:1292 +#: rc_option_editor.cc:1300 rc_option_editor.cc:1308 rc_option_editor.cc:1316 +#: rc_option_editor.cc:1333 rc_option_editor.cc:1335 rc_option_editor.cc:1343 +#: rc_option_editor.cc:1351 rc_option_editor.cc:1371 rc_option_editor.cc:1383 +#: rc_option_editor.cc:1385 rc_option_editor.cc:1393 rc_option_editor.cc:1401 +#: rc_option_editor.cc:1409 rc_option_editor.cc:1417 rc_option_editor.cc:1425 +#: rc_option_editor.cc:1440 rc_option_editor.cc:1444 msgid "Editor" msgstr "Редактор" -#: editor.cc:1215 editor.cc:1225 editor.cc:4440 editor_actions.cc:130 +#: editor.cc:1215 editor.cc:1225 editor.cc:4444 editor_actions.cc:130 #: editor_actions.cc:1813 msgid "Loop" msgstr "Петля" -#: editor.cc:1231 editor.cc:1241 editor.cc:4467 editor_actions.cc:131 +#: editor.cc:1231 editor.cc:1241 editor.cc:4471 editor_actions.cc:131 #: time_info_box.cc:67 msgid "Punch" msgstr "Врезка" -#: editor.cc:1352 +#: editor.cc:1353 msgid "Linear (for highly correlated material)" msgstr "Линейно (для схожего материала)" -#: editor.cc:1362 editor.cc:1499 editor.cc:1561 +#: editor.cc:1363 editor.cc:1500 editor.cc:1562 msgid "Constant power" msgstr "С постоянной силой" -#: editor.cc:1371 editor.cc:1492 editor.cc:1554 +#: editor.cc:1372 editor.cc:1493 editor.cc:1555 msgid "Symmetric" msgstr "Симметрично" -#: editor.cc:1381 editor.cc:1474 editor.cc:1536 +#: editor.cc:1382 editor.cc:1475 editor.cc:1537 msgid "Slow" msgstr "Медленно" -#: editor.cc:1390 editor.cc:1483 editor.cc:1545 sfdb_ui.cc:1627 +#: editor.cc:1391 editor.cc:1484 editor.cc:1546 sfdb_ui.cc:1627 #: sfdb_ui.cc:1736 msgid "Fast" msgstr "Быстро" -#: editor.cc:1437 +#: editor.cc:1438 msgid "programming error: fade in canvas item has no regionview data pointer!" msgstr "programming error: fade in canvas item has no regionview data pointer!" -#: editor.cc:1448 editor.cc:1512 +#: editor.cc:1449 editor.cc:1513 msgid "Deactivate" msgstr "Деактивировать" -#: editor.cc:1450 editor.cc:1514 +#: editor.cc:1451 editor.cc:1515 msgid "Activate" msgstr "Активировать" -#: editor.cc:1458 editor.cc:1521 +#: editor.cc:1459 editor.cc:1522 msgid "Slowest" msgstr "Медленнее всего" -#: editor.cc:1572 route_time_axis.cc:1877 selection.cc:1009 selection.cc:1064 +#: editor.cc:1573 route_time_axis.cc:1877 selection.cc:1009 selection.cc:1064 msgid "programming error: " msgstr "Ошибка в программе: " -#: editor.cc:1673 editor.cc:1681 editor_ops.cc:3522 +#: editor.cc:1674 editor.cc:1682 editor_ops.cc:3522 msgid "Freeze" msgstr "Заморозить" -#: editor.cc:1677 +#: editor.cc:1678 msgid "Unfreeze" msgstr "Разморозить" -#: editor.cc:1816 +#: editor.cc:1817 msgid "Selected Regions" msgstr "Выделенные области" -#: editor.cc:1852 editor_markers.cc:895 +#: editor.cc:1853 editor_markers.cc:895 msgid "Play Range" msgstr "Воспроизвести выделение" -#: editor.cc:1853 editor_markers.cc:898 +#: editor.cc:1854 editor_markers.cc:898 msgid "Loop Range" msgstr "Создать петлю из выделения" -#: editor.cc:1862 editor_actions.cc:332 +#: editor.cc:1863 editor_actions.cc:332 msgid "Move Range Start to Previous Region Boundary" msgstr "Переместить начало выделения к границе предыдущей области" -#: editor.cc:1869 editor_actions.cc:339 +#: editor.cc:1870 editor_actions.cc:339 msgid "Move Range Start to Next Region Boundary" msgstr "Переместить начало выделения к границе следующей области" -#: editor.cc:1876 editor_actions.cc:346 +#: editor.cc:1877 editor_actions.cc:346 msgid "Move Range End to Previous Region Boundary" msgstr "Переместить конец выделения к границе предыдущей области" -#: editor.cc:1883 editor_actions.cc:353 +#: editor.cc:1884 editor_actions.cc:353 msgid "Move Range End to Next Region Boundary" msgstr "Переместить конец выделения к границе следующей области" -#: editor.cc:1889 +#: editor.cc:1890 msgid "Convert to Region In-Place" msgstr "Преобразовать в область на месте" -#: editor.cc:1890 +#: editor.cc:1891 msgid "Convert to Region in Region List" msgstr "Преобразовать в область в списке областей" -#: editor.cc:1893 editor_markers.cc:925 +#: editor.cc:1894 editor_markers.cc:925 msgid "Select All in Range" msgstr "Выбрать всё в выделении" -#: editor.cc:1896 +#: editor.cc:1897 msgid "Set Loop from Range" msgstr "Создать петлю из выделения" -#: editor.cc:1897 +#: editor.cc:1898 msgid "Set Punch from Range" msgstr "Создать врезку из выделения" -#: editor.cc:1900 +#: editor.cc:1901 msgid "Add Range Markers" msgstr "Добавить маркеры областей" -#: editor.cc:1903 +#: editor.cc:1904 msgid "Crop Region to Range" msgstr "Обрезать область по выделению" -#: editor.cc:1904 +#: editor.cc:1905 msgid "Fill Range with Region" msgstr "Заполнить диапазон областью" -#: editor.cc:1905 editor_actions.cc:289 +#: editor.cc:1906 editor_actions.cc:289 msgid "Duplicate Range" msgstr "Продублировать диапазон" -#: editor.cc:1908 +#: editor.cc:1909 msgid "Consolidate Range" msgstr "Объединить диапазон" -#: editor.cc:1909 +#: editor.cc:1910 msgid "Consolidate Range With Processing" msgstr "Объединить диапазон с обработкой" -#: editor.cc:1910 +#: editor.cc:1911 msgid "Bounce Range to Region List" msgstr "Свести диапазон в список областей" -#: editor.cc:1911 +#: editor.cc:1912 msgid "Bounce Range to Region List With Processing" msgstr "Свести выделение в список областей с обработкой" -#: editor.cc:1912 editor_markers.cc:908 +#: editor.cc:1913 editor_markers.cc:908 msgid "Export Range..." msgstr "Экспортировать выделение…" -#: editor.cc:1927 editor.cc:2008 editor_actions.cc:281 +#: editor.cc:1915 +msgid "Export Video Range..." +msgstr "Экспортировать фрагмент видео..." + +#: editor.cc:1931 editor.cc:2012 editor_actions.cc:281 msgid "Play From Edit Point" msgstr "Воспроизвести от курсора редактора" -#: editor.cc:1928 editor.cc:2009 +#: editor.cc:1932 editor.cc:2013 msgid "Play From Start" msgstr "Воспроизвести с начала" -#: editor.cc:1929 +#: editor.cc:1933 msgid "Play Region" msgstr "Воспроизвести область" -#: editor.cc:1931 +#: editor.cc:1935 msgid "Loop Region" msgstr "Создать петлю из области" -#: editor.cc:1941 editor.cc:2018 +#: editor.cc:1945 editor.cc:2022 msgid "Select All in Track" msgstr "Выделить всё на дорожке" -#: editor.cc:1942 editor.cc:2019 editor_actions.cc:185 -#: export_timespan_selector.cc:53 processor_box.cc:2237 +#: editor.cc:1946 editor.cc:2023 editor_actions.cc:185 +#: export_timespan_selector.cc:53 processor_box.cc:2276 msgid "Select All" msgstr "Выделить всё" -#: editor.cc:1943 editor.cc:2020 +#: editor.cc:1947 editor.cc:2024 msgid "Invert Selection in Track" msgstr "Обратить выделение на дорожке" -#: editor.cc:1944 editor.cc:2021 editor_actions.cc:187 +#: editor.cc:1948 editor.cc:2025 editor_actions.cc:187 msgid "Invert Selection" msgstr "Обратить выделение" -#: editor.cc:1946 +#: editor.cc:1950 msgid "Set Range to Loop Range" msgstr "Установить диапазон по диапазону петли" -#: editor.cc:1947 +#: editor.cc:1951 msgid "Set Range to Punch Range" msgstr "Установить диапазон по диапазону врезки" -#: editor.cc:1949 editor.cc:2023 editor_actions.cc:188 +#: editor.cc:1953 editor.cc:2027 editor_actions.cc:188 msgid "Select All After Edit Point" msgstr "Выделить всё после курсора редактора" -#: editor.cc:1950 editor.cc:2024 editor_actions.cc:189 +#: editor.cc:1954 editor.cc:2028 editor_actions.cc:189 msgid "Select All Before Edit Point" msgstr "Выделить всё до курсора редактора" -#: editor.cc:1951 editor.cc:2025 +#: editor.cc:1955 editor.cc:2029 msgid "Select All After Playhead" msgstr "Выделить всё после указателя" -#: editor.cc:1952 editor.cc:2026 +#: editor.cc:1956 editor.cc:2030 msgid "Select All Before Playhead" msgstr "Выделить всё до указателя" -#: editor.cc:1953 +#: editor.cc:1957 msgid "Select All Between Playhead and Edit Point" msgstr "Выделить всё между указателем и курсором редактора" -#: editor.cc:1954 +#: editor.cc:1958 msgid "Select All Within Playhead and Edit Point" msgstr "Выделить всё между указателем и точкой редактирования" -#: editor.cc:1955 +#: editor.cc:1959 msgid "Select Range Between Playhead and Edit Point" msgstr "Создать выделение между указателем и курсором редактора" -#: editor.cc:1957 editor.cc:2028 editor_actions.cc:127 editor_actions.cc:128 +#: editor.cc:1961 editor.cc:2032 editor_actions.cc:127 editor_actions.cc:128 msgid "Select" msgstr "Выделить" -#: editor.cc:1965 editor.cc:2036 editor_actions.cc:309 processor_box.cc:2222 +#: editor.cc:1969 editor.cc:2040 editor_actions.cc:309 processor_box.cc:2261 msgid "Cut" msgstr "Вырезать" -#: editor.cc:1966 editor.cc:2037 editor_actions.cc:312 processor_box.cc:2225 +#: editor.cc:1970 editor.cc:2041 editor_actions.cc:312 processor_box.cc:2264 msgid "Copy" msgstr "Копировать" -#: editor.cc:1967 editor.cc:2038 editor_actions.cc:313 processor_box.cc:2233 +#: editor.cc:1971 editor.cc:2042 editor_actions.cc:313 processor_box.cc:2272 msgid "Paste" msgstr "Вставить" -#: editor.cc:1971 editor_actions.cc:87 +#: editor.cc:1975 editor_actions.cc:87 msgid "Align" msgstr "Выровнять" -#: editor.cc:1972 +#: editor.cc:1976 msgid "Align Relative" msgstr "Выровнять относительно" -#: editor.cc:1979 +#: editor.cc:1983 msgid "Insert Selected Region" msgstr "Вставить выделенную область" -#: editor.cc:1980 +#: editor.cc:1984 msgid "Insert Existing Media" msgstr "Вставить существующие данные" -#: editor.cc:1989 editor.cc:2045 +#: editor.cc:1993 editor.cc:2049 msgid "Nudge Entire Track Later" msgstr "Толкнуть всю дорожку вперёд" -#: editor.cc:1990 editor.cc:2046 +#: editor.cc:1994 editor.cc:2050 msgid "Nudge Track After Edit Point Later" msgstr "Толкнуть дорожку вперёд после курсора редактора" -#: editor.cc:1991 editor.cc:2047 +#: editor.cc:1995 editor.cc:2051 msgid "Nudge Entire Track Earlier" msgstr "Толкнуть всю дорожку назад" -#: editor.cc:1992 editor.cc:2048 +#: editor.cc:1996 editor.cc:2052 msgid "Nudge Track After Edit Point Earlier" msgstr "Толкнуть дорожку назад после курсора редактора" -#: editor.cc:1994 editor.cc:2050 +#: editor.cc:1998 editor.cc:2054 msgid "Nudge" msgstr "Толкнуть" -#: editor.cc:3070 +#: editor.cc:3074 msgid "Smart Mode (add Range functions to Object mode)" msgstr "Универсальный режим, совмещает функции работы с областями и объектами" -#: editor.cc:3071 +#: editor.cc:3075 msgid "Object Mode (select/move Objects)" msgstr "Объектный режим (выделение и перемещение объектов)" -#: editor.cc:3072 +#: editor.cc:3076 msgid "Range Mode (select/move Ranges)" msgstr "Режим выделения (создание и перемещение выделений)" -#: editor.cc:3073 +#: editor.cc:3077 msgid "Draw/Edit MIDI Notes" msgstr "Рисовать или редактировать ноты MIDI" -#: editor.cc:3074 +#: editor.cc:3078 msgid "Draw Region Gain" msgstr "Нарисовать линию усиления области" -#: editor.cc:3075 +#: editor.cc:3079 msgid "Select Zoom Range" msgstr "Менять масштаб просмотра" -#: editor.cc:3076 +#: editor.cc:3080 msgid "Stretch/Shrink Regions and MIDI Notes" msgstr "Растянуть или сжать области и ноты MIDI" -#: editor.cc:3077 +#: editor.cc:3081 msgid "Listen to Specific Regions" msgstr "Воспроизводить отдельные области" -#: editor.cc:3078 +#: editor.cc:3082 msgid "Note Level Editing" msgstr "Редактировать MIDI-дорожки" -#: editor.cc:3079 +#: editor.cc:3083 msgid "" "Groups: click to (de)activate\n" "Context-click for other operations" @@ -2978,89 +2970,89 @@ msgstr "" "Группы: щёлкните для (де)активации\n" "Щелчок другой клавишей вызывает контекстное меню" -#: editor.cc:3080 +#: editor.cc:3084 msgid "Nudge Region/Selection Later" msgstr "Толкнуть область или выделение вперёд" -#: editor.cc:3081 +#: editor.cc:3085 msgid "Nudge Region/Selection Earlier" msgstr "Толкнуть область или выделение назад" -#: editor.cc:3082 editor_actions.cc:242 +#: editor.cc:3086 editor_actions.cc:242 msgid "Zoom In" msgstr "Увеличить" -#: editor.cc:3083 editor_actions.cc:241 +#: editor.cc:3087 editor_actions.cc:241 msgid "Zoom Out" msgstr "Уменьшить" -#: editor.cc:3084 editor_actions.cc:243 +#: editor.cc:3088 editor_actions.cc:243 msgid "Zoom to Session" msgstr "Показать всё" -#: editor.cc:3085 +#: editor.cc:3089 msgid "Zoom focus" msgstr "Фокус при масштабировании" -#: editor.cc:3086 +#: editor.cc:3090 msgid "Expand Tracks" msgstr "Увеличить дорожки по высоте" -#: editor.cc:3087 +#: editor.cc:3091 msgid "Shrink Tracks" msgstr "Уменьшить дорожки по высоте" -#: editor.cc:3088 +#: editor.cc:3092 msgid "Snap/Grid Units" msgstr "Единица прилипания/сетки" -#: editor.cc:3089 +#: editor.cc:3093 msgid "Snap/Grid Mode" msgstr "Режим прилипания/сетки" -#: editor.cc:3091 +#: editor.cc:3095 msgid "Edit Mode" msgstr "Режим редактирования" -#: editor.cc:3092 +#: editor.cc:3096 msgid "" "Nudge Clock\n" "(controls distance used to nudge regions and selections)" msgstr "" -#: editor.cc:3194 +#: editor.cc:3198 msgid "malformed URL passed to drag-n-drop code" msgstr "" -#: editor.cc:3256 editor_actions.cc:291 +#: editor.cc:3260 editor_actions.cc:291 msgid "Command|Undo" msgstr "Отменить" -#: editor.cc:3258 +#: editor.cc:3262 msgid "Command|Undo (%1)" msgstr "Отменить (%1)" -#: editor.cc:3265 editor_actions.cc:292 +#: editor.cc:3269 editor_actions.cc:292 msgid "Redo" msgstr "Вернуть" -#: editor.cc:3267 +#: editor.cc:3271 msgid "Redo (%1)" msgstr "Вернуть (%1)" -#: editor.cc:3286 editor.cc:3310 editor_actions.cc:106 editor_actions.cc:1794 +#: editor.cc:3290 editor.cc:3314 editor_actions.cc:106 editor_actions.cc:1794 msgid "Duplicate" msgstr "Продублировать" -#: editor.cc:3287 +#: editor.cc:3291 msgid "Number of duplications:" msgstr "Количество копий:" -#: editor.cc:3864 +#: editor.cc:3868 msgid "Playlist Deletion" msgstr "Удаление списка воспроизведения" -#: editor.cc:3865 +#: editor.cc:3869 msgid "" "Playlist %1 is currently unused.\n" "If it is kept, its audio files will not be cleaned.\n" @@ -3070,36 +3062,37 @@ msgstr "" "Если его оставить, связанные звуковые файлы не будут подчищены.\n" "Если его удалить, будут подчищены и связанные звуковые файлы." -#: editor.cc:3875 +#: editor.cc:3879 msgid "Delete Playlist" msgstr "Удалить список" -#: editor.cc:3876 +#: editor.cc:3880 msgid "Keep Playlist" msgstr "Сохранить список" -#: editor.cc:3877 editor_audio_import.cc:581 editor_ops.cc:5856 -#: sfdb_freesound_mootcher.cc:69 processor_box.cc:2003 processor_box.cc:2028 +#: editor.cc:3881 editor_audio_import.cc:581 editor_ops.cc:5856 +#: engine_dialog.cc:1689 sfdb_freesound_mootcher.cc:69 processor_box.cc:2030 +#: processor_box.cc:2055 msgid "Cancel" msgstr "Отмена" -#: editor.cc:4021 +#: editor.cc:4025 msgid "new playlists" msgstr "Создать списки воспроизведения" -#: editor.cc:4037 +#: editor.cc:4041 msgid "copy playlists" msgstr "Скопировать списки воспроизведения" -#: editor.cc:4052 +#: editor.cc:4056 msgid "clear playlists" msgstr "Очистить списки воспроизведения" -#: editor.cc:4687 +#: editor.cc:4691 msgid "Please wait while %1 loads visual data." msgstr "Дождитесь загрузки визуальных данных в %1." -#: editor.cc:5492 editor_markers.cc:940 panner_ui.cc:393 processor_box.cc:2253 +#: editor.cc:5496 editor_markers.cc:940 panner_ui.cc:392 processor_box.cc:2292 msgid "Edit..." msgstr "Изменить" @@ -3148,8 +3141,8 @@ msgstr "Слои" msgid "Position" msgstr "Положение" -#: editor_actions.cc:101 gain_meter.cc:121 gain_meter.cc:791 panner_ui.cc:177 -#: panner_ui.cc:586 +#: editor_actions.cc:101 gain_meter.cc:120 gain_meter.cc:794 panner_ui.cc:176 +#: panner_ui.cc:585 msgid "Trim" msgstr "Обрезать" @@ -3199,7 +3192,7 @@ msgstr "Параметры MIDI" msgid "Misc Options" msgstr "Прочие параметры" -#: editor_actions.cc:115 rc_option_editor.cc:1460 route_group_dialog.cc:48 +#: editor_actions.cc:115 rc_option_editor.cc:1458 route_group_dialog.cc:48 #: session_option_editor.cc:218 session_option_editor.cc:225 msgid "Monitoring" msgstr "Мониторинг" @@ -3377,7 +3370,7 @@ msgstr "К началу области" msgid "Playhead to Range End" msgstr "К концу области" -#: editor_actions.cc:186 export_timespan_selector.cc:61 processor_box.cc:2239 +#: editor_actions.cc:186 export_timespan_selector.cc:61 processor_box.cc:2278 msgid "Deselect All" msgstr "Снять все выделения" @@ -3936,7 +3929,7 @@ msgstr "Мин:С" msgid "Video Monitor" msgstr "Видеомонитор" -#: editor_actions.cc:549 rc_option_editor.cc:1842 +#: editor_actions.cc:549 rc_option_editor.cc:1838 msgid "Video" msgstr "Видео" @@ -4455,31 +4448,31 @@ msgstr "скопировать маркер темпа" msgid "move tempo mark" msgstr "переместить маркер темпа" -#: editor_drag.cc:2545 +#: editor_drag.cc:2550 msgid "change fade in length" msgstr "смена длительности фейда нарастания" -#: editor_drag.cc:2663 +#: editor_drag.cc:2668 msgid "change fade out length" msgstr "смена длительности фейда затухания" -#: editor_drag.cc:3018 +#: editor_drag.cc:3023 msgid "move marker" msgstr "смещение маркера" -#: editor_drag.cc:3581 +#: editor_drag.cc:3586 msgid "An error occurred while executing time stretch operation" msgstr "" -#: editor_drag.cc:4011 +#: editor_drag.cc:4016 msgid "programming_error: %1" msgstr "Ошибка в программе: %1" -#: editor_drag.cc:4081 editor_markers.cc:680 +#: editor_drag.cc:4086 editor_markers.cc:680 msgid "new range marker" msgstr "новый маркер выделения" -#: editor_drag.cc:4762 +#: editor_drag.cc:4767 msgid "rubberband selection" msgstr "прямоугольное выделение" @@ -4703,8 +4696,8 @@ msgstr "Переименовать маркер" msgid "Rename Range" msgstr "Переименовать выделение" -#: editor_markers.cc:1363 editor_mouse.cc:2510 processor_box.cc:1781 -#: processor_box.cc:2235 route_time_axis.cc:982 route_ui.cc:1540 +#: editor_markers.cc:1363 editor_mouse.cc:2510 processor_box.cc:1808 +#: processor_box.cc:2274 route_time_axis.cc:982 route_ui.cc:1540 msgid "Rename" msgstr "Переименовать" @@ -4840,7 +4833,7 @@ msgstr "опускание областей вниз" msgid "Rename Region" msgstr "Переименовать область..." -#: editor_ops.cc:2372 processor_box.cc:1779 route_ui.cc:1538 +#: editor_ops.cc:2372 processor_box.cc:1806 route_ui.cc:1538 msgid "New name:" msgstr "Новое название:" @@ -5352,8 +5345,8 @@ msgstr "" msgid "Region position glued to Bars|Beats time?" msgstr "" -#: editor_regions.cc:120 editor_routes.cc:207 gain_meter.cc:759 -#: mixer_strip.cc:1931 meter_strip.cc:320 panner_ui.cc:554 +#: editor_regions.cc:120 editor_routes.cc:207 gain_meter.cc:762 +#: mixer_strip.cc:1931 meter_strip.cc:320 panner_ui.cc:553 #: stereo_panner.cc:237 msgid "M" msgstr "В" @@ -5398,8 +5391,7 @@ msgstr "Удалить неиспользуемые области" msgid "Mult." msgstr "" -#: editor_regions.cc:847 engine_dialog.cc:84 midi_list_editor.cc:103 -#: time_info_box.cc:91 +#: editor_regions.cc:847 midi_list_editor.cc:103 time_info_box.cc:91 msgid "Start" msgstr "Начало" @@ -5465,7 +5457,7 @@ msgstr "..." msgid "SI" msgstr "" -#: editor_routes.cc:209 mixer_strip.cc:353 rc_option_editor.cc:1880 +#: editor_routes.cc:209 mixer_strip.cc:353 rc_option_editor.cc:1876 msgid "Solo Isolated" msgstr "Изолирование соло" @@ -5680,248 +5672,217 @@ msgstr "смена высоты тона" msgid "timefx cannot be started - thread creation error" msgstr "" -#: engine_dialog.cc:75 -msgid "Realtime" -msgstr "" - -#: engine_dialog.cc:76 -msgid "Do not lock memory" -msgstr "Не блокировать память" - -#: engine_dialog.cc:77 -msgid "Unlock memory" -msgstr "Разблокировать память" - -#: engine_dialog.cc:78 -msgid "No zombies" -msgstr "Без зомби" - #: engine_dialog.cc:79 -msgid "Provide monitor ports" -msgstr "Предоставить порты мониторинга" +msgid "Device Control Panel" +msgstr "Панель управления устройством" -#: engine_dialog.cc:80 -msgid "Force 16 bit" -msgstr "Принудительно 16 разрядов" +#: engine_dialog.cc:80 engine_dialog.cc:1703 +msgid "Measure" +msgstr "" #: engine_dialog.cc:81 -msgid "H/W monitoring" -msgstr "Аппаратный мониторинг" +msgid "Use results" +msgstr "Использовать результаты" #: engine_dialog.cc:82 -msgid "H/W metering" -msgstr "Аппаратный замер" +msgid "Back to settings ... (ignore results)" +msgstr "" #: engine_dialog.cc:83 -msgid "Verbose output" -msgstr "Подробный вывод" - -#: engine_dialog.cc:103 -msgid "8000Hz" -msgstr "8000 Гц" +msgid "Calibrate..." +msgstr "Откалибровать..." -#: engine_dialog.cc:104 -msgid "22050Hz" -msgstr "22,05 КГц" - -#: engine_dialog.cc:105 -msgid "44100Hz" -msgstr "44,1 КГц" - -#: engine_dialog.cc:106 -msgid "48000Hz" -msgstr "48 КГц" +#: engine_dialog.cc:87 +msgid "Refresh list" +msgstr "Обновить список" #: engine_dialog.cc:107 -msgid "88200Hz" -msgstr "88,2 КГц" - -#: engine_dialog.cc:108 -msgid "96000Hz" -msgstr "96 КГц" - -#: engine_dialog.cc:109 -msgid "192000Hz" -msgstr "192КГц" - -#: engine_dialog.cc:127 engine_dialog.cc:132 engine_dialog.cc:169 -#: engine_dialog.cc:562 midi_channel_selector.cc:163 -#: midi_channel_selector.cc:402 midi_channel_selector.cc:438 -#: rc_option_editor.cc:1250 sfdb_ui.cc:538 -msgid "None" -msgstr "Нет" - -#: engine_dialog.cc:128 engine_dialog.cc:563 -msgid "Triangular" -msgstr "Треугольное" +msgid "" +"No audio/MIDI backends detected. %1 cannot run\n" +"\n" +"(This is a build/packaging/system error. It should never happen.)" +msgstr "" -#: engine_dialog.cc:129 engine_dialog.cc:565 -msgid "Rectangular" -msgstr "Прямоугольное" +#: engine_dialog.cc:136 +msgid "Latency Measurement Tool" +msgstr "Тестирование задержки отклика" -#: engine_dialog.cc:130 engine_dialog.cc:567 -msgid "Shaped" -msgstr "По очертаниям" +#: engine_dialog.cc:151 +msgid "" +"Turn down the volume on your audio equipment to a very " +"low level." +msgstr "" +"Уберите громкость выхода звуковой карты до минимума." -#: engine_dialog.cc:158 engine_dialog.cc:483 engine_dialog.cc:974 -msgid "Playback/recording on 1 device" -msgstr "Воспроизведение и запись на 1 устройстве" +#: engine_dialog.cc:159 +msgid "Select two channels below and connect them using a cable." +msgstr "Выберите нижк два канала и соедините их кабелем." -#: engine_dialog.cc:159 engine_dialog.cc:487 engine_dialog.cc:540 -#: engine_dialog.cc:977 -msgid "Playback/recording on 2 devices" -msgstr "Воспроизведение и запись на 2 устройствах" +#: engine_dialog.cc:164 +msgid "Output channel" +msgstr "Канал выхода" -#: engine_dialog.cc:160 engine_dialog.cc:503 engine_dialog.cc:980 -msgid "Playback only" -msgstr "Только воспроизведение" +#: engine_dialog.cc:172 +msgid "Input channel" +msgstr "Канал входа" -#: engine_dialog.cc:161 engine_dialog.cc:505 engine_dialog.cc:983 -msgid "Recording only" -msgstr "Только запись" +#: engine_dialog.cc:209 +msgid "Once the channels are connected, click the \"Measure\" button." +msgstr "Соединив каналы, нажмите кнопку «Измерить задержку»." -#: engine_dialog.cc:171 engine_dialog.cc:448 -msgid "coremidi" +#: engine_dialog.cc:216 +msgid "When satisfied with the results, click the \"Use results\" button." msgstr "" +"Если результат вас устраивает, нажмите кнопку «Использовать результаты»." -#: engine_dialog.cc:173 engine_dialog.cc:581 -msgid "seq" -msgstr "" +#: engine_dialog.cc:231 engine_dialog.cc:1705 +msgid "No measurement results yet" +msgstr "Пока нет результатов измерения" -#: engine_dialog.cc:174 engine_dialog.cc:583 -msgid "raw" -msgstr "" +#: engine_dialog.cc:240 route_params_ui.cc:105 +msgid "Latency" +msgstr "Задержка отклика" + +#: engine_dialog.cc:335 +msgid "Audio System:" +msgstr "Звуковая подсистема:" -#: engine_dialog.cc:181 +#: engine_dialog.cc:376 msgid "Driver:" msgstr "Драйвер:" -#: engine_dialog.cc:186 -msgid "Audio Interface:" -msgstr "Звуковой интерфейс:" +#: engine_dialog.cc:382 +msgid "Device:" +msgstr "Устройство:" -#: engine_dialog.cc:191 sfdb_ui.cc:147 sfdb_ui.cc:260 sfdb_ui.cc:265 +#: engine_dialog.cc:387 engine_dialog.cc:477 sfdb_ui.cc:147 sfdb_ui.cc:260 +#: sfdb_ui.cc:265 msgid "Sample rate:" msgstr "Частота сэмплирования:" -#: engine_dialog.cc:196 +#: engine_dialog.cc:393 engine_dialog.cc:484 msgid "Buffer size:" msgstr "Размер буфера:" -#: engine_dialog.cc:202 -msgid "Number of buffers:" -msgstr "Число буферов:" +#: engine_dialog.cc:406 +msgid "Input Channels:" +msgstr "Каналов входа:" -#: engine_dialog.cc:209 -msgid "Approximate latency:" -msgstr "Примерная задержка:" +#: engine_dialog.cc:417 +msgid "Output Channels:" +msgstr "Каналов выхода:" -#: engine_dialog.cc:222 -msgid "Audio mode:" -msgstr "Звуковой режим:" +#: engine_dialog.cc:428 +msgid "Hardware input latency:" +msgstr "Задержка аппаратных входов:" -#: engine_dialog.cc:284 engine_dialog.cc:408 -msgid "Ignore" -msgstr "Игнорировать" +#: engine_dialog.cc:431 engine_dialog.cc:444 +msgid "samples" +msgstr "сэмплов" -#: engine_dialog.cc:292 -msgid "Client timeout" -msgstr "Ошибка времени ожидания клиента" +#: engine_dialog.cc:441 +msgid "Hardware output latency:" +msgstr "Задержка аппаратных выходов:" -#: engine_dialog.cc:299 -msgid "Number of ports:" -msgstr "Число портов:" +#: engine_dialog.cc:452 +msgid "MIDI System" +msgstr "Подсистема MIDI" -#: engine_dialog.cc:304 -msgid "MIDI driver:" -msgstr "Драйвер MIDI:" +#: engine_dialog.cc:469 +msgid "" +"The %1 audio backend was configured and started externally.\n" +"This limits your control over it." +msgstr "" +"Звуковая подсистема %1 была настроена и запущена извне.\n" +"Вы не сможете полностью контролировать её." -#: engine_dialog.cc:310 -msgid "Dither:" -msgstr "Подмешивание шума:" +#: engine_dialog.cc:577 +msgid "MIDI Inputs" +msgstr "MIDI-входы" -#: engine_dialog.cc:319 -msgid "" -"No JACK server found anywhere on this system. Please install JACK and restart" -msgstr "Сервер JACK в системе не обнаружен. Установить его и попробуйте снова." +#: engine_dialog.cc:594 +msgid "MIDI Outputs" +msgstr "MIDI-выходы" -#: engine_dialog.cc:327 -msgid "Server:" -msgstr "Сервер:" +#: engine_dialog.cc:678 +msgid "all available channels" +msgstr "все доступные каналы" -#: engine_dialog.cc:339 -msgid "Input device:" -msgstr "Устройство входа:" +#: engine_dialog.cc:872 +#, c-format +msgid "%u samples" +msgstr "%u сэмплов" -#: engine_dialog.cc:343 -msgid "Output device:" -msgstr "Устройство выхода:" +#: engine_dialog.cc:923 +#, c-format +msgid "(%.1f msecs)" +msgstr "(%.1f мс)" -#: engine_dialog.cc:348 -msgid "Hardware input latency:" -msgstr "Задержка аппаратных входов:" +#: engine_dialog.cc:1369 +msgid "Cannot set driver to %1" +msgstr "Невозможно использовать %1 в качестве драйвера." -#: engine_dialog.cc:351 engine_dialog.cc:357 -msgid "samples" -msgstr "сэмплов" +#: engine_dialog.cc:1373 +msgid "Cannot set device name to %1" +msgstr "Невозможно %1 в имени устройства." -#: engine_dialog.cc:354 -msgid "Hardware output latency:" -msgstr "Задержка аппаратных выходов:" +#: engine_dialog.cc:1377 +msgid "Cannot set sample rate to %1" +msgstr "Невозможно использовать %1 в частоты сэмплирования." -#: engine_dialog.cc:368 -msgid "Device" -msgstr "Устройство" +#: engine_dialog.cc:1381 +msgid "Cannot set buffer size to %1" +msgstr "Невозможно использовать %1 в размера буфера." -#: engine_dialog.cc:370 -msgid "Advanced" -msgstr "Дополнительно" +#: engine_dialog.cc:1387 +msgid "Cannot set input channels to %1" +msgstr "" -#: engine_dialog.cc:653 -msgid "cannot open JACK rc file %1 to store parameters" +#: engine_dialog.cc:1391 +msgid "Cannot set output channels to %1" msgstr "" -#: engine_dialog.cc:787 -msgid "" -"You do not have any audio devices capable of\n" -"simultaneous playback and recording.\n" -"\n" -"Please use Applications -> Utilities -> Audio MIDI Setup\n" -"to create an \"aggregrate\" device, or install a suitable\n" -"audio interface.\n" -"\n" -"Please send email to Apple and ask them why new Macs\n" -"have no duplex audio device.\n" -"\n" -"Alternatively, if you really want just playback\n" -"or recording but not both, start JACK before running\n" -"%1 and choose the relevant device then." +#: engine_dialog.cc:1397 +msgid "Cannot set input latency to %1" msgstr "" -#: engine_dialog.cc:800 -msgid "No suitable audio devices" -msgstr "Нет подходящих звуковых устройств" +#: engine_dialog.cc:1401 +msgid "Cannot set output latency to %1" +msgstr "" -#: engine_dialog.cc:1017 -msgid "JACK appears to be missing from the %1 bundle" -msgstr "JACK отсутствует в поставке %1" +#: engine_dialog.cc:1632 +msgid "No signal detected " +msgstr "Сигнал не обнаружен" -#: engine_dialog.cc:1087 -msgid "You need to choose an audio device first." -msgstr "Для начала нужно выбрать звуковое устройство." +#: engine_dialog.cc:1645 port_insert_ui.cc:71 port_insert_ui.cc:99 +msgid "Disconnected from audio engine" +msgstr "Выполнено отсоединение от звукового движка" -#: engine_dialog.cc:1104 -msgid "Audio device \"%1\" not known on this computer." -msgstr "Звуковое устройство \"%1\" в этом компьютере не обнаружено." +#: engine_dialog.cc:1659 +msgid "(signal detection error)" +msgstr "(ошибка обнаружения сигнала)" -#: engine_dialog.cc:1256 -msgid "AudioSetup value for %1 is missing data" -msgstr "Значению AudioSetup для %1 не хватает данных" +#: engine_dialog.cc:1665 +msgid "(inverted - bad wiring)" +msgstr "" -#: engine_dialog.cc:1335 -msgid "configuration files contain a JACK server path that doesn't exist (%1)" +#: engine_dialog.cc:1675 +msgid "Detected roundtrip latency: %1" msgstr "" +#: engine_dialog.cc:1687 port_insert_ui.cc:135 +msgid "Detecting ..." +msgstr "Выполняется определение..." + +#: engine_dialog.cc:1767 +msgid "Disconnect from %1" +msgstr "Отсоединить от %1" + +#: engine_dialog.cc:1779 +msgid "Connect to %1" +msgstr "Соединить с %1" + #: export_channel_selector.cc:45 sfdb_ui.cc:145 msgid "Channels:" msgstr "Каналов:" @@ -6072,9 +6033,9 @@ msgid "Folder:" msgstr "Папка:" #: export_filename_selector.cc:37 session_import_dialog.cc:44 -#: transcode_video_dialog.cc:59 video_server_dialog.cc:45 -#: video_server_dialog.cc:47 export_video_dialog.cc:69 -#: export_video_dialog.cc:71 +#: transcode_video_dialog.cc:58 video_server_dialog.cc:45 +#: video_server_dialog.cc:47 export_video_dialog.cc:68 +#: export_video_dialog.cc:70 msgid "Browse" msgstr "Указать" @@ -6230,9 +6191,8 @@ msgid "Range" msgstr "Диапазон" #: sfdb_freesound_mootcher.cc:189 sfdb_freesound_mootcher.cc:324 -#, fuzzy msgid "curl error %1 (%2)" -msgstr "Ошибка в программе: %1 (%2)" +msgstr "Ошибка curl %1 (%2)" #: sfdb_freesound_mootcher.cc:266 msgid "getSoundResourceFile: There is no valid root in the xml file" @@ -6243,76 +6203,80 @@ msgid "getSoundResourceFile: root = %1, != response" msgstr "" #: sfdb_freesound_mootcher.cc:410 -#, fuzzy msgid "%1" -msgstr "%" +msgstr "%1" -#: gain_meter.cc:106 gain_meter.cc:357 gain_meter.cc:462 gain_meter.cc:856 +#: gain_meter.cc:105 gain_meter.cc:360 gain_meter.cc:465 gain_meter.cc:859 msgid "-inf" msgstr "-inf" -#: gain_meter.cc:112 gain_meter.cc:913 +#: gain_meter.cc:111 gain_meter.cc:916 msgid "Fader automation mode" msgstr "Режим автоматизации фейдера" -#: gain_meter.cc:113 gain_meter.cc:914 +#: gain_meter.cc:112 gain_meter.cc:917 msgid "Fader automation type" msgstr "Тип автоматизации фейдера" -#: gain_meter.cc:122 gain_meter.cc:795 panner_ui.cc:178 panner_ui.cc:590 +#: gain_meter.cc:121 gain_meter.cc:798 panner_ui.cc:177 panner_ui.cc:589 msgid "Abs" msgstr "Абс" -#: gain_meter.cc:762 mixer_strip.cc:1948 meter_strip.cc:337 panner_ui.cc:557 +#: gain_meter.cc:765 mixer_strip.cc:1948 meter_strip.cc:337 panner_ui.cc:556 #: route_time_axis.cc:2411 msgid "P" msgstr "P" -#: gain_meter.cc:765 panner_ui.cc:560 +#: gain_meter.cc:768 panner_ui.cc:559 msgid "T" msgstr "К" -#: gain_meter.cc:768 panner_ui.cc:563 +#: gain_meter.cc:771 panner_ui.cc:562 msgid "W" msgstr "З" -#: generic_pluginui.cc:83 +#: generic_pluginui.cc:81 msgid "Presets" msgstr "Профили" -#: generic_pluginui.cc:232 +#: generic_pluginui.cc:230 msgid "Switches" msgstr "Переключатели" -#: generic_pluginui.cc:242 generic_pluginui.cc:376 processor_box.cc:2212 +#: generic_pluginui.cc:240 generic_pluginui.cc:374 processor_box.cc:2251 msgid "Controls" msgstr "Управление" -#: generic_pluginui.cc:270 +#: generic_pluginui.cc:268 msgid "Plugin Editor: could not build control element for port %1" msgstr "Редактор модулей: невозможно создать управляющий элемент для порта %1" -#: generic_pluginui.cc:408 +#: generic_pluginui.cc:406 msgid "Meters" msgstr "Индикаторы уровня" -#: generic_pluginui.cc:423 +#: generic_pluginui.cc:421 msgid "Automation control" msgstr "Контроль автоматизации" -#: generic_pluginui.cc:430 +#: generic_pluginui.cc:428 msgid "Mgnual" msgstr "" -#: global_port_matrix.cc:164 +#: global_port_matrix.cc:157 msgid "Audio Connection Manager" msgstr "Управление звуковыми соединениями" -#: global_port_matrix.cc:167 +#: global_port_matrix.cc:160 msgid "MIDI Connection Manager" msgstr "Управление MIDI-соединениями" -#: global_port_matrix.cc:213 io_selector.cc:216 +#: global_port_matrix.cc:200 io_selector.cc:210 mixer_strip.cc:719 +#: mixer_strip.cc:845 +msgid "Disconnect" +msgstr "Отсоединить" + +#: global_port_matrix.cc:206 io_selector.cc:216 msgid "port" msgstr "порт" @@ -6505,19 +6469,19 @@ msgstr "Выберите действие и нажмите комбинацию msgid "Main_menu" msgstr "" -#: keyeditor.cc:255 +#: keyeditor.cc:253 msgid "redirectmenu" msgstr "" -#: keyeditor.cc:257 +#: keyeditor.cc:255 msgid "Editor_menus" msgstr "" -#: keyeditor.cc:259 +#: keyeditor.cc:257 msgid "RegionList" msgstr "" -#: keyeditor.cc:261 +#: keyeditor.cc:259 msgid "ProcessorMenu" msgstr "" @@ -6540,7 +6504,7 @@ msgstr[0] "%1 сэмпл" msgstr[1] "%1 сэмпла" msgstr[2] "%1 сэмплов" -#: latency_gui.cc:72 panner_ui.cc:392 +#: latency_gui.cc:72 panner_ui.cc:391 msgid "Reset" msgstr "Сбросить" @@ -6632,88 +6596,65 @@ msgstr "Диапазоны (включая диапазоны дорожек msgid "add range marker" msgstr "добавка маркера выделения" -#: main.cc:83 -msgid "%1 could not connect to JACK." -msgstr "%1 не удалось соединиться с сервером JACK." - -#: main.cc:87 -msgid "" -"There are several possible reasons:\n" -"\n" -"1) JACK is not running.\n" -"2) JACK is running as another user, perhaps root.\n" -"3) There is already another client called \"%1\".\n" -"\n" -"Please consider the possibilities, and perhaps (re)start JACK." -msgstr "" -"Существует несколько возможных причин:\n" -"\n" -"1) Сервер JACK не запущен.\n" -"2) Сервер JACK запущен с правами другого пользователя — возможно, root.\n" -"3) Уже существует клиент сервера JACK с именем \"%1\".\n" -"\n" -"Пожалуйста, проверьте все варианты; возможно потребуется (пере)запуск JACK." +#: main.cc:81 +msgid "%1 could not connect to the audio backend." +msgstr "%1 не удалось соединиться со звуковой подсистемой." -#: main.cc:203 main.cc:324 +#: main.cc:194 main.cc:315 msgid "cannot create user %3 folder %1 (%2)" msgstr "Не удалось создать пользовательскую папку %3: %1 (%2)" -#: main.cc:210 main.cc:331 +#: main.cc:201 main.cc:322 msgid "cannot open pango.rc file %1" msgstr "" -#: main.cc:235 main.cc:358 +#: main.cc:226 main.cc:349 msgid "Cannot find ArdourMono TrueType font" msgstr "" -#: main.cc:247 main.cc:364 +#: main.cc:238 main.cc:355 msgid "Cannot load ArdourMono TrueType font." msgstr "" -#: main.cc:312 +#: main.cc:303 msgid "" "No fontconfig file found on your system. Things may looked very odd or ugly" msgstr "" -#: main.cc:368 +#: main.cc:359 msgid "Failed to set fontconfig configuration." msgstr "" -#: main.cc:379 main.cc:395 -msgid "JACK exited" -msgstr "JACk завершил работу" +#: main.cc:370 main.cc:386 +msgid "The audio backend (%1) has failed, or terminated" +msgstr "" -#: main.cc:382 +#: main.cc:373 msgid "" -"JACK exited unexpectedly, and without notifying %1.\n" +"%2 exited unexpectedly, and without notifying %1.\n" "\n" -"This could be due to misconfiguration or to an error inside JACK.\n" +"This could be due to misconfiguration or to an error inside %2.\n" "\n" "Click OK to exit %1." msgstr "" -#: main.cc:397 -msgid "" -"JACK exited unexpectedly, and without notifying %1.\n" -"\n" -"This is probably due to an error inside JACK. You should restart JACK\n" -"and reconnect %1 to it, or exit %1 now. You cannot save your\n" -"session at this time, because we would lose your connection information.\n" +#: main.cc:387 +msgid "%2 exited unexpectedly, and without notifying %1." msgstr "" -#: main.cc:487 +#: main.cc:474 msgid " (built using " msgstr "" -#: main.cc:490 +#: main.cc:477 msgid " and GCC version " msgstr ", при помощи GCC версии " -#: main.cc:500 +#: main.cc:487 msgid "Copyright (C) 1999-2012 Paul Davis" msgstr "Авторские права © 1999-2012 Paul Davis" -#: main.cc:501 +#: main.cc:488 msgid "" "Some portions Copyright (C) Steve Harris, Ari Johnson, Brett Viren, Joel " "Baker, Robin Gareus" @@ -6721,31 +6662,31 @@ msgstr "" "Частичные авторские права © Steve Harris, Ari Johnson, Brett Viren, Joel " "Baker, Robin Gareus" -#: main.cc:503 +#: main.cc:490 msgid "%1 comes with ABSOLUTELY NO WARRANTY" msgstr "%1 распространяется БЕЗО ВСЯКИХ ГАРАНТИЙ" -#: main.cc:504 +#: main.cc:491 msgid "not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." msgstr "" -#: main.cc:505 +#: main.cc:492 msgid "This is free software, and you are welcome to redistribute it " msgstr "Это свободное программное обеспечение, Вы можете распространять его" -#: main.cc:506 +#: main.cc:493 msgid "under certain conditions; see the source for copying conditions." msgstr "на определённых условиях; подробнее об этом читайте в файле COPYING." -#: main.cc:513 +#: main.cc:500 msgid "could not initialize %1." msgstr "Не удалось инициализировать %1." -#: main.cc:522 +#: main.cc:509 msgid "Cannot xinstall SIGPIPE error handler" msgstr "" -#: main.cc:528 +#: main.cc:515 msgid "could not create %1 GUI" msgstr "не удалось создать графический интерфейс для %1" @@ -6762,6 +6703,11 @@ msgstr "" msgid "All" msgstr "Все" +#: midi_channel_selector.cc:163 midi_channel_selector.cc:402 +#: midi_channel_selector.cc:438 rc_option_editor.cc:1248 sfdb_ui.cc:538 +msgid "None" +msgstr "Нет" + #: midi_channel_selector.cc:167 midi_channel_selector.cc:407 #: midi_channel_selector.cc:443 msgid "Invert" @@ -7148,27 +7094,27 @@ msgstr "все" msgid "some" msgstr "не все" -#: midi_tracer.cc:43 +#: midi_tracer.cc:46 msgid "Line history: " msgstr "Запоминать строк:" -#: midi_tracer.cc:51 +#: midi_tracer.cc:54 msgid "Auto-Scroll" msgstr "Автопрокрутка" -#: midi_tracer.cc:52 +#: midi_tracer.cc:55 msgid "Decimal" msgstr "Десятичный" -#: midi_tracer.cc:53 rc_option_editor.cc:659 +#: midi_tracer.cc:56 rc_option_editor.cc:657 msgid "Enabled" msgstr "Включено" -#: midi_tracer.cc:54 +#: midi_tracer.cc:57 msgid "Delta times" msgstr "Разница во времени" -#: midi_tracer.cc:66 +#: midi_tracer.cc:70 msgid "Port:" msgstr "Порт:" @@ -7232,7 +7178,7 @@ msgstr "Выберите дополнительную папку:" msgid "Missing Plugins" msgstr "Отсутствующие модули" -#: missing_plugin_dialog.cc:33 transcode_video_dialog.cc:60 +#: missing_plugin_dialog.cc:33 transcode_video_dialog.cc:59 msgid "OK" msgstr "ОК" @@ -7309,7 +7255,7 @@ msgid "pre" msgstr "lj" #: mixer_strip.cc:95 mixer_strip.cc:123 mixer_strip.cc:354 mixer_strip.cc:1300 -#: rc_option_editor.cc:1881 +#: rc_option_editor.cc:1877 msgid "Comments" msgstr "Комментарии" @@ -7355,11 +7301,11 @@ msgstr "Изол" msgid "Mix group" msgstr "Группа микса" -#: mixer_strip.cc:351 rc_option_editor.cc:1878 +#: mixer_strip.cc:351 rc_option_editor.cc:1874 msgid "Phase Invert" msgstr "Инверсия фазы" -#: mixer_strip.cc:352 rc_option_editor.cc:1879 route_ui.cc:1218 +#: mixer_strip.cc:352 rc_option_editor.cc:1875 route_ui.cc:1218 msgid "Solo Safe" msgstr "Блокировка солирования" @@ -7367,7 +7313,7 @@ msgstr "Блокировка солирования" msgid "Group" msgstr "Группа" -#: mixer_strip.cc:356 rc_option_editor.cc:1882 +#: mixer_strip.cc:356 rc_option_editor.cc:1878 msgid "Meter Point" msgstr "Точка измерения" @@ -7385,9 +7331,11 @@ msgstr "" msgid "Snd" msgstr "Псл" -#: mixer_strip.cc:701 mixer_strip.cc:829 processor_box.cc:2154 -msgid "Not connected to JACK - no I/O changes are possible" -msgstr "Нет соединения с JACK, любые изменения входа-выхода невозможны" +#: mixer_strip.cc:701 mixer_strip.cc:829 processor_box.cc:2193 +msgid "Not connected to audio engine - no I/O changes are possible" +msgstr "" +"Нет соединения со звуковой подсистемой, любые изменения входа-выхода " +"невозможны." #: mixer_strip.cc:1096 msgid "INPUT to %1" @@ -7502,9 +7450,8 @@ msgid "D" msgstr "" #: mixer_strip.cc:1953 -#, fuzzy msgid "i" -msgstr "вх" +msgstr "" #: mixer_strip.cc:2128 msgid "Pre-fader" @@ -7515,19 +7462,16 @@ msgid "Post-fader" msgstr "После фейдера" #: mixer_strip.cc:2166 meter_strip.cc:728 -#, fuzzy msgid "Change all in Group to %1" -msgstr "Поменять все в группе на пиковое" +msgstr "Поменять все в группе на %1" #: mixer_strip.cc:2168 meter_strip.cc:730 -#, fuzzy msgid "Change all to %1" -msgstr "Поменять все на пиковое" +msgstr "Поменять все на %1" #: mixer_strip.cc:2170 meter_strip.cc:732 -#, fuzzy msgid "Change same track-type to %1" -msgstr "Поменять дорожки одного типа на пиковое" +msgstr "Поменять дорожки одного типа на %1" #: mixer_ui.cc:1189 msgid "track display list item for renamed strip not found!" @@ -7542,14 +7486,12 @@ msgid "Strips" msgstr "Каналы" #: meter_strip.cc:764 -#, fuzzy msgid "Variable height" -msgstr "Высота видеолинейки" +msgstr "Переменная высота" #: meter_strip.cc:765 -#, fuzzy msgid "Short" -msgstr "Короткое" +msgstr "" #: meter_strip.cc:766 msgid "Tall" @@ -7573,31 +7515,31 @@ msgstr "Среднеквадратичное + пиковое значение" #: meter_patterns.cc:87 msgid "IEC1/DIN" -msgstr "" +msgstr "IEC1/DIN" #: meter_patterns.cc:90 msgid "IEC1/Nordic" -msgstr "" +msgstr "IEC1/Nordic" #: meter_patterns.cc:93 msgid "IEC2/BBC" -msgstr "" +msgstr "IEC2/BBC" #: meter_patterns.cc:96 msgid "IEC2/EBU" -msgstr "" +msgstr "IEC2/EBU" #: meter_patterns.cc:99 msgid "K20" -msgstr "" +msgstr "K20" #: meter_patterns.cc:102 msgid "K14" -msgstr "" +msgstr "K14" #: meter_patterns.cc:105 msgid "VU" -msgstr "" +msgstr "VU" #: monitor_section.cc:62 msgid "SiP" @@ -7902,11 +7844,11 @@ msgstr "" #: opts.cc:63 msgid "" -" -c, --name Use a specific jack client name, default is " +" -c, --name Use a specific backend client name, default is " "ardour\n" msgstr "" -" -c, --jack-client-name имя Использовать другое имя клиента к JACK, " -"по умолчанию -- ardour\n" +" -c, --name <имя> Использовать другое имя клиента звуковой " +"подсистемы, по умолчанию -- ardour\n" #: opts.cc:64 msgid "" @@ -7979,7 +7921,7 @@ msgstr "" msgid "Panner (2D)" msgstr "Панорамирование (2D)" -#: panner2d.cc:783 panner_ui.cc:384 plugin_ui.cc:451 +#: panner2d.cc:783 panner_ui.cc:383 plugin_ui.cc:448 msgid "Bypass" msgstr "Обход" @@ -7987,15 +7929,15 @@ msgstr "Обход" msgid "Panner" msgstr "Панорамирование" -#: panner_ui.cc:71 +#: panner_ui.cc:70 msgid "Pan automation mode" msgstr "Режим автоматизации панорамы" -#: panner_ui.cc:72 +#: panner_ui.cc:71 msgid "Pan automation type" msgstr "Тип автоматизации панорамы" -#: panner_ui.cc:295 +#: panner_ui.cc:294 msgid "" "No panner user interface is currently available for %1-in/2out tracks/busses" msgstr "" @@ -8148,65 +8090,65 @@ msgstr "По создателю" msgid "By Category" msgstr "По категории" -#: plugin_ui.cc:116 +#: plugin_ui.cc:114 msgid "Eh? LADSPA plugins don't have editors!" msgstr "Что? У эффектов LADSPA нет своих редакторов!" -#: plugin_ui.cc:125 plugin_ui.cc:227 +#: plugin_ui.cc:123 plugin_ui.cc:226 msgid "" "unknown type of editor-supplying plugin (note: no VST support in this " "version of %1)" msgstr "" -#: plugin_ui.cc:128 +#: plugin_ui.cc:126 msgid "unknown type of editor-supplying plugin" msgstr "" -#: plugin_ui.cc:257 +#: plugin_ui.cc:256 msgid "" "unknown type of editor-supplying plugin (note: no linuxVST support in this " "version of %1)" msgstr "" -#: plugin_ui.cc:329 +#: plugin_ui.cc:328 msgid "create_lv2_editor called on non-LV2 plugin" msgstr "" -#: plugin_ui.cc:417 +#: plugin_ui.cc:414 msgid "Add" msgstr "Добавить" -#: plugin_ui.cc:421 +#: plugin_ui.cc:418 msgid "Description" msgstr "Описание" -#: plugin_ui.cc:422 +#: plugin_ui.cc:419 msgid "Plugin analysis" msgstr "Частотный анализ модуля" -#: plugin_ui.cc:429 +#: plugin_ui.cc:426 msgid "" "Presets (if any) for this plugin\n" "(Both factory and user-created)" msgstr "Все доступные профили этого модуля,как «заводские», так и собственные" -#: plugin_ui.cc:430 +#: plugin_ui.cc:427 msgid "Save a new preset" msgstr "Сохранить новый профиль" -#: plugin_ui.cc:431 +#: plugin_ui.cc:428 msgid "Save the current preset" msgstr "Сохранить текущий профиль" -#: plugin_ui.cc:432 +#: plugin_ui.cc:429 msgid "Delete the current preset" msgstr "Удалить текущий профиль" -#: plugin_ui.cc:433 +#: plugin_ui.cc:430 msgid "Disable signal processing by the plugin" msgstr "Выключить обработку сигнала этим модулем" -#: plugin_ui.cc:466 plugin_ui.cc:662 +#: plugin_ui.cc:463 plugin_ui.cc:659 msgid "" "Click to allow the plugin to receive keyboard events that %1 would normally " "use as a shortcut" @@ -8214,71 +8156,71 @@ msgstr "" "Щёлкните, чтобы разрешить этому модулю получать клавиатурные события, " "которые %1 обычно использует как горячие клавиши" -#: plugin_ui.cc:467 +#: plugin_ui.cc:464 msgid "Click to enable/disable this plugin" msgstr "Щелкните, чтобы включить или отключить этот модуль" -#: plugin_ui.cc:506 +#: plugin_ui.cc:503 msgid "latency (%1 sample)" msgid_plural "latency (%1 samples)" msgstr[0] "Задержка (%1 сэмпл)" msgstr[1] "Задержка (%1 сэмпла)" msgstr[2] "Задержка (%1 сэмплов)" -#: plugin_ui.cc:508 +#: plugin_ui.cc:505 msgid "latency (%1 ms)" msgstr "Задержка (%1 мс)" -#: plugin_ui.cc:519 +#: plugin_ui.cc:516 msgid "Edit Latency" msgstr "Изменить задержку" -#: plugin_ui.cc:558 +#: plugin_ui.cc:555 msgid "Plugin preset %1 not found" msgstr "Предустановка модуля %1 не обнаружена" -#: plugin_ui.cc:595 +#: plugin_ui.cc:592 msgid "" "Plugin presets are not supported in this build of %1. Consider paying for a " "full version" msgstr "" -#: plugin_ui.cc:615 plugin_ui.cc:630 +#: plugin_ui.cc:612 plugin_ui.cc:627 msgid "" "Plugin presets are not supported in this build of %1. Consider paying for a " "newer version" msgstr "" -#: plugin_ui.cc:669 +#: plugin_ui.cc:666 msgid "Click to allow normal use of %1 keyboard shortcuts" msgstr "" "Щёлкните, чтобы переключиться на обычное использование горячих клавиш %1" -#: port_group.cc:335 +#: port_group.cc:337 msgid "%1 Busses" msgstr "Шины %1" -#: port_group.cc:336 +#: port_group.cc:338 msgid "%1 Tracks" msgstr "Дорожки %1" -#: port_group.cc:337 +#: port_group.cc:339 msgid "Hardware" msgstr "Аппаратное обеспечение" -#: port_group.cc:338 +#: port_group.cc:340 msgid "%1 Misc" msgstr "Прочее" -#: port_group.cc:339 +#: port_group.cc:341 msgid "Other" msgstr "Прочее" -#: port_group.cc:430 port_group.cc:431 +#: port_group.cc:432 port_group.cc:433 msgid "LTC Out" msgstr "LTC Out" -#: port_group.cc:434 port_group.cc:435 +#: port_group.cc:436 port_group.cc:437 msgid "LTC In" msgstr "LTC In" @@ -8314,15 +8256,15 @@ msgstr "MIDI clock out" msgid "MMC out" msgstr "MMC out" -#: port_group.cc:540 +#: port_group.cc:532 msgid ":monitor" msgstr "" -#: port_group.cc:552 +#: port_group.cc:544 msgid "system:" msgstr "" -#: port_group.cc:553 +#: port_group.cc:545 msgid "alsa_pcm" msgstr "alsa_pcm" @@ -8338,18 +8280,10 @@ msgstr "Посыл/Выход" msgid "Return/Input" msgstr "Возврат/Вход" -#: port_insert_ui.cc:71 port_insert_ui.cc:99 -msgid "Disconnected from audio engine" -msgstr "Выполнено отсоединение от звукового движка" - #: port_insert_ui.cc:86 msgid "No signal detected" msgstr "" -#: port_insert_ui.cc:135 -msgid "Detecting ..." -msgstr "Выполняется определение..." - #: port_insert_ui.cc:166 msgid "Port Insert " msgstr "Вставка порта" @@ -8468,7 +8402,7 @@ msgstr "Скрыть все регуляторы" msgid "on" msgstr "Вкл" -#: processor_box.cc:465 rc_option_editor.cc:1911 rc_option_editor.cc:1925 +#: processor_box.cc:465 rc_option_editor.cc:1907 rc_option_editor.cc:1921 msgid "off" msgstr "Выкл" @@ -8480,7 +8414,7 @@ msgstr "" "Щелчком правой клавишей мыши можно добавлять, \n" "изменять и удалять модули, посылы, возвраты и прочее." -#: processor_box.cc:1197 processor_box.cc:1591 +#: processor_box.cc:1197 processor_box.cc:1618 msgid "Plugin Incompatibility" msgstr "Несовместимость модулей" @@ -8544,7 +8478,7 @@ msgstr "" msgid "Cannot set up new send: %1" msgstr "Невозможно настроить новый посыл: %1" -#: processor_box.cc:1594 +#: processor_box.cc:1621 msgid "" "You cannot reorder these plugins/sends/inserts\n" "in that way because the inputs and\n" @@ -8554,19 +8488,19 @@ msgstr "" "посылы и возвраты подобным образом, поскольку \n" "входы и выходы перестанут корректно работать." -#: processor_box.cc:1778 +#: processor_box.cc:1805 msgid "Rename Processor" msgstr "Переименовать обработчик" -#: processor_box.cc:1809 +#: processor_box.cc:1836 msgid "At least 100 IO objects exist with a name like %1 - name not changed" msgstr "" -#: processor_box.cc:1943 +#: processor_box.cc:1970 msgid "plugin insert constructor failed" msgstr "" -#: processor_box.cc:1954 +#: processor_box.cc:1981 msgid "" "Copying the set of processors on the clipboard failed,\n" "probably because the I/O configuration of the plugins\n" @@ -8576,7 +8510,7 @@ msgstr "" "буфер обмена. Вероятно, конфигурация входа и выхода\n" "модулей не совпала с конфигурацией этой дорожки." -#: processor_box.cc:2000 +#: processor_box.cc:2027 msgid "" "Do you really want to remove all processors from %1?\n" "(this cannot be undone)" @@ -8585,15 +8519,15 @@ msgstr "" "обработчики из \"%1\" ?\n" "(отмена невозможна)" -#: processor_box.cc:2004 processor_box.cc:2029 +#: processor_box.cc:2031 processor_box.cc:2056 msgid "Yes, remove them all" msgstr "Да, удалить их все" -#: processor_box.cc:2006 processor_box.cc:2031 +#: processor_box.cc:2033 processor_box.cc:2058 msgid "Remove processors" msgstr "Удалить обработчики" -#: processor_box.cc:2021 +#: processor_box.cc:2048 msgid "" "Do you really want to remove all pre-fader processors from %1?\n" "(this cannot be undone)" @@ -8602,7 +8536,7 @@ msgstr "" "предфейдерные обработчики из \"%1\" ?\n" "(отмена невозможна)" -#: processor_box.cc:2024 +#: processor_box.cc:2051 msgid "" "Do you really want to remove all post-fader processors from %1?\n" "(this cannot be undone)" @@ -8611,54 +8545,58 @@ msgstr "" "послефейдерные обработчики из \"%1\" ?\n" "(отмена невозможна)" -#: processor_box.cc:2200 +#: processor_box.cc:2239 msgid "New Plugin" msgstr "Добавить модуль" -#: processor_box.cc:2203 +#: processor_box.cc:2242 msgid "New Insert" msgstr "Добавить возврат" -#: processor_box.cc:2206 +#: processor_box.cc:2245 msgid "New External Send ..." msgstr "Добавить внешний посыл с портом JACK..." -#: processor_box.cc:2210 +#: processor_box.cc:2249 msgid "New Aux Send ..." msgstr "Добавить внешний посыл без порта JACK..." -#: processor_box.cc:2214 +#: processor_box.cc:2253 msgid "Clear (all)" msgstr "Очистить (всё)" -#: processor_box.cc:2216 +#: processor_box.cc:2255 msgid "Clear (pre-fader)" msgstr "Очистить (до фейдера)" -#: processor_box.cc:2218 +#: processor_box.cc:2257 msgid "Clear (post-fader)" msgstr "Очистить (после фейдера)" -#: processor_box.cc:2244 +#: processor_box.cc:2283 msgid "Activate All" msgstr "Активировать все" -#: processor_box.cc:2246 +#: processor_box.cc:2285 msgid "Deactivate All" msgstr "Деактивировать все" -#: processor_box.cc:2248 +#: processor_box.cc:2287 msgid "A/B Plugins" msgstr "Отключить все" -#: processor_box.cc:2257 +#: processor_box.cc:2296 msgid "Edit with generic controls..." msgstr "Изменить с интерфейсом хоста..." -#: processor_box.cc:2557 +#: processor_box.cc:2599 msgid "%1: %2 (by %3)" msgstr "%1: %2 (автор — %3)" +#: processor_box.cc:2601 +msgid "%2 (by %3)" +msgstr "" + #: patch_change_dialog.cc:51 msgid "Patch Change" msgstr "Смена программы" @@ -8707,122 +8645,122 @@ msgstr "Начало привязки ноты" msgid "Snap note end" msgstr "Конец привязки ноты" -#: rc_option_editor.cc:69 +#: rc_option_editor.cc:67 msgid "Click audio file:" msgstr "Файл щелчка доли:" -#: rc_option_editor.cc:72 rc_option_editor.cc:79 +#: rc_option_editor.cc:70 rc_option_editor.cc:77 msgid "Browse..." msgstr "Просмотр..." -#: rc_option_editor.cc:76 +#: rc_option_editor.cc:74 msgid "Click emphasis audio file:" msgstr "Файл щелчка сильной доли:" -#: rc_option_editor.cc:108 +#: rc_option_editor.cc:106 msgid "Choose Click" msgstr "Выберите щелчок метронома" -#: rc_option_editor.cc:128 +#: rc_option_editor.cc:126 msgid "Choose Click Emphasis" msgstr "Выберите акцентирующий щелчок метронома" -#: rc_option_editor.cc:160 +#: rc_option_editor.cc:158 msgid "Limit undo history to" msgstr "Ограничивать историю действий" -#: rc_option_editor.cc:161 +#: rc_option_editor.cc:159 msgid "Save undo history of" msgstr "Ограничивать сохранение истории действий" -#: rc_option_editor.cc:170 rc_option_editor.cc:177 +#: rc_option_editor.cc:168 rc_option_editor.cc:175 msgid "commands" msgstr "командами" -#: rc_option_editor.cc:315 +#: rc_option_editor.cc:313 msgid "Edit using:" msgstr "Редактировать с:" -#: rc_option_editor.cc:321 rc_option_editor.cc:347 rc_option_editor.cc:374 +#: rc_option_editor.cc:319 rc_option_editor.cc:345 rc_option_editor.cc:372 msgid "+ button" msgstr "+ клавиша" -#: rc_option_editor.cc:341 +#: rc_option_editor.cc:339 msgid "Delete using:" msgstr "Удалять с:" -#: rc_option_editor.cc:368 +#: rc_option_editor.cc:366 msgid "Insert note using:" msgstr "Вставлять ноты с:" -#: rc_option_editor.cc:395 +#: rc_option_editor.cc:393 msgid "Ignore snap using:" msgstr "Игнорировать прилипание с:" -#: rc_option_editor.cc:411 +#: rc_option_editor.cc:409 msgid "Keyboard layout:" msgstr "Раскладка клавиатуры:" -#: rc_option_editor.cc:534 +#: rc_option_editor.cc:532 msgid "Font scaling:" msgstr "Масштаб шрифта:" -#: rc_option_editor.cc:586 +#: rc_option_editor.cc:584 msgid "Playback (seconds of buffering):" msgstr "Воспроизведение (в секундах):" -#: rc_option_editor.cc:599 +#: rc_option_editor.cc:597 msgid "Recording (seconds of buffering):" msgstr "Запись (в секундах):" -#: rc_option_editor.cc:656 +#: rc_option_editor.cc:654 msgid "Control Surface Protocol" msgstr "Устройства управления" -#: rc_option_editor.cc:660 +#: rc_option_editor.cc:658 msgid "Feedback" msgstr "Отклик" -#: rc_option_editor.cc:665 +#: rc_option_editor.cc:663 msgid "Double-click on a name to edit settings for an enabled protocol" msgstr "" "Двойной щелчок по названию открывает редактор параметров включённого " "протокола" -#: rc_option_editor.cc:817 +#: rc_option_editor.cc:815 msgid "Show Video Export Info before export" msgstr "Показывать диалог с вводной информацией об экспорте видео" -#: rc_option_editor.cc:818 +#: rc_option_editor.cc:816 msgid "Show Video Server Startup Dialog" msgstr "Показывать диалог с параметрами видеосервера" -#: rc_option_editor.cc:819 +#: rc_option_editor.cc:817 msgid "Advanced Setup (remote video server)" msgstr "Дополнительные параметры (удалённого видеосервера)" -#: rc_option_editor.cc:827 +#: rc_option_editor.cc:825 msgid "" "When enabled you can speficify a custom video-server URL and docroot. " "- Do not enable this option unless you know what you are doing." msgstr "" -#: rc_option_editor.cc:829 +#: rc_option_editor.cc:827 msgid "Video Server URL:" msgstr "URL видеосервера:" -#: rc_option_editor.cc:834 +#: rc_option_editor.cc:832 msgid "" "Base URL of the video-server including http prefix. This is usually 'http://" "hostname.example.org:1554/' and defaults to 'http://localhost:1554/' when " "the video-server is running locally" msgstr "" -#: rc_option_editor.cc:836 +#: rc_option_editor.cc:834 msgid "Video Folder:" msgstr "Папка с видео:" -#: rc_option_editor.cc:841 +#: rc_option_editor.cc:839 msgid "" "Local path to the video-server document-root. Only files below this " "directory will be accessible by the video-server. If the server run on a " @@ -8831,7 +8769,7 @@ msgid "" "monitor and file-browsing when opening/adding a video file." msgstr "" -#: rc_option_editor.cc:848 +#: rc_option_editor.cc:846 msgid "" "When enabled an information window with details is displayed before " "the video-export dialog." @@ -8839,7 +8777,7 @@ msgstr "" "Если включено, перед экспортом видео показывается окно со справочной " "информацией" -#: rc_option_editor.cc:853 +#: rc_option_editor.cc:851 msgid "" "When enabled the video server is never launched automatically without " "confirmation" @@ -8847,101 +8785,101 @@ msgstr "" "Если включено, видеосервер никогда автоматически не запускается без " "подтверждения" -#: rc_option_editor.cc:993 +#: rc_option_editor.cc:991 msgid "%1 Preferences" msgstr "Параметры %1" -#: rc_option_editor.cc:1004 +#: rc_option_editor.cc:1002 msgid "DSP CPU Utilization" msgstr "Использование центрального процессора" -#: rc_option_editor.cc:1008 +#: rc_option_editor.cc:1006 msgid "Signal processing uses" msgstr "При обработке используются" -#: rc_option_editor.cc:1013 +#: rc_option_editor.cc:1011 msgid "all but one processor" msgstr "Все процессоры кроме одного" -#: rc_option_editor.cc:1014 +#: rc_option_editor.cc:1012 msgid "all available processors" msgstr "Все доступные процессоры" -#: rc_option_editor.cc:1017 +#: rc_option_editor.cc:1015 msgid "%1 processors" msgstr "%1 процессора" -#: rc_option_editor.cc:1020 +#: rc_option_editor.cc:1018 msgid "This setting will only take effect when %1 is restarted." msgstr "Это изменение вступит в силу при следующем запуске %1." -#: rc_option_editor.cc:1025 +#: rc_option_editor.cc:1023 msgid "Options|Undo" msgstr "История действий" -#: rc_option_editor.cc:1032 +#: rc_option_editor.cc:1030 msgid "Verify removal of last capture" msgstr "Проверять удаление последней записи" -#: rc_option_editor.cc:1040 +#: rc_option_editor.cc:1038 msgid "Make periodic backups of the session file" msgstr "Периодически создавать резервные копии файла сеанса" -#: rc_option_editor.cc:1045 +#: rc_option_editor.cc:1043 msgid "Session Management" msgstr "Управление сеансами" -#: rc_option_editor.cc:1050 +#: rc_option_editor.cc:1048 msgid "Always copy imported files" msgstr "Всегда копировать импортируемые файлы" -#: rc_option_editor.cc:1057 +#: rc_option_editor.cc:1055 msgid "Default folder for new sessions:" msgstr "Папка для новых сеансов по умолчанию:" -#: rc_option_editor.cc:1065 +#: rc_option_editor.cc:1063 msgid "Maximum number of recent sessions" msgstr "Максимальное число недавних сеансов" -#: rc_option_editor.cc:1078 +#: rc_option_editor.cc:1076 msgid "Click gain level" msgstr "Уровень щелчка метронома" -#: rc_option_editor.cc:1083 route_time_axis.cc:215 route_time_axis.cc:676 +#: rc_option_editor.cc:1081 route_time_axis.cc:215 route_time_axis.cc:676 msgid "Automation" msgstr "Автоматизация" -#: rc_option_editor.cc:1088 +#: rc_option_editor.cc:1086 msgid "Thinning factor (larger value => less data)" msgstr "" -#: rc_option_editor.cc:1097 +#: rc_option_editor.cc:1095 msgid "Automation sampling interval (milliseconds)" msgstr "Интервал сэмплирования для автоматизации (мс)" -#: rc_option_editor.cc:1109 +#: rc_option_editor.cc:1107 msgid "Keep record-enable engaged on stop" msgstr "Готовность к записи сохраняется после остановки" -#: rc_option_editor.cc:1118 +#: rc_option_editor.cc:1116 msgid "Stop recording when an xrun occurs" msgstr "Останавливать запись при рассинхронизации" -#: rc_option_editor.cc:1123 +#: rc_option_editor.cc:1121 msgid "" "When enabled %1 will stop recording if an over- or underrun is " "detected by the audio engine" msgstr "" -#: rc_option_editor.cc:1129 +#: rc_option_editor.cc:1127 msgid "Create markers where xruns occur" msgstr "Создавать маркеры в точках рассинхронизации" -#: rc_option_editor.cc:1138 +#: rc_option_editor.cc:1136 msgid "Stop at the end of the session" msgstr "Останавливаться в конце сеанса" -#: rc_option_editor.cc:1143 +#: rc_option_editor.cc:1141 msgid "" "When enabled if %1 is not recording, it will stop the " "transport when it reaches the current session end marker\n" @@ -8954,13 +8892,13 @@ msgstr "" "\n" "Если выключено, %1 будет воспроизводить дальше маркера конца сеанса." -#: rc_option_editor.cc:1151 -msgid "Do seamless looping (not possible when slaved to MTC, JACK etc)" +#: rc_option_editor.cc:1149 +msgid "Do seamless looping (not possible when slaved to MTC, LTC etc)" msgstr "" "Бесшовное циклическое воспроизведение (невозможно, когда Ardour ведом по " -"MTC, JACK и т.д.)" +"MTC, LTC и т.д.)" -#: rc_option_editor.cc:1156 +#: rc_option_editor.cc:1154 msgid "" "When enabled this will loop by reading ahead and wrapping around at " "the loop point, preventing any need to do a transport locate at the end of " @@ -8970,11 +8908,11 @@ msgid "" "loop when %1 reaches the end which will often cause a small click or delay" msgstr "" -#: rc_option_editor.cc:1164 +#: rc_option_editor.cc:1162 msgid "Disable per-track record disarm while rolling" msgstr "Сделать невозможным отключение готовности к записи при захвате" -#: rc_option_editor.cc:1168 +#: rc_option_editor.cc:1166 msgid "" "When enabled this will prevent you from accidentally stopping " "specific tracks recording during a take" @@ -8982,11 +8920,11 @@ msgstr "" "Если включено, вы не сможете нечаянно выключить готовность к записи " "во время захвата сигнала" -#: rc_option_editor.cc:1173 +#: rc_option_editor.cc:1171 msgid "12dB gain reduction during fast-forward and fast-rewind" msgstr "Приглушение громкости на 12Дб при перемотке" -#: rc_option_editor.cc:1177 +#: rc_option_editor.cc:1175 msgid "" "This will reduce the unpleasant increase in perceived volume that occurs " "when fast-forwarding or rewinding through some kinds of audio" @@ -8994,19 +8932,19 @@ msgstr "" "При перемотке воспринимаемое на слух резкое увеличение громкости будет " "нивелировано" -#: rc_option_editor.cc:1181 +#: rc_option_editor.cc:1179 msgid "Sync/Slave" msgstr "Синхронизация и ведомый режим" -#: rc_option_editor.cc:1185 +#: rc_option_editor.cc:1183 msgid "External timecode source" msgstr "Внешний источник синхросигнала" -#: rc_option_editor.cc:1195 +#: rc_option_editor.cc:1193 msgid "Match session video frame rate to external timecode" msgstr "Адаптировать частоту кадров видео в сеансе к внешнему тайм-коду" -#: rc_option_editor.cc:1201 +#: rc_option_editor.cc:1199 msgid "" "This option controls the value of the video frame rate while chasing " "an external timecode source.\n" @@ -9029,21 +8967,21 @@ msgstr "" "этого индикатор частоты кадров в основном счётчике будет мерцать красным, а " "%1 будет конвертировать внешний тайм-код в тайм-код сеанса." -#: rc_option_editor.cc:1211 +#: rc_option_editor.cc:1209 msgid "External timecode is sync locked" msgstr "Внешний источник синхросигнала заблокировн" -#: rc_option_editor.cc:1217 +#: rc_option_editor.cc:1215 msgid "" "When enabled indicates that the selected external timecode source " "shares sync (Black & Burst, Wordclock, etc) with the audio interface." msgstr "" -#: rc_option_editor.cc:1224 +#: rc_option_editor.cc:1222 msgid "Lock to 29.9700 fps instead of 30000/1001" msgstr "Принудительно использовать 29,9700 к/с вместо 30000/1001" -#: rc_option_editor.cc:1230 +#: rc_option_editor.cc:1228 msgid "" "When enabled the external timecode source is assumed to use 29.97 fps " "instead of 30000/1001.\n" @@ -9056,143 +8994,143 @@ msgid "" "variant of using exactly 29.97 fps has zero timecode drift.\n" msgstr "" -#: rc_option_editor.cc:1240 +#: rc_option_editor.cc:1238 msgid "LTC Reader" msgstr "Чтение LTC" -#: rc_option_editor.cc:1244 +#: rc_option_editor.cc:1242 msgid "LTC incoming port" msgstr "Входящий порт LTC" -#: rc_option_editor.cc:1257 +#: rc_option_editor.cc:1255 msgid "LTC Generator" msgstr "Генератор LTC" -#: rc_option_editor.cc:1262 +#: rc_option_editor.cc:1260 msgid "Enable LTC generator" msgstr "Включить генератор LTC" -#: rc_option_editor.cc:1269 +#: rc_option_editor.cc:1267 msgid "send LTC while stopped" msgstr "Посылать LTC во время остановки" -#: rc_option_editor.cc:1275 +#: rc_option_editor.cc:1273 msgid "" "When enabled %1 will continue to send LTC information even when the " "transport (playhead) is not moving" msgstr "" -#: rc_option_editor.cc:1281 +#: rc_option_editor.cc:1279 msgid "LTC generator level" msgstr "Уровень генератора LTC" -#: rc_option_editor.cc:1285 +#: rc_option_editor.cc:1283 msgid "" "Specify the Peak Volume of the generated LTC signal in dbFS. A good value " "is 0dBu ^= -18dbFS in an EBU calibrated system" msgstr "" -#: rc_option_editor.cc:1297 +#: rc_option_editor.cc:1295 msgid "Link selection of regions and tracks" msgstr "Связывать выделение областей и дорожек" -#: rc_option_editor.cc:1305 +#: rc_option_editor.cc:1303 msgid "Move relevant automation when audio regions are moved" msgstr "Перемещать автоматизацию вместе с областями" -#: rc_option_editor.cc:1313 +#: rc_option_editor.cc:1311 msgid "Show meters on tracks in the editor" msgstr "Показывать индикаторы громкости в дорожках" -#: rc_option_editor.cc:1321 +#: rc_option_editor.cc:1319 msgid "Display master-meter in the toolbar" -msgstr "" +msgstr "Показывать индикатор громкости мастер-шины в панели" -#: rc_option_editor.cc:1328 +#: rc_option_editor.cc:1326 msgid "Regions in active edit groups are edited together" msgstr "Области в активных редактируемых группах меняются вместе" -#: rc_option_editor.cc:1329 +#: rc_option_editor.cc:1327 msgid "whenever they overlap in time" msgstr "Когда пересекаются по времени" -#: rc_option_editor.cc:1330 +#: rc_option_editor.cc:1328 msgid "only if they have identical length, position and origin" msgstr "При одинаковой длительности, позиции и происхождении" -#: rc_option_editor.cc:1340 +#: rc_option_editor.cc:1338 msgid "Make rubberband selection rectangle snap to the grid" msgstr "Прямоугольное выделение прилипает к сетке" -#: rc_option_editor.cc:1348 +#: rc_option_editor.cc:1346 msgid "Show waveforms in regions" msgstr "Показывать форму волны в областях" -#: rc_option_editor.cc:1356 +#: rc_option_editor.cc:1354 msgid "Show gain envelopes in audio regions" msgstr "Показывать огибающие усиления" -#: rc_option_editor.cc:1357 +#: rc_option_editor.cc:1355 msgid "in all modes" msgstr "Во всех режимах" -#: rc_option_editor.cc:1358 +#: rc_option_editor.cc:1356 msgid "only in region gain mode" msgstr "Только в режиме правки огибающей" -#: rc_option_editor.cc:1365 +#: rc_option_editor.cc:1363 msgid "Waveform scale" msgstr "Масштаб сигнала" -#: rc_option_editor.cc:1370 +#: rc_option_editor.cc:1368 msgid "linear" msgstr "Линейный" -#: rc_option_editor.cc:1371 +#: rc_option_editor.cc:1369 msgid "logarithmic" msgstr "Логарифмический" -#: rc_option_editor.cc:1377 +#: rc_option_editor.cc:1375 msgid "Waveform shape" msgstr "Форма сигнала" -#: rc_option_editor.cc:1382 +#: rc_option_editor.cc:1380 msgid "traditional" msgstr "Обычная" -#: rc_option_editor.cc:1383 +#: rc_option_editor.cc:1381 msgid "rectified" msgstr "От низа" -#: rc_option_editor.cc:1390 +#: rc_option_editor.cc:1388 msgid "Show waveforms for audio while it is being recorded" msgstr "Показывать форму сигнала при записи" -#: rc_option_editor.cc:1398 +#: rc_option_editor.cc:1396 msgid "Show zoom toolbar" msgstr "Показывать панель для управления масштабом" -#: rc_option_editor.cc:1406 +#: rc_option_editor.cc:1404 msgid "Color regions using their track's color" msgstr "Раскрашивать области цветом дорожки" -#: rc_option_editor.cc:1414 +#: rc_option_editor.cc:1412 msgid "Update editor window during drags of the summary" msgstr "Обновлять окно редактора при изменениях в панели сводки" -#: rc_option_editor.cc:1422 +#: rc_option_editor.cc:1420 msgid "Synchronise editor and mixer track order" msgstr "Синхронизировать порядок дорожек в редакторе и микшере" -#: rc_option_editor.cc:1430 +#: rc_option_editor.cc:1428 msgid "Synchronise editor and mixer selection" msgstr "Синхронизировать выделение в редакторе и микшере" -#: rc_option_editor.cc:1437 +#: rc_option_editor.cc:1435 msgid "Name new markers" msgstr "Спрашивать об имени каждого нового маркера" -#: rc_option_editor.cc:1443 +#: rc_option_editor.cc:1441 msgid "" "If enabled, popup a dialog when a new marker is created to allow its name to " "be set as it is created.\n" @@ -9200,240 +9138,244 @@ msgid "" "You can always rename markers by right-clicking on them" msgstr "" -#: rc_option_editor.cc:1449 +#: rc_option_editor.cc:1447 msgid "Auto-scroll editor window when dragging near its edges" msgstr "" "Автоматически прокручивать окно редактора при перетаскивании близко к краям" -#: rc_option_editor.cc:1456 +#: rc_option_editor.cc:1454 msgid "Buffering" msgstr "Буферизация" -#: rc_option_editor.cc:1464 +#: rc_option_editor.cc:1462 msgid "Record monitoring handled by" msgstr "Мониторинг записи выполняет" -#: rc_option_editor.cc:1475 +#: rc_option_editor.cc:1468 +msgid "via Audio Driver" +msgstr "" + +#: rc_option_editor.cc:1471 msgid "ardour" msgstr "Ardour" -#: rc_option_editor.cc:1476 +#: rc_option_editor.cc:1472 msgid "audio hardware" msgstr "Аппаратное обеспечение" -#: rc_option_editor.cc:1483 +#: rc_option_editor.cc:1479 msgid "Tape machine mode" msgstr "Режим плёночного магнитофона" -#: rc_option_editor.cc:1488 +#: rc_option_editor.cc:1484 msgid "Connection of tracks and busses" msgstr "Соединение дорожек и шин" -#: rc_option_editor.cc:1493 +#: rc_option_editor.cc:1489 msgid "Auto-connect master/monitor busses" msgstr "Автоматически соединять шины master/monitor" -#: rc_option_editor.cc:1500 +#: rc_option_editor.cc:1496 msgid "Connect track inputs" msgstr "Соединять входы дорожек" -#: rc_option_editor.cc:1505 +#: rc_option_editor.cc:1501 msgid "automatically to physical inputs" msgstr "Автоматически с физическими входами" -#: rc_option_editor.cc:1506 rc_option_editor.cc:1519 +#: rc_option_editor.cc:1502 rc_option_editor.cc:1515 msgid "manually" msgstr "Вручную" -#: rc_option_editor.cc:1512 +#: rc_option_editor.cc:1508 msgid "Connect track and bus outputs" msgstr "Соединять выходы дорожек и шин" -#: rc_option_editor.cc:1517 +#: rc_option_editor.cc:1513 msgid "automatically to physical outputs" msgstr "Автоматически с физическими выходами" -#: rc_option_editor.cc:1518 +#: rc_option_editor.cc:1514 msgid "automatically to master bus" msgstr "Автоматически с общей шиной" -#: rc_option_editor.cc:1523 +#: rc_option_editor.cc:1519 msgid "Denormals" msgstr "Отклонения сигнала" -#: rc_option_editor.cc:1528 +#: rc_option_editor.cc:1524 msgid "Use DC bias to protect against denormals" msgstr "" -#: rc_option_editor.cc:1535 +#: rc_option_editor.cc:1531 msgid "Processor handling" -msgstr "" +msgstr "Что делать с обработчиками" -#: rc_option_editor.cc:1540 +#: rc_option_editor.cc:1536 msgid "no processor handling" -msgstr "" +msgstr "Ничего не делать" -#: rc_option_editor.cc:1545 +#: rc_option_editor.cc:1541 msgid "use FlushToZero" msgstr "Использовать FlushToZero" -#: rc_option_editor.cc:1549 +#: rc_option_editor.cc:1545 msgid "use DenormalsAreZero" msgstr "Использовать DenormalsAreZero" -#: rc_option_editor.cc:1553 +#: rc_option_editor.cc:1549 msgid "use FlushToZero and DenormalsAreZero" msgstr "Использовать FlushToZero и DenormalsAreZero" -#: rc_option_editor.cc:1563 +#: rc_option_editor.cc:1559 msgid "Silence plugins when the transport is stopped" msgstr "Приглушать модули при остановке транспорта" -#: rc_option_editor.cc:1571 +#: rc_option_editor.cc:1567 msgid "Make new plugins active" msgstr "Делать новые эффекты/инструменты активными" -#: rc_option_editor.cc:1579 +#: rc_option_editor.cc:1575 msgid "Enable automatic analysis of audio" msgstr "Включить автоматический анализ звука" -#: rc_option_editor.cc:1587 +#: rc_option_editor.cc:1583 msgid "Replicate missing region channels" msgstr "Воссоздавать отсутствующие каналы области" -#: rc_option_editor.cc:1594 rc_option_editor.cc:1609 rc_option_editor.cc:1621 -#: rc_option_editor.cc:1633 rc_option_editor.cc:1645 rc_option_editor.cc:1649 -#: rc_option_editor.cc:1657 rc_option_editor.cc:1665 rc_option_editor.cc:1673 -#: rc_option_editor.cc:1675 rc_option_editor.cc:1683 rc_option_editor.cc:1691 -#: rc_option_editor.cc:1699 +#: rc_option_editor.cc:1590 rc_option_editor.cc:1605 rc_option_editor.cc:1617 +#: rc_option_editor.cc:1629 rc_option_editor.cc:1641 rc_option_editor.cc:1645 +#: rc_option_editor.cc:1653 rc_option_editor.cc:1661 rc_option_editor.cc:1669 +#: rc_option_editor.cc:1671 rc_option_editor.cc:1679 rc_option_editor.cc:1687 +#: rc_option_editor.cc:1695 msgid "Solo / mute" msgstr "Соло/Приглушение" -#: rc_option_editor.cc:1597 +#: rc_option_editor.cc:1593 msgid "Solo-in-place mute cut (dB)" msgstr "Приглушение сигнала при солировании (dB)" -#: rc_option_editor.cc:1604 +#: rc_option_editor.cc:1600 msgid "Solo controls are Listen controls" msgstr "Управление солированием работает как управление прослушиванием" -#: rc_option_editor.cc:1613 +#: rc_option_editor.cc:1609 msgid "Listen Position" msgstr "Положение прослушивания" -#: rc_option_editor.cc:1618 +#: rc_option_editor.cc:1614 msgid "after-fader (AFL)" msgstr "После фейдера (AFL)" -#: rc_option_editor.cc:1619 +#: rc_option_editor.cc:1615 msgid "pre-fader (PFL)" msgstr "До фейдера (PFL)" -#: rc_option_editor.cc:1625 +#: rc_option_editor.cc:1621 msgid "PFL signals come from" msgstr "Источник сигнала PFL" -#: rc_option_editor.cc:1630 +#: rc_option_editor.cc:1626 msgid "before pre-fader processors" msgstr "До послефейдерных обработчиков" -#: rc_option_editor.cc:1631 +#: rc_option_editor.cc:1627 msgid "pre-fader but after pre-fader processors" msgstr "До фейдера, но после предфейдерных обработчиков" -#: rc_option_editor.cc:1637 +#: rc_option_editor.cc:1633 msgid "AFL signals come from" msgstr "Источник сигнала AFL" -#: rc_option_editor.cc:1642 +#: rc_option_editor.cc:1638 msgid "immediately post-fader" msgstr "Сразу после фейдера" -#: rc_option_editor.cc:1643 +#: rc_option_editor.cc:1639 msgid "after post-fader processors (before pan)" msgstr "За послефейдерными обработчиками и до панорамирования" -#: rc_option_editor.cc:1652 +#: rc_option_editor.cc:1648 msgid "Exclusive solo" msgstr "Эксклюзивное солирование" -#: rc_option_editor.cc:1660 +#: rc_option_editor.cc:1656 msgid "Show solo muting" msgstr "Показывать приглушение при солировании" -#: rc_option_editor.cc:1668 +#: rc_option_editor.cc:1664 msgid "Soloing overrides muting" msgstr "Солирование приоритетнее приглушения" -#: rc_option_editor.cc:1673 +#: rc_option_editor.cc:1669 msgid "Default track / bus muting options" msgstr "Приглушение дорожек и шин по умолчанию затрагивает" -#: rc_option_editor.cc:1678 +#: rc_option_editor.cc:1674 msgid "Mute affects pre-fader sends" msgstr "Предфейдерные посылы" -#: rc_option_editor.cc:1686 +#: rc_option_editor.cc:1682 msgid "Mute affects post-fader sends" msgstr "Послефейдерные посылы" -#: rc_option_editor.cc:1694 +#: rc_option_editor.cc:1690 msgid "Mute affects control outputs" msgstr "Выходы мониторинга" -#: rc_option_editor.cc:1702 +#: rc_option_editor.cc:1698 msgid "Mute affects main outputs" msgstr "Основные выходы" -#: rc_option_editor.cc:1718 +#: rc_option_editor.cc:1714 msgid "Send MIDI Time Code" msgstr "Передавать MIDI Time Code" -#: rc_option_editor.cc:1726 +#: rc_option_editor.cc:1722 msgid "Percentage either side of normal transport speed to transmit MTC" msgstr "" -#: rc_option_editor.cc:1735 +#: rc_option_editor.cc:1731 msgid "Obey MIDI Machine Control commands" msgstr "Выполнять команды MIDI Machine Control" -#: rc_option_editor.cc:1743 +#: rc_option_editor.cc:1739 msgid "Send MIDI Machine Control commands" msgstr "Отправлять команды MIDI Machine Control" -#: rc_option_editor.cc:1751 +#: rc_option_editor.cc:1747 msgid "Send MIDI control feedback" msgstr "Отправлять отклик на контрольные события MIDI" -#: rc_option_editor.cc:1759 +#: rc_option_editor.cc:1755 msgid "Inbound MMC device ID" msgstr "Идентификатор входящего устройства MMC" -#: rc_option_editor.cc:1768 +#: rc_option_editor.cc:1764 msgid "Outbound MMC device ID" -msgstr "" +msgstr "Идентификатор выходящего устройства MMC" -#: rc_option_editor.cc:1777 +#: rc_option_editor.cc:1773 msgid "Initial program change" msgstr "Исходная смена программы" -#: rc_option_editor.cc:1786 +#: rc_option_editor.cc:1782 msgid "Display first MIDI bank/program as 0" msgstr "Показывать первый банк/программу MIDI как 0" -#: rc_option_editor.cc:1794 +#: rc_option_editor.cc:1790 msgid "Never display periodic MIDI messages (MTC, MIDI Clock)" msgstr "Никогда не показывать периодические сообщения MIDI (MTC, MIDI Clock)" -#: rc_option_editor.cc:1802 +#: rc_option_editor.cc:1798 msgid "Sound MIDI notes as they are selected" msgstr "Воспроизводить ноты MIDI при их выделении" -#: rc_option_editor.cc:1810 rc_option_editor.cc:1820 rc_option_editor.cc:1822 +#: rc_option_editor.cc:1806 rc_option_editor.cc:1816 rc_option_editor.cc:1818 msgid "User interaction" msgstr "Взаимодействие с пользователем" -#: rc_option_editor.cc:1813 +#: rc_option_editor.cc:1809 msgid "" "Use translations of %1 messages\n" " (requires a restart of %1 to take effect)\n" @@ -9443,181 +9385,177 @@ msgstr "" " (вступает в силу после перезапуска %1)\n" " (если локализация для вашего языка доступна)" -#: rc_option_editor.cc:1820 +#: rc_option_editor.cc:1816 msgid "Keyboard" msgstr "Клавиатура" -#: rc_option_editor.cc:1830 +#: rc_option_editor.cc:1826 msgid "Control surface remote ID" msgstr "ID для удалённого управления" -#: rc_option_editor.cc:1835 +#: rc_option_editor.cc:1831 msgid "assigned by user" msgstr "Назначенные пользователем" -#: rc_option_editor.cc:1836 +#: rc_option_editor.cc:1832 msgid "follows order of mixer" msgstr "Следуют порядку микшера" -#: rc_option_editor.cc:1837 +#: rc_option_editor.cc:1833 msgid "follows order of editor" msgstr "Следуют порядку редактора" -#: rc_option_editor.cc:1846 rc_option_editor.cc:1854 rc_option_editor.cc:1864 -#: rc_option_editor.cc:1885 rc_option_editor.cc:1894 rc_option_editor.cc:1902 -#: rc_option_editor.cc:1916 rc_option_editor.cc:1935 rc_option_editor.cc:1951 -#: rc_option_editor.cc:1967 rc_option_editor.cc:1981 rc_option_editor.cc:1995 -#: rc_option_editor.cc:1997 +#: rc_option_editor.cc:1842 rc_option_editor.cc:1850 rc_option_editor.cc:1860 +#: rc_option_editor.cc:1881 rc_option_editor.cc:1890 rc_option_editor.cc:1898 +#: rc_option_editor.cc:1912 rc_option_editor.cc:1931 rc_option_editor.cc:1947 +#: rc_option_editor.cc:1963 rc_option_editor.cc:1977 rc_option_editor.cc:1991 +#: rc_option_editor.cc:1993 msgid "Preferences|GUI" msgstr "Интерфейс" -#: rc_option_editor.cc:1849 +#: rc_option_editor.cc:1845 msgid "Graphically indicate mouse pointer hovering over various widgets" msgstr "Подсвечивать элементы интерфейса под указателем мыши" -#: rc_option_editor.cc:1857 +#: rc_option_editor.cc:1853 msgid "Show tooltips if mouse hovers over a control" msgstr "Показывать всплывающие подсказки к элементам интерфейса" -#: rc_option_editor.cc:1867 +#: rc_option_editor.cc:1863 msgid "GUI" msgstr "Интерфейс" -#: rc_option_editor.cc:1870 +#: rc_option_editor.cc:1866 msgid "update transport clock display every 40ms instead of every 100ms" msgstr "Обновлять счётчик транспорта каждые 40мс вместо каждых 100мс" -#: rc_option_editor.cc:1887 +#: rc_option_editor.cc:1883 msgid "Mixer Strip" msgstr "Полоса микшера" -#: rc_option_editor.cc:1897 +#: rc_option_editor.cc:1893 msgid "Use narrow strips in the mixer by default" msgstr "Использовать тонкие полоски в микшере по умолчанию" -#: rc_option_editor.cc:1906 +#: rc_option_editor.cc:1902 msgid "Peak hold time" msgstr "Удерживание пика" -#: rc_option_editor.cc:1912 +#: rc_option_editor.cc:1908 msgid "short" msgstr "Короткое" -#: rc_option_editor.cc:1913 +#: rc_option_editor.cc:1909 msgid "medium" msgstr "Среднее" -#: rc_option_editor.cc:1914 +#: rc_option_editor.cc:1910 msgid "long" msgstr "Долгое" -#: rc_option_editor.cc:1920 +#: rc_option_editor.cc:1916 msgid "DPM fall-off" msgstr "Скорость спадания" -#: rc_option_editor.cc:1926 +#: rc_option_editor.cc:1922 msgid "slowest [6.6dB/sec]" msgstr "Самое медленное [6,6 Дб/с]" -#: rc_option_editor.cc:1927 +#: rc_option_editor.cc:1923 msgid "slow [8.6dB/sec] (BBC PPM, EBU PPM)" msgstr "Медленное [8,6 Дб/с] (BBC PPM, EBU PPM)" -#: rc_option_editor.cc:1928 +#: rc_option_editor.cc:1924 msgid "slowish [12.0dB/sec] (DIN)" msgstr "Неторопливое [12 Дб/с] (DIN)" -#: rc_option_editor.cc:1929 +#: rc_option_editor.cc:1925 msgid "moderate [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)" msgstr "Умеренное [13,3 Дб/с] (EBU Digi PPM, IRT Digi PPM)" -#: rc_option_editor.cc:1930 +#: rc_option_editor.cc:1926 msgid "medium [20dB/sec]" msgstr "Среднее [20 Дб/с]" -#: rc_option_editor.cc:1931 +#: rc_option_editor.cc:1927 msgid "fast [32dB/sec]" msgstr "Быстрое [32 Дб/с]" -#: rc_option_editor.cc:1932 +#: rc_option_editor.cc:1928 msgid "faster [46dB/sec]" msgstr "Ещё быстрее [46 Дб/с]" -#: rc_option_editor.cc:1933 +#: rc_option_editor.cc:1929 msgid "fastest [70dB/sec]" msgstr "Самое быстрое [70 Дб/с]" -#: rc_option_editor.cc:1939 -#, fuzzy +#: rc_option_editor.cc:1935 msgid "Meter line-up level; 0dBu" -msgstr "Уровень выравнивания" +msgstr "Точка выравнивания индикатора; 0dBu" -#: rc_option_editor.cc:1944 rc_option_editor.cc:1960 +#: rc_option_editor.cc:1940 rc_option_editor.cc:1956 msgid "-24dBFS (SMPTE US: 4dBu = -20dBFS)" -msgstr "" +msgstr "-24dBFS (SMPTE US: 4dBu = -20dBFS)" -#: rc_option_editor.cc:1945 rc_option_editor.cc:1961 -#, fuzzy +#: rc_option_editor.cc:1941 rc_option_editor.cc:1957 msgid "-20dBFS (SMPTE RP.0155)" -msgstr "-20 Дб (SMPTE)" +msgstr "-20dBFS (SMPTE RP.0155)" -#: rc_option_editor.cc:1946 rc_option_editor.cc:1962 -#, fuzzy +#: rc_option_editor.cc:1942 rc_option_editor.cc:1958 msgid "-18dBFS (EBU, BBC)" -msgstr "-18 Дб (EBU)" +msgstr "-18dBFS (EBU, BBC)" -#: rc_option_editor.cc:1947 rc_option_editor.cc:1963 +#: rc_option_editor.cc:1943 rc_option_editor.cc:1959 msgid "-15dBFS (DIN)" -msgstr "" +msgstr "-15dBFS (DIN)" -#: rc_option_editor.cc:1949 +#: rc_option_editor.cc:1945 msgid "" "Configure meter-marks and color-knee point for dBFS scale DPM, set reference " "level for IEC1/Nordic, IEC2 PPM and VU meter." msgstr "" -#: rc_option_editor.cc:1955 -#, fuzzy +#: rc_option_editor.cc:1951 msgid "IEC1/DIN Meter line-up level; 0dBu" -msgstr "Уровень выравнивания" +msgstr "Точка выравнивания индикатора IEC1/DIN; 0dBu" -#: rc_option_editor.cc:1965 +#: rc_option_editor.cc:1961 msgid "Reference level for IEC1/DIN meter." -msgstr "" +msgstr "Референсный уровень индикатора IEC1/DIN" -#: rc_option_editor.cc:1971 +#: rc_option_editor.cc:1967 msgid "VU Meter standard" -msgstr "" +msgstr "Стандарт индикатора VU" -#: rc_option_editor.cc:1976 +#: rc_option_editor.cc:1972 msgid "0VU = -2dBu (France)" -msgstr "" +msgstr "0VU = -2dBu (Франция)" -#: rc_option_editor.cc:1977 +#: rc_option_editor.cc:1973 msgid "0VU = 0dBu (North America, Australia)" -msgstr "" +msgstr "0VU = 0dBu (Северная Америка, Австралия)" -#: rc_option_editor.cc:1978 +#: rc_option_editor.cc:1974 msgid "0VU = +4dBu (standard)" -msgstr "" +msgstr "0VU = +4dBu (стандарт)" -#: rc_option_editor.cc:1979 +#: rc_option_editor.cc:1975 msgid "0VU = +8dBu" -msgstr "" +msgstr "0VU = +8dBu" -#: rc_option_editor.cc:1985 +#: rc_option_editor.cc:1981 msgid "Peak threshold [dBFS]" msgstr "Порог пика (dbFS)" -#: rc_option_editor.cc:1993 +#: rc_option_editor.cc:1989 msgid "" "Specify the audio signal level in dbFS at and above which the meter-peak " "indicator will flash red." msgstr "" -#: rc_option_editor.cc:2000 +#: rc_option_editor.cc:1996 msgid "LED meter style" -msgstr "" +msgstr "Индикатор в стиле LED" #: region_editor.cc:79 msgid "audition this region" @@ -10327,6 +10265,118 @@ msgstr "в папке сеанса" msgid "Send " msgstr "Посыл" +#: session_dialog.cc:66 +msgid "Session Setup" +msgstr "Настройка сеанса" + +#: session_dialog.cc:71 +msgid "Advanced options ..." +msgstr "Дополнительные параметры" + +#: session_dialog.cc:267 +msgid "New Session" +msgstr "Создать сеанс" + +#: session_dialog.cc:305 +msgid "Check the website for more..." +msgstr "" + +#: session_dialog.cc:308 +msgid "Click to open the program website in your web browser" +msgstr "" + +#: session_dialog.cc:328 +msgid "Sample Rate" +msgstr "Частота сэмплирования" + +#: session_dialog.cc:329 +msgid "Disk Format" +msgstr "" + +#: session_dialog.cc:347 +msgid "Select session file" +msgstr "Выберите файл сеанса" + +#: session_dialog.cc:362 +msgid "Other Sessions" +msgstr "Другие сеансы" + +#: session_dialog.cc:388 +msgid "Open" +msgstr "Открыть" + +#: session_dialog.cc:455 +msgid "Session name:" +msgstr "Название сеанса:" + +#: session_dialog.cc:477 +msgid "Create session folder in:" +msgstr "Создать папку сеанса в:" + +#: session_dialog.cc:500 +msgid "Select folder for session" +msgstr "Выберите папку для сеанса" + +#: session_dialog.cc:529 +msgid "Use this template" +msgstr "Использовать этот шаблон" + +#: session_dialog.cc:532 +msgid "no template" +msgstr "Без шаблона" + +#: session_dialog.cc:664 session_dialog.cc:696 +msgid "32 bit float" +msgstr "32bit float" + +#: session_dialog.cc:667 session_dialog.cc:699 +msgid "24 bit" +msgstr "" + +#: session_dialog.cc:670 session_dialog.cc:702 +msgid "16 bit" +msgstr "16bit" + +#: session_dialog.cc:741 session_dialog.cc:742 session_dialog.cc:743 +msgid "channels" +msgstr "канал(-ов)" + +#: session_dialog.cc:757 +msgid "Busses" +msgstr "Шины" + +#: session_dialog.cc:758 +msgid "Inputs" +msgstr "Входы" + +#: session_dialog.cc:759 +msgid "Outputs" +msgstr "Выходы" + +#: session_dialog.cc:767 +msgid "Create master bus" +msgstr "Создать мастер-шину" + +#: session_dialog.cc:777 +msgid "Automatically connect to physical inputs" +msgstr "Автоматически подключить к физическим входам" + +#: session_dialog.cc:784 session_dialog.cc:843 +msgid "Use only" +msgstr "Использовать только" + +#: session_dialog.cc:837 +msgid "Automatically connect outputs" +msgstr "Автоматически подключить выходы" + +#: session_dialog.cc:859 +msgid "... to master bus" +msgstr "... к мастер-шине" + +#: session_dialog.cc:869 +msgid "... to physical outputs" +msgstr "... к физическим выходам" + #: session_import_dialog.cc:64 msgid "Import from Session" msgstr "Импортировать из сеанса" @@ -11207,14 +11257,6 @@ msgid "Azimuth:" msgstr "Азимут:" #: startup.cc:72 -msgid "Create a new session" -msgstr "Начать новый сеанс" - -#: startup.cc:73 -msgid "Open an existing session" -msgstr "Открыть существующий сеанс" - -#: startup.cc:74 msgid "" "Use an external mixer or the hardware mixer of your audio interface.\n" "%1 will play NO role in monitoring" @@ -11222,16 +11264,11 @@ msgstr "" "Использовать внешний микшер или микшер звукового интерфейса.\n" "%1 никак не будет участвовать в мониторинге." -#: startup.cc:76 +#: startup.cc:74 msgid "Ask %1 to play back material as it is being recorded" msgstr "Дать %1 воспроизводить материал при его записи" -#: startup.cc:79 -msgid "I'd like more options for this session" -msgstr "Указать дополнительные параметры для этого сеанса" - -#: startup.cc:194 -#, fuzzy +#: startup.cc:143 msgid "" "Welcome to this BETA release of Ardour %1\n" "\n" @@ -11255,7 +11292,7 @@ msgid "" "\n" " http://ardour.org/support\n" msgstr "" -"Перед вами БЕТА-версия Ardour 3.0\n" +"Перед вами БЕТА-версия Ardour %1\n" "\n" "Версия для Linux уже выпущена, но за отсутствием достаточного количества\n" "тестировщиков версия для OS X является бетой. Отсюда — несколько советов:\n" @@ -11278,15 +11315,11 @@ msgstr "" "\n" " http://ardour.org/support\n" -#: startup.cc:218 +#: startup.cc:167 msgid "This is a BETA RELEASE" msgstr "Это БЕТА-версия программы" -#: startup.cc:324 -msgid "Audio / MIDI Setup" -msgstr "Параметры звука и MIDI" - -#: startup.cc:336 +#: startup.cc:176 msgid "" "%1 is a digital audio workstation. You can use it to " "record, edit and mix multi-track audio. You can produce your own CDs, mix " @@ -11303,15 +11336,15 @@ msgstr "" "\n" "Перед началом работы с программой необходимо кое-что настроить." -#: startup.cc:362 +#: startup.cc:202 msgid "Welcome to %1" msgstr "Приветствуем вас в %1" -#: startup.cc:385 +#: startup.cc:225 msgid "Default folder for %1 sessions" msgstr "Папка для сеансов %1 по умолчанию" -#: startup.cc:391 +#: startup.cc:231 msgid "" "Each project that you work on with %1 has its own folder.\n" "These can require a lot of disk space if you are recording audio.\n" @@ -11329,11 +11362,11 @@ msgstr "" "(Сохранять сеансы можно будет где угодно, просто указанная\n" "папка будет использоваться по умолчанию)" -#: startup.cc:415 +#: startup.cc:253 msgid "Default folder for new sessions" msgstr "Папка для новых сеансов по умолчанию" -#: startup.cc:436 +#: startup.cc:274 msgid "" "While recording instruments or vocals, you probably want to listen to the\n" "signal as well as record it. This is called \"monitoring\". There are\n" @@ -11358,15 +11391,15 @@ msgstr "" "Если вы не понимаете смысл этого параметра, просто используйте \n" "предлагаемый по умолчанию вариант." -#: startup.cc:457 +#: startup.cc:295 msgid "Monitoring Choices" msgstr "Способ мониторинга" -#: startup.cc:480 +#: startup.cc:318 msgid "Use a Master bus directly" msgstr "Использовать мастер-шину напрямую" -#: startup.cc:482 +#: startup.cc:320 msgid "" "Connect the Master bus directly to your hardware outputs. This is preferable " "for simple usage." @@ -11374,11 +11407,11 @@ msgstr "" "Соединить мастер-шину напрямую с выходами звукового интерфейса.\n" "Предпочтительно для простого использования." -#: startup.cc:491 +#: startup.cc:329 msgid "Use an additional Monitor bus" msgstr "Использовать дополнительную шину мониторинга" -#: startup.cc:494 +#: startup.cc:332 msgid "" "Use a Monitor bus between Master bus and hardware outputs for \n" "greater control in monitoring without affecting the mix." @@ -11386,7 +11419,7 @@ msgstr "" "Использовать шину мониторинга между мастер-шиной и выходами \n" "звукового интерфейса для полного контроля без вмешательства в микс." -#: startup.cc:516 +#: startup.cc:354 msgid "" "You can change this preference at any time via the Preferences dialog.\n" "You can also add or remove the monitor section to/from any session.\n" @@ -11399,110 +11432,10 @@ msgstr "" "Если вы не понимаете смысл этого параметра, просто используйте\n" "предлагаемое по умолчанию." -#: startup.cc:527 +#: startup.cc:365 msgid "Monitor Section" msgstr "Секция монитора" -#: startup.cc:573 -msgid "Check the website for more..." -msgstr "" - -#: startup.cc:576 -msgid "Click to open the program website in your web browser" -msgstr "" - -#: startup.cc:729 -msgid "Open" -msgstr "Открыть" - -#: startup.cc:775 -msgid "Session name:" -msgstr "Название сеанса:" - -#: startup.cc:798 -msgid "Create session folder in:" -msgstr "Создать папку сеанса в:" - -#: startup.cc:821 -msgid "Select folder for session" -msgstr "Выберите папку для сеанса" - -#: startup.cc:853 -msgid "Use this template" -msgstr "Использовать этот шаблон" - -#: startup.cc:856 -msgid "no template" -msgstr "Без шаблона" - -#: startup.cc:884 -msgid "Use an existing session as a template:" -msgstr "Использовать существующий сеанс как шаблон:" - -#: startup.cc:896 -msgid "Select template" -msgstr "Выберите шаблон" - -#: startup.cc:922 -msgid "New Session" -msgstr "Создать сеанс" - -#: startup.cc:1077 -msgid "Select session file" -msgstr "Выберите файл сеанса" - -#: startup.cc:1093 -msgid "Browse:" -msgstr "Обзор:" - -#: startup.cc:1102 -msgid "Select a session" -msgstr "Выберите сеанс" - -#: startup.cc:1129 startup.cc:1130 startup.cc:1131 -msgid "channels" -msgstr "канал(-ов)" - -#: startup.cc:1145 -msgid "Busses" -msgstr "Шины" - -#: startup.cc:1146 -msgid "Inputs" -msgstr "Входы" - -#: startup.cc:1147 -msgid "Outputs" -msgstr "Выходы" - -#: startup.cc:1155 -msgid "Create master bus" -msgstr "Создать мастер-шину" - -#: startup.cc:1165 -msgid "Automatically connect to physical inputs" -msgstr "Автоматически подключить к физическим входам" - -#: startup.cc:1172 startup.cc:1231 -msgid "Use only" -msgstr "Использовать только" - -#: startup.cc:1225 -msgid "Automatically connect outputs" -msgstr "Автоматически подключить выходы" - -#: startup.cc:1247 -msgid "... to master bus" -msgstr "... к мастер-шине" - -#: startup.cc:1257 -msgid "... to physical outputs" -msgstr "... к физическим выходам" - -#: startup.cc:1307 -msgid "Advanced Session Options" -msgstr "Дополнительные параметры сеанса" - #: step_entry.cc:59 msgid "Step Entry: %1" msgstr "Пошаговый ввод: %1" @@ -12168,23 +12101,23 @@ msgstr "could not find any ui configuration file, canvas will look broken." msgid "Config file %1 not saved" msgstr "Config file %1 not saved" -#: utils.cc:110 utils.cc:153 +#: utils.cc:111 utils.cc:154 msgid "bad XPM header %1" msgstr "bad XPM header %1" -#: utils.cc:292 utils.cc:324 +#: utils.cc:293 utils.cc:325 msgid "missing RGBA style for \"%1\"" msgstr "missing RGBA style for \"%1\"" -#: utils.cc:591 +#: utils.cc:598 msgid "cannot find XPM file for %1" msgstr "cannot find XPM file for %1" -#: utils.cc:617 +#: utils.cc:624 msgid "cannot find icon image for %1 using %2" msgstr "cannot find icon image for %1 using %2" -#: utils.cc:632 +#: utils.cc:639 msgid "Caught exception while loading icon named %1" msgstr "" @@ -12293,117 +12226,118 @@ msgid "" "ffprobe to ffprobe_harvid.\n" msgstr "" -#: transcode_video_dialog.cc:56 +#: transcode_video_dialog.cc:55 msgid "Transcode/Import Video File " msgstr "Импортировать/перекодировать видеофайл" -#: transcode_video_dialog.cc:58 +#: transcode_video_dialog.cc:57 msgid "Output File:" msgstr "Файл вывода:" -#: transcode_video_dialog.cc:61 export_video_dialog.cc:73 +#: transcode_video_dialog.cc:60 export_video_dialog.cc:72 msgid "Abort" msgstr "Прервать" -#: transcode_video_dialog.cc:63 +#: transcode_video_dialog.cc:62 msgid "Height = " msgstr "Высота = " -#: transcode_video_dialog.cc:66 +#: transcode_video_dialog.cc:65 msgid "Manual Override" msgstr "" -#: transcode_video_dialog.cc:70 export_video_dialog.cc:89 -#, fuzzy +#: transcode_video_dialog.cc:69 export_video_dialog.cc:88 msgid "Debug Mode: Print ffmpeg command and output to stdout." msgstr "Режим отладки: вывод команд ffmpeg в stdout" -#: transcode_video_dialog.cc:107 +#: transcode_video_dialog.cc:106 msgid "File Information" msgstr "Информация о файле" -#: transcode_video_dialog.cc:113 +#: transcode_video_dialog.cc:112 msgid "" "No ffprobe or ffmpeg executables could be found on this system. Video Import " "is not possible until you install those tools. See the Log window for more " "information." msgstr "" +"Исполняемые файлы ffprobe и ffmpeg не найдены в системе. Импорт видео " +"невозможен, пока вы их не установите. Подробности приведены в окне журнала." -#: transcode_video_dialog.cc:120 +#: transcode_video_dialog.cc:119 msgid "" "File-info can not be read. Most likely '%1' is not a valid video-file or an " "unsupported video codec or format." msgstr "" -#: transcode_video_dialog.cc:134 +#: transcode_video_dialog.cc:133 msgid "FPS:" msgstr "К/с:" -#: transcode_video_dialog.cc:136 +#: transcode_video_dialog.cc:135 msgid "Duration:" msgstr "Длительность:" -#: transcode_video_dialog.cc:138 +#: transcode_video_dialog.cc:137 msgid "Codec:" msgstr "Кодек:" -#: transcode_video_dialog.cc:140 +#: transcode_video_dialog.cc:139 msgid "Geometry:" msgstr "Геометрия:" -#: transcode_video_dialog.cc:155 +#: transcode_video_dialog.cc:154 msgid "??" msgstr "" -#: transcode_video_dialog.cc:176 +#: transcode_video_dialog.cc:175 msgid "Import Settings" msgstr "Параметры импорта" -#: transcode_video_dialog.cc:181 +#: transcode_video_dialog.cc:180 msgid "Do Not Import Video" msgstr "Не импортировать видео" -#: transcode_video_dialog.cc:182 +#: transcode_video_dialog.cc:181 msgid "Reference From Current Location" msgstr "Использовать исходный видеофайл" -#: transcode_video_dialog.cc:184 +#: transcode_video_dialog.cc:183 msgid "Import/Transcode Video to Session" msgstr "Импортировать/перекодировать видео в сеанс" -#: transcode_video_dialog.cc:198 +#: transcode_video_dialog.cc:197 msgid "Scale Video: Width = " msgstr "Масштаб видео: Ширина = " -#: transcode_video_dialog.cc:205 +#: transcode_video_dialog.cc:204 msgid "Original Width" msgstr "Исходная ширина" -#: transcode_video_dialog.cc:220 +#: transcode_video_dialog.cc:219 msgid "Bitrate (KBit/s):" msgstr "Скорость потока (Кбит/с):" -#: transcode_video_dialog.cc:225 +#: transcode_video_dialog.cc:224 msgid "Extract Audio:" msgstr "Извлечь звук:" -#: transcode_video_dialog.cc:345 +#: transcode_video_dialog.cc:344 msgid "Extracting Audio.." msgstr "Извлекается звук..." -#: transcode_video_dialog.cc:348 +#: transcode_video_dialog.cc:347 msgid "Audio Extraction Failed." msgstr "Не удалось извлечь звуковую дорожку." -#: transcode_video_dialog.cc:374 +#: transcode_video_dialog.cc:373 msgid "Transcoding Video.." msgstr "Перекодирование видео..." -#: transcode_video_dialog.cc:408 +#: transcode_video_dialog.cc:407 msgid "Transcoding Failed." msgstr "Не удалось выполнить перекодирование." -#: transcode_video_dialog.cc:491 +#: transcode_video_dialog.cc:490 msgid "Save Transcoded Video File" msgstr "Сохранить перекодированный видеофайл" @@ -12483,170 +12417,184 @@ msgstr "Снимок с таким названием уже есть. Пере msgid "Cannot create video folder \"%1\" (%2)" msgstr "Не удалось создать папку для видео: \"%1\" (%2)" -#: export_video_dialog.cc:66 +#: export_video_dialog.cc:65 msgid "Export Video File " msgstr "Экспортировать видеофайл" -#: export_video_dialog.cc:70 +#: export_video_dialog.cc:69 msgid "Video:" msgstr "Видео:" -#: export_video_dialog.cc:74 +#: export_video_dialog.cc:73 msgid "Scale Video (W x H):" msgstr "Масштабирование видео (В×Ш):" -#: export_video_dialog.cc:79 +#: export_video_dialog.cc:78 msgid "Set Aspect Ratio:" msgstr "Указать соотношение сторон:" -#: export_video_dialog.cc:80 +#: export_video_dialog.cc:79 msgid "Normalize Audio" msgstr "Нормировать звук" -#: export_video_dialog.cc:81 +#: export_video_dialog.cc:80 msgid "2 Pass Encoding" msgstr "Кодирование в два прохода" -#: export_video_dialog.cc:82 +#: export_video_dialog.cc:81 msgid "Codec Optimizations:" msgstr "Оптимизация кодека:" -#: export_video_dialog.cc:84 +#: export_video_dialog.cc:83 msgid "Deinterlace" msgstr "" -#: export_video_dialog.cc:85 +#: export_video_dialog.cc:84 msgid "Use [2] B-frames (MPEG 2 or 4 only)" msgstr "Использовать [2] B-кадры (только MPEG 2 или 4)" -#: export_video_dialog.cc:86 +#: export_video_dialog.cc:85 msgid "Override FPS (Default is to retain FPS from the input video file):" msgstr "Принудительно указать свою частоту кадров:" -#: export_video_dialog.cc:87 +#: export_video_dialog.cc:86 msgid "Include Session Metadata" msgstr "Включить метаданные сеанса" -#: export_video_dialog.cc:107 +#: export_video_dialog.cc:106 msgid "" "No ffprobe or ffmpeg executables could be found on this system. Video Export " "is not possible until you install those tools. See the Log window for more " "information." msgstr "" +"Исполняемые файлы ffprobe или ffmpeg в системе не обнаружены. Экспорт видео " +"будет недоступен до тех пор, пока вы их не установите. См. подробнее в окне " +"журнала." -#: export_video_dialog.cc:117 +#: export_video_dialog.cc:116 msgid "Output:" msgstr "Выход:" -#: export_video_dialog.cc:127 +#: export_video_dialog.cc:126 msgid "Input:" msgstr "Вход:" -#: export_video_dialog.cc:138 +#: export_video_dialog.cc:137 msgid "Audio:" msgstr "Звук:" -#: export_video_dialog.cc:140 +#: export_video_dialog.cc:139 msgid "Master Bus" msgstr "Мастер-шина" -#: export_video_dialog.cc:145 +#: export_video_dialog.cc:144 msgid "from the %1 session's start to the session's end" msgstr "от начала до конца сеанса %1" -#: export_video_dialog.cc:149 +#: export_video_dialog.cc:148 msgid "from 00:00:00:00 to the video's end" msgstr "от 00:00:00:00 до конца видео" -#: export_video_dialog.cc:151 +#: export_video_dialog.cc:150 msgid "from the video's start to the video's end" msgstr "от начала до конца видео" -#: export_video_dialog.cc:184 +#: export_video_dialog.cc:153 +msgid "Selected range" +msgstr "Выбранный диапазон" + +#: export_video_dialog.cc:193 msgid "Settings:" msgstr "Параметры:" -#: export_video_dialog.cc:192 +#: export_video_dialog.cc:201 msgid "Range:" msgstr "Диапазон:" -#: export_video_dialog.cc:195 +#: export_video_dialog.cc:204 msgid "Preset:" msgstr "Профиль:" -#: export_video_dialog.cc:198 +#: export_video_dialog.cc:207 msgid "Video Codec:" msgstr "Видеокодек:" -#: export_video_dialog.cc:201 +#: export_video_dialog.cc:210 msgid "Video KBit/s:" msgstr "Скорость видеопотока (Кбит/с):" -#: export_video_dialog.cc:204 +#: export_video_dialog.cc:213 msgid "Audio Codec:" msgstr "Звуковой кодек:" -#: export_video_dialog.cc:207 +#: export_video_dialog.cc:216 msgid "Audio KBit/s:" msgstr "Скорость звукового потока (Кбит/с):" -#: export_video_dialog.cc:210 +#: export_video_dialog.cc:219 msgid "Audio Samplerate:" msgstr "Частота сэмплирования звука:" -#: export_video_dialog.cc:387 +#: export_video_dialog.cc:395 msgid "Normalizing audio" msgstr "Выполняется нормировка звука" -#: export_video_dialog.cc:391 +#: export_video_dialog.cc:399 msgid "Exporting audio" msgstr "Экспорт звука" -#: export_video_dialog.cc:437 +#: export_video_dialog.cc:445 msgid "Exporting Audio..." msgstr "Экспортируется звук..." -#: export_video_dialog.cc:494 +#: export_video_dialog.cc:502 msgid "" "Export Video: Cannot query duration of video-file, using duration from " "timeline instead." msgstr "" +"Экспорт видео: невозможно запросить длительность видеофайла, вместо неё " +"используется длительность проекта." -#: export_video_dialog.cc:523 +#: export_video_dialog.cc:532 +msgid "Export Video: export-range does not include video." +msgstr "" + +#: export_video_dialog.cc:544 msgid "Export Video: No Master Out Ports to Connect for Audio Export" msgstr "" +"Экспорт видео: нет соединяемых портов выхода мастер-шины для экспорта звука" -#: export_video_dialog.cc:562 +#: export_video_dialog.cc:583 msgid "Encoding Video..." msgstr "Кодируется видео..." -#: export_video_dialog.cc:581 +#: export_video_dialog.cc:602 msgid "Export Video: Video input file cannot be read." -msgstr "" +msgstr "Экспорт видео: не удалось прочитать используемый видеофайл" -#: export_video_dialog.cc:679 +#: export_video_dialog.cc:695 msgid "Encoding Video.. Pass 1/2" msgstr "Выполняется кодирование видео. Проход 1/2." -#: export_video_dialog.cc:691 +#: export_video_dialog.cc:707 msgid "Encoding Video.. Pass 2/2" msgstr "Выполняется кодирование видео. Проход 2/2." -#: export_video_dialog.cc:779 +#: export_video_dialog.cc:814 msgid "Transcoding failed." msgstr "Не удалось выполнить перекодировку." -#: export_video_dialog.cc:948 export_video_dialog.cc:968 +#: export_video_dialog.cc:983 export_video_dialog.cc:1003 msgid "Save Exported Video File" msgstr "Сохранить экспортированный видеофайл" #: export_video_infobox.cc:30 msgid "Video Export Info" -msgstr "" +msgstr "Информация об экспорте видео" #: export_video_infobox.cc:31 msgid "Do Not Show This Dialog Again (Reset in Edit > Preferences > Video)." -msgstr "" +msgstr "Больше не показывать этот диалог (сбрасывается в диалоге настройки)" #: export_video_infobox.cc:43 msgid "Video Export Info" @@ -12660,6 +12608,210 @@ msgid "" "\n" "Open Manual in Browser? " msgstr "" +"Кодирование видео — нетривиальная задача с множеством нюансов.\n" +"\n" +"Рекомендуем прочитать руководство по адресу %1/video-timeline/operations/" +"#export.\n" +"\n" +"Открыть руководство в браузере? " + +#~ msgid "Measure latency" +#~ msgstr "Измерить задержку" + +#~ msgid "Cancel measurement" +#~ msgstr "Отменить измерение" + +#~ msgid "Start MIDI ALSA/JACK bridge" +#~ msgstr "Запустить соединитель ALSA MIDI и JACK MIDI" + +#~ msgid "Starting audio engine" +#~ msgstr "Запускается звуковой движок" + +#~ msgid "disconnected" +#~ msgstr "отсоединено" + +#~ msgid "Unable to start the session running" +#~ msgstr "Невозможно запустить уже выполняемый сеанс" + +#~ msgid "Click the Refresh button to try again." +#~ msgstr "Щёлкните кнопку «Обновить» для повторной попытки." + +#~ msgid "JACK" +#~ msgstr "JACK" + +#~ msgid "Reconnect" +#~ msgstr "Пересоединить" + +#~ msgid "JACK Sampling Rate and Latency" +#~ msgstr "Частота сэмплирования и задержка JACK" + +#~ msgid "Do not lock memory" +#~ msgstr "Не блокировать память" + +#~ msgid "Unlock memory" +#~ msgstr "Разблокировать память" + +#~ msgid "No zombies" +#~ msgstr "Без зомби" + +#~ msgid "Provide monitor ports" +#~ msgstr "Предоставить порты мониторинга" + +#~ msgid "H/W monitoring" +#~ msgstr "Аппаратный мониторинг" + +#~ msgid "H/W metering" +#~ msgstr "Аппаратный замер" + +#~ msgid "Verbose output" +#~ msgstr "Подробный вывод" + +#~ msgid "8000Hz" +#~ msgstr "8000 Гц" + +#~ msgid "22050Hz" +#~ msgstr "22,05 КГц" + +#~ msgid "44100Hz" +#~ msgstr "44,1 КГц" + +#~ msgid "48000Hz" +#~ msgstr "48 КГц" + +#~ msgid "88200Hz" +#~ msgstr "88,2 КГц" + +#~ msgid "96000Hz" +#~ msgstr "96 КГц" + +#~ msgid "192000Hz" +#~ msgstr "192КГц" + +#~ msgid "Triangular" +#~ msgstr "Треугольное" + +#~ msgid "Rectangular" +#~ msgstr "Прямоугольное" + +#~ msgid "Shaped" +#~ msgstr "По очертаниям" + +#~ msgid "Playback/recording on 1 device" +#~ msgstr "Воспроизведение и запись на 1 устройстве" + +#~ msgid "Playback/recording on 2 devices" +#~ msgstr "Воспроизведение и запись на 2 устройствах" + +#~ msgid "Playback only" +#~ msgstr "Только воспроизведение" + +#~ msgid "Recording only" +#~ msgstr "Только запись" + +#~ msgid "Audio Interface:" +#~ msgstr "Звуковой интерфейс:" + +#~ msgid "Number of buffers:" +#~ msgstr "Число буферов:" + +#~ msgid "Approximate latency:" +#~ msgstr "Примерная задержка:" + +#~ msgid "Audio mode:" +#~ msgstr "Звуковой режим:" + +#~ msgid "Ignore" +#~ msgstr "Игнорировать" + +#~ msgid "Client timeout" +#~ msgstr "Ошибка времени ожидания клиента" + +#~ msgid "Number of ports:" +#~ msgstr "Число портов:" + +#~ msgid "MIDI driver:" +#~ msgstr "Драйвер MIDI:" + +#~ msgid "Dither:" +#~ msgstr "Подмешивание шума:" + +#~ msgid "" +#~ "No JACK server found anywhere on this system. Please install JACK and " +#~ "restart" +#~ msgstr "" +#~ "Сервер JACK в системе не обнаружен. Установить его и попробуйте снова." + +#~ msgid "Server:" +#~ msgstr "Сервер:" + +#~ msgid "Input device:" +#~ msgstr "Устройство входа:" + +#~ msgid "Output device:" +#~ msgstr "Устройство выхода:" + +#~ msgid "Advanced" +#~ msgstr "Дополнительно" + +#~ msgid "No suitable audio devices" +#~ msgstr "Нет подходящих звуковых устройств" + +#~ msgid "JACK appears to be missing from the %1 bundle" +#~ msgstr "JACK отсутствует в поставке %1" + +#~ msgid "You need to choose an audio device first." +#~ msgstr "Для начала нужно выбрать звуковое устройство." + +#~ msgid "Audio device \"%1\" not known on this computer." +#~ msgstr "Звуковое устройство \"%1\" в этом компьютере не обнаружено." + +#~ msgid "AudioSetup value for %1 is missing data" +#~ msgstr "Значению AudioSetup для %1 не хватает данных" + +#~ msgid "" +#~ "There are several possible reasons:\n" +#~ "\n" +#~ "1) JACK is not running.\n" +#~ "2) JACK is running as another user, perhaps root.\n" +#~ "3) There is already another client called \"%1\".\n" +#~ "\n" +#~ "Please consider the possibilities, and perhaps (re)start JACK." +#~ msgstr "" +#~ "Существует несколько возможных причин:\n" +#~ "\n" +#~ "1) Сервер JACK не запущен.\n" +#~ "2) Сервер JACK запущен с правами другого пользователя — возможно, root.\n" +#~ "3) Уже существует клиент сервера JACK с именем \"%1\".\n" +#~ "\n" +#~ "Пожалуйста, проверьте все варианты; возможно потребуется (пере)запуск " +#~ "JACK." + +#~ msgid "JACK exited" +#~ msgstr "JACk завершил работу" + +#~ msgid "Create a new session" +#~ msgstr "Начать новый сеанс" + +#~ msgid "Open an existing session" +#~ msgstr "Открыть существующий сеанс" + +#~ msgid "I'd like more options for this session" +#~ msgstr "Указать дополнительные параметры для этого сеанса" + +#~ msgid "Use an existing session as a template:" +#~ msgstr "Использовать существующий сеанс как шаблон:" + +#~ msgid "Select template" +#~ msgstr "Выберите шаблон" + +#~ msgid "Browse:" +#~ msgstr "Обзор:" + +#~ msgid "Select a session" +#~ msgstr "Выберите сеанс" + +#~ msgid "Advanced Session Options" +#~ msgstr "Дополнительные параметры сеанса" #~ msgid "Change all in Group to RMS + Peak" #~ msgstr "Поменять все в группе на среднеквадратичное + пиковое" @@ -12902,9 +13054,6 @@ msgstr "" #~ msgid "Realtime Priority" #~ msgstr "Приоритет реального времени" -#~ msgid "Advanced options" -#~ msgstr "Расширенные параметры" - #~ msgid "MIDI Thru" #~ msgstr "MIDI Thru" @@ -13066,12 +13215,6 @@ msgstr "" #~ msgid "time stretch" #~ msgstr "ardour: эффект timestretch" -#~ msgid "Input channels:" -#~ msgstr "Каналов входа:" - -#~ msgid "Output channels:" -#~ msgstr "Каналов выхода:" - #~ msgid "New From" #~ msgstr "Создать из" @@ -14141,9 +14284,6 @@ msgstr "" #~ msgid "TimeFXProgress" #~ msgstr "TimeStretchProgress" -#~ msgid "Sample Rate" -#~ msgstr "Частота сэмплирования" - #~ msgid "22.05kHz" #~ msgstr "22,05 КГц" @@ -14374,12 +14514,6 @@ msgstr "" #~ msgid "ardour: plugins" #~ msgstr "Эффекты" -#~ msgid "# Inputs" -#~ msgstr "# входов" - -#~ msgid "# Outputs" -#~ msgstr "# выходов" - #~ msgid "add automation event to " #~ msgstr "добавить автомат. событие к" @@ -14564,9 +14698,6 @@ msgstr "" #~ msgid "Add Port" #~ msgstr "Добавить порт" -#~ msgid "Connection \"" -#~ msgstr "Соединение \"" - #~ msgid "\"" #~ msgstr "\"" diff --git a/libs/ardour/po/ru.po b/libs/ardour/po/ru.po index 1dfd367b68..55d7661f8c 100644 --- a/libs/ardour/po/ru.po +++ b/libs/ardour/po/ru.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: libardour 3\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-09-03 07:59-0400\n" -"PO-Revision-Date: 2013-06-14 02:14+0300\n" +"POT-Creation-Date: 2013-10-15 10:54+0400\n" +"PO-Revision-Date: 2013-10-15 10:54+0300\n" "Last-Translator: Александр Прокудин \n" "Language-Team: русский <>\n" "Language: \n" @@ -124,7 +124,7 @@ msgstr "" #: audio_playlist_source.cc:171 audiosource.cc:913 file_source.cc:529 #: midi_playlist_source.cc:144 midi_playlist_source.cc:152 #: midi_playlist_source.cc:159 midi_source.cc:371 plugin_insert.cc:643 -#: rb_effect.cc:332 session.cc:2465 session.cc:2498 session.cc:3643 +#: rb_effect.cc:332 session.cc:2613 session.cc:2646 session.cc:3791 #: session_handle.cc:87 sndfilesource.cc:121 msgid "programming error: %1" msgstr "programming error: %1" @@ -193,59 +193,21 @@ msgstr "Не удалось загрузить модуль VAMP под назв msgid "VAMP Plugin \"%1\" could not be loaded" msgstr "Не удалось загрузить модуль VAMP под названием \"%1\"" -#: audioengine.cc:186 -msgid "" -"This version of JACK is old - you should upgrade to a newer version that " -"supports jack_port_type_get_buffer_size()" +#: audioengine.cc:488 +msgid "looking for backends in %1\n" msgstr "" -#: audioengine.cc:190 -msgid "Connect session to engine" +#: audioengine.cc:511 +msgid "AudioEngine: cannot load module \"%1\" (%2)" msgstr "" -#: audioengine.cc:843 -msgid "" -"a port with the name \"%1\" already exists: check for duplicated track/bus " -"names" +#: audioengine.cc:517 +msgid "AudioEngine: backend at \"%1\" has no descriptor function." msgstr "" -#: audioengine.cc:845 session.cc:1698 -msgid "" -"No more JACK ports are available. You will need to stop %1 and restart JACK " -"with more ports if you need this many tracks." -msgstr "" - -#: audioengine.cc:848 -msgid "AudioEngine: cannot register port \"%1\": %2" -msgstr "AudioEngine: cannot register port \"%1\": %2" - -#: audioengine.cc:878 -msgid "unable to create port: %1" -msgstr "" - -#: audioengine.cc:932 -msgid "connect called before engine was started" -msgstr "" - -#: audioengine.cc:958 -msgid "AudioEngine: cannot connect %1 (%2) to %3 (%4)" -msgstr "" - -#: audioengine.cc:973 audioengine.cc:1004 -msgid "disconnect called before engine was started" -msgstr "" - -#: audioengine.cc:1052 -msgid "get_port_by_name() called before engine was started" -msgstr "" - -#: audioengine.cc:1104 -msgid "get_ports called before engine was started" -msgstr "" - -#: audioengine.cc:1427 -msgid "failed to connect to JACK" -msgstr "" +#: audioengine.cc:589 +msgid "Could not create backend for %1: %2" +msgstr "Не удалось создать движок для %1: %2" #: audioregion.cc:1643 msgid "" @@ -429,7 +391,7 @@ msgstr "" msgid "audio" msgstr "" -#: data_type.cc:28 session.cc:1640 session.cc:1643 +#: data_type.cc:28 session.cc:1788 session.cc:1791 msgid "MIDI" msgstr "" @@ -541,7 +503,7 @@ msgstr "Треугольное" msgid "Rectangular" msgstr "Прямоугольное" -#: export_formats.cc:52 session.cc:4861 session.cc:4877 +#: export_formats.cc:52 session.cc:5009 session.cc:5025 msgid "None" msgstr "Нет" @@ -651,7 +613,7 @@ msgid "" "configuration" msgstr "" -#: file_source.cc:198 session_state.cc:2891 +#: file_source.cc:198 session_state.cc:2807 msgid "" "there are already 1000 files with names like %1; versioning discontinued" msgstr "" @@ -746,23 +708,23 @@ msgstr "" msgid "unknown file type for session %1" msgstr "" -#: globals.cc:205 +#: globals.cc:207 msgid "Could not set system open files limit to \"unlimited\"" msgstr "" -#: globals.cc:207 +#: globals.cc:209 msgid "Could not set system open files limit to %1" msgstr "" -#: globals.cc:211 +#: globals.cc:213 msgid "Your system is configured to limit %1 to only %2 open files" msgstr "" -#: globals.cc:215 +#: globals.cc:217 msgid "Could not get system open files limit (%1)" msgstr "" -#: globals.cc:266 +#: globals.cc:268 msgid "Loading configuration" msgstr "" @@ -882,47 +844,47 @@ msgstr "" msgid "IO: bad output string in XML node \"%1\"" msgstr "" -#: io.cc:1410 +#: io.cc:1411 #, c-format msgid "%s %u" msgstr "" -#: io.cc:1457 +#: io.cc:1458 #, c-format msgid "%s in" msgstr "" -#: io.cc:1459 +#: io.cc:1460 #, c-format msgid "%s out" msgstr "" -#: io.cc:1534 session.cc:494 session.cc:523 +#: io.cc:1535 session.cc:683 session.cc:712 msgid "mono" msgstr "" -#: io.cc:1536 session.cc:507 session.cc:537 +#: io.cc:1537 session.cc:696 session.cc:726 msgid "L" msgstr "" -#: io.cc:1536 session.cc:509 session.cc:539 +#: io.cc:1537 session.cc:698 session.cc:728 msgid "R" msgstr "" -#: io.cc:1538 io.cc:1544 +#: io.cc:1539 io.cc:1545 #, c-format msgid "%d" msgstr "" -#: ladspa_plugin.cc:88 +#: ladspa_plugin.cc:86 msgid "LADSPA: module has no descriptor function." msgstr "" -#: ladspa_plugin.cc:93 +#: ladspa_plugin.cc:91 msgid "LADSPA: plugin has gone away since discovery!" msgstr "" -#: ladspa_plugin.cc:100 +#: ladspa_plugin.cc:98 msgid "LADSPA: \"%1\" cannot be used, since it cannot do inplace processing" msgstr "" @@ -1000,7 +962,7 @@ msgstr "" msgid "incorrect XML mode passed to Locations::set_state" msgstr "" -#: location.cc:842 session.cc:4362 session_state.cc:1114 +#: location.cc:842 session.cc:4510 session_state.cc:1031 msgid "session" msgstr "" @@ -1132,6 +1094,38 @@ msgstr "" msgid "MIDI stretch created non-MIDI source" msgstr "" +#: midiport_manager.cc:71 +msgid "MIDI control in" +msgstr "" + +#: midiport_manager.cc:72 +msgid "MIDI control out" +msgstr "" + +#: midiport_manager.cc:74 +msgid "MMC in" +msgstr "" + +#: midiport_manager.cc:75 +msgid "MMC out" +msgstr "" + +#: midiport_manager.cc:96 +msgid "MTC in" +msgstr "" + +#: midiport_manager.cc:98 +msgid "MTC out" +msgstr "" + +#: midiport_manager.cc:101 +msgid "MIDI Clock in" +msgstr "" + +#: midiport_manager.cc:103 +msgid "MIDI Clock out" +msgstr "" + #: monitor_processor.cc:53 msgid "monitor dim" msgstr "" @@ -1168,21 +1162,21 @@ msgstr "" msgid "solo control" msgstr "" -#: mtc_slave.cc:235 +#: mtc_slave.cc:238 msgid "MTC Slave: atomic read of current time failed, sleeping!" msgstr "" -#: mtc_slave.cc:359 +#: mtc_slave.cc:361 msgid "" "Unknown rate/drop value %1 in incoming MTC stream, session values used " "instead" msgstr "" -#: mtc_slave.cc:379 +#: mtc_slave.cc:381 msgid "Session framerate adjusted from %1 TO: MTC's %2." msgstr "" -#: mtc_slave.cc:393 +#: mtc_slave.cc:395 msgid "Session and MTC framerate mismatch: MTC:%1 %2:%3." msgstr "" @@ -1246,19 +1240,19 @@ msgstr "" msgid "looking for panners in %1" msgstr "" -#: panner_manager.cc:99 +#: panner_manager.cc:100 msgid "Panner discovered: \"%1\" in %2" msgstr "" -#: panner_manager.cc:116 +#: panner_manager.cc:117 msgid "PannerManager: cannot load module \"%1\" (%2)" msgstr "PannerManager: cannot load module \"%1\" (%2)" -#: panner_manager.cc:123 +#: panner_manager.cc:124 msgid "PannerManager: module \"%1\" has no descriptor function." msgstr "" -#: panner_manager.cc:186 +#: panner_manager.cc:187 msgid "no panner discovered for in/out = %1/%2" msgstr "" @@ -1368,11 +1362,7 @@ msgstr "" msgid "unknown plugin type \"%1\" - ignored" msgstr "" -#: port.cc:367 -msgid "get_connected_latency_range() called while disconnected from JACK" -msgstr "" - -#: port.cc:450 +#: port.cc:410 msgid "could not reregister %1" msgstr "" @@ -1388,6 +1378,34 @@ msgstr "" msgid "non-port insert XML used for port plugin insert" msgstr "" +#: port_manager.cc:270 +msgid "" +"a port with the name \"%1\" already exists: check for duplicated track/bus " +"names" +msgstr "" + +#: port_manager.cc:272 +msgid "" +"No more ports are available. You will need to stop %1 and restart with more " +"ports if you need this many tracks." +msgstr "" + +#: port_manager.cc:275 +msgid "AudioEngine: cannot register port \"%1\": %2" +msgstr "AudioEngine: cannot register port \"%1\": %2" + +#: port_manager.cc:314 +msgid "unable to create port: %1" +msgstr "" + +#: port_manager.cc:401 +msgid "AudioEngine: cannot connect %1 (%2) to %3 (%4)" +msgstr "" + +#: port_manager.cc:453 port_manager.cc:454 +msgid "Re-establising port %1 failed" +msgstr "" + #: processor.cc:207 msgid "No %1 property flag in element %2" msgstr "" @@ -1396,44 +1414,41 @@ msgstr "" msgid "No child node with active property" msgstr "" -#: rc_configuration.cc:93 +#: rc_configuration.cc:88 msgid "Loading system configuration file %1" msgstr "Loading system configuration file %1" -#: rc_configuration.cc:97 +#: rc_configuration.cc:92 msgid "%1: cannot read system configuration file \"%2\"" msgstr "%1: cannot read system configuration file \"%2\"" -#: rc_configuration.cc:102 +#: rc_configuration.cc:97 msgid "%1: system configuration file \"%2\" not loaded successfully." msgstr "%1: system configuration file \"%2\" not loaded successfully." -#: rc_configuration.cc:106 -#, fuzzy +#: rc_configuration.cc:101 msgid "" "Your system %1 configuration file is empty. This probably means that there " "was an error installing %1" msgstr "" -"your system %1 configuration file is empty. This probably means that there " -"as an error installing %1" -#: rc_configuration.cc:121 +#: rc_configuration.cc:116 msgid "Loading user configuration file %1" msgstr "Loading user configuration file %1" -#: rc_configuration.cc:125 +#: rc_configuration.cc:120 msgid "%1: cannot read configuration file \"%2\"" msgstr "%1: cannot read configuration file \"%2\"" -#: rc_configuration.cc:130 +#: rc_configuration.cc:125 msgid "%1: user configuration file \"%2\" not loaded successfully." msgstr "%1: user configuration file \"%2\" not loaded successfully." -#: rc_configuration.cc:134 +#: rc_configuration.cc:129 msgid "your %1 configuration file is empty. This is not normal." msgstr "your %1 configuration file is empty. This is not normal." -#: rc_configuration.cc:151 +#: rc_configuration.cc:146 msgid "Config file %1 not saved" msgstr "Config file %1 not saved" @@ -1471,23 +1486,23 @@ msgstr "" msgid "return %1" msgstr "" -#: route.cc:1105 route.cc:2581 +#: route.cc:1107 route.cc:2584 msgid "unknown Processor type \"%1\"; ignored" msgstr "" -#: route.cc:1117 +#: route.cc:1119 msgid "processor could not be created. Ignored." msgstr "" -#: route.cc:2007 route.cc:2234 +#: route.cc:2010 route.cc:2237 msgid "Bad node sent to Route::set_state() [%1]" msgstr "" -#: route.cc:2067 +#: route.cc:2070 msgid "Pannable state found for route (%1) without a panner!" msgstr "" -#: route.cc:2137 route.cc:2141 route.cc:2348 route.cc:2352 +#: route.cc:2140 route.cc:2144 route.cc:2351 route.cc:2355 msgid "badly formed order key string in state file! [%1] ... ignored." msgstr "" @@ -1515,185 +1530,183 @@ msgstr "" msgid "programming error: send created using role %1" msgstr "programming error: send created using role %1" -#: session.cc:347 -msgid "Set block size and sample rate" +#: session.cc:343 +msgid "Connect to engine" +msgstr "Соединение со звуковым движком" + +#: session.cc:348 +msgid "Session loading complete" +msgstr "Загрузка сеанса завершена" + +#: session.cc:420 +msgid "Set up LTC" msgstr "" -#: session.cc:352 -msgid "Using configuration" +#: session.cc:422 +msgid "Set up Click" msgstr "" -#: session.cc:377 +#: session.cc:424 +msgid "Set up standard connections" +msgstr "Настройка обычных соединений" + +#: session.cc:561 msgid "LTC In" msgstr "" -#: session.cc:378 +#: session.cc:562 msgid "LTC Out" msgstr "" -#: session.cc:404 +#: session.cc:588 msgid "LTC-in" msgstr "" -#: session.cc:405 +#: session.cc:589 msgid "LTC-out" msgstr "" -#: session.cc:434 +#: session.cc:632 msgid "could not setup Click I/O" msgstr "" -#: session.cc:461 -msgid "cannot setup Click I/O" -msgstr "" - -#: session.cc:464 -msgid "Compute I/O Latencies" -msgstr "" - -#: session.cc:470 -msgid "Set up standard connections" -msgstr "Настройка обычных соединений" - -#: session.cc:491 +#: session.cc:680 #, c-format msgid "out %" msgstr "" -#: session.cc:505 +#: session.cc:694 #, c-format msgid "out %+%" msgstr "" -#: session.cc:520 +#: session.cc:709 #, c-format msgid "in %" msgstr "" -#: session.cc:534 +#: session.cc:723 #, c-format msgid "in %+%" msgstr "" -#: session.cc:570 -msgid "Setup signal flow and plugins" -msgstr "Настройка модулей и звукового потока" - -#: session.cc:614 -msgid "Connect to engine" -msgstr "Соединение со звуковым движком" - -#: session.cc:645 +#: session.cc:787 msgid "cannot connect master output %1 to %2" msgstr "" -#: session.cc:704 +#: session.cc:846 msgid "monitor" msgstr "" -#: session.cc:749 +#: session.cc:891 msgid "cannot connect control input %1 to %2" msgstr "" -#: session.cc:769 +#: session.cc:911 msgid "The preferred I/O for the monitor bus (%1) cannot be found" msgstr "" -#: session.cc:800 +#: session.cc:942 msgid "cannot connect control output %1 to %2" msgstr "" -#: session.cc:864 +#: session.cc:1006 msgid "cannot create Auditioner: no auditioning of regions possible" msgstr "" -#: session.cc:1043 +#: session.cc:1190 msgid "Session: you can't use that location for auto punch (start <= end)" msgstr "" -#: session.cc:1083 +#: session.cc:1230 msgid "" "You cannot use this location for auto-loop because it has zero or negative " "length" msgstr "" -#: session.cc:1396 +#: session.cc:1544 msgid "feedback loop setup between %1 and %2" msgstr "" -#: session.cc:1692 +#: session.cc:1840 msgid "Session: could not create new midi track." msgstr "" -#: session.cc:1875 session.cc:1878 +#: session.cc:1846 +msgid "" +"No more JACK ports are available. You will need to stop %1 and restart JACK " +"with more ports if you need this many tracks." +msgstr "" + +#: session.cc:2023 session.cc:2026 msgid "Audio" msgstr "" -#: session.cc:1902 session.cc:1910 session.cc:1987 session.cc:1995 +#: session.cc:2050 session.cc:2058 session.cc:2135 session.cc:2143 msgid "cannot configure %1 in/%2 out configuration for new audio track" msgstr "" -#: session.cc:1933 +#: session.cc:2081 msgid "Session: could not create new audio track." msgstr "" -#: session.cc:1965 session.cc:1968 +#: session.cc:2113 session.cc:2116 msgid "Bus" msgstr "" -#: session.cc:2018 +#: session.cc:2166 msgid "Session: could not create new audio route." msgstr "" -#: session.cc:2077 session.cc:2087 +#: session.cc:2225 session.cc:2235 msgid "Session: UINT_MAX routes? impossible!" msgstr "" -#: session.cc:2109 +#: session.cc:2257 msgid "Session: cannot create track/bus from template description" msgstr "" -#: session.cc:2135 +#: session.cc:2283 msgid "Session: could not create new route from template" msgstr "" -#: session.cc:2164 +#: session.cc:2312 msgid "Adding new tracks/busses failed" msgstr "Не удалось добавить новые дорожки/шины" -#: session.cc:3265 +#: session.cc:3413 msgid "FATAL ERROR! Could not find a suitable version of %1 for a rename" msgstr "" -#: session.cc:3385 session.cc:3443 +#: session.cc:3533 session.cc:3591 msgid "There are already %1 recordings for %2, which I consider too many." msgstr "" -#: session.cc:3833 +#: session.cc:3981 msgid "send ID %1 appears to be in use already" msgstr "" -#: session.cc:3845 +#: session.cc:3993 msgid "aux send ID %1 appears to be in use already" msgstr "" -#: session.cc:3857 +#: session.cc:4005 msgid "return ID %1 appears to be in use already" msgstr "" -#: session.cc:3869 +#: session.cc:4017 msgid "insert ID %1 appears to be in use already" msgstr "" -#: session.cc:3996 +#: session.cc:4144 msgid "Cannot write a range where end <= start (e.g. %1 <= %2)" msgstr "" -#: session.cc:4025 +#: session.cc:4173 msgid "too many bounced versions of playlist \"%1\"" msgstr "" -#: session.cc:4035 +#: session.cc:4183 msgid "cannot create new audio file \"%1\" for %2" msgstr "" @@ -1732,11 +1745,11 @@ msgstr "" msgid "Session: cannot have two events of type %1 at the same frame (%2)." msgstr "" -#: session_export.cc:126 +#: session_export.cc:125 msgid "%1: cannot seek to %2 for export" msgstr "" -#: session_export.cc:183 +#: session_export.cc:182 msgid "Export ended unexpectedly: %1" msgstr "" @@ -1746,10 +1759,6 @@ msgid "" "of this session." msgstr "" -#: session_midi.cc:428 -msgid "Session: could not send full MIDI time code" -msgstr "" - #: session_midi.cc:520 msgid "Session: cannot send quarter-frame MTC message (%1)" msgstr "" @@ -1758,370 +1767,372 @@ msgstr "" msgid "Session: cannot create Playlist from XML description." msgstr "" -#: session_process.cc:133 +#: session_process.cc:132 msgid "Session: error in no roll for %1" msgstr "" -#: session_process.cc:1158 +#: session_process.cc:1157 msgid "Programming error: illegal event type in process_event (%1)" msgstr "" -#: session_state.cc:139 +#: session_state.cc:140 msgid "Could not use path %1 (%2)" msgstr "Не удалось использовать расположение %1 (%2)" -#: session_state.cc:267 +#: session_state.cc:184 msgid "solo cut control (dB)" msgstr "" -#: session_state.cc:360 +#: session_state.cc:208 +msgid "Set block size and sample rate" +msgstr "" + +#: session_state.cc:213 +msgid "Using configuration" +msgstr "Применяется конфигурация" + +#: session_state.cc:325 msgid "Reset Remote Controls" msgstr "Сброс удалённого управления" -#: session_state.cc:385 -msgid "Session loading complete" -msgstr "Загрузка сеанса завершена" - -#: session_state.cc:452 +#: session_state.cc:417 msgid "Session: cannot create session peakfile folder \"%1\" (%2)" msgstr "" -#: session_state.cc:459 +#: session_state.cc:424 msgid "Session: cannot create session sounds dir \"%1\" (%2)" msgstr "" -#: session_state.cc:466 +#: session_state.cc:431 msgid "Session: cannot create session midi dir \"%1\" (%2)" msgstr "" -#: session_state.cc:473 +#: session_state.cc:438 msgid "Session: cannot create session dead sounds folder \"%1\" (%2)" msgstr "" -#: session_state.cc:480 +#: session_state.cc:445 msgid "Session: cannot create session export folder \"%1\" (%2)" msgstr "" -#: session_state.cc:487 +#: session_state.cc:452 msgid "Session: cannot create session analysis folder \"%1\" (%2)" msgstr "" -#: session_state.cc:494 +#: session_state.cc:459 msgid "Session: cannot create session plugins folder \"%1\" (%2)" msgstr "Session: cannot create session plugins folder \"%1\" (%2)" -#: session_state.cc:501 +#: session_state.cc:466 msgid "Session: cannot create session externals folder \"%1\" (%2)" msgstr "Session: cannot create session externals folder \"%1\" (%2)" -#: session_state.cc:515 +#: session_state.cc:480 msgid "Session: cannot create session folder \"%1\" (%2)" msgstr "Session: cannot create session folder \"%1\" (%2)" -#: session_state.cc:548 +#: session_state.cc:514 msgid "Could not open %1 for writing session template" msgstr "Не удалось открыть %1 для записи шаблона сеанса" -#: session_state.cc:554 +#: session_state.cc:520 msgid "Could not open session template %1 for reading" msgstr "" -#: session_state.cc:573 +#: session_state.cc:539 msgid "master" msgstr "master" -#: session_state.cc:636 +#: session_state.cc:600 msgid "Could not remove pending capture state at path \"%1\" (%2)" msgstr "" -#: session_state.cc:660 +#: session_state.cc:624 msgid "could not rename snapshot %1 to %2 (%3)" msgstr "" -#: session_state.cc:688 -#, fuzzy +#: session_state.cc:652 msgid "Could not remove session file at path \"%1\" (%2)" -msgstr "Could not create directory for Session template\"%1\" (%2)" +msgstr "" -#: session_state.cc:761 +#: session_state.cc:669 msgid "" "the %1 audio engine is not connected and state saving would lose all I/O " "connections. Session not saved" msgstr "" -#: session_state.cc:812 +#: session_state.cc:720 msgid "state could not be saved to %1" msgstr "" -#: session_state.cc:814 session_state.cc:825 -#, fuzzy +#: session_state.cc:722 session_state.cc:733 msgid "Could not remove temporary session file at path \"%1\" (%2)" -msgstr "Could not create directory for Session template\"%1\" (%2)" +msgstr "" -#: session_state.cc:822 +#: session_state.cc:730 msgid "could not rename temporary session file %1 to %2" msgstr "" -#: session_state.cc:890 +#: session_state.cc:798 msgid "%1: session file \"%2\" doesn't exist!" msgstr "%1: файл сеанса «%2» не существует!" -#: session_state.cc:902 +#: session_state.cc:810 msgid "Could not understand session file %1" msgstr "" -#: session_state.cc:911 +#: session_state.cc:819 msgid "Session file %1 is not a session" msgstr "Файл сеанса %1 не является сеансом" -#: session_state.cc:1208 +#: session_state.cc:1125 msgid "programming error: Session: incorrect XML node sent to set_state()" msgstr "" -#: session_state.cc:1257 +#: session_state.cc:1179 msgid "Session: XML state has no options section" msgstr "" -#: session_state.cc:1262 +#: session_state.cc:1184 msgid "Session: XML state has no metadata section" msgstr "" -#: session_state.cc:1273 +#: session_state.cc:1195 msgid "Session: XML state has no sources section" msgstr "" -#: session_state.cc:1280 +#: session_state.cc:1202 msgid "Session: XML state has no Tempo Map section" msgstr "" -#: session_state.cc:1287 +#: session_state.cc:1209 msgid "Session: XML state has no locations section" msgstr "" -#: session_state.cc:1313 +#: session_state.cc:1235 msgid "Session: XML state has no Regions section" msgstr "" -#: session_state.cc:1320 +#: session_state.cc:1242 msgid "Session: XML state has no playlists section" msgstr "" -#: session_state.cc:1340 +#: session_state.cc:1262 msgid "Session: XML state has no bundles section" msgstr "" -#: session_state.cc:1352 +#: session_state.cc:1274 msgid "Session: XML state has no diskstreams section" msgstr "" -#: session_state.cc:1360 +#: session_state.cc:1282 msgid "Session: XML state has no routes section" msgstr "" -#: session_state.cc:1372 +#: session_state.cc:1294 msgid "Session: XML state has no route groups section" msgstr "" -#: session_state.cc:1381 +#: session_state.cc:1303 msgid "Session: XML state has no edit groups section" msgstr "" -#: session_state.cc:1388 +#: session_state.cc:1310 msgid "Session: XML state has no mix groups section" msgstr "" -#: session_state.cc:1396 +#: session_state.cc:1318 msgid "Session: XML state has no click section" msgstr "" -#: session_state.cc:1444 +#: session_state.cc:1360 msgid "Session: cannot create Route from XML description." msgstr "" -#: session_state.cc:1448 +#: session_state.cc:1364 msgid "Loaded track/bus %1" msgstr "Загружена дорожка/шина %1" -#: session_state.cc:1546 +#: session_state.cc:1462 msgid "Could not find diskstream for route" msgstr "" -#: session_state.cc:1600 +#: session_state.cc:1516 msgid "Session: cannot create Region from XML description." msgstr "" -#: session_state.cc:1604 +#: session_state.cc:1520 msgid "Can not load state for region '%1'" msgstr "" -#: session_state.cc:1640 +#: session_state.cc:1556 msgid "Regions in compound description not found (ID's %1 and %2): ignored" msgstr "" -#: session_state.cc:1668 +#: session_state.cc:1584 msgid "Nested source has no ID info in session file! (ignored)" msgstr "" -#: session_state.cc:1680 +#: session_state.cc:1596 msgid "Cannot reconstruct nested source for region %1" msgstr "" -#: session_state.cc:1742 +#: session_state.cc:1658 msgid "Session: XMLNode describing a AudioRegion is incomplete (no source)" msgstr "" -#: session_state.cc:1750 session_state.cc:1771 session_state.cc:1791 +#: session_state.cc:1666 session_state.cc:1687 session_state.cc:1707 msgid "" "Session: XMLNode describing a AudioRegion references an unknown source id =%1" msgstr "" -#: session_state.cc:1756 session_state.cc:1777 session_state.cc:1797 +#: session_state.cc:1672 session_state.cc:1693 session_state.cc:1713 msgid "" "Session: XMLNode describing a AudioRegion references a non-audio source id =" "%1" msgstr "" -#: session_state.cc:1820 +#: session_state.cc:1736 msgid "" "Session: XMLNode describing an AudioRegion is missing some master sources; " "ignored" msgstr "" -#: session_state.cc:1854 +#: session_state.cc:1770 msgid "Session: XMLNode describing a MidiRegion is incomplete (no source)" msgstr "" -#: session_state.cc:1862 +#: session_state.cc:1778 msgid "" "Session: XMLNode describing a MidiRegion references an unknown source id =%1" msgstr "" -#: session_state.cc:1868 +#: session_state.cc:1784 msgid "" "Session: XMLNode describing a MidiRegion references a non-midi source id =%1" msgstr "" -#: session_state.cc:1936 +#: session_state.cc:1852 msgid "" "cannot create new file from region name \"%1\" with ident = \"%2\": too many " "existing files with similar names" msgstr "" -#: session_state.cc:1959 +#: session_state.cc:1875 msgid "Session: cannot create Source from XML description." msgstr "" -#: session_state.cc:1993 +#: session_state.cc:1909 msgid "A sound file is missing. It will be replaced by silence." msgstr "" -#: session_state.cc:2016 +#: session_state.cc:1932 msgid "Found a sound file that cannot be used by %1. Talk to the progammers." msgstr "" -#: session_state.cc:2033 +#: session_state.cc:1949 msgid "Could not create templates directory \"%1\" (%2)" msgstr "Could not create templates directory \"%1\" (%2)" -#: session_state.cc:2046 +#: session_state.cc:1962 msgid "Template \"%1\" already exists - new version not created" msgstr "" -#: session_state.cc:2052 +#: session_state.cc:1968 msgid "Could not create directory for Session template\"%1\" (%2)" msgstr "Could not create directory for Session template\"%1\" (%2)" -#: session_state.cc:2062 +#: session_state.cc:1978 msgid "template not saved" msgstr "" -#: session_state.cc:2072 +#: session_state.cc:1988 msgid "Could not create directory for Session template plugin state\"%1\" (%2)" msgstr "" -#: session_state.cc:2267 +#: session_state.cc:2183 msgid "Unknown node \"%1\" found in Bundles list from session file" msgstr "" -#: session_state.cc:2809 session_state.cc:2815 +#: session_state.cc:2725 session_state.cc:2731 msgid "Cannot expand path %1 (%2)" msgstr "Cannot expand path %1 (%2)" -#: session_state.cc:2868 +#: session_state.cc:2784 msgid "Session: cannot create dead file folder \"%1\" (%2)" msgstr "Session: cannot create dead file folder \"%1\" (%2)" -#: session_state.cc:2907 +#: session_state.cc:2823 msgid "cannot rename unused file source from %1 to %2 (%3)" msgstr "" -#: session_state.cc:2925 +#: session_state.cc:2841 msgid "cannot remove peakfile %1 for %2 (%3)" msgstr "" -#: session_state.cc:3227 +#: session_state.cc:3143 msgid "could not backup old history file, current history not saved" msgstr "" -#: session_state.cc:3240 +#: session_state.cc:3156 msgid "history could not be saved to %1" msgstr "" -#: session_state.cc:3243 +#: session_state.cc:3159 msgid "Could not remove history file at path \"%1\" (%2)" msgstr "" -#: session_state.cc:3247 +#: session_state.cc:3163 msgid "could not restore history file from backup %1 (%2)" msgstr "" -#: session_state.cc:3272 +#: session_state.cc:3188 msgid "%1: no history file \"%2\" for this session." msgstr "" -#: session_state.cc:3278 +#: session_state.cc:3194 msgid "Could not understand session history file \"%1\"" msgstr "" -#: session_state.cc:3320 +#: session_state.cc:3236 msgid "Failed to downcast MidiSource for NoteDiffCommand" msgstr "" -#: session_state.cc:3331 +#: session_state.cc:3247 msgid "Failed to downcast MidiSource for SysExDiffCommand" msgstr "" -#: session_state.cc:3342 +#: session_state.cc:3258 msgid "Failed to downcast MidiSource for PatchChangeDiffCommand" msgstr "" -#: session_state.cc:3350 +#: session_state.cc:3266 msgid "Couldn't figure out how to make a Command out of a %1 XMLNode." msgstr "" -#: session_state.cc:3602 +#: session_state.cc:3518 msgid "Session: unknown diskstream type in XML" msgstr "" -#: session_state.cc:3607 +#: session_state.cc:3523 msgid "Session: could not load diskstream via XML state" msgstr "" -#: session_time.cc:215 -msgid "Unknown JACK transport state %1 in sync callback" +#: session_time.cc:214 +msgid "Unknown transport state %1 in sync callback" msgstr "" -#: session_transport.cc:168 +#: session_transport.cc:167 msgid "Cannot loop - no loop range defined" msgstr "" -#: session_transport.cc:728 +#: session_transport.cc:739 msgid "" "Seamless looping cannot be supported while %1 is using JACK transport.\n" "Recommend changing the configured options" msgstr "" -#: session_transport.cc:1094 +#: session_transport.cc:1105 msgid "" "Global varispeed cannot be supported while %1 is connected to JACK transport " "control" @@ -2132,9 +2143,8 @@ msgid "Unable to read event prefix, corrupt MIDI ring" msgstr "" #: smf_source.cc:265 -#, fuzzy msgid "Event has time and size but no body, corrupt MIDI ring" -msgstr "Прямоугольное" +msgstr "" #: smf_source.cc:271 msgid "Event time is before MIDI source position" @@ -2265,7 +2275,7 @@ msgstr "" msgid "attempt to write a non-writable audio file source (%1)" msgstr "" -#: sndfilesource.cc:396 utils.cc:507 utils.cc:531 utils.cc:545 utils.cc:564 +#: sndfilesource.cc:396 utils.cc:510 utils.cc:534 utils.cc:548 utils.cc:567 msgid "programming error: %1 %2" msgstr "programming error: %1 %2" @@ -2483,19 +2493,19 @@ msgstr "" msgid "programming error: unknown edit mode string \"%1\"" msgstr "programming error: unknown edit mode string \"%1\"" -#: utils.cc:389 utils.cc:418 +#: utils.cc:389 utils.cc:421 msgid "MIDI Timecode" msgstr "" -#: utils.cc:389 utils.cc:416 +#: utils.cc:389 utils.cc:419 msgid "MTC" msgstr "MTC" -#: utils.cc:393 utils.cc:425 +#: utils.cc:393 utils.cc:428 msgid "MIDI Clock" msgstr "" -#: utils.cc:397 utils.cc:412 utils.cc:432 +#: utils.cc:397 utils.cc:415 utils.cc:435 msgid "JACK" msgstr "JACK" @@ -2503,22 +2513,25 @@ msgstr "JACK" msgid "programming error: unknown sync source string \"%1\"" msgstr "programming error: unknown sync source string \"%1\"" -#: utils.cc:423 +#: utils.cc:426 msgid "M-Clock" msgstr "" -#: utils.cc:429 +#: utils.cc:432 msgid "LTC" msgstr "LTC" -#: utils.cc:599 +#: utils.cc:602 msgid "programming error: unknown native header format: %1" msgstr "programming error: unknown native header format: %1" -#: utils.cc:614 +#: utils.cc:617 msgid "cannot open directory %1 (%2)" msgstr "cannot open directory %1 (%2)" +#~ msgid "Setup signal flow and plugins" +#~ msgstr "Настройка модулей и звукового потока" + #~ msgid "Session" #~ msgstr "Сеанс" -- cgit v1.2.3 From 58e8f43052a3b98046e1addbde86819177a9ec1c Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Tue, 15 Oct 2013 13:28:01 -0400 Subject: reduce default height of mackie control GUI, as per #5713 --- libs/surfaces/mackie/gui.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libs/surfaces/mackie/gui.cc b/libs/surfaces/mackie/gui.cc index 1a063b674e..ebb9fd584e 100644 --- a/libs/surfaces/mackie/gui.cc +++ b/libs/surfaces/mackie/gui.cc @@ -84,6 +84,7 @@ MackieControlProtocolGUI::MackieControlProtocolGUI (MackieControlProtocol& p) Gtk::Table* table = Gtk::manage (new Gtk::Table (2, 9)); table->set_row_spacings (4); table->set_col_spacings (6); + table->set_border_width (12); l = manage (new Gtk::Label (_("Device Type:"))); l->set_alignment (1.0, 0.5); table->attach (*l, 0, 1, 0, 1, AttachOptions(FILL|EXPAND), AttachOptions(0)); @@ -182,11 +183,10 @@ MackieControlProtocolGUI::MackieControlProtocolGUI (MackieControlProtocol& p) fkey_packer->pack_start (function_key_scroller, true, true); fkey_packer->pack_start (*observation_packer, false, false); fkey_packer->set_spacing (12); - function_key_scroller.set_size_request (700,700); function_key_scroller.property_shadow_type() = Gtk::SHADOW_NONE; function_key_scroller.add (function_key_editor); append_page (*fkey_packer, _("Function Keys")); - + build_available_action_menu (); build_function_key_editor (); refresh_function_key_editor (); -- cgit v1.2.3 From cfd571f4909b216a22ab53a67fc3574f7144db61 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Tue, 15 Oct 2013 13:30:15 -0400 Subject: bump to 3.5 --- wscript | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wscript b/wscript index da7b39d883..a29d08eee2 100644 --- a/wscript +++ b/wscript @@ -8,7 +8,7 @@ import subprocess import sys MAJOR = '3' -MINOR = '4' +MINOR = '5' VERSION = MAJOR + '.' + MINOR APPNAME = 'Ardour' + MAJOR -- cgit v1.2.3 From 001fc1f55bd273ef0d0f0fc31626dccb89b97b44 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Tue, 15 Oct 2013 14:03:41 -0400 Subject: fix spelling and program name abstraction --- gtk2_ardour/video_server_dialog.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gtk2_ardour/video_server_dialog.cc b/gtk2_ardour/video_server_dialog.cc index 811c00f64f..18a4d21dc9 100644 --- a/gtk2_ardour/video_server_dialog.cc +++ b/gtk2_ardour/video_server_dialog.cc @@ -133,7 +133,7 @@ VideoServerDialog::VideoServerDialog (Session* s) t->attach (cachesize_spinner, 1, 2, 2, 3); l = manage (new Label (string_compose( - _("%1 relies on an external Video Server for the videotimeline.\nThe server configured in Edit -> Prefereces -> Video is not reachable.\nDo you want ardour to launch 'harvid' on this machine?"), PROGRAM_NAME) + _("%1 relies on an external video server for the videotimeline.\nThe server configured in Edit -> Preferences -> Video is not reachable.\nDo you want %1 to launch 'harvid' on this machine?"), PROGRAM_NAME) , Gtk::ALIGN_LEFT, Gtk::ALIGN_CENTER, false)); l->set_max_width_chars(80); l->set_line_wrap(); -- cgit v1.2.3 From 56fa4d90456e12c5af868f1656f9be09dde57580 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Tue, 15 Oct 2013 14:03:59 -0400 Subject: update russian translation (again) --- gtk2_ardour/po/ru.po | 305 +++++++++++++++++++++++++----------------------- libs/ardour/po/ru.po | 6 +- libs/gtkmm2ext/po/ru.po | 23 ++-- 3 files changed, 172 insertions(+), 162 deletions(-) diff --git a/gtk2_ardour/po/ru.po b/gtk2_ardour/po/ru.po index e7d01fd622..a0bb16dbf4 100644 --- a/gtk2_ardour/po/ru.po +++ b/gtk2_ardour/po/ru.po @@ -10,8 +10,8 @@ msgid "" msgstr "" "Project-Id-Version: Ardour 3\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-10-15 10:13+0400\n" -"PO-Revision-Date: 2013-10-15 10:48+0300\n" +"POT-Creation-Date: 2013-10-15 21:42+0400\n" +"PO-Revision-Date: 2013-10-15 21:46+0300\n" "Last-Translator: Александр Прокудин \n" "Language-Team: русский <>\n" "Language: ru\n" @@ -741,11 +741,11 @@ msgstr "" " %1, потому что %1 работал недостаточно быстро.\n" "Попробуйте снова запустить подсистему и сохранить сеанс." -#: ardour_ui.cc:823 startup.cc:378 +#: ardour_ui.cc:826 startup.cc:379 msgid "%1 is ready for use" msgstr "%1 готов к работе" -#: ardour_ui.cc:872 +#: ardour_ui.cc:875 msgid "" "WARNING: Your system has a limit for maximum amount of locked memory. This " "might cause %1 to run out of memory before your system runs out of memory. \n" @@ -760,23 +760,23 @@ msgstr "" "Вы можете узнать установленный предел при помощи команды 'ulimit -l'. Обычно " "это контролируется в %2." -#: ardour_ui.cc:889 +#: ardour_ui.cc:892 msgid "Do not show this window again" msgstr "Больше не показывать это окно" -#: ardour_ui.cc:931 +#: ardour_ui.cc:934 msgid "Don't quit" msgstr "Не выходить" -#: ardour_ui.cc:932 +#: ardour_ui.cc:935 msgid "Just quit" msgstr "Просто выйти" -#: ardour_ui.cc:933 +#: ardour_ui.cc:936 msgid "Save and quit" msgstr "Сохранить и выйти" -#: ardour_ui.cc:943 +#: ardour_ui.cc:946 msgid "" "%1 was unable to save your session.\n" "\n" @@ -791,15 +791,15 @@ msgstr "" "\n" "«Просто выйти»." -#: ardour_ui.cc:974 +#: ardour_ui.cc:977 msgid "Please wait while %1 cleans up..." msgstr "Дождитесь завершения подчистки сеанса в %1..." -#: ardour_ui.cc:992 +#: ardour_ui.cc:995 msgid "Unsaved Session" msgstr "Сеанс не сохранён" -#: ardour_ui.cc:1013 +#: ardour_ui.cc:1016 msgid "" "The session \"%1\"\n" "has not been saved.\n" @@ -817,7 +817,7 @@ msgstr "" "\n" "Что вы хотите сделать?" -#: ardour_ui.cc:1016 +#: ardour_ui.cc:1019 msgid "" "The snapshot \"%1\"\n" "has not been saved.\n" @@ -835,75 +835,75 @@ msgstr "" "\n" "Что вы хотите сделать?" -#: ardour_ui.cc:1030 +#: ardour_ui.cc:1033 msgid "Prompter" msgstr "" -#: ardour_ui.cc:1116 ardour_ui.cc:1124 +#: ardour_ui.cc:1119 ardour_ui.cc:1127 #, c-format msgid "Audio: none" msgstr "Звук: нет" -#: ardour_ui.cc:1128 +#: ardour_ui.cc:1131 #, c-format msgid "Audio: %.1f kHz / %4.1f ms" msgstr "Звук: %.1f КГц / %4.1f мс" -#: ardour_ui.cc:1132 +#: ardour_ui.cc:1135 #, c-format msgid "Audio: % kHz / %4.1f ms" msgstr "Звук: % КГц / %4.1f мс" -#: ardour_ui.cc:1150 export_video_dialog.cc:67 +#: ardour_ui.cc:1153 export_video_dialog.cc:67 msgid "File:" msgstr "Файл:" -#: ardour_ui.cc:1154 +#: ardour_ui.cc:1157 msgid "BWF" msgstr "BWF" -#: ardour_ui.cc:1157 +#: ardour_ui.cc:1160 msgid "WAV" msgstr "WAV" -#: ardour_ui.cc:1160 +#: ardour_ui.cc:1163 msgid "WAV64" msgstr "WAV64" -#: ardour_ui.cc:1163 session_option_editor.cc:197 +#: ardour_ui.cc:1166 session_option_editor.cc:197 msgid "CAF" msgstr "CAF" -#: ardour_ui.cc:1166 +#: ardour_ui.cc:1169 msgid "AIFF" msgstr "AIFF" -#: ardour_ui.cc:1169 +#: ardour_ui.cc:1172 msgid "iXML" msgstr "iXML" -#: ardour_ui.cc:1172 +#: ardour_ui.cc:1175 msgid "RF64" msgstr "RF64" -#: ardour_ui.cc:1180 +#: ardour_ui.cc:1183 msgid "32-float" msgstr "32-float" -#: ardour_ui.cc:1183 +#: ardour_ui.cc:1186 msgid "24-int" msgstr "24-int" -#: ardour_ui.cc:1186 +#: ardour_ui.cc:1189 msgid "16-int" msgstr "16-int" -#: ardour_ui.cc:1205 +#: ardour_ui.cc:1208 #, c-format msgid "DSP: %5.1f%%" msgstr "ЦП: %5.1f%%" -#: ardour_ui.cc:1224 +#: ardour_ui.cc:1227 #, c-format msgid "" "Buffers: p:" @@ -914,34 +914,34 @@ msgstr "" "%% c:" "%%%" -#: ardour_ui.cc:1265 +#: ardour_ui.cc:1268 msgid "Disk: Unknown" msgstr "На диске: неизвестно" -#: ardour_ui.cc:1267 +#: ardour_ui.cc:1270 msgid "Disk: 24hrs+" msgstr "На диске: 24ч+" -#: ardour_ui.cc:1285 +#: ardour_ui.cc:1288 msgid "Disk: >24 hrs" msgstr "На диске: >24ч" -#: ardour_ui.cc:1296 +#: ardour_ui.cc:1299 #, c-format msgid "Disk: %02dh:%02dm:%02ds" msgstr "На диске: %02dч:%02dм:%02dс" -#: ardour_ui.cc:1322 +#: ardour_ui.cc:1325 #, c-format msgid "Timecode|TC: %s" msgstr "ТК: %s" -#: ardour_ui.cc:1439 ardour_ui.cc:1448 session_dialog.cc:322 +#: ardour_ui.cc:1442 ardour_ui.cc:1451 session_dialog.cc:322 #: session_dialog.cc:327 msgid "Recent Sessions" msgstr "Недавние сеансы" -#: ardour_ui.cc:1527 +#: ardour_ui.cc:1530 msgid "" "%1 is not connected to any audio backend.\n" "You cannot open or close sessions in this condition" @@ -949,27 +949,27 @@ msgstr "" "%1 не соединен с какой-либо звуковой подсистемой.\n" "Открытие и закрытие сеансов невозможно." -#: ardour_ui.cc:1551 +#: ardour_ui.cc:1554 msgid "Open Session" msgstr "Открыть сеанс" -#: ardour_ui.cc:1576 session_dialog.cc:353 session_import_dialog.cc:169 +#: ardour_ui.cc:1579 session_dialog.cc:353 session_import_dialog.cc:169 #: session_metadata_dialog.cc:729 msgid "%1 sessions" msgstr "Cеансы %1" -#: ardour_ui.cc:1613 +#: ardour_ui.cc:1616 msgid "You cannot add a track without a session already loaded." msgstr "Вы не можете добавить дорожку без загруженного сеанса." -#: ardour_ui.cc:1621 +#: ardour_ui.cc:1624 msgid "could not create %1 new mixed track" msgid_plural "could not create %1 new mixed tracks" msgstr[0] "Не удалось создать %1 новую смешанную дорожку" msgstr[1] "Не удалось создать %1 новых смешанных дорожки" msgstr[2] "Не удалось создать %1 новых смешанных дорожек" -#: ardour_ui.cc:1627 ardour_ui.cc:1688 +#: ardour_ui.cc:1630 ardour_ui.cc:1691 msgid "" "There are insufficient JACK ports available\n" "to create a new track or bus.\n" @@ -981,25 +981,25 @@ msgstr "" "Необходимо сохранить %1, выйти и запустить\n" "JACK с увеличенным количеством портов." -#: ardour_ui.cc:1662 +#: ardour_ui.cc:1665 msgid "You cannot add a track or bus without a session already loaded." msgstr "Вы не можете добавить дорожку или шину без открытого сеанса." -#: ardour_ui.cc:1671 +#: ardour_ui.cc:1674 msgid "could not create %1 new audio track" msgid_plural "could not create %1 new audio tracks" msgstr[0] "Не удалось создать %1 новую звуковую дорожку" msgstr[1] "Не удалось создать %2 новых звуковых дорожки" msgstr[2] "Не удалось создать %2 новых звуковых дорожек" -#: ardour_ui.cc:1680 +#: ardour_ui.cc:1683 msgid "could not create %1 new audio bus" msgid_plural "could not create %1 new audio busses" msgstr[0] "Не удалось создать %1 новую звуковую шину" msgstr[1] "Не удалось создать %1 новых звуковых шины" msgstr[2] "Не удалось создать %1 новых звуковых шин" -#: ardour_ui.cc:1804 +#: ardour_ui.cc:1807 msgid "" "Please create one or more tracks before trying to record.\n" "You can do this with the \"Add Track or Bus\" option in the Session menu." @@ -1008,15 +1008,15 @@ msgstr "" "как пытаться что-либо записать.\n" "Используйте меню «Сеанс > Добавить дорожку/шину»." -#: ardour_ui.cc:2181 +#: ardour_ui.cc:2184 msgid "Take Snapshot" msgstr "Создать снимок" -#: ardour_ui.cc:2182 +#: ardour_ui.cc:2185 msgid "Name of new snapshot" msgstr "Название нового снимка" -#: ardour_ui.cc:2206 +#: ardour_ui.cc:2209 msgid "" "To ensure compatibility with various systems\n" "snapshot names may not contain a '%1' character" @@ -1024,27 +1024,27 @@ msgstr "" "Для обеспечения совместимости с различными системами\n" "названия снимков не могут содержать символ '%1'." -#: ardour_ui.cc:2218 +#: ardour_ui.cc:2221 msgid "Confirm Snapshot Overwrite" msgstr "Подтвердите перезапись снимка" -#: ardour_ui.cc:2219 +#: ardour_ui.cc:2222 msgid "A snapshot already exists with that name. Do you want to overwrite it?" msgstr "Снимок с таким названием уже есть. Перезаписать его?" -#: ardour_ui.cc:2222 utils_videotl.cc:67 +#: ardour_ui.cc:2225 utils_videotl.cc:67 msgid "Overwrite" msgstr "Перезаписать" -#: ardour_ui.cc:2256 +#: ardour_ui.cc:2259 msgid "Rename Session" msgstr "Переименовать сеанс" -#: ardour_ui.cc:2257 +#: ardour_ui.cc:2260 msgid "New session name" msgstr "Новое название сеанса" -#: ardour_ui.cc:2271 ardour_ui.cc:2672 ardour_ui.cc:2710 +#: ardour_ui.cc:2274 ardour_ui.cc:2675 ardour_ui.cc:2713 msgid "" "To ensure compatibility with various systems\n" "session names may not contain a '%1' character" @@ -1052,12 +1052,12 @@ msgstr "" "Для обеспечения совместимости с различными системами\n" "названия сеансов не могут содержать символ '%1'." -#: ardour_ui.cc:2279 +#: ardour_ui.cc:2282 msgid "" "That name is already in use by another directory/folder. Please try again." msgstr "" -#: ardour_ui.cc:2288 +#: ardour_ui.cc:2291 msgid "" "Renaming this session failed.\n" "Things could be seriously messed up at this point" @@ -1065,19 +1065,19 @@ msgstr "" "Не удалось переименовать этот сеанс.\n" "Очень может быть, что всё испортилось." -#: ardour_ui.cc:2399 +#: ardour_ui.cc:2402 msgid "Save Template" msgstr "Сохранить шаблон" -#: ardour_ui.cc:2400 +#: ardour_ui.cc:2403 msgid "Name for template:" msgstr "Название шаблона:" -#: ardour_ui.cc:2401 +#: ardour_ui.cc:2404 msgid "-template" msgstr "-шаблон" -#: ardour_ui.cc:2439 +#: ardour_ui.cc:2442 msgid "" "This session\n" "%1\n" @@ -1087,35 +1087,35 @@ msgstr "" "%1\n" "уже существует. Открыть его?" -#: ardour_ui.cc:2449 +#: ardour_ui.cc:2452 msgid "Open Existing Session" msgstr "Открыть существующий сеанс" -#: ardour_ui.cc:2700 +#: ardour_ui.cc:2703 msgid "There is no existing session at \"%1\"" msgstr "По адресу \"%1\" не существующего сеанса" -#: ardour_ui.cc:2792 +#: ardour_ui.cc:2795 msgid "Please wait while %1 loads your session" msgstr "Дождитесь завершения загрузки сеанса в %1" -#: ardour_ui.cc:2807 +#: ardour_ui.cc:2810 msgid "Port Registration Error" msgstr "Ошибка регистрации порта" -#: ardour_ui.cc:2808 +#: ardour_ui.cc:2811 msgid "Click the Close button to try again." msgstr "Щелкните кнопку «Закрыть» для возврата к предыдущему диалогу." -#: ardour_ui.cc:2829 +#: ardour_ui.cc:2832 msgid "Session \"%1 (snapshot %2)\" did not load successfully" msgstr "Не удалось загрузить сеанс \"%1 (снимок %2)\"" -#: ardour_ui.cc:2836 +#: ardour_ui.cc:2839 msgid "Loading Error" msgstr "Ошибка при загрузке" -#: ardour_ui.cc:2855 +#: ardour_ui.cc:2858 msgid "" "This session has been opened in read-only mode.\n" "\n" @@ -1125,24 +1125,24 @@ msgstr "" "\n" "Вы не сможете записывать или сохранять." -#: ardour_ui.cc:2861 +#: ardour_ui.cc:2864 msgid "Read-only Session" msgstr "Сеанс в режиме чтения" -#: ardour_ui.cc:2919 +#: ardour_ui.cc:2922 msgid "Could not create session in \"%1\"" msgstr "Не удалось создать сеанс «%1»" -#: ardour_ui.cc:3019 +#: ardour_ui.cc:3022 msgid "No files were ready for clean-up" msgstr "Нет готовых к удалению звуковых файлов" -#: ardour_ui.cc:3023 ardour_ui.cc:3033 ardour_ui.cc:3166 ardour_ui.cc:3173 +#: ardour_ui.cc:3026 ardour_ui.cc:3036 ardour_ui.cc:3169 ardour_ui.cc:3176 #: ardour_ui_ed.cc:104 msgid "Clean-up" msgstr "Очистить" -#: ardour_ui.cc:3024 +#: ardour_ui.cc:3027 msgid "" "If this seems suprising, \n" "check for any existing snapshots.\n" @@ -1154,19 +1154,19 @@ msgstr "" "Они могут включать области, которым\n" "нужны неиспользуемые файлы." -#: ardour_ui.cc:3083 +#: ardour_ui.cc:3086 msgid "kilo" msgstr "кило" -#: ardour_ui.cc:3086 +#: ardour_ui.cc:3089 msgid "mega" msgstr "мега" -#: ardour_ui.cc:3089 +#: ardour_ui.cc:3092 msgid "giga" msgstr "гига" -#: ardour_ui.cc:3094 +#: ardour_ui.cc:3097 msgid "" "The following file was deleted from %2,\n" "releasing %3 %4bytes of disk space" @@ -1186,7 +1186,7 @@ msgstr[2] "" "освободив при этом %3 %4байт\n" "дискового пространства." -#: ardour_ui.cc:3101 +#: ardour_ui.cc:3104 msgid "" "The following file was not in use and \n" "has been moved to: %2\n" @@ -1233,11 +1233,11 @@ msgstr[2] "" "\n" "дополнительно освободит %3 %4байт дискового пространства.\n" -#: ardour_ui.cc:3161 +#: ardour_ui.cc:3164 msgid "Are you sure you want to clean-up?" msgstr "Вы уверены, что хотите выполнить очистку?" -#: ardour_ui.cc:3168 +#: ardour_ui.cc:3171 msgid "" "Clean-up is a destructive operation.\n" "ALL undo/redo information will be lost if you clean-up.\n" @@ -1248,81 +1248,81 @@ msgstr "" "неиспользуемые звуковые файлы\n" "будут перемещены в «мертвую» зону." -#: ardour_ui.cc:3176 +#: ardour_ui.cc:3179 msgid "CleanupDialog" msgstr "Очистка" -#: ardour_ui.cc:3206 +#: ardour_ui.cc:3209 msgid "Cleaned Files" msgstr "Очищенные файлы" -#: ardour_ui.cc:3223 +#: ardour_ui.cc:3226 msgid "deleted file" msgstr "удалён файл" -#: ardour_ui.cc:3315 +#: ardour_ui.cc:3318 msgid "" "Video-Server was not launched by Ardour. The request to stop it is ignored." msgstr "" "Видеосервер не был запущен Ardour. Запрос на его остановку проигнорирован." -#: ardour_ui.cc:3319 +#: ardour_ui.cc:3322 msgid "Stop Video-Server" msgstr "Остановить видеосервер" -#: ardour_ui.cc:3320 +#: ardour_ui.cc:3323 msgid "Do you really want to stop the Video Server?" msgstr "Вы действительно хотите остановить видеосервер?" -#: ardour_ui.cc:3323 +#: ardour_ui.cc:3326 msgid "Yes, Stop It" msgstr "Да, остановить" -#: ardour_ui.cc:3349 +#: ardour_ui.cc:3352 msgid "The Video Server is already started." msgstr "" -#: ardour_ui.cc:3351 +#: ardour_ui.cc:3354 msgid "" "An external Video Server is configured and can be reached. Not starting a " "new instance." msgstr "" -#: ardour_ui.cc:3359 ardour_ui.cc:3449 +#: ardour_ui.cc:3362 ardour_ui.cc:3452 msgid "" "Could not connect to the Video Server. Start it or configure its access URL " "in Edit -> Preferences." msgstr "" -#: ardour_ui.cc:3383 +#: ardour_ui.cc:3386 msgid "Specified docroot is not an existing directory." msgstr "" -#: ardour_ui.cc:3388 +#: ardour_ui.cc:3391 msgid "Given Video Server is not an executable file." msgstr "" -#: ardour_ui.cc:3421 +#: ardour_ui.cc:3424 msgid "Cannot launch the video-server" msgstr "Не удалось запустить видеосервер" -#: ardour_ui.cc:3430 +#: ardour_ui.cc:3433 msgid "Video-server was started but does not respond to requests..." msgstr "" -#: ardour_ui.cc:3475 editor_audio_import.cc:632 +#: ardour_ui.cc:3478 editor_audio_import.cc:632 msgid "could not open %1" msgstr "не удалось открыть %1" -#: ardour_ui.cc:3479 +#: ardour_ui.cc:3482 msgid "no video-file selected" msgstr "" -#: ardour_ui.cc:3651 +#: ardour_ui.cc:3654 msgid "Recording was stopped because your system could not keep up." msgstr "Запись остановлена из-за недостаточного быстродействия системы" -#: ardour_ui.cc:3680 +#: ardour_ui.cc:3683 msgid "" "The disk system on your computer\n" "was not able to keep up with %1.\n" @@ -1336,7 +1336,7 @@ msgstr "" "В частности ей не удалось записать данные на диск\n" "достаточно быстро для фиксации захваченных данных.\n" -#: ardour_ui.cc:3699 +#: ardour_ui.cc:3702 msgid "" "The disk system on your computer\n" "was not able to keep up with %1.\n" @@ -1350,11 +1350,11 @@ msgstr "" "В частности ей не удалось прочитать данные\n" "с диска достаточно быстро для воспроизведения.\n" -#: ardour_ui.cc:3739 +#: ardour_ui.cc:3742 msgid "Crash Recovery" msgstr "Восстановление данных" -#: ardour_ui.cc:3740 +#: ardour_ui.cc:3743 msgid "" "This session appears to have been in the\n" "middle of recording when %1 or\n" @@ -1370,19 +1370,19 @@ msgstr "" "%1 может восстановить записанные данные,\n" "либо проигнорировать их. Примите решение.\n" -#: ardour_ui.cc:3752 +#: ardour_ui.cc:3755 msgid "Ignore crash data" msgstr "Проигнорировать" -#: ardour_ui.cc:3753 +#: ardour_ui.cc:3756 msgid "Recover from crash" msgstr "Восстановить данные" -#: ardour_ui.cc:3773 +#: ardour_ui.cc:3776 msgid "Sample Rate Mismatch" msgstr "Несовпадение частот сэмплирования" -#: ardour_ui.cc:3774 +#: ardour_ui.cc:3777 msgid "" "This session was created with a sample rate of %1 Hz, but\n" "%2 is currently running at %3 Hz. If you load this session,\n" @@ -1394,23 +1394,23 @@ msgstr "" "Если вы загрузите этот сеанс, звуковые данные могут быть\n" "воспроизведены с некорректной частотой сэмплирования.\n" -#: ardour_ui.cc:3783 +#: ardour_ui.cc:3786 msgid "Do not load session" msgstr "Не загружать сеанс" -#: ardour_ui.cc:3784 +#: ardour_ui.cc:3787 msgid "Load session anyway" msgstr "Все равно загрузить" -#: ardour_ui.cc:3811 +#: ardour_ui.cc:3814 msgid "Could not disconnect from Audio/MIDI engine" msgstr "Не удалось отсоединиться от аудио/MIDI-подсистемы." -#: ardour_ui.cc:3827 ardour_ui.cc:3830 +#: ardour_ui.cc:3830 ardour_ui.cc:3833 msgid "Could not reconnect to the Audio/MIDI engine" msgstr "Не удалось повторно соединиться с аудио/MIDI-подсистемой." -#: ardour_ui.cc:4106 +#: ardour_ui.cc:4109 msgid "" "%4This is a session from an older version of %3%5\n" "\n" @@ -3071,7 +3071,7 @@ msgid "Keep Playlist" msgstr "Сохранить список" #: editor.cc:3881 editor_audio_import.cc:581 editor_ops.cc:5856 -#: engine_dialog.cc:1689 sfdb_freesound_mootcher.cc:69 processor_box.cc:2030 +#: engine_dialog.cc:1713 sfdb_freesound_mootcher.cc:69 processor_box.cc:2030 #: processor_box.cc:2055 msgid "Cancel" msgstr "Отмена" @@ -5676,7 +5676,7 @@ msgstr "" msgid "Device Control Panel" msgstr "Панель управления устройством" -#: engine_dialog.cc:80 engine_dialog.cc:1703 +#: engine_dialog.cc:80 engine_dialog.cc:1727 msgid "Measure" msgstr "" @@ -5736,7 +5736,7 @@ msgid "When satisfied with the results, click the \"Use results\" button." msgstr "" "Если результат вас устраивает, нажмите кнопку «Использовать результаты»." -#: engine_dialog.cc:231 engine_dialog.cc:1705 +#: engine_dialog.cc:231 engine_dialog.cc:1729 msgid "No measurement results yet" msgstr "Пока нет результатов измерения" @@ -5797,89 +5797,96 @@ msgstr "" "Звуковая подсистема %1 была настроена и запущена извне.\n" "Вы не сможете полностью контролировать её." -#: engine_dialog.cc:577 +#: engine_dialog.cc:523 +msgid "" +"Your selected audio configuration is playback- or capture-only.\n" +"\n" +"Latency calibration requires playback and capture" +msgstr "" + +#: engine_dialog.cc:597 msgid "MIDI Inputs" msgstr "MIDI-входы" -#: engine_dialog.cc:594 +#: engine_dialog.cc:614 msgid "MIDI Outputs" msgstr "MIDI-выходы" -#: engine_dialog.cc:678 +#: engine_dialog.cc:698 msgid "all available channels" msgstr "все доступные каналы" -#: engine_dialog.cc:872 +#: engine_dialog.cc:892 #, c-format msgid "%u samples" msgstr "%u сэмплов" -#: engine_dialog.cc:923 +#: engine_dialog.cc:943 #, c-format msgid "(%.1f msecs)" msgstr "(%.1f мс)" -#: engine_dialog.cc:1369 +#: engine_dialog.cc:1391 msgid "Cannot set driver to %1" msgstr "Невозможно использовать %1 в качестве драйвера." -#: engine_dialog.cc:1373 +#: engine_dialog.cc:1395 msgid "Cannot set device name to %1" msgstr "Невозможно %1 в имени устройства." -#: engine_dialog.cc:1377 +#: engine_dialog.cc:1399 msgid "Cannot set sample rate to %1" msgstr "Невозможно использовать %1 в частоты сэмплирования." -#: engine_dialog.cc:1381 +#: engine_dialog.cc:1403 msgid "Cannot set buffer size to %1" msgstr "Невозможно использовать %1 в размера буфера." -#: engine_dialog.cc:1387 +#: engine_dialog.cc:1409 msgid "Cannot set input channels to %1" msgstr "" -#: engine_dialog.cc:1391 +#: engine_dialog.cc:1413 msgid "Cannot set output channels to %1" msgstr "" -#: engine_dialog.cc:1397 +#: engine_dialog.cc:1419 msgid "Cannot set input latency to %1" msgstr "" -#: engine_dialog.cc:1401 +#: engine_dialog.cc:1423 msgid "Cannot set output latency to %1" msgstr "" -#: engine_dialog.cc:1632 +#: engine_dialog.cc:1656 msgid "No signal detected " msgstr "Сигнал не обнаружен" -#: engine_dialog.cc:1645 port_insert_ui.cc:71 port_insert_ui.cc:99 +#: engine_dialog.cc:1669 port_insert_ui.cc:71 port_insert_ui.cc:99 msgid "Disconnected from audio engine" msgstr "Выполнено отсоединение от звукового движка" -#: engine_dialog.cc:1659 +#: engine_dialog.cc:1683 msgid "(signal detection error)" msgstr "(ошибка обнаружения сигнала)" -#: engine_dialog.cc:1665 +#: engine_dialog.cc:1689 msgid "(inverted - bad wiring)" msgstr "" -#: engine_dialog.cc:1675 +#: engine_dialog.cc:1699 msgid "Detected roundtrip latency: %1" msgstr "" -#: engine_dialog.cc:1687 port_insert_ui.cc:135 +#: engine_dialog.cc:1711 port_insert_ui.cc:135 msgid "Detecting ..." msgstr "Выполняется определение..." -#: engine_dialog.cc:1767 +#: engine_dialog.cc:1791 msgid "Disconnect from %1" msgstr "Отсоединить от %1" -#: engine_dialog.cc:1779 +#: engine_dialog.cc:1803 msgid "Connect to %1" msgstr "Соединить с %1" @@ -11362,11 +11369,11 @@ msgstr "" "(Сохранять сеансы можно будет где угодно, просто указанная\n" "папка будет использоваться по умолчанию)" -#: startup.cc:253 +#: startup.cc:254 msgid "Default folder for new sessions" msgstr "Папка для новых сеансов по умолчанию" -#: startup.cc:274 +#: startup.cc:275 msgid "" "While recording instruments or vocals, you probably want to listen to the\n" "signal as well as record it. This is called \"monitoring\". There are\n" @@ -11391,15 +11398,15 @@ msgstr "" "Если вы не понимаете смысл этого параметра, просто используйте \n" "предлагаемый по умолчанию вариант." -#: startup.cc:295 +#: startup.cc:296 msgid "Monitoring Choices" msgstr "Способ мониторинга" -#: startup.cc:318 +#: startup.cc:319 msgid "Use a Master bus directly" msgstr "Использовать мастер-шину напрямую" -#: startup.cc:320 +#: startup.cc:321 msgid "" "Connect the Master bus directly to your hardware outputs. This is preferable " "for simple usage." @@ -11407,11 +11414,11 @@ msgstr "" "Соединить мастер-шину напрямую с выходами звукового интерфейса.\n" "Предпочтительно для простого использования." -#: startup.cc:329 +#: startup.cc:330 msgid "Use an additional Monitor bus" msgstr "Использовать дополнительную шину мониторинга" -#: startup.cc:332 +#: startup.cc:333 msgid "" "Use a Monitor bus between Master bus and hardware outputs for \n" "greater control in monitoring without affecting the mix." @@ -11419,7 +11426,7 @@ msgstr "" "Использовать шину мониторинга между мастер-шиной и выходами \n" "звукового интерфейса для полного контроля без вмешательства в микс." -#: startup.cc:354 +#: startup.cc:355 msgid "" "You can change this preference at any time via the Preferences dialog.\n" "You can also add or remove the monitor section to/from any session.\n" @@ -11432,7 +11439,7 @@ msgstr "" "Если вы не понимаете смысл этого параметра, просто используйте\n" "предлагаемое по умолчанию." -#: startup.cc:365 +#: startup.cc:366 msgid "Monitor Section" msgstr "Секция монитора" @@ -12378,10 +12385,14 @@ msgstr "Размер кэша:" #: video_server_dialog.cc:136 msgid "" -"%1 relies on an external Video Server for the videotimeline.\n" -"The server configured in Edit -> Prefereces -> Video is not reachable.\n" -"Do you want ardour to launch 'harvid' on this machine?" +"%1 relies on an external video server for the videotimeline.\n" +"The server configured in Edit -> Preferences -> Video is not reachable.\n" +"Do you want %1 to launch 'harvid' on this machine?" msgstr "" +"%1 использует внешний видеосервер для видеотаймлайна.\n" +"Сервер, указанный в диалоге «Правка -> Параметры -> Видео»,\n" +"сейчас недоступен.\n" +"Вы хотите, чтобы %1 запустил 'harvid' на этом компьютере?" #: video_server_dialog.cc:176 msgid "Set Video Server Executable" diff --git a/libs/ardour/po/ru.po b/libs/ardour/po/ru.po index 55d7661f8c..9d4f2d3bfa 100644 --- a/libs/ardour/po/ru.po +++ b/libs/ardour/po/ru.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: libardour 3\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-10-15 10:54+0400\n" -"PO-Revision-Date: 2013-10-15 10:54+0300\n" +"POT-Creation-Date: 2013-10-15 21:42+0400\n" +"PO-Revision-Date: 2013-10-15 21:40+0300\n" "Last-Translator: Александр Прокудин \n" "Language-Team: русский <>\n" "Language: \n" @@ -1785,7 +1785,7 @@ msgstr "" #: session_state.cc:208 msgid "Set block size and sample rate" -msgstr "" +msgstr "Установка размера блока и частоты сэмплирования" #: session_state.cc:213 msgid "Using configuration" diff --git a/libs/gtkmm2ext/po/ru.po b/libs/gtkmm2ext/po/ru.po index 6be73a3b88..0d1a8e4092 100644 --- a/libs/gtkmm2ext/po/ru.po +++ b/libs/gtkmm2ext/po/ru.po @@ -7,26 +7,25 @@ msgid "" msgstr "" "Project-Id-Version: gtkmm2ext\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-08-15 15:09-0400\n" -"PO-Revision-Date: 2012-12-31 01:38+0300\n" +"POT-Creation-Date: 2013-10-15 21:33+0400\n" +"PO-Revision-Date: 2013-10-15 21:54+0300\n" "Last-Translator: Александр Прокудин \n" "Language-Team: русский <>\n" -"Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2); 10<=4 && (n%100<10 || n" "%100>=20) ? 1 : 2);\n" +"X-Generator: Poedit 1.5.4\n" #: actions.cc:386 msgid "Unknown action name: %1" msgstr "Неизвестное название действия: %1" #: binding_proxy.cc:84 -#, fuzzy msgid "operate controller now" -msgstr "включить MIDI-контроллер" +msgstr "" #: bindable_button.cc:48 msgid "button cannot watch state of non-existing Controllable\n" @@ -36,7 +35,7 @@ msgstr "" msgid "Log" msgstr "Журнал" -#: gtk_ui.cc:361 +#: gtk_ui.cc:363 msgid "" "\n" "\n" @@ -46,11 +45,11 @@ msgstr "" "\n" "Комбинация клавиш: " -#: gtk_ui.cc:633 +#: gtk_ui.cc:635 msgid "Press To Exit" msgstr "Нажмите для выхода" -#: gtk_ui.cc:669 +#: gtk_ui.cc:671 msgid "I'm sorry %1, I can't do that" msgstr "" @@ -78,21 +77,21 @@ msgstr "Alt" msgid "Meta" msgstr "Meta" -#: keyboard.cc:139 keyboard.cc:531 +#: keyboard.cc:139 keyboard.cc:535 msgid "Unknown" msgstr "Неизвестно" -#: keyboard.cc:542 +#: keyboard.cc:546 msgid "key bindings file not found at \"%2\" or contains errors." msgstr "" #: tearoff.cc:57 msgid "Click to tear this into its own window" -msgstr "" +msgstr "Щелкните, чтобы превратить эту панель инструментов в плавающее окно" #: tearoff.cc:63 msgid "Click to put this back in the main window" -msgstr "" +msgstr "Щелкните, чтобы превратить это плавающее окно в панель инструментов" #: textviewer.cc:34 msgid "Close" -- cgit v1.2.3 From 4404a389965e0b8052c3b6919b34021ea480ba5b Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Tue, 15 Oct 2013 14:55:54 -0400 Subject: prevent button in latency measurement dialog from changing size when relabelled --- gtk2_ardour/engine_dialog.cc | 12 +++++------- gtk2_ardour/engine_dialog.h | 1 + 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/gtk2_ardour/engine_dialog.cc b/gtk2_ardour/engine_dialog.cc index c7d996ae55..7bab4659fb 100644 --- a/gtk2_ardour/engine_dialog.cc +++ b/gtk2_ardour/engine_dialog.cc @@ -77,7 +77,7 @@ EngineControl::EngineControl () , ports_adjustment (128, 8, 1024, 1, 16) , ports_spinner (ports_adjustment) , control_app_button (_("Device Control Panel")) - , lm_measure_button (_("Measure")) + , lm_measure_label (_("Measure")) , lm_use_button (_("Use results")) , lm_back_button (_("Back to settings ... (ignore results)")) , lm_button (_("Calibrate...")) @@ -179,6 +179,8 @@ EngineControl::EngineControl () xopt = AttachOptions(0); + lm_measure_label.set_padding (10, 10); + lm_measure_button.add (lm_measure_label); lm_measure_button.signal_clicked().connect (sigc::mem_fun (*this, &EngineControl::latency_button_clicked)); lm_use_button.signal_clicked().connect (sigc::mem_fun (*this, &EngineControl::use_latency_button_clicked)); lm_back_button.signal_clicked().connect (sigc::bind (sigc::mem_fun (notebook, &Gtk::Notebook::set_current_page), 0)); @@ -191,10 +193,6 @@ EngineControl::EngineControl () Gtk::Misc* l; - if ((l = dynamic_cast(lm_measure_button.get_child())) != 0) { - l->set_padding (10, 10); - } - if ((l = dynamic_cast(lm_use_button.get_child())) != 0) { l->set_padding (10, 10); } @@ -1710,7 +1708,7 @@ EngineControl::start_latency_detection () if (ARDOUR::AudioEngine::instance()->start_latency_detection () == 0) { lm_results.set_markup (string_compose (results_markup, _("Detecting ..."))); latency_timeout = Glib::signal_timeout().connect (mem_fun (*this, &EngineControl::check_latency_measurement), 100); - lm_measure_button.set_label (_("Cancel")); + lm_measure_label.set_text (_("Cancel")); have_lm_results = false; lm_use_button.set_sensitive (false); lm_input_channel_combo.set_sensitive (false); @@ -1724,7 +1722,7 @@ EngineControl::end_latency_detection () { latency_timeout.disconnect (); ARDOUR::AudioEngine::instance()->stop_latency_detection (); - lm_measure_button.set_label (_("Measure")); + lm_measure_label.set_text (_("Measure")); if (!have_lm_results) { lm_results.set_markup (string_compose (results_markup, _("No measurement results yet"))); } else { diff --git a/gtk2_ardour/engine_dialog.h b/gtk2_ardour/engine_dialog.h index 1bf15c2111..31648b6dbb 100644 --- a/gtk2_ardour/engine_dialog.h +++ b/gtk2_ardour/engine_dialog.h @@ -86,6 +86,7 @@ class EngineControl : public ArdourDialog, public PBD::ScopedConnectionList { Gtk::ComboBoxText lm_output_channel_combo; Gtk::ComboBoxText lm_input_channel_combo; + Gtk::Label lm_measure_label; Gtk::Button lm_measure_button; Gtk::Button lm_use_button; Gtk::Button lm_back_button; -- cgit v1.2.3 From 9a630003ff7c43c1389b564920f6dfbd5d32c9ff Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Tue, 15 Oct 2013 15:22:25 -0400 Subject: fix up issues with MIDI I/O option when using jack1 or jack2's most recent options for this --- libs/backends/jack/jack_utils.cc | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/libs/backends/jack/jack_utils.cc b/libs/backends/jack/jack_utils.cc index b7149e84b1..92f175d9cb 100644 --- a/libs/backends/jack/jack_utils.cc +++ b/libs/backends/jack/jack_utils.cc @@ -83,7 +83,8 @@ namespace { const char * const dummy_driver_command_line_name = X_("dummy"); // should we provide more "pretty" names like above? - const char * const alsaint_midi_driver_name = X_("alsa"); + const char * const alsa_seq_midi_driver_name = X_("alsa"); + const char * const alsa_raw_midi_driver_name = X_("alsarawmidi"); const char * const alsaseq_midi_driver_name = X_("seq"); const char * const alsaraw_midi_driver_name = X_("raw"); const char * const winmme_midi_driver_name = X_("winmme"); @@ -744,9 +745,12 @@ ARDOUR::get_jack_command_line_string (JackCommandLineOptions& options, string& c #endif if (options.driver == alsa_driver_name) { - if (options.midi_driver == alsaint_midi_driver_name) { - args.push_back ("-I"); + if (options.midi_driver == alsa_seq_midi_driver_name) { + args.push_back ("-X"); args.push_back ("alsa_midi"); + } else if (options.midi_driver == alsa_raw_midi_driver_name) { + args.push_back ("-X"); + args.push_back ("alsarawmidi"); } } @@ -860,7 +864,7 @@ ARDOUR::get_jack_command_line_string (JackCommandLineOptions& options, string& c if (options.driver == alsa_driver_name || options.driver == coreaudio_driver_name) { - if (options.midi_driver != alsaint_midi_driver_name) { + if (options.midi_driver != alsa_seq_midi_driver_name) { if (!options.midi_driver.empty() && options.midi_driver != get_none_string ()) { args.push_back ("-X"); args.push_back (options.midi_driver); @@ -921,9 +925,10 @@ ARDOUR::enumerate_midi_options () { if (midi_options.empty()) { #ifdef HAVE_ALSA - midi_options.push_back (make_pair (_("ALSA"), alsaint_midi_driver_name)); midi_options.push_back (make_pair (_("(legacy) ALSA raw devices"), alsaraw_midi_driver_name)); midi_options.push_back (make_pair (_("(legacy) ALSA sequencer"), alsaseq_midi_driver_name)); + midi_options.push_back (make_pair (_("ALSA (JACK1, 0.124 and later)"), alsa_seq_midi_driver_name)); + midi_options.push_back (make_pair (_("ALSA (JACK2, 1.9.8 and later)"), alsa_raw_midi_driver_name)); #endif #ifdef HAVE_PORTAUDIO /* Windows folks: what name makes sense here? Are there other -- cgit v1.2.3 From cf808c3e1cf595b99fe41eb196af90abcbaaa5c8 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Tue, 15 Oct 2013 15:32:50 -0400 Subject: another russian translation update --- gtk2_ardour/po/ru.po | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/gtk2_ardour/po/ru.po b/gtk2_ardour/po/ru.po index a0bb16dbf4..2ceaf3c1b0 100644 --- a/gtk2_ardour/po/ru.po +++ b/gtk2_ardour/po/ru.po @@ -11,7 +11,7 @@ msgstr "" "Project-Id-Version: Ardour 3\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-10-15 21:42+0400\n" -"PO-Revision-Date: 2013-10-15 21:46+0300\n" +"PO-Revision-Date: 2013-10-15 23:24+0300\n" "Last-Translator: Александр Прокудин \n" "Language-Team: русский <>\n" "Language: ru\n" @@ -737,9 +737,10 @@ msgid "" "was not fast enough. Try to restart\n" "the audio backend and save the session." msgstr "" -"Звуковая подсистема либо завершила работу, либо отсоединила\n" -" %1, потому что %1 работал недостаточно быстро.\n" -"Попробуйте снова запустить подсистему и сохранить сеанс." +"Звуковая подсистема либо завершила работу, либо\n" +"отсоединила %1, потому что %1\n" +"работал недостаточно быстро. Попробуйте снова\n" +"запустить подсистему и сохранить сеанс." #: ardour_ui.cc:826 startup.cc:379 msgid "%1 is ready for use" @@ -4259,7 +4260,7 @@ msgstr "Вставить смену программы..." #: editor_actions.cc:1888 msgid "Unlink from other copies" -msgstr "" +msgstr "Отсоединить от других копий" #: editor_actions.cc:1889 msgid "Strip Silence..." @@ -4430,7 +4431,7 @@ msgstr "Разница:" #: editor_drag.cc:1722 msgid "Move Video" -msgstr "" +msgstr "Переместить видео" #: editor_drag.cc:2200 msgid "copy meter mark" @@ -5678,7 +5679,7 @@ msgstr "Панель управления устройством" #: engine_dialog.cc:80 engine_dialog.cc:1727 msgid "Measure" -msgstr "" +msgstr "Измерить" #: engine_dialog.cc:81 msgid "Use results" @@ -5686,7 +5687,7 @@ msgstr "Использовать результаты" #: engine_dialog.cc:82 msgid "Back to settings ... (ignore results)" -msgstr "" +msgstr "Закрыть и не использовать" #: engine_dialog.cc:83 msgid "Calibrate..." @@ -5717,7 +5718,7 @@ msgstr "" #: engine_dialog.cc:159 msgid "Select two channels below and connect them using a cable." -msgstr "Выберите нижк два канала и соедините их кабелем." +msgstr "Выберите ниже два канала и соедините их кабелем." #: engine_dialog.cc:164 msgid "Output channel" @@ -5729,7 +5730,7 @@ msgstr "Канал входа" #: engine_dialog.cc:209 msgid "Once the channels are connected, click the \"Measure\" button." -msgstr "Соединив каналы, нажмите кнопку «Измерить задержку»." +msgstr "Соединив каналы, нажмите кнопку «Измерить»." #: engine_dialog.cc:216 msgid "When satisfied with the results, click the \"Use results\" button." @@ -5876,7 +5877,7 @@ msgstr "" #: engine_dialog.cc:1699 msgid "Detected roundtrip latency: %1" -msgstr "" +msgstr "Обнаружена циклическая задержка отклика: %1" #: engine_dialog.cc:1711 port_insert_ui.cc:135 msgid "Detecting ..." @@ -9586,7 +9587,7 @@ msgstr "Точка синхронизации (относительно обла #: region_editor.cc:96 msgid "Sync point (absolute):" -msgstr "Точка синхронизации (абсолютная:" +msgstr "Точка синхронизации (абсолютная):" #: region_editor.cc:98 msgid "File start:" @@ -10032,7 +10033,7 @@ msgstr "Включить записываемость этой дорожки" #: route_ui.cc:133 msgid "make mixer strips show sends to this bus" -msgstr "" +msgstr "Показывать в полосках микшера посылы к этой шине" #: route_ui.cc:138 msgid "Monitor input" @@ -10084,7 +10085,7 @@ msgstr "Назначить выбранным дорожкам и шинам (п #: route_ui.cc:889 msgid "Copy track/bus gains to sends" -msgstr "" +msgstr "Скопировать фейдеры дорожки/шины в посылы" #: route_ui.cc:890 msgid "Set sends gain to -inf" -- cgit v1.2.3 From 31554ebf8495fb88c73cbf9e90ccffb934d7a0d3 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Tue, 15 Oct 2013 21:30:12 -0400 Subject: package small-splash image in binary bundles --- tools/linux_packaging/build | 1 + tools/osx_packaging/osx_build | 1 + 2 files changed, 2 insertions(+) diff --git a/tools/linux_packaging/build b/tools/linux_packaging/build index 3d8b58c97c..3bf793a637 100755 --- a/tools/linux_packaging/build +++ b/tools/linux_packaging/build @@ -531,6 +531,7 @@ fi # share stuff cp -R ../../gtk2_ardour/splash.png $Shared +cp -R ../../gtk2_ardour/small-splash.png $Shared cp -R ../../gtk2_ardour/ArdourMono.ttf $Shared # go through and recursively remove any .svn dirs in the bundle diff --git a/tools/osx_packaging/osx_build b/tools/osx_packaging/osx_build index 8cce6423d6..bab4906f2e 100755 --- a/tools/osx_packaging/osx_build +++ b/tools/osx_packaging/osx_build @@ -409,6 +409,7 @@ cp -r ../../gtk2_ardour/pixmaps $Resources # shared stuff cp -R ../../gtk2_ardour/splash.png $Shared +cp -R ../../gtk2_ardour/small-splash.png $Shared cp -R ../../gtk2_ardour/ArdourMono.ttf $Shared # go through and recursively remove any .svn dirs in the bundle -- cgit v1.2.3 From cb3abec9665b7a69702294e5a6ffdd26f54885c3 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Tue, 15 Oct 2013 22:05:10 -0400 Subject: fix typo from earlier change to conditionalize driver-change in audio backend --- gtk2_ardour/engine_dialog.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gtk2_ardour/engine_dialog.cc b/gtk2_ardour/engine_dialog.cc index 7bab4659fb..b6306ae285 100644 --- a/gtk2_ardour/engine_dialog.cc +++ b/gtk2_ardour/engine_dialog.cc @@ -1290,9 +1290,9 @@ EngineControl::EngineControl () /* backend never started, so we have to force a group of settings. */ - change_driver = true; + change_device = true; if (backend->requires_driver_selection()) { - change_device = true; + change_driver = true; } change_rate = true; change_bufsize = true; -- cgit v1.2.3 From da5a49067839ec32a016bf1b66c3808ad7cbf699 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Wed, 16 Oct 2013 21:28:41 -0400 Subject: remember to fix up libnames in backends, missed the 3.5 tag but this is just the build script --- tools/osx_packaging/osx_build | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/osx_packaging/osx_build b/tools/osx_packaging/osx_build index bab4906f2e..276eb90fe5 100755 --- a/tools/osx_packaging/osx_build +++ b/tools/osx_packaging/osx_build @@ -351,7 +351,7 @@ cp $ARDOURSTACK_ROOT/lib/suil-0/lib* $Frameworks while [ true ] ; do missing=false - for file in $APPROOT/MacOS/* $Frameworks/* $Frameworks/modules/* $Panners/*.dylib $Surfaces/*.dylib $Plugins/*.so ; do + for file in $APPROOT/MacOS/* $Frameworks/* $Frameworks/modules/* $Panners/*.dylib $Backends/*.dylib $Surfaces/*.dylib $Plugins/*.so ; do if ! file $file | grep -qs Mach-O ; then continue fi @@ -438,7 +438,7 @@ done echo "Fixing up library names ..." # now do the same for all the libraries we include -for libdir in $Frameworks $Frameworks/modules $Surfaces $Panners ; do +for libdir in $Frameworks $Frameworks/modules $Surfaces $Panners $Backends ; do libbase=`basename $libdir` -- cgit v1.2.3