From 680ea1118c5892e0e6093e5c41ba190106eca52d Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Thu, 2 Aug 2012 14:33:56 +0000 Subject: [PATCH] merge 13034:13103 from svn+ssh://ardoursvn@subversion.ardour.org/ardour2/branches/3.0 git-svn-id: svn://localhost/ardour2/branches/3.0-SG@13107 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/analysis_window.cc | 2 +- gtk2_ardour/analysis_window.h | 4 +- gtk2_ardour/ardev_common.sh.in | 1 + gtk2_ardour/ardour2_ui_dark_sae.rc.in | 5 +- gtk2_ardour/ardour2_ui_light_sae.rc.in | 5 +- gtk2_ardour/ardour3_ui_dark_sae.rc.in | 5 +- gtk2_ardour/ardour3_ui_light_sae.rc.in | 5 +- gtk2_ardour/ardour3_widget_list.rc | 5 +- gtk2_ardour/ardour_ui.cc | 10 +- gtk2_ardour/ardour_ui_dialogs.cc | 3 + gtk2_ardour/au_pluginui.mm | 19 +- gtk2_ardour/audio_region_view.cc | 15 +- gtk2_ardour/automation_line.cc | 44 +- gtk2_ardour/automation_line.h | 13 +- gtk2_ardour/automation_time_axis.cc | 15 +- gtk2_ardour/canvas_patch_change.cc | 4 +- gtk2_ardour/editor.cc | 2 +- gtk2_ardour/editor_actions.cc | 6 +- gtk2_ardour/editor_cursors.cc | 10 + gtk2_ardour/editor_cursors.h | 3 +- gtk2_ardour/editor_group_tabs.cc | 2 +- gtk2_ardour/editor_mouse.cc | 6 + gtk2_ardour/editor_regions.cc | 1 + gtk2_ardour/editor_routes.cc | 107 +- gtk2_ardour/editor_routes.h | 7 +- gtk2_ardour/editor_summary.cc | 146 +- gtk2_ardour/editor_summary.h | 8 +- gtk2_ardour/export_file_notebook.cc | 4 +- gtk2_ardour/export_filename_selector.cc | 13 +- gtk2_ardour/fft_graph.cc | 4 +- gtk2_ardour/keyeditor.cc | 10 +- gtk2_ardour/keyeditor.h | 1 + gtk2_ardour/location_ui.cc | 3 + gtk2_ardour/midi_region_view.cc | 4 +- gtk2_ardour/mixer_group_tabs.cc | 2 +- gtk2_ardour/mixer_ui.cc | 192 +- gtk2_ardour/mixer_ui.h | 9 +- gtk2_ardour/mnemonic-us.bindings.in | 3 +- gtk2_ardour/po/ru.po | 4914 +++++++++-------- gtk2_ardour/processor_box.cc | 2 +- gtk2_ardour/route_params_ui.cc | 2 +- gtk2_ardour/startup.cc | 1 - gtk2_ardour/strip_silence_dialog.cc | 2 +- gtk2_ardour/strip_silence_dialog.h | 6 +- gtk2_ardour/tempo_dialog.cc | 6 +- gtk2_ardour/utils.cc | 11 +- libs/ardour/amp.cc | 4 +- libs/ardour/analyser.cc | 13 +- libs/ardour/ardour/analyser.h | 6 +- libs/ardour/ardour/audioengine.h | 10 +- libs/ardour/ardour/audioregion.h | 4 + libs/ardour/ardour/audiosource.h | 6 +- libs/ardour/ardour/auditioner.h | 4 +- libs/ardour/ardour/auto_bundle.h | 2 +- libs/ardour/ardour/automatable.h | 4 +- libs/ardour/ardour/automation_control.h | 31 +- libs/ardour/ardour/automation_list.h | 2 +- libs/ardour/ardour/automation_watch.h | 61 + libs/ardour/ardour/buffer_manager.h | 4 +- libs/ardour/ardour/bundle.h | 4 +- libs/ardour/ardour/butler.h | 6 +- libs/ardour/ardour/control_protocol_manager.h | 4 +- libs/ardour/ardour/debug.h | 1 + libs/ardour/ardour/diskstream.h | 4 +- libs/ardour/ardour/file_source.h | 3 +- libs/ardour/ardour/graph.h | 4 +- libs/ardour/ardour/internal_return.h | 2 +- libs/ardour/ardour/io.h | 9 +- libs/ardour/ardour/io_processor.h | 10 +- libs/ardour/ardour/location.h | 8 +- libs/ardour/ardour/logcurve.h | 4 +- libs/ardour/ardour/midi_diskstream.h | 2 +- libs/ardour/ardour/midi_model.h | 8 +- libs/ardour/ardour/midi_source.h | 2 +- libs/ardour/ardour/playlist.h | 12 +- libs/ardour/ardour/process_thread.h | 4 +- libs/ardour/ardour/rc_configuration_vars.h | 2 +- libs/ardour/ardour/region_factory.h | 6 +- libs/ardour/ardour/route.h | 14 +- libs/ardour/ardour/session.h | 14 +- libs/ardour/ardour/session_playlist.h | 2 +- libs/ardour/ardour/session_playlists.h | 4 +- libs/ardour/ardour/session_route.h | 2 +- libs/ardour/ardour/slave.h | 4 +- libs/ardour/ardour/source.h | 8 +- libs/ardour/ardour/source_factory.h | 6 +- libs/ardour/ardour/tempo.h | 6 +- libs/ardour/ardour/thread_buffers.h | 2 +- libs/ardour/ardour/user_bundle.h | 2 +- libs/ardour/ardour/worker.h | 16 +- libs/ardour/audio_diskstream.cc | 8 +- libs/ardour/audio_playlist_source.cc | 2 +- libs/ardour/audio_track.cc | 12 +- libs/ardour/audio_unit.cc | 6 +- libs/ardour/audioengine.cc | 15 +- libs/ardour/audiofilesource.cc | 4 +- libs/ardour/audioregion.cc | 5 +- libs/ardour/audiosource.cc | 24 +- libs/ardour/auditioner.cc | 6 +- libs/ardour/auto_bundle.cc | 8 +- libs/ardour/automatable.cc | 74 +- libs/ardour/automation_control.cc | 67 +- libs/ardour/automation_list.cc | 27 +- libs/ardour/automation_watch.cc | 186 + libs/ardour/buffer_manager.cc | 12 +- libs/ardour/bundle.cc | 40 +- libs/ardour/butler.cc | 6 +- libs/ardour/control_protocol_manager.cc | 16 +- libs/ardour/debug.cc | 1 + libs/ardour/delivery.cc | 2 +- libs/ardour/diskstream.cc | 12 +- libs/ardour/enums.cc | 24 + libs/ardour/export_profile_manager.cc | 3 +- libs/ardour/file_source.cc | 13 +- libs/ardour/globals.cc | 4 + libs/ardour/graph.cc | 6 +- libs/ardour/import.cc | 10 +- libs/ardour/internal_return.cc | 8 +- libs/ardour/io.cc | 54 +- libs/ardour/io_processor.cc | 6 +- libs/ardour/ladspa_plugin.cc | 5 + libs/ardour/location.cc | 26 +- libs/ardour/lv2_plugin.cc | 7 + libs/ardour/midi_diskstream.cc | 16 +- libs/ardour/midi_model.cc | 6 +- libs/ardour/midi_region.cc | 4 +- libs/ardour/midi_source.cc | 8 +- libs/ardour/midi_stretch.cc | 2 +- libs/ardour/midi_track.cc | 8 +- libs/ardour/mtc_slave.cc | 4 +- libs/ardour/plugin_insert.cc | 4 +- libs/ardour/po/ru.po | 1557 +++--- libs/ardour/port_insert.cc | 2 +- libs/ardour/process_thread.cc | 25 +- libs/ardour/region.cc | 2 +- libs/ardour/region_factory.cc | 28 +- libs/ardour/return.cc | 2 +- libs/ardour/route.cc | 217 +- libs/ardour/session.cc | 107 +- libs/ardour/session_butler.cc | 2 +- libs/ardour/session_click.cc | 4 +- libs/ardour/session_directory.cc | 2 + libs/ardour/session_export.cc | 2 +- libs/ardour/session_playlists.cc | 24 +- libs/ardour/session_process.cc | 2 +- libs/ardour/session_state.cc | 33 +- libs/ardour/session_transport.cc | 32 +- libs/ardour/smf_source.cc | 15 +- libs/ardour/source.cc | 8 +- libs/ardour/source_factory.cc | 14 +- libs/ardour/tempo.cc | 85 +- libs/ardour/test/testrunner.cc | 1 + libs/ardour/track.cc | 17 +- libs/ardour/user_bundle.cc | 2 +- libs/ardour/vst_plugin.cc | 4 + libs/ardour/worker.cc | 2 +- libs/ardour/wscript | 1 + .../audiographer/general/threader.h | 14 +- libs/audiographer/tests/test_runner.cc | 1 - libs/evoral/evoral/Control.hpp | 4 +- libs/evoral/evoral/ControlList.hpp | 45 +- libs/evoral/evoral/ControlSet.hpp | 8 +- libs/evoral/evoral/Sequence.hpp | 18 +- libs/evoral/evoral/types.hpp | 1 + libs/evoral/src/Control.cpp | 2 +- libs/evoral/src/ControlList.cpp | 527 +- libs/evoral/src/ControlSet.cpp | 4 +- libs/evoral/src/Curve.cpp | 6 +- libs/evoral/src/Event.cpp | 2 +- libs/evoral/src/Sequence.cpp | 21 +- libs/evoral/src/debug.cpp | 1 + libs/evoral/test/SequenceTest.cpp | 6 +- libs/gtkmm2ext/gtk_ui.cc | 4 +- libs/gtkmm2ext/gtkmm2ext/gtk_ui.h | 6 +- libs/gtkmm2ext/po/ru_RU.po | 80 +- libs/midi++2/ipmidi_port.cc | 2 +- libs/midi++2/jack_midi_port.cc | 2 +- libs/midi++2/midi++/ipmidi_port.h | 4 +- libs/midi++2/midi++/jack_midi_port.h | 2 +- libs/pbd/base_ui.cc | 6 +- libs/pbd/boost_debug.cc | 22 +- libs/pbd/controllable.cc | 10 +- libs/pbd/event_loop.cc | 8 +- libs/pbd/file_manager.cc | 8 +- libs/pbd/id.cc | 6 +- libs/pbd/pbd/abstract_ui.cc | 16 +- libs/pbd/pbd/abstract_ui.h | 10 +- libs/pbd/pbd/base_ui.h | 12 +- libs/pbd/pbd/controllable.h | 4 +- libs/pbd/pbd/event_loop.h | 6 +- libs/pbd/pbd/file_manager.h | 4 +- libs/pbd/pbd/id.h | 4 +- libs/pbd/pbd/pool.h | 12 +- libs/pbd/pbd/rcu.h | 6 +- libs/pbd/pbd/signals.h | 14 +- libs/pbd/pbd/signals.py | 12 +- libs/pbd/pbd/sndfile_manager.h | 2 +- libs/pbd/pbd/stacktrace.h | 12 +- libs/pbd/pbd/stateful.h | 2 +- libs/pbd/pool.cc | 37 +- libs/pbd/pthread_utils.cc | 4 +- libs/pbd/signals.cc | 4 +- libs/pbd/stateful.cc | 4 +- libs/pbd/test/signals_test.cc | 2 + .../tranzport/tranzport_control_protocol.h | 4 +- .../generic_midi_control_protocol.cc | 37 +- .../generic_midi_control_protocol.h | 6 +- .../surfaces/generic_midi/midicontrollable.cc | 4 +- .../surfaces/mackie/mackie_control_protocol.h | 2 - libs/surfaces/mackie/surface_port.h | 1 - .../tranzport/tranzport_control_protocol.h | 4 +- libs/surfaces/wiimote/wiimote.h | 76 +- tools/linux_packaging/ardour.sh.in | 24 +- tools/linux_packaging/build | 5 +- tools/osx_packaging/startup_script | 4 +- wscript | 15 +- 216 files changed, 5535 insertions(+), 4543 deletions(-) create mode 100644 libs/ardour/ardour/automation_watch.h create mode 100644 libs/ardour/automation_watch.cc diff --git a/gtk2_ardour/analysis_window.cc b/gtk2_ardour/analysis_window.cc index c4948f5092..e93fad887c 100644 --- a/gtk2_ardour/analysis_window.cc +++ b/gtk2_ardour/analysis_window.cc @@ -239,7 +239,7 @@ AnalysisWindow::analyze_data (Gtk::Button */*button*/) { track_list_ready = false; { - Glib::Mutex::Lock lm (track_list_lock); + Glib::Threads::Mutex::Lock lm (track_list_lock); // Empty track list & free old graphs clear_tracklist(); diff --git a/gtk2_ardour/analysis_window.h b/gtk2_ardour/analysis_window.h index 19ef84069a..af540b9173 100644 --- a/gtk2_ardour/analysis_window.h +++ b/gtk2_ardour/analysis_window.h @@ -35,7 +35,7 @@ #include -#include +#include #include "ardour/session_handle.h" @@ -116,7 +116,7 @@ private: FFTGraph fft_graph; bool track_list_ready; - Glib::Mutex track_list_lock; + Glib::Threads::Mutex track_list_lock; friend class FFTGraph; }; diff --git a/gtk2_ardour/ardev_common.sh.in b/gtk2_ardour/ardev_common.sh.in index 29a1dff241..210f282e76 100644 --- a/gtk2_ardour/ardev_common.sh.in +++ b/gtk2_ardour/ardev_common.sh.in @@ -17,6 +17,7 @@ export ARDOUR_PANNER_PATH=$libs/panners/2in2out:$libs/panners/1in2out:$libs/pann export ARDOUR_DATA_PATH=$TOP/gtk2_ardour:build/gtk2_ardour:. export ARDOUR_MIDIMAPS_PATH=$TOP/midi_maps:. export ARDOUR_MCP_PATH=$TOP/mcp:. +export ARDOUR_EXPORT_FORMATS_PATH=$TOP/export:. # # even though we set the above variables, ardour requires that these diff --git a/gtk2_ardour/ardour2_ui_dark_sae.rc.in b/gtk2_ardour/ardour2_ui_dark_sae.rc.in index 9cf5cbd46b..64ec9120b6 100644 --- a/gtk2_ardour/ardour2_ui_dark_sae.rc.in +++ b/gtk2_ardour/ardour2_ui_dark_sae.rc.in @@ -1434,10 +1434,7 @@ widget "*NamedSelectionDisplay" style:highest "treeview_display" widget "*SnapshotDisplay" style:highest "treeview_display" widget "*MixerTrackCommentArea" style:highest "option_entry" widget "*MixerPanZone" style:highest "pan_zone" -widget "*MixerTrackDisplayList" style:highest "treeview_display" -widget "*MixerSnapshotDisplayList" style:highest "treeview_display" -widget "*MixerAuxDisplayList" style:highest "treeview_display" -widget "*MixerGroupList" style:highest "treeview_display" +widget "*LHSList" style:highest "treeview_display" widget "*RegionEditorLabel" style:highest "medium_text" widget "*RegionEditorSmallLabel" style:highest "small_text" widget "*RegionEditorEntry" style:highest "medium_entry" diff --git a/gtk2_ardour/ardour2_ui_light_sae.rc.in b/gtk2_ardour/ardour2_ui_light_sae.rc.in index 2a6844c6d0..2cd6360fc4 100644 --- a/gtk2_ardour/ardour2_ui_light_sae.rc.in +++ b/gtk2_ardour/ardour2_ui_light_sae.rc.in @@ -1452,10 +1452,7 @@ widget "*NamedSelectionDisplay" style:highest "treeview_display" widget "*SnapshotDisplay" style:highest "treeview_display" widget "*MixerTrackCommentArea" style:highest "option_entry" widget "*MixerPanZone" style:highest "pan_zone" -widget "*MixerTrackDisplayList" style:highest "treeview_display" -widget "*MixerSnapshotDisplayList" style:highest "treeview_display" -widget "*MixerAuxDisplayList" style:highest "treeview_display" -widget "*MixerGroupList" style:highest "treeview_display" +widget "*LHSList" style:highest "treeview_display" widget "*RegionEditorLabel" style:highest "medium_text" widget "*RegionEditorSmallLabel" style:highest "small_text" widget "*RegionEditorEntry" style:highest "medium_entry" diff --git a/gtk2_ardour/ardour3_ui_dark_sae.rc.in b/gtk2_ardour/ardour3_ui_dark_sae.rc.in index 1cb58e3285..fa8d26f355 100644 --- a/gtk2_ardour/ardour3_ui_dark_sae.rc.in +++ b/gtk2_ardour/ardour3_ui_dark_sae.rc.in @@ -1449,10 +1449,7 @@ widget "*NamedSelectionDisplay" style:highest "treeview_display" widget "*SnapshotDisplay" style:highest "treeview_display" widget "*MixerTrackCommentArea" style:highest "option_entry" widget "*MixerPanZone" style:highest "pan_zone" -widget "*MixerTrackDisplayList" style:highest "treeview_display" -widget "*MixerSnapshotDisplayList" style:highest "treeview_display" -widget "*MixerAuxDisplayList" style:highest "treeview_display" -widget "*MixerGroupList" style:highest "treeview_display" +widget "*LHSList" style:highest "treeview_display" widget "*RegionEditorLabel" style:highest "medium_text" widget "*RegionEditorSmallLabel" style:highest "small_text" widget "*RegionEditorEntry" style:highest "medium_entry" diff --git a/gtk2_ardour/ardour3_ui_light_sae.rc.in b/gtk2_ardour/ardour3_ui_light_sae.rc.in index c1b10a40be..ccbafc9e92 100644 --- a/gtk2_ardour/ardour3_ui_light_sae.rc.in +++ b/gtk2_ardour/ardour3_ui_light_sae.rc.in @@ -1453,10 +1453,7 @@ widget "*NamedSelectionDisplay" style:highest "treeview_display" widget "*SnapshotDisplay" style:highest "treeview_display" widget "*MixerTrackCommentArea" style:highest "option_entry" widget "*MixerPanZone" style:highest "pan_zone" -widget "*MixerTrackDisplayList" style:highest "treeview_display" -widget "*MixerSnapshotDisplayList" style:highest "treeview_display" -widget "*MixerAuxDisplayList" style:highest "treeview_display" -widget "*MixerGroupList" style:highest "treeview_display" +widget "*LHSList" style:highest "treeview_display" widget "*RegionEditorLabel" style:highest "medium_text" widget "*RegionEditorSmallLabel" style:highest "small_text" widget "*RegionEditorEntry" style:highest "medium_entry" diff --git a/gtk2_ardour/ardour3_widget_list.rc b/gtk2_ardour/ardour3_widget_list.rc index 25a48abbcd..2d4ed27530 100644 --- a/gtk2_ardour/ardour3_widget_list.rc +++ b/gtk2_ardour/ardour3_widget_list.rc @@ -226,10 +226,7 @@ widget "*PluginUIClickBox*" style:highest "medium_bold_entry" widget "*PluginSlider" style:highest "plugin_slider" widget "*MixerTrackCommentArea" style:highest "option_entry" widget "*MixerPanZone" style:highest "pan_zone" -widget "*MixerTrackDisplayList" style:highest "treeview_display" -widget "*MixerSnapshotDisplayList" style:highest "treeview_display" -widget "*MixerAuxDisplayList" style:highest "treeview_display" -widget "*MixerGroupList" style:highest "treeview_display" +widget "*LHSList" style:highest "treeview_display" widget "*RegionEditorLabel" style:highest "medium_text" widget "*RegionEditorSmallLabel" style:highest "small_text" widget "*RegionEditorEntry" style:highest "medium_entry" diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc index c5d2bf5c11..3164467a83 100644 --- a/gtk2_ardour/ardour_ui.cc +++ b/gtk2_ardour/ardour_ui.cc @@ -62,6 +62,7 @@ #include "ardour/ardour.h" #include "ardour/audioengine.h" #include "ardour/audiofilesource.h" +#include "ardour/automation_watch.h" #include "ardour/diskstream.h" #include "ardour/filename_extensions.h" #include "ardour/port.h" @@ -794,7 +795,7 @@ If you still wish to quit, please use the\n\n\ */ save_ardour_state (); - loading_message (_("Please wait while Ardour cleans up...")); + loading_message (string_compose (_("Please wait while %1 cleans up..."), PROGRAM_NAME)); if (_session) { // _session->set_deletion_in_progress (); @@ -878,6 +879,7 @@ ARDOUR_UI::ask_about_saving_session (const vector& actions) return -1; } + gint ARDOUR_UI::every_second () { @@ -3519,16 +3521,16 @@ ARDOUR_UI::TransportControllable::set_value (double val) action = X_("Stop"); break; case GotoStart: - action = X_("Goto Start"); + action = X_("GotoStart"); break; case GotoEnd: - action = X_("Goto End"); + action = X_("GotoEnd"); break; case AutoLoop: action = X_("Loop"); break; case PlaySelection: - action = X_("Play Selection"); + action = X_("PlaySelection"); break; case RecordEnable: action = X_("Record"); diff --git a/gtk2_ardour/ardour_ui_dialogs.cc b/gtk2_ardour/ardour_ui_dialogs.cc index 7fc50df673..0116f4e842 100644 --- a/gtk2_ardour/ardour_ui_dialogs.cc +++ b/gtk2_ardour/ardour_ui_dialogs.cc @@ -25,6 +25,7 @@ #include "ardour/session.h" #include "ardour/audioengine.h" +#include "ardour/automation_watch.h" #include "actions.h" #include "add_route_dialog.h" @@ -77,6 +78,8 @@ ARDOUR_UI::set_session (Session *s) } } + AutomationWatch::instance().set_session (s); + if (location_ui->get()) { location_ui->get()->set_session(s); } diff --git a/gtk2_ardour/au_pluginui.mm b/gtk2_ardour/au_pluginui.mm index 0433d2502d..f394e305c8 100644 --- a/gtk2_ardour/au_pluginui.mm +++ b/gtk2_ardour/au_pluginui.mm @@ -542,7 +542,7 @@ AUPluginUI::parent_carbon_window () { #ifdef WITH_CARBON NSWindow* win = get_nswindow (); - int x, y; + Rect windowStructureBoundsRect; if (!win) { return -1; @@ -555,7 +555,11 @@ AUPluginUI::parent_carbon_window () return -1; } - toplevel->get_window()->get_root_origin (x, y); + /* figure out where the cocoa parent window is in carbon-coordinate space, which + differs from both cocoa-coordinate space and GTK-coordinate space + */ + + GetWindowBounds((WindowRef) [win windowRef], kWindowStructureRgn, &windowStructureBoundsRect); /* compute how tall the title bar is, because we have to offset the position of the carbon window by that much. @@ -568,13 +572,16 @@ AUPluginUI::parent_carbon_window () int packing_extra = 6; // this is the total vertical packing in our top level window + /* move into position, based on parent window position */ + MoveWindow (carbon_window, + windowStructureBoundsRect.left, + windowStructureBoundsRect.top + titlebar_height + top_box.get_height() + packing_extra, + false); + ShowWindow (carbon_window); + // create the cocoa window for the carbon one and make it visible cocoa_parent = [[NSWindow alloc] initWithWindowRef: carbon_window]; - PositionWindow (carbon_window, [cocoa_parent windowRef], kWindowCascadeStartAtParentWindowScreen); - MoveWindow (carbon_window, x, y + titlebar_height + top_box.get_height() + packing_extra, false); - ShowWindow (carbon_window); - SetWindowActivationScope (carbon_window, kWindowActivationScopeNone); _notify = [ [NotificationObject alloc] initWithPluginUI:this andCocoaParent:cocoa_parent andTopLevelParent:win ]; diff --git a/gtk2_ardour/audio_region_view.cc b/gtk2_ardour/audio_region_view.cc index 83015c9f63..31a2e4ca06 100644 --- a/gtk2_ardour/audio_region_view.cc +++ b/gtk2_ardour/audio_region_view.cc @@ -267,7 +267,7 @@ void AudioRegionView::region_changed (const PropertyChange& what_changed) { ENSURE_GUI_THREAD (*this, &AudioRegionView::region_changed, what_changed); - // cerr << "AudioRegionView::region_changed() called" << endl; + cerr << "AudioRegionView::region_changed() called" << endl; RegionView::region_changed (what_changed); @@ -275,17 +275,30 @@ AudioRegionView::region_changed (const PropertyChange& what_changed) region_scale_amplitude_changed (); } if (what_changed.contains (ARDOUR::Properties::fade_in)) { + cerr << region()->name() << " in changed\n"; + stacktrace (cerr, 40); fade_in_changed (); } if (what_changed.contains (ARDOUR::Properties::fade_out)) { + cerr << region()->name() << " out changed\n"; fade_out_changed (); } if (what_changed.contains (ARDOUR::Properties::fade_in_active)) { + cerr << region()->name() << " in active changed\n"; fade_in_active_changed (); } if (what_changed.contains (ARDOUR::Properties::fade_out_active)) { + cerr << region()->name() << " out active changed\n"; fade_out_active_changed (); } + if (what_changed.contains (ARDOUR::Properties::fade_in_is_xfade)) { + cerr << region()->name() << " in is xfade changed\n"; + fade_in_changed (); + } + if (what_changed.contains (ARDOUR::Properties::fade_out_is_xfade)) { + cerr << region()->name() << " out is xfade changed\n"; + fade_out_changed (); + } if (what_changed.contains (ARDOUR::Properties::envelope_active)) { envelope_active_changed (); } diff --git a/gtk2_ardour/automation_line.cc b/gtk2_ardour/automation_line.cc index 4a21e7905a..8691e1e2ab 100644 --- a/gtk2_ardour/automation_line.cc +++ b/gtk2_ardour/automation_line.cc @@ -28,6 +28,8 @@ #include "ardour/automation_list.h" #include "ardour/dB.h" +#include "ardour/debug.h" + #include "evoral/Curve.hpp" #include "simplerect.h" @@ -79,6 +81,7 @@ AutomationLine::AutomationLine (const string& name, TimeAxisView& tv, ArdourCanv _visible = Line; update_pending = false; + have_timeout = false; _uses_gain_mapping = false; no_draw = false; _is_boolean = false; @@ -90,7 +93,7 @@ AutomationLine::AutomationLine (const string& name, TimeAxisView& tv, ArdourCanv group->property_y() = 0.0; line = new ArdourCanvas::Line (*group); - line->property_width_pixels() = (guint)1; + line->property_width_pixels() = (guint)3; line->set_data ("line", this); line->signal_event().connect (sigc::mem_fun (*this, &AutomationLine::event_handler)); @@ -123,15 +126,6 @@ AutomationLine::event_handler (GdkEvent* event) return PublicEditor::instance().canvas_line_event (event, line, this); } -void -AutomationLine::queue_reset () -{ - if (!update_pending) { - update_pending = true; - Gtkmm2ext::UI::instance()->call_slot (invalidator (*this), boost::bind (&AutomationLine::reset, this)); - } -} - void AutomationLine::show () { @@ -829,7 +823,12 @@ void AutomationLine::set_colors () void AutomationLine::list_changed () { - queue_reset (); + DEBUG_TRACE (DEBUG::Automation, string_compose ("\tline changed, existing update pending? %1\n", update_pending)); + + if (!update_pending) { + update_pending = true; + Gtkmm2ext::UI::instance()->call_slot (invalidator (*this), boost::bind (&AutomationLine::queue_reset, this)); + } } void @@ -936,7 +935,9 @@ AutomationLine::reset_callback (const Evoral::ControlList& events) void AutomationLine::reset () { + DEBUG_TRACE (DEBUG::Automation, "\t\tLINE RESET\n"); update_pending = false; + have_timeout = false; if (no_draw) { return; @@ -945,6 +946,27 @@ AutomationLine::reset () alist->apply_to_points (*this, &AutomationLine::reset_callback); } +void +AutomationLine::queue_reset () +{ + /* this must be called from the GUI thread + */ + + if (trackview.editor().session()->transport_rolling() && alist->automation_write()) { + /* automation write pass ... defer to a timeout */ + /* redraw in 1/4 second */ + if (!have_timeout) { + DEBUG_TRACE (DEBUG::Automation, "\tqueue timeout\n"); + Glib::signal_timeout().connect (sigc::bind_return (sigc::mem_fun (*this, &AutomationLine::reset), false), 250); + have_timeout = true; + } else { + DEBUG_TRACE (DEBUG::Automation, "\ttimeout already queued, change ignored\n"); + } + } else { + reset (); + } +} + void AutomationLine::clear () { diff --git a/gtk2_ardour/automation_line.h b/gtk2_ardour/automation_line.h index 6be7ccd6b8..73734bcd40 100644 --- a/gtk2_ardour/automation_line.h +++ b/gtk2_ardour/automation_line.h @@ -166,12 +166,13 @@ class AutomationLine : public sigc::trackable, public PBD::StatefulDestructible bool _our_time_converter; VisibleAspects _visible; - - bool _uses_gain_mapping : 1; - bool terminal_points_can_slide : 1; - bool update_pending : 1; - bool no_draw : 1; - bool _is_boolean : 1; + + bool _uses_gain_mapping; + bool terminal_points_can_slide; + bool update_pending; + bool have_timeout; + bool no_draw; + bool _is_boolean; /** true if we did a push at any point during the current drag */ bool did_push; diff --git a/gtk2_ardour/automation_time_axis.cc b/gtk2_ardour/automation_time_axis.cc index 7c9f38aa0f..c72602bf6c 100644 --- a/gtk2_ardour/automation_time_axis.cc +++ b/gtk2_ardour/automation_time_axis.cc @@ -565,6 +565,15 @@ AutomationTimeAxisView::add_automation_event (GdkEvent* event, framepos_t when, return; } + boost::shared_ptr list = _line->the_list (); + + if (list->in_write_pass()) { + /* do not allow the GUI to add automation events during an + automation write pass. + */ + return; + } + double x = 0; _canvas_display->w2i (x, y); @@ -577,7 +586,6 @@ AutomationTimeAxisView::add_automation_event (GdkEvent* event, framepos_t when, _line->view_to_model_coord (x, y); - boost::shared_ptr list = _line->the_list (); _editor.snap_to_with_modifier (when, event); @@ -621,6 +629,11 @@ AutomationTimeAxisView::paste_one (AutomationLine& line, framepos_t pos, float t AutomationSelection::iterator p; boost::shared_ptr alist(line.the_list()); + if (_session->transport_rolling() && alist->automation_write()) { + /* do not paste if this control is in write mode and we're rolling */ + return false; + } + for (p = selection.lines.begin(); p != selection.lines.end() && nth; ++p, --nth) {} if (p == selection.lines.end()) { diff --git a/gtk2_ardour/canvas_patch_change.cc b/gtk2_ardour/canvas_patch_change.cc index 29e30e332d..9e754c953e 100644 --- a/gtk2_ardour/canvas_patch_change.cc +++ b/gtk2_ardour/canvas_patch_change.cc @@ -187,7 +187,7 @@ CanvasPatchChange::on_event (GdkEvent* ev) case GDK_Up: case GDK_KP_Up: case GDK_uparrow: - if (Keyboard::modifier_state_contains (ev->scroll.state, Keyboard::PrimaryModifier)) { + if (Keyboard::modifier_state_contains (ev->key.state, Keyboard::PrimaryModifier)) { _region.previous_bank (*this); } else { _region.previous_patch (*this); @@ -196,7 +196,7 @@ CanvasPatchChange::on_event (GdkEvent* ev) case GDK_Down: case GDK_KP_Down: case GDK_downarrow: - if (Keyboard::modifier_state_contains (ev->scroll.state, Keyboard::PrimaryModifier)) { + if (Keyboard::modifier_state_contains (ev->key.state, Keyboard::PrimaryModifier)) { _region.next_bank (*this); } else { _region.next_patch (*this); diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc index e6b8f748eb..a2a0c109c1 100644 --- a/gtk2_ardour/editor.cc +++ b/gtk2_ardour/editor.cc @@ -4394,7 +4394,7 @@ Editor::set_punch_range (framepos_t start, framepos_t end, string cmd) Location* tpl; if ((tpl = transport_punch_location()) == 0) { - Location* loc = new Location (*_session, start, end, _("Loop"), Location::IsAutoPunch); + Location* loc = new Location (*_session, start, end, _("Punch"), Location::IsAutoPunch); XMLNode &before = _session->locations()->get_state(); _session->locations()->add (loc, true); _session->set_auto_loop_location (loc); diff --git a/gtk2_ardour/editor_actions.cc b/gtk2_ardour/editor_actions.cc index 1f697a1610..e274170982 100644 --- a/gtk2_ardour/editor_actions.cc +++ b/gtk2_ardour/editor_actions.cc @@ -1482,6 +1482,10 @@ Editor::parameter_changed (std::string p) } } else if (p == "show-region-gain") { set_gain_envelope_visibility (); + } else if (p == "remote-model") { + if (_routes) { + _routes->reset_remote_control_ids (); + } } } @@ -1692,7 +1696,7 @@ Editor::register_region_actions () reg_sens (_region_actions, "quantize-region", _("Quantize..."), sigc::mem_fun (*this, &Editor::quantize_region)); reg_sens (_region_actions, "insert-patch-change", _("Insert Patch Change..."), sigc::bind (sigc::mem_fun (*this, &Editor::insert_patch_change), false)); reg_sens (_region_actions, "insert-patch-change-context", _("Insert Patch Change..."), sigc::bind (sigc::mem_fun (*this, &Editor::insert_patch_change), true)); - reg_sens (_region_actions, "fork-region", _("Fork"), sigc::mem_fun (*this, &Editor::fork_region)); + reg_sens (_region_actions, "fork-region", _("Unlink from other copies"), sigc::mem_fun (*this, &Editor::fork_region)); reg_sens (_region_actions, "strip-region-silence", _("Strip Silence..."), sigc::mem_fun (*this, &Editor::strip_region_silence)); reg_sens (_region_actions, "set-selection-from-region", _("Set Range Selection"), sigc::mem_fun (*this, &Editor::set_selection_from_region)); diff --git a/gtk2_ardour/editor_cursors.cc b/gtk2_ardour/editor_cursors.cc index ccacda210f..0d88c1cdbc 100644 --- a/gtk2_ardour/editor_cursors.cc +++ b/gtk2_ardour/editor_cursors.cc @@ -22,6 +22,8 @@ #include +#include "gtkmm2ext/rgb_macros.h" + #include "utils.h" #include "editor_cursors.h" #include "editor.h" @@ -32,6 +34,7 @@ using namespace Gtk; EditorCursor::EditorCursor (Editor& ed, bool (Editor::*callbck)(GdkEvent*,ArdourCanvas::Item*)) : editor (ed), + shade (*editor.cursor_group), canvas_item (*editor.cursor_group), length(1.0) { @@ -46,6 +49,10 @@ EditorCursor::EditorCursor (Editor& ed, bool (Editor::*callbck)(GdkEvent*,Ardour canvas_item.property_arrow_shape_b() = 0.0; canvas_item.property_arrow_shape_c() = 9.0; + shade.property_points() = points; + shade.property_width_pixels() = 7; + shade.property_fill_color_rgba() = RGBA_TO_UINT (255, 255, 255, 75); + canvas_item.set_data ("cursor", this); canvas_item.signal_event().connect (sigc::bind (sigc::mem_fun (ed, callbck), &canvas_item)); current_frame = 1; /* force redraw at 0 */ @@ -69,6 +76,7 @@ EditorCursor::set_position (framepos_t frame) points.back().set_x (new_pos); canvas_item.property_points() = points; + shade.property_points() = points; } current_frame = frame; } @@ -79,6 +87,7 @@ EditorCursor::set_length (double units) length = units; points.back().set_y (points.front().get_y() + length); canvas_item.property_points() = points; + shade.property_points() = points; } void @@ -87,4 +96,5 @@ EditorCursor::set_y_axis (double position) points.front().set_y (position); points.back().set_y (position + length); canvas_item.property_points() = points; + shade.property_points() = points; } diff --git a/gtk2_ardour/editor_cursors.h b/gtk2_ardour/editor_cursors.h index 2e2c654bd1..2b5c46b4a0 100644 --- a/gtk2_ardour/editor_cursors.h +++ b/gtk2_ardour/editor_cursors.h @@ -25,7 +25,8 @@ class EditorCursor { public: Editor& editor; ArdourCanvas::Points points; - ArdourCanvas::Line canvas_item; + ArdourCanvas::Line shade; + ArdourCanvas::Line canvas_item; framepos_t current_frame; double length; diff --git a/gtk2_ardour/editor_group_tabs.cc b/gtk2_ardour/editor_group_tabs.cc index cb85544669..f9e2bc3a19 100644 --- a/gtk2_ardour/editor_group_tabs.cc +++ b/gtk2_ardour/editor_group_tabs.cc @@ -201,5 +201,5 @@ EditorGroupTabs::selected_routes () const void EditorGroupTabs::sync_order_keys () { - _editor->_routes->sync_order_keys_from_model (); + _editor->_routes->sync_order_keys_from_treeview (); } diff --git a/gtk2_ardour/editor_mouse.cc b/gtk2_ardour/editor_mouse.cc index 143f18aaae..61e8b5d035 100644 --- a/gtk2_ardour/editor_mouse.cc +++ b/gtk2_ardour/editor_mouse.cc @@ -421,6 +421,12 @@ Editor::mouse_mode_toggled (MouseMode m) default: break; } + + if (_session && mouse_mode == MouseAudition) { + /* stop transport and reset default speed to avoid oddness with + auditioning */ + _session->request_transport_speed (0.0, true); + } mouse_mode = m; diff --git a/gtk2_ardour/editor_regions.cc b/gtk2_ardour/editor_regions.cc index c57d07965f..bb9b0cf8d9 100644 --- a/gtk2_ardour/editor_regions.cc +++ b/gtk2_ardour/editor_regions.cc @@ -79,6 +79,7 @@ EditorRegions::EditorRegions (Editor* e) { _display.set_size_request (100, -1); _display.set_rules_hint (true); + _display.set_name ("LHSList"); /* Try to prevent single mouse presses from initiating edits. This relies on a hack in gtktreeview.c:gtk_treeview_button_press() diff --git a/gtk2_ardour/editor_routes.cc b/gtk2_ardour/editor_routes.cc index 9b2d613fad..53c8f8aa57 100644 --- a/gtk2_ardour/editor_routes.cc +++ b/gtk2_ardour/editor_routes.cc @@ -221,6 +221,7 @@ EditorRoutes::EditorRoutes (Editor* e) _display.get_selection()->set_mode (SELECTION_SINGLE); _display.get_selection()->set_select_function (sigc::mem_fun (*this, &EditorRoutes::selection_filter)); _display.set_reorderable (true); + _display.set_name (X_("LHSList")); _display.set_rules_hint (true); _display.set_size_request (100, -1); _display.add_object_drag (_columns.route.index(), "routes"); @@ -281,7 +282,7 @@ EditorRoutes::EditorRoutes (Editor* e) _display.set_enable_search (false); - Route::SyncOrderKeys.connect (*this, MISSING_INVALIDATOR, boost::bind (&EditorRoutes::sync_model_from_order_keys, this, _1), gui_context()); + Route::SyncOrderKeys.connect (*this, MISSING_INVALIDATOR, boost::bind (&EditorRoutes::sync_treeview_from_order_keys, this, _1), gui_context()); } bool @@ -550,14 +551,14 @@ EditorRoutes::route_deleted (Gtk::TreeModel::Path const &) as when a row/route is actually deleted. */ DEBUG_TRACE (DEBUG::OrderKeys, "editor routes treeview row deleted\n"); - sync_order_keys_from_model (); + sync_order_keys_from_treeview (); } void EditorRoutes::reordered (TreeModel::Path const &, TreeModel::iterator const &, int* /*what*/) { DEBUG_TRACE (DEBUG::OrderKeys, "editor routes treeview reordered\n"); - sync_order_keys_from_model (); + sync_order_keys_from_treeview (); } void @@ -664,7 +665,7 @@ EditorRoutes::routes_added (list routes) /* now update route order keys from the treeview/track display order */ - sync_order_keys_from_model (); + sync_order_keys_from_treeview (); } void @@ -760,7 +761,7 @@ EditorRoutes::update_visibility () /* force route order keys catch up with visibility changes */ - sync_order_keys_from_model (); + sync_order_keys_from_treeview (); resume_redisplay (); } @@ -799,7 +800,57 @@ EditorRoutes::show_track_in_display (TimeAxisView& tv) } void -EditorRoutes::sync_order_keys_from_model () +EditorRoutes::reset_remote_control_ids () +{ + if (Config->get_remote_model() != EditorOrdered || !_session || _session->deletion_in_progress()) { + return; + } + + TreeModel::Children rows = _model->children(); + + if (rows.empty()) { + return; + } + + + DEBUG_TRACE (DEBUG::OrderKeys, "editor reset remote control ids\n"); + + TreeModel::Children::iterator ri; + bool rid_change = false; + uint32_t rid = 1; + uint32_t invisible_key = UINT32_MAX; + + for (ri = rows.begin(); ri != rows.end(); ++ri) { + + boost::shared_ptr route = (*ri)[_columns.route]; + bool visible = (*ri)[_columns.visible]; + + + if (!route->is_master() && !route->is_monitor()) { + + uint32_t new_rid = (visible ? rid : invisible_key--); + + if (new_rid != route->remote_control_id()) { + route->set_remote_control_id_from_order_key (EditorSort, new_rid); + rid_change = true; + } + + if (visible) { + rid++; + } + + } + } + + if (rid_change) { + /* tell the world that we changed the remote control IDs */ + _session->notify_remote_id_change (); + } +} + + +void +EditorRoutes::sync_order_keys_from_treeview () { if (_ignore_reorder || !_session || _session->deletion_in_progress()) { return; @@ -811,30 +862,60 @@ EditorRoutes::sync_order_keys_from_model () return; } - DEBUG_TRACE (DEBUG::OrderKeys, "editor sync order keys from model\n"); + + DEBUG_TRACE (DEBUG::OrderKeys, "editor sync order keys from treeview\n"); TreeModel::Children::iterator ri; bool changed = false; + bool rid_change = false; uint32_t order = 0; + uint32_t rid = 1; + uint32_t invisible_key = UINT32_MAX; + + for (ri = rows.begin(); ri != rows.end(); ++ri) { - for (ri = rows.begin(); ri != rows.end(); ++ri, ++order) { boost::shared_ptr route = (*ri)[_columns.route]; + bool visible = (*ri)[_columns.visible]; + uint32_t old_key = route->order_key (EditorSort); if (order != old_key) { route->set_order_key (EditorSort, order); + changed = true; } + + if ((Config->get_remote_model() == EditorOrdered) && !route->is_master() && !route->is_monitor()) { + + uint32_t new_rid = (visible ? rid : invisible_key--); + + if (new_rid != route->remote_control_id()) { + route->set_remote_control_id_from_order_key (EditorSort, new_rid); + rid_change = true; + } + + if (visible) { + rid++; + } + + } + + ++order; } if (changed) { /* tell the world that we changed the editor sort keys */ _session->sync_order_keys (EditorSort); } + + if (rid_change) { + /* tell the world that we changed the remote control IDs */ + _session->notify_remote_id_change (); + } } void -EditorRoutes::sync_model_from_order_keys (RouteSortOrderKey src) +EditorRoutes::sync_treeview_from_order_keys (RouteSortOrderKey src) { /* Some route order key(s) for `src' has been changed, make sure that we update out tree/list model and GUI to reflect the change. @@ -891,9 +972,9 @@ EditorRoutes::sync_model_from_order_keys (RouteSortOrderKey src) boost::shared_ptr route = (*ri)[_columns.route]; uint32_t new_order = route->order_key (EditorSort); - DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("editor change order for %1 from %2 to %3\n", + DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("EDITOR change order for %1 from %2 to %3\n", route->name(), old_order, new_order)); - + neworder[new_order] = old_order; if (old_order != new_order) { @@ -962,7 +1043,7 @@ EditorRoutes::set_all_tracks_visibility (bool yn) /* force route order keys catch up with visibility changes */ - sync_order_keys_from_model (); + sync_order_keys_from_treeview (); resume_redisplay (); } @@ -1024,7 +1105,7 @@ EditorRoutes::set_all_audio_midi_visibility (int tracks, bool yn) /* force route order keys catch up with visibility changes */ - sync_order_keys_from_model (); + sync_order_keys_from_treeview (); resume_redisplay (); } diff --git a/gtk2_ardour/editor_routes.h b/gtk2_ardour/editor_routes.h index 008304303f..4933a9496f 100644 --- a/gtk2_ardour/editor_routes.h +++ b/gtk2_ardour/editor_routes.h @@ -59,9 +59,10 @@ public: std::list views () const; void hide_all_tracks (bool); void clear (); - void sync_order_keys_from_model (); -private: + void sync_order_keys_from_treeview (); + void reset_remote_control_ids (); +private: void initial_display (); void on_input_active_changed (std::string const &); void on_tv_rec_enable_changed (std::string const &); @@ -71,7 +72,7 @@ private: void on_tv_solo_safe_toggled (std::string const &); void build_menu (); void show_menu (); - void sync_model_from_order_keys (ARDOUR::RouteSortOrderKey); + void sync_treeview_from_order_keys (ARDOUR::RouteSortOrderKey); void route_deleted (Gtk::TreeModel::Path const &); void visible_changed (std::string const &); void active_changed (std::string const &); diff --git a/gtk2_ardour/editor_summary.cc b/gtk2_ardour/editor_summary.cc index d04e2e7d60..d9fc4b1443 100644 --- a/gtk2_ardour/editor_summary.cc +++ b/gtk2_ardour/editor_summary.cc @@ -18,6 +18,7 @@ */ #include "ardour/session.h" + #include "time_axis_view.h" #include "streamview.h" #include "editor_summary.h" @@ -56,7 +57,8 @@ EditorSummary::EditorSummary (Editor* e) Region::RegionPropertyChanged.connect (region_property_connection, invalidator (*this), boost::bind (&CairoWidget::set_dirty, this), gui_context()); _editor->playhead_cursor->PositionChanged.connect (position_connection, invalidator (*this), boost::bind (&EditorSummary::playhead_position_changed, this, _1), gui_context()); - add_events (Gdk::POINTER_MOTION_MASK); + add_events (Gdk::POINTER_MOTION_MASK|Gdk::KEY_PRESS_MASK|Gdk::KEY_RELEASE_MASK|Gdk::ENTER_NOTIFY_MASK|Gdk::LEAVE_NOTIFY_MASK); + set_flags (get_flags() | Gtk::CAN_FOCUS); } /** Connect to a session. @@ -80,57 +82,6 @@ EditorSummary::set_session (Session* s) } } -/** Handle an expose event. - * @param event Event from GTK. - */ -bool -EditorSummary::on_expose_event (GdkEventExpose* event) -{ - CairoWidget::on_expose_event (event); - - if (_session == 0) { - return false; - } - - cairo_t* cr = gdk_cairo_create (get_window()->gobj()); - - /* Render the view rectangle. If there is an editor visual pending, don't update - the view rectangle now --- wait until the expose event that we'll get after - the visual change. This prevents a flicker. - */ - - if (_editor->pending_visual_change.idle_handler_id < 0) { - get_editor (&_view_rectangle_x, &_view_rectangle_y); - } - - cairo_move_to (cr, _view_rectangle_x.first, _view_rectangle_y.first); - cairo_line_to (cr, _view_rectangle_x.second, _view_rectangle_y.first); - cairo_line_to (cr, _view_rectangle_x.second, _view_rectangle_y.second); - cairo_line_to (cr, _view_rectangle_x.first, _view_rectangle_y.second); - cairo_line_to (cr, _view_rectangle_x.first, _view_rectangle_y.first); - cairo_set_source_rgba (cr, 1, 1, 1, 0.25); - cairo_fill_preserve (cr); - cairo_set_line_width (cr, 1); - cairo_set_source_rgba (cr, 1, 1, 1, 0.5); - cairo_stroke (cr); - - /* Playhead */ - - cairo_set_line_width (cr, 1); - /* XXX: colour should be set from configuration file */ - cairo_set_source_rgba (cr, 1, 0, 0, 1); - - double const p = playhead_frame_to_position (_editor->playhead_cursor->current_frame); - cairo_move_to (cr, p, 0); - cairo_line_to (cr, p, get_height()); - cairo_stroke (cr); - _last_playhead = p; - - cairo_destroy (cr); - - return true; -} - /** Render the required regions to a cairo context. * @param cr Context. */ @@ -212,7 +163,7 @@ EditorSummary::render (cairo_t* cr) cairo_set_line_width (cr, 1); cairo_set_source_rgb (cr, 1, 1, 0); - double const p = (_session->current_start_frame() - _start) * _x_scale; + const double p = (_session->current_start_frame() - _start) * _x_scale; cairo_move_to (cr, p, 0); cairo_line_to (cr, p, get_height()); cairo_stroke (cr); @@ -221,6 +172,39 @@ EditorSummary::render (cairo_t* cr) cairo_move_to (cr, q, 0); cairo_line_to (cr, q, get_height()); cairo_stroke (cr); + + /* Render the view rectangle. If there is an editor visual pending, don't update + the view rectangle now --- wait until the expose event that we'll get after + the visual change. This prevents a flicker. + */ + + if (_editor->pending_visual_change.idle_handler_id < 0) { + get_editor (&_view_rectangle_x, &_view_rectangle_y); + } + + cairo_move_to (cr, _view_rectangle_x.first, _view_rectangle_y.first); + cairo_line_to (cr, _view_rectangle_x.second, _view_rectangle_y.first); + cairo_line_to (cr, _view_rectangle_x.second, _view_rectangle_y.second); + cairo_line_to (cr, _view_rectangle_x.first, _view_rectangle_y.second); + cairo_line_to (cr, _view_rectangle_x.first, _view_rectangle_y.first); + cairo_set_source_rgba (cr, 1, 1, 1, 0.25); + cairo_fill_preserve (cr); + cairo_set_line_width (cr, 1); + cairo_set_source_rgba (cr, 1, 1, 1, 0.5); + cairo_stroke (cr); + + /* Playhead */ + + cairo_set_line_width (cr, 1); + /* XXX: colour should be set from configuration file */ + cairo_set_source_rgba (cr, 1, 0, 0, 1); + + const double ph= playhead_frame_to_position (_editor->playhead_cursor->current_frame); + cairo_move_to (cr, ph, 0); + cairo_line_to (cr, ph, get_height()); + cairo_stroke (cr); + _last_playhead = ph; + } /** Render a region for the summary. @@ -304,6 +288,56 @@ EditorSummary::centre_on_click (GdkEventButton* ev) set_editor (ex, ey); } +bool +EditorSummary::on_enter_notify_event (GdkEventCrossing*) +{ + grab_focus (); + Keyboard::magic_widget_grab_focus (); + return false; +} + +bool +EditorSummary::on_leave_notify_event (GdkEventCrossing*) +{ + /* there are no inferior/child windows, so any leave event means that + we're gone. + */ + Keyboard::magic_widget_drop_focus (); + return false; +} + +bool +EditorSummary::on_key_press_event (GdkEventKey* key) +{ + gint x, y; + + switch (key->keyval) { + case GDK_p: + if (_session) { + get_pointer (x, y); + _session->request_locate ((framepos_t) x / _x_scale, _session->transport_rolling()); + return true; + } + break; + default: + break; + } + + return false; +} + +bool +EditorSummary::on_key_release_event (GdkEventKey* key) +{ + switch (key->keyval) { + case GDK_p: + return true; + default: + break; + } + return false; +} + /** Handle a button press. * @param ev GTK event. */ @@ -953,3 +987,9 @@ EditorSummary::playhead_frame_to_position (framepos_t t) const { return (t - _start) * _x_scale; } + +framepos_t +EditorSummary::position_to_playhead_frame_to_position (double pos) const +{ + return _start + (pos * _x_scale); +} diff --git a/gtk2_ardour/editor_summary.h b/gtk2_ardour/editor_summary.h index 0af8be5c91..c1afc3237f 100644 --- a/gtk2_ardour/editor_summary.h +++ b/gtk2_ardour/editor_summary.h @@ -57,13 +57,16 @@ private: TO_LEFT_OR_RIGHT, OTHERWISE_OUTSIDE }; - - bool on_expose_event (GdkEventExpose *); + void on_size_request (Gtk::Requisition *); bool on_button_press_event (GdkEventButton *); bool on_button_release_event (GdkEventButton *); bool on_motion_notify_event (GdkEventMotion *); bool on_scroll_event (GdkEventScroll *); + bool on_key_press_event (GdkEventKey*); + bool on_key_release_event (GdkEventKey*); + bool on_enter_notify_event (GdkEventCrossing*); + bool on_leave_notify_event (GdkEventCrossing*); void centre_on_click (GdkEventButton *); void render (cairo_t *); @@ -84,6 +87,7 @@ private: void route_gui_changed (std::string); bool suspending_editor_updates () const; double playhead_frame_to_position (framepos_t) const; + framepos_t position_to_playhead_frame_to_position (double pos) const; void set_overlays_dirty (int, int, int, int); framepos_t _start; ///< start frame of the overview diff --git a/gtk2_ardour/export_file_notebook.cc b/gtk2_ardour/export_file_notebook.cc index 2d13da32ba..54c0f628c7 100644 --- a/gtk2_ardour/export_file_notebook.cc +++ b/gtk2_ardour/export_file_notebook.cc @@ -252,7 +252,7 @@ ExportFileNotebook::FilePage::get_format_name () const if (format_state && format_state->format) { return format_state->format->name(); } - return "No format!"; + return _("No format!"); } void @@ -264,7 +264,7 @@ ExportFileNotebook::FilePage::save_format_to_manager (FormatPtr format) void ExportFileNotebook::FilePage::update_tab_label () { - tab_label.set_text (string_compose ("Format %1: %2", tab_number, get_format_name())); + tab_label.set_text (string_compose (_("Format %1: %2"), tab_number, get_format_name())); } void diff --git a/gtk2_ardour/export_filename_selector.cc b/gtk2_ardour/export_filename_selector.cc index 1b85d6585c..4f3a02a015 100644 --- a/gtk2_ardour/export_filename_selector.cc +++ b/gtk2_ardour/export_filename_selector.cc @@ -27,7 +27,7 @@ using namespace ARDOUR; ExportFilenameSelector::ExportFilenameSelector () : - include_label (_("Include in Filename(s):"), Gtk::ALIGN_LEFT), + include_label ("", Gtk::ALIGN_LEFT), label_label (_("Label:"), Gtk::ALIGN_LEFT), session_checkbox (_("Session Name")), @@ -38,10 +38,12 @@ ExportFilenameSelector::ExportFilenameSelector () : example_filename_label ("", Gtk::ALIGN_LEFT) { + include_label.set_markup (_("Build filename(s) from these components:")); + + pack_start (path_hbox, false, false, 12); pack_start (include_label, false, false, 6); pack_start (include_hbox, false, false, 0); - pack_start (path_hbox, false, false, 12); - pack_start (example_filename_label, false, false, 0); + pack_start (example_filename_label, false, false, 12); include_hbox.pack_start (label_label, false, false, 3); include_hbox.pack_start (label_entry, false, false, 3); @@ -207,10 +209,9 @@ void ExportFilenameSelector::set_example_filename (std::string filename) { if (filename == "") { - example_filename_label.set_text (_("Sorry, no example filename can be shown at the moment")); + example_filename_label.set_markup (_("Sorry, no example filename can be shown at the moment")); } else { - example_filename_label.set_text (string_compose(_("Example filename: \"%1\""), - filename)); + example_filename_label.set_markup (string_compose(_("Current (approximate) filename: \"%1\""), filename)); } } diff --git a/gtk2_ardour/fft_graph.cc b/gtk2_ardour/fft_graph.cc index c0171ce57b..2b0b32a28a 100644 --- a/gtk2_ardour/fft_graph.cc +++ b/gtk2_ardour/fft_graph.cc @@ -61,7 +61,7 @@ void FFTGraph::setWindowSize(int windowSize) { if (_a_window) { - Glib::Mutex::Lock lm (_a_window->track_list_lock); + Glib::Threads::Mutex::Lock lm (_a_window->track_list_lock); setWindowSize_internal(windowSize); } else { setWindowSize_internal(windowSize); @@ -268,7 +268,7 @@ FFTGraph::draw_scales(Glib::RefPtr window) void FFTGraph::redraw() { - Glib::Mutex::Lock lm (_a_window->track_list_lock); + Glib::Threads::Mutex::Lock lm (_a_window->track_list_lock); draw_scales(get_window()); diff --git a/gtk2_ardour/keyeditor.cc b/gtk2_ardour/keyeditor.cc index 72207ea27f..07042a1cdf 100644 --- a/gtk2_ardour/keyeditor.cc +++ b/gtk2_ardour/keyeditor.cc @@ -76,7 +76,10 @@ KeyEditor::KeyEditor () scroller.add (view); scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC); - add (scroller); + add (vpacker); + + vpacker.set_spacing (6); + vpacker.pack_start (scroller); if (!ARDOUR::Profile->get_sae()) { @@ -87,14 +90,17 @@ KeyEditor::KeyEditor () unbind_box.pack_start (unbind_button, false, false); unbind_button.signal_clicked().connect (sigc::mem_fun (*this, &KeyEditor::unbind)); - add (unbind_box); + vpacker.pack_start (unbind_box, false, false); unbind_box.show (); unbind_button.show (); } + vpacker.set_border_width (12); + view.show (); scroller.show (); + vpacker.show (); unbind_button.set_sensitive (false); } diff --git a/gtk2_ardour/keyeditor.h b/gtk2_ardour/keyeditor.h index 1fc3c44155..ba374c71b2 100644 --- a/gtk2_ardour/keyeditor.h +++ b/gtk2_ardour/keyeditor.h @@ -35,6 +35,7 @@ class KeyEditor : public ArdourWindow Gtk::TreeModelColumn bindable; }; + Gtk::VBox vpacker; Gtk::ScrolledWindow scroller; Gtk::TreeView view; Glib::RefPtr model; diff --git a/gtk2_ardour/location_ui.cc b/gtk2_ardour/location_ui.cc index 9f027ea8bf..d1b82f8c66 100644 --- a/gtk2_ardour/location_ui.cc +++ b/gtk2_ardour/location_ui.cc @@ -60,6 +60,9 @@ LocationEditRow::LocationEditRow(Session * sess, Location * loc, int32_t num) remove_button.set_image (*manage (new Image (Stock::REMOVE, Gtk::ICON_SIZE_MENU))); + start_to_playhead_button.set_name ("LocationEditCdButton"); + end_to_playhead_button.set_name ("LocationEditCdButton"); + number_label.set_name ("LocationEditNumberLabel"); name_label.set_name ("LocationEditNameLabel"); name_entry.set_name ("LocationEditNameEntry"); diff --git a/gtk2_ardour/midi_region_view.cc b/gtk2_ardour/midi_region_view.cc index 4212a3131c..0ede957a45 100644 --- a/gtk2_ardour/midi_region_view.cc +++ b/gtk2_ardour/midi_region_view.cc @@ -1972,7 +1972,7 @@ MidiRegionView::next_patch (CanvasPatchChange& patch) } void -MidiRegionView::previous_bank (CanvasPatchChange& patch) +MidiRegionView::next_bank (CanvasPatchChange& patch) { if (patch.patch()->program() < 127) { MIDI::Name::PatchPrimaryKey key = patch_change_to_patch_key (patch.patch()); @@ -1984,7 +1984,7 @@ MidiRegionView::previous_bank (CanvasPatchChange& patch) } void -MidiRegionView::next_bank (CanvasPatchChange& patch) +MidiRegionView::previous_bank (CanvasPatchChange& patch) { if (patch.patch()->program() > 0) { MIDI::Name::PatchPrimaryKey key = patch_change_to_patch_key (patch.patch()); diff --git a/gtk2_ardour/mixer_group_tabs.cc b/gtk2_ardour/mixer_group_tabs.cc index f3121a5ca9..4a56b01fcd 100644 --- a/gtk2_ardour/mixer_group_tabs.cc +++ b/gtk2_ardour/mixer_group_tabs.cc @@ -192,5 +192,5 @@ MixerGroupTabs::selected_routes () const void MixerGroupTabs::sync_order_keys () { - _mixer->sync_order_keys_from_model (); + _mixer->sync_order_keys_from_treeview (); } diff --git a/gtk2_ardour/mixer_ui.cc b/gtk2_ardour/mixer_ui.cc index a8278a7654..a141999277 100644 --- a/gtk2_ardour/mixer_ui.cc +++ b/gtk2_ardour/mixer_ui.cc @@ -28,10 +28,9 @@ #include #include "pbd/convert.h" -#include "pbd/stacktrace.h" #include "pbd/unwind.h" -#include +#include #include #include @@ -94,7 +93,7 @@ Mixer_UI::Mixer_UI () /* allow this window to become the key focus window */ set_flags (CAN_FOCUS); - Route::SyncOrderKeys.connect (*this, invalidator (*this), boost::bind (&Mixer_UI::sync_model_from_order_keys, this, _1), gui_context()); + Route::SyncOrderKeys.connect (*this, invalidator (*this), boost::bind (&Mixer_UI::sync_treeview_from_order_keys, this, _1), gui_context()); scroller_base.set_flags (Gtk::CAN_FOCUS); scroller_base.add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK); @@ -122,7 +121,7 @@ Mixer_UI::Mixer_UI () group_display.get_column (1)->set_data (X_("colnum"), GUINT_TO_POINTER(1)); group_display.get_column (0)->set_expand(true); group_display.get_column (1)->set_expand(false); - group_display.set_name ("MixerGroupList"); + group_display.set_name ("LHSList"); group_display.get_selection()->set_mode (Gtk::SELECTION_SINGLE); group_display.set_reorderable (true); group_display.set_headers_visible (true); @@ -366,7 +365,7 @@ Mixer_UI::add_strips (RouteList& routes) } } - sync_order_keys_from_model (); + sync_order_keys_from_treeview (); redisplay_track_list (); } @@ -395,7 +394,52 @@ Mixer_UI::remove_strip (MixerStrip* strip) } void -Mixer_UI::sync_order_keys_from_model () +Mixer_UI::reset_remote_control_ids () +{ + if (Config->get_remote_model() != MixerOrdered || !_session || _session->deletion_in_progress()) { + return; + } + + TreeModel::Children rows = track_model->children(); + + if (rows.empty()) { + return; + } + + DEBUG_TRACE (DEBUG::OrderKeys, "mixer resets remote control ids after remote model change\n"); + + TreeModel::Children::iterator ri; + bool rid_change = false; + uint32_t rid = 1; + uint32_t invisible_key = UINT32_MAX; + + for (ri = rows.begin(); ri != rows.end(); ++ri) { + boost::shared_ptr route = (*ri)[track_columns.route]; + bool visible = (*ri)[track_columns.visible]; + + if (!route->is_master() && !route->is_monitor()) { + + uint32_t new_rid = (visible ? rid : invisible_key--); + + if (new_rid != route->remote_control_id()) { + route->set_remote_control_id_from_order_key (MixerSort, new_rid); + rid_change = true; + } + + if (visible) { + rid++; + } + } + } + + if (rid_change) { + /* tell the world that we changed the remote control IDs */ + _session->notify_remote_id_change (); + } +} + +void +Mixer_UI::sync_order_keys_from_treeview () { if (ignore_reorder || !_session || _session->deletion_in_progress()) { return; @@ -411,28 +455,53 @@ Mixer_UI::sync_order_keys_from_model () TreeModel::Children::iterator ri; bool changed = false; + bool rid_change = false; uint32_t order = 0; + uint32_t rid = 1; + uint32_t invisible_key = UINT32_MAX; - for (ri = rows.begin(); ri != rows.end(); ++ri, ++order) { + for (ri = rows.begin(); ri != rows.end(); ++ri) { boost::shared_ptr route = (*ri)[track_columns.route]; + bool visible = (*ri)[track_columns.visible]; + uint32_t old_key = route->order_key (MixerSort); - if (old_key != order) { + if (order != old_key) { route->set_order_key (MixerSort, order); changed = true; } - order++; + if ((Config->get_remote_model() == MixerOrdered) && !route->is_master() && !route->is_monitor()) { + + uint32_t new_rid = (visible ? rid : invisible_key--); + + if (new_rid != route->remote_control_id()) { + route->set_remote_control_id_from_order_key (MixerSort, new_rid); + rid_change = true; + } + + if (visible) { + rid++; + } + + } + + ++order; } - + if (changed) { /* tell everyone that we changed the mixer sort keys */ _session->sync_order_keys (MixerSort); } + + if (rid_change) { + /* tell the world that we changed the remote control IDs */ + _session->notify_remote_id_change (); + } } void -Mixer_UI::sync_model_from_order_keys (RouteSortOrderKey src) +Mixer_UI::sync_treeview_from_order_keys (RouteSortOrderKey src) { if (!_session || _session->deletion_in_progress()) { return; @@ -467,7 +536,7 @@ Mixer_UI::sync_model_from_order_keys (RouteSortOrderKey src) vector neworder; TreeModel::Children rows = track_model->children(); - uint32_t n = 0; + uint32_t old_order = 0; bool changed = false; if (rows.empty()) { @@ -476,18 +545,18 @@ Mixer_UI::sync_model_from_order_keys (RouteSortOrderKey src) neworder.assign (rows.size(), 0); - for (TreeModel::Children::iterator ri = rows.begin(); ri != rows.end(); ++ri, ++n) { + for (TreeModel::Children::iterator ri = rows.begin(); ri != rows.end(); ++ri, ++old_order) { boost::shared_ptr route = (*ri)[track_columns.route]; - uint32_t o = route->order_key (MixerSort); + uint32_t new_order = route->order_key (MixerSort); - neworder[o] = n; + neworder[new_order] = old_order; - if (o != n) { + if (old_order != new_order) { changed = true; } - DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("mixer change order for %1 to %2\n", - route->name(), route->order_key (MixerSort))); + DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("MIXER change order for %1 from %2 to %3\n", + route->name(), old_order, new_order)); } if (changed) { @@ -681,6 +750,50 @@ Mixer_UI::session_going_away () update_title (); } +void +Mixer_UI::track_visibility_changed (std::string const & path) +{ + if (_session && _session->deletion_in_progress()) { + return; + } + + TreeIter iter; + + if ((iter = track_model->get_iter (path))) { + MixerStrip* strip = (*iter)[track_columns.strip]; + if (strip) { + bool visible = (*iter)[track_columns.visible]; + + if (strip->set_marked_for_display (!visible)) { + update_track_visibility (); + } + } + } +} + +void +Mixer_UI::update_track_visibility () +{ + TreeModel::Children rows = track_model->children(); + TreeModel::Children::iterator i; + + { + Unwinder uw (no_track_list_redisplay, true); + + for (i = rows.begin(); i != rows.end(); ++i) { + MixerStrip *strip = (*i)[track_columns.strip]; + (*i)[track_columns.visible] = strip->marked_for_display (); + } + + /* force route order keys catch up with visibility changes + */ + + sync_order_keys_from_treeview (); + } + + redisplay_track_list (); +} + void Mixer_UI::show_strip (MixerStrip* ms) { @@ -853,7 +966,7 @@ void Mixer_UI::track_list_reorder (const TreeModel::Path&, const TreeModel::iterator&, int* /*new_order*/) { DEBUG_TRACE (DEBUG::OrderKeys, "mixer UI treeview reordered\n"); - sync_order_keys_from_model (); + sync_order_keys_from_treeview (); } void @@ -863,7 +976,7 @@ Mixer_UI::track_list_delete (const Gtk::TreeModel::Path&) as when a row/route is actually deleted. */ DEBUG_TRACE (DEBUG::OrderKeys, "mixer UI treeview row deleted\n"); - sync_order_keys_from_model (); + sync_order_keys_from_treeview (); } void @@ -1010,43 +1123,9 @@ Mixer_UI::track_display_button_press (GdkEventButton* ev) return true; } - TreeIter iter; - TreeModel::Path path; - TreeViewColumn* column; - int cellx; - int celly; - - if (!track_display.get_path_at_pos ((int)ev->x, (int)ev->y, path, column, cellx, celly)) { - return false; - } - - switch (GPOINTER_TO_UINT (column->get_data (X_("colnum")))) { - case 0: - /* allow normal processing to occur */ - return false; - - case 1: /* visibility */ - if ((iter = track_model->get_iter (path))) { - MixerStrip* strip = (*iter)[track_columns.strip]; - if (strip) { - - if (!strip->route()->is_master() && !strip->route()->is_monitor()) { - bool visible = (*iter)[track_columns.visible]; - (*iter)[track_columns.visible] = !visible; - redisplay_track_list (); - } - } - } - return true; - - default: - break; - } - return false; } - void Mixer_UI::build_track_menu () { @@ -1661,6 +1740,8 @@ Mixer_UI::parameter_changed (string const & p) for (list::iterator i = strips.begin(); i != strips.end(); ++i) { (*i)->set_width_enum (s ? Narrow : Wide, this); } + } else if (p == "remote-model") { + reset_remote_control_ids (); } } @@ -1692,7 +1773,7 @@ Mixer_UI::setup_track_display () track_display.get_column (1)->set_data (X_("colnum"), GUINT_TO_POINTER(1)); track_display.get_column (0)->set_expand(true); track_display.get_column (1)->set_expand(false); - track_display.set_name (X_("MixerTrackDisplayList")); + track_display.set_name (X_("LHSList")); track_display.get_selection()->set_mode (Gtk::SELECTION_NONE); track_display.set_reorderable (true); track_display.set_headers_visible (true); @@ -1703,6 +1784,7 @@ Mixer_UI::setup_track_display () CellRendererToggle* track_list_visible_cell = dynamic_cast(track_display.get_column_cell_renderer (1)); track_list_visible_cell->property_activatable() = true; track_list_visible_cell->property_radio() = false; + track_list_visible_cell->signal_toggled().connect (sigc::mem_fun (*this, &Mixer_UI::track_visibility_changed)); track_display.signal_button_press_event().connect (sigc::mem_fun (*this, &Mixer_UI::track_display_button_press), false); diff --git a/gtk2_ardour/mixer_ui.h b/gtk2_ardour/mixer_ui.h index ab0223aa4d..90af35822b 100644 --- a/gtk2_ardour/mixer_ui.h +++ b/gtk2_ardour/mixer_ui.h @@ -166,9 +166,11 @@ class Mixer_UI : public Gtk::Window, public PBD::ScopedConnectionList, public AR void initial_track_display (); void show_track_list_menu (); - + void set_all_strips_visibility (bool yn); void set_all_audio_visibility (int tracks, bool yn); + void track_visibility_changed (std::string const & path); + void update_track_visibility (); void hide_all_routes (); void show_all_routes (); @@ -244,8 +246,9 @@ class Mixer_UI : public Gtk::Window, public PBD::ScopedConnectionList, public AR Width _strip_width; - void sync_order_keys_from_model (); - void sync_model_from_order_keys (ARDOUR::RouteSortOrderKey); + void sync_order_keys_from_treeview (); + void sync_treeview_from_order_keys (ARDOUR::RouteSortOrderKey); + void reset_remote_control_ids (); bool ignore_reorder; void parameter_changed (std::string const &); diff --git a/gtk2_ardour/mnemonic-us.bindings.in b/gtk2_ardour/mnemonic-us.bindings.in index aff1435781..d37a47211f 100644 --- a/gtk2_ardour/mnemonic-us.bindings.in +++ b/gtk2_ardour/mnemonic-us.bindings.in @@ -182,7 +182,8 @@ This mode provides many different operations on both regions and control points, @sess|Common/Save|<@PRIMARY@>s|save session @sess|Main/Snapshot|<@PRIMARY@><@TERTIARY@>s|snapshot session @trans|Editor/track-solo-toggle|<@SECONDARY@>s|toggle track solo status -@rop|Region/duplicate-region|d|duplicate region (once) +@mmode|MouseMode/set-mouse-mode-draw|d|note-draw mode +@rop|Region/duplicate-region|<@SECONDARY@>d|duplicate region (once) @rop|Region/multi-duplicate-region|<@TERTIARY@>d|duplicate region (multi) @select|Editor/select-all-in-punch-range|<@PRIMARY@>d|select all in punch range @vis|Editor/fit-tracks|f|fit tracks vertically diff --git a/gtk2_ardour/po/ru.po b/gtk2_ardour/po/ru.po index 1efddb86aa..6343828177 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: 2012-05-23 07:43+0400\n" -"PO-Revision-Date: 2012-05-23 10:07+0400\n" +"POT-Creation-Date: 2012-07-15 14:56+0400\n" +"PO-Revision-Date: 2012-07-15 15:41+0400\n" "Last-Translator: Александр Прокудин \n" "Language-Team: русский <>\n" "Language: ru\n" @@ -23,186 +23,190 @@ msgstr "" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2); 10<=4 && (n%100<10 || n" "%100>=20) ? 1 : 2);\n" -#: about.cc:123 +#: about.cc:122 msgid "Brian Ahr" msgstr "Brian Ahr" -#: about.cc:124 +#: about.cc:123 msgid "John Anderson" msgstr "John Anderson" -#: about.cc:125 +#: about.cc:124 msgid "Marcus Andersson" msgstr "Marcus Andersson" -#: about.cc:126 +#: about.cc:125 msgid "Nedko Arnaudov" msgstr "Nedko Arnaudov" -#: about.cc:127 +#: about.cc:126 msgid "Hans Baier" msgstr "Hans Baier" -#: about.cc:128 +#: about.cc:127 msgid "Ben Bell" msgstr "Ben Bell" -#: about.cc:129 +#: about.cc:128 msgid "Sakari Bergen" msgstr "Sakari Bergen" -#: about.cc:130 +#: about.cc:129 msgid "Chris Cannam" msgstr "Chris Cannam" -#: about.cc:131 +#: about.cc:130 msgid "Jesse Chappell" msgstr "Jesse Chappell" -#: about.cc:132 +#: about.cc:131 msgid "Thomas Charbonnel" msgstr "Thomas Charbonnel" -#: about.cc:133 +#: about.cc:132 msgid "Sam Chessman" msgstr "Sam Chessman" -#: about.cc:134 +#: about.cc:133 msgid "André Colomb" msgstr "André Colomb" -#: about.cc:135 +#: about.cc:134 msgid "Paul Davis" msgstr "Paul Davis" -#: about.cc:136 +#: about.cc:135 msgid "Gerard van Dongen" msgstr "Gerard van Dongen" -#: about.cc:137 +#: about.cc:136 msgid "Colin Fletcher" msgstr "Colin Fletcher" -#: about.cc:138 +#: about.cc:137 msgid "Dave Flick" msgstr "Dave Flick" -#: about.cc:139 +#: about.cc:138 msgid "Hans Fugal" msgstr "Hans Fugal" -#: about.cc:140 +#: about.cc:139 msgid "Robin Gareus" msgstr "Robin Gareus" -#: about.cc:141 +#: about.cc:140 msgid "Christopher George" msgstr "Christopher George" -#: about.cc:142 +#: about.cc:141 msgid "Chris Goddard" msgstr "Chris Goddard" -#: about.cc:143 +#: about.cc:142 msgid "J. Abelardo Gutierrez" msgstr "J. Abelardo Gutierrez" -#: about.cc:144 +#: about.cc:143 msgid "Jeremy Hall" msgstr "Jeremy Hall" -#: about.cc:145 +#: about.cc:144 msgid "Audun Halland" msgstr "Audun Halland" -#: about.cc:146 +#: about.cc:145 msgid "David Halter" msgstr "David Halter" -#: about.cc:147 +#: about.cc:146 msgid "Steve Harris" msgstr "Steve Harris" -#: about.cc:148 +#: about.cc:147 msgid "Melvin Ray Herr" msgstr "Melvin Ray Herr" -#: about.cc:149 +#: about.cc:148 msgid "Carl Hetherington" msgstr "Carl Hetherington" -#: about.cc:150 +#: about.cc:149 msgid "Rob Holland" msgstr "Rob Holland" -#: about.cc:151 +#: about.cc:150 msgid "Robert Jordens" msgstr "Robert Jordens" -#: about.cc:152 +#: about.cc:151 msgid "Stefan Kersten" msgstr "Stefan Kersten" -#: about.cc:153 +#: about.cc:152 msgid "Armand Klenk" msgstr "Armand Klenk" -#: about.cc:154 +#: about.cc:153 msgid "Matt Krai" msgstr "Matt Krai" -#: about.cc:155 +#: about.cc:154 msgid "Nick Lanham" msgstr "Nick Lanham" -#: about.cc:156 +#: about.cc:155 msgid "Colin Law" msgstr "Colin Law" -#: about.cc:157 +#: about.cc:156 msgid "Joshua Leach" msgstr "Joshua Leach" -#: about.cc:158 +#: about.cc:157 msgid "Ben Loftis" msgstr "Ben Loftis" -#: about.cc:159 +#: about.cc:158 msgid "Nick Mainsbridge" msgstr "Nick Mainsbridge" -#: about.cc:160 +#: about.cc:159 msgid "Tim Mayberry" msgstr "Tim Mayberry" -#: about.cc:161 +#: about.cc:160 msgid "Doug Mclain" msgstr "Doug Mclain" -#: about.cc:162 +#: about.cc:161 msgid "Jack O'Quin" msgstr "Jack O'Quin" -#: about.cc:163 +#: about.cc:162 msgid "Nimal Ratnayake" msgstr "Nimal Ratnayake" -#: about.cc:164 +#: about.cc:163 msgid "David Robillard" msgstr "David Robillard" -#: about.cc:165 +#: about.cc:164 msgid "Taybin Rutkin" msgstr "Taybin Rutkin" -#: about.cc:166 +#: about.cc:165 msgid "Andreas Ruge" msgstr "Andreas Ruge" -#: about.cc:167 +#: about.cc:166 msgid "Sampo Savolainen" msgstr "Sampo Savolainen" +#: about.cc:167 +msgid "Rodrigo Severo" +msgstr "Rodrigo Severo" + #: about.cc:168 msgid "Per Sigmond" msgstr "Per Sigmond" @@ -359,15 +363,15 @@ msgstr "" "Норвежский:\n" "\t Eivind Ødegård\n" -#: about.cc:578 +#: about.cc:577 msgid "Copyright (C) 1999-2012 Paul Davis\n" msgstr "Авторские права © 1999—2012 Paul Davis\n" -#: about.cc:582 +#: about.cc:581 msgid "http://ardour.org/" msgstr "http://ardour.org/" -#: about.cc:583 +#: about.cc:582 msgid "" "%1\n" "(built from revision %2)" @@ -375,27 +379,27 @@ msgstr "" "%1\n" "(собрано из редакции %2)" -#: about.cc:587 +#: about.cc:586 msgid "Config" msgstr "Конфигурация сборки" -#: actions.cc:81 +#: actions.cc:80 msgid "Loading menus from %1" -msgstr "Загружаются меню из %1" +msgstr "Loading menus from %1" -#: actions.cc:84 actions.cc:85 +#: actions.cc:83 actions.cc:84 msgid "badly formatted UI definition file: %1" -msgstr "Некорректно отформатированный файл определения интерфейса: %1" +msgstr "badly formatted UI definition file: %1" -#: actions.cc:87 +#: actions.cc:86 msgid "%1 menu definition file not found" -msgstr "Файл определения меню %1 не найден" +msgstr "%1 menu definition file not found" -#: actions.cc:91 actions.cc:92 +#: actions.cc:90 actions.cc:91 msgid "%1 will not work without a valid ardour.menus file" -msgstr "%1 не будет работать без корректного файла ardour.menus" +msgstr "%1 will not work without a valid ardour.menus file" -#: add_route_dialog.cc:52 route_params_ui.cc:508 +#: add_route_dialog.cc:52 route_params_ui.cc:503 msgid "Add Track or Bus" msgstr "Добавить дорожку или шину" @@ -420,112 +424,118 @@ msgid "MIDI Tracks" msgstr "MIDI-дорожки" #: add_route_dialog.cc:80 +msgid "Audio+MIDI Tracks" +msgstr "Звуковые и MIDI-дорожки" + +#: add_route_dialog.cc:81 msgid "Busses" msgstr "Шины" -#: add_route_dialog.cc:102 +#: add_route_dialog.cc:103 msgid "Add:" msgstr "Добавить:" -#: add_route_dialog.cc:115 startup.cc:799 time_fx_dialog.cc:101 +#: add_route_dialog.cc:116 startup.cc:794 time_fx_dialog.cc:92 msgid "Options" msgstr "Параметры" -#: add_route_dialog.cc:125 bundle_manager.cc:195 region_editor.cc:51 +#: add_route_dialog.cc:126 bundle_manager.cc:194 region_editor.cc:49 #: route_group_dialog.cc:67 msgid "Name:" msgstr "Имя:" -#: add_route_dialog.cc:155 +#: add_route_dialog.cc:156 msgid "Group:" msgstr "Группа:" -#: add_route_dialog.cc:199 add_route_dialog.cc:206 rc_option_editor.cc:1180 -#: rc_option_editor.cc:1182 rc_option_editor.cc:1184 rc_option_editor.cc:1186 -#: rc_option_editor.cc:1210 rc_option_editor.cc:1212 rc_option_editor.cc:1220 -#: rc_option_editor.cc:1222 rc_option_editor.cc:1240 rc_option_editor.cc:1253 -#: rc_option_editor.cc:1255 rc_option_editor.cc:1257 rc_option_editor.cc:1288 -#: rc_option_editor.cc:1290 rc_option_editor.cc:1292 rc_option_editor.cc:1300 -#: rc_option_editor.cc:1308 rc_option_editor.cc:1316 rc_option_editor.cc:1324 +#: add_route_dialog.cc:217 add_route_dialog.cc:226 rc_option_editor.cc:1165 +#: rc_option_editor.cc:1167 rc_option_editor.cc:1169 rc_option_editor.cc:1171 +#: rc_option_editor.cc:1195 rc_option_editor.cc:1197 rc_option_editor.cc:1205 +#: rc_option_editor.cc:1207 rc_option_editor.cc:1225 rc_option_editor.cc:1238 +#: rc_option_editor.cc:1240 rc_option_editor.cc:1242 rc_option_editor.cc:1273 +#: rc_option_editor.cc:1275 rc_option_editor.cc:1277 rc_option_editor.cc:1285 +#: rc_option_editor.cc:1293 rc_option_editor.cc:1301 rc_option_editor.cc:1309 msgid "Audio" -msgstr "Звук" +msgstr "Audio" -#: add_route_dialog.cc:200 add_route_dialog.cc:208 editor_actions.cc:107 -#: missing_file_dialog.cc:55 rc_option_editor.cc:1447 rc_option_editor.cc:1455 -#: rc_option_editor.cc:1463 rc_option_editor.cc:1472 rc_option_editor.cc:1480 -#: rc_option_editor.cc:1488 rc_option_editor.cc:1496 rc_option_editor.cc:1505 -#: rc_option_editor.cc:1514 rc_option_editor.cc:1523 rc_option_editor.cc:1531 -#: rc_option_editor.cc:1539 +#: add_route_dialog.cc:218 add_route_dialog.cc:229 editor_actions.cc:104 +#: missing_file_dialog.cc:55 rc_option_editor.cc:1432 rc_option_editor.cc:1440 +#: rc_option_editor.cc:1448 rc_option_editor.cc:1457 rc_option_editor.cc:1465 +#: rc_option_editor.cc:1473 rc_option_editor.cc:1481 rc_option_editor.cc:1490 +#: rc_option_editor.cc:1499 rc_option_editor.cc:1508 rc_option_editor.cc:1516 +#: rc_option_editor.cc:1524 msgid "MIDI" msgstr "MIDI" -#: add_route_dialog.cc:201 add_route_dialog.cc:210 +#: add_route_dialog.cc:219 add_route_dialog.cc:232 +msgid "Audio+MIDI" +msgstr "Audio+MIDI" + +#: add_route_dialog.cc:220 add_route_dialog.cc:235 msgid "Bus" msgstr "Шина" -#: add_route_dialog.cc:272 add_route_dialog.cc:291 editor_actions.cc:387 -#: time_axis_view.cc:1295 +#: add_route_dialog.cc:299 add_route_dialog.cc:318 editor_actions.cc:384 +#: time_axis_view.cc:1300 msgid "Normal" msgstr "Нормальная" -#: add_route_dialog.cc:275 add_route_dialog.cc:293 +#: add_route_dialog.cc:302 add_route_dialog.cc:320 msgid "Non Layered" msgstr "" -#: add_route_dialog.cc:276 add_route_dialog.cc:295 +#: add_route_dialog.cc:303 add_route_dialog.cc:322 msgid "Tape" msgstr "Пленочная" -#: add_route_dialog.cc:352 +#: add_route_dialog.cc:403 msgid "Mono" msgstr "Моно" -#: add_route_dialog.cc:356 +#: add_route_dialog.cc:407 msgid "Stereo" msgstr "Стерео" -#: add_route_dialog.cc:380 +#: add_route_dialog.cc:431 msgid "3 Channel" msgstr "3 канала" -#: add_route_dialog.cc:384 +#: add_route_dialog.cc:435 msgid "4 Channel" msgstr "4 канала" -#: add_route_dialog.cc:388 +#: add_route_dialog.cc:439 msgid "5 Channel" msgstr "5 каналов" -#: add_route_dialog.cc:392 +#: add_route_dialog.cc:443 msgid "6 Channel" msgstr "6 каналов" -#: add_route_dialog.cc:396 +#: add_route_dialog.cc:447 msgid "8 Channel" msgstr "8 каналов" -#: add_route_dialog.cc:400 +#: add_route_dialog.cc:451 msgid "12 Channel" msgstr "3 канала" -#: add_route_dialog.cc:404 mixer_strip.cc:2076 +#: add_route_dialog.cc:455 mixer_strip.cc:2077 msgid "Custom" msgstr "На заказ" -#: add_route_dialog.cc:437 add_route_dialog.cc:451 route_group_menu.cc:81 +#: add_route_dialog.cc:488 add_route_dialog.cc:502 route_group_menu.cc:81 #, fuzzy msgid "New Group..." msgstr "Создать группу..." -#: add_route_dialog.cc:441 route_group_menu.cc:85 -#, fuzzy +#: add_route_dialog.cc:492 route_group_menu.cc:85 msgid "No Group" msgstr "Нет группы" -#: add_route_dialog.cc:513 -#, fuzzy +#: add_route_dialog.cc:564 msgid "-none-" -msgstr "нет" +msgstr "-нет-" #: ambiguous_file_dialog.cc:30 msgid "Ambiguous File" @@ -589,17 +599,17 @@ msgstr "Нормировать значения" msgid "FFT analysis window" msgstr "Спектральный анализ" -#: analysis_window.cc:60 editor.cc:1865 +#: analysis_window.cc:60 editor.cc:1863 msgid "Spectral Analysis" msgstr "Спектральный анализ" -#: analysis_window.cc:67 editor_actions.cc:140 export_channel_selector.cc:546 -#: session_metadata_dialog.cc:545 +#: analysis_window.cc:67 editor_actions.cc:137 export_channel_selector.cc:543 +#: session_metadata_dialog.cc:544 msgid "Track" msgstr "Дорожка" -#: analysis_window.cc:68 editor_actions.cc:572 mixer_ui.cc:121 -#: mixer_ui.cc:1736 +#: analysis_window.cc:68 editor_actions.cc:569 mixer_ui.cc:120 +#: mixer_ui.cc:1688 msgid "Show" msgstr "Показать" @@ -611,38 +621,38 @@ msgstr "Повторно проанализировать данные" msgid "button cannot watch state of non-existing Controllable\n" msgstr "" -#: ardour_ui.cc:161 +#: ardour_ui.cc:154 #, fuzzy msgid "audition" msgstr "Контроль" -#: ardour_ui.cc:162 +#: ardour_ui.cc:155 #, fuzzy msgid "solo" msgstr "Соло" -#: ardour_ui.cc:163 +#: ardour_ui.cc:156 #, fuzzy msgid "feedback" msgstr "Отклик" -#: ardour_ui.cc:165 +#: ardour_ui.cc:158 msgid "Errors" msgstr "Ошибки" -#: ardour_ui.cc:286 +#: ardour_ui.cc:279 msgid "could not initialize %1." msgstr "Не удалось инициализировать %1." -#: ardour_ui.cc:376 +#: ardour_ui.cc:369 msgid "Starting audio engine" msgstr "Запускается звуковой движок" -#: ardour_ui.cc:675 startup.cc:607 +#: ardour_ui.cc:668 startup.cc:599 msgid "%1 is ready for use" msgstr "%1 готов к работе" -#: ardour_ui.cc:717 +#: ardour_ui.cc:710 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" @@ -658,23 +668,23 @@ msgstr "" "Соответствующая настройка как правило доступна в файле /etc/security/limits." "conf." -#: ardour_ui.cc:726 +#: ardour_ui.cc:719 msgid "Do not show this window again" msgstr "Больше не показывать это окно" -#: ardour_ui.cc:773 +#: ardour_ui.cc:760 msgid "Don't quit" msgstr "Не выходить" -#: ardour_ui.cc:774 +#: ardour_ui.cc:761 msgid "Just quit" msgstr "Просто выйти" -#: ardour_ui.cc:775 +#: ardour_ui.cc:762 msgid "Save and quit" msgstr "Сохранить и выйти" -#: ardour_ui.cc:785 +#: ardour_ui.cc:772 msgid "" "%1 was unable to save your session.\n" "\n" @@ -689,11 +699,15 @@ msgstr "" "\n" "«Просто выйти»." -#: ardour_ui.cc:827 +#: ardour_ui.cc:798 +msgid "Please wait while Ardour cleans up..." +msgstr "Дождитесь завершения подчистки сеанса в Ardour" + +#: ardour_ui.cc:816 msgid "Unsaved Session" msgstr "Сеанс не сохранён" -#: ardour_ui.cc:848 +#: ardour_ui.cc:837 msgid "" "The session \"%1\"\n" "has not been saved.\n" @@ -711,7 +725,7 @@ msgstr "" "\n" "Что вы хотите сделать?" -#: ardour_ui.cc:851 +#: ardour_ui.cc:840 msgid "" "The snapshot \"%1\"\n" "has not been saved.\n" @@ -729,74 +743,74 @@ msgstr "" "\n" "Что вы хотите сделать?" -#: ardour_ui.cc:865 +#: ardour_ui.cc:854 msgid "Prompter" msgstr "" -#: ardour_ui.cc:928 +#: ardour_ui.cc:918 msgid "disconnected" msgstr "отсоединено" -#: ardour_ui.cc:935 +#: ardour_ui.cc:925 #, c-format msgid "JACK: %.1f kHz / %4.1f ms" msgstr "JACK: %.1f КГц / %4.1f мс" -#: ardour_ui.cc:939 +#: ardour_ui.cc:929 #, c-format msgid "JACK: % kHz / %4.1f ms" msgstr "JACK: % КГц / %4.1f мс" -#: ardour_ui.cc:957 +#: ardour_ui.cc:947 msgid "File:" msgstr "Файл:" -#: ardour_ui.cc:961 +#: ardour_ui.cc:951 msgid "BWF" msgstr "BWF" -#: ardour_ui.cc:964 +#: ardour_ui.cc:954 msgid "WAV" msgstr "WAV" -#: ardour_ui.cc:967 +#: ardour_ui.cc:957 msgid "WAV64" msgstr "WAV64" -#: ardour_ui.cc:970 session_option_editor.cc:236 +#: ardour_ui.cc:960 session_option_editor.cc:232 msgid "CAF" msgstr "CAF" -#: ardour_ui.cc:973 +#: ardour_ui.cc:963 msgid "AIFF" msgstr "AIFF" -#: ardour_ui.cc:976 +#: ardour_ui.cc:966 msgid "iXML" msgstr "iXML" -#: ardour_ui.cc:979 +#: ardour_ui.cc:969 msgid "RF64" msgstr "RF64" -#: ardour_ui.cc:987 +#: ardour_ui.cc:977 msgid "32-float" msgstr "32-float" -#: ardour_ui.cc:990 +#: ardour_ui.cc:980 msgid "24-int" msgstr "24-int" -#: ardour_ui.cc:993 +#: ardour_ui.cc:983 msgid "16-int" msgstr "16-int" -#: ardour_ui.cc:1012 +#: ardour_ui.cc:1002 #, c-format msgid "DSP: %5.1f%%" msgstr "ЦП: %5.1f%%" -#: ardour_ui.cc:1031 +#: ardour_ui.cc:1021 #, c-format msgid "" "Buffers: p:" @@ -807,24 +821,28 @@ msgstr "" "%% c:" "%%%" -#: ardour_ui.cc:1066 +#: ardour_ui.cc:1057 +msgid "Disk: Unknown" +msgstr "На диске: неизвестно" + +#: ardour_ui.cc:1059 msgid "Disk: 24hrs+" msgstr "На диске: 24ч+" -#: ardour_ui.cc:1082 +#: ardour_ui.cc:1077 msgid "Disk: >24 hrs" msgstr "На диске: >24ч" -#: ardour_ui.cc:1093 +#: ardour_ui.cc:1088 #, c-format msgid "Disk: %02dh:%02dm:%02ds" msgstr "На диске: %02dч:%02dм:%02dс" -#: ardour_ui.cc:1205 ardour_ui.cc:1214 startup.cc:1014 +#: ardour_ui.cc:1200 ardour_ui.cc:1209 startup.cc:1009 msgid "Recent Sessions" msgstr "Недавние сеансы" -#: ardour_ui.cc:1296 +#: ardour_ui.cc:1291 msgid "" "%1 is not connected to JACK\n" "You cannot open or close sessions in this condition" @@ -832,30 +850,30 @@ msgstr "" "%1 не соединен с JACK.\n" "Открытие и закрытие сеансов невозможно." -#: ardour_ui.cc:1323 +#: ardour_ui.cc:1318 msgid "Open Session" msgstr "Открыть сеанс" -#: ardour_ui.cc:1341 session_import_dialog.cc:169 -#: session_metadata_dialog.cc:728 +#: ardour_ui.cc:1336 session_import_dialog.cc:169 +#: session_metadata_dialog.cc:727 startup.cc:1038 msgid "%1 sessions" msgstr "Cеансы %1" -#: ardour_ui.cc:1377 +#: ardour_ui.cc:1373 msgid "You cannot add a track without a session already loaded." msgstr "Вы не можете добавить дорожку без загруженного сеанса." -#: ardour_ui.cc:1388 +#: ardour_ui.cc:1382 #, fuzzy -msgid "could not create a new midi track" +msgid "could not create a new mixed track" msgstr "Не удалось создать новую MIDI-дорожку" -#: ardour_ui.cc:1390 +#: ardour_ui.cc:1384 #, fuzzy -msgid "could not create %1 new midi tracks" +msgid "could not create %1 new mixed tracks" msgstr "не удалось создать новый аудиотрек" -#: ardour_ui.cc:1399 ardour_ui.cc:1456 +#: ardour_ui.cc:1391 ardour_ui.cc:1459 #, fuzzy msgid "" "There are insufficient JACK ports available\n" @@ -868,37 +886,37 @@ msgstr "" "Необходимо сохранить сеанс, выйти и\n" "запустить JACK с большим количеством портов." -#: ardour_ui.cc:1423 +#: ardour_ui.cc:1426 msgid "You cannot add a track or bus without a session already loaded." msgstr "Вы не можете добавить дорожку или шину без открытого сеанса." -#: ardour_ui.cc:1433 +#: ardour_ui.cc:1436 msgid "could not create a new audio track" msgstr "Не удалось создать новую звуковую дорожку" -#: ardour_ui.cc:1435 +#: ardour_ui.cc:1438 msgid "could only create %1 of %2 new audio %3" msgstr "" -#: ardour_ui.cc:1436 editor_ops.cc:6345 +#: ardour_ui.cc:1439 editor_ops.cc:6364 msgid "tracks" msgstr "дорожек" -#: ardour_ui.cc:1436 editor_ops.cc:6351 +#: ardour_ui.cc:1439 editor_ops.cc:6370 msgid "busses" msgstr "шин" -#: ardour_ui.cc:1446 +#: ardour_ui.cc:1449 #, fuzzy msgid "could not create a new audio bus" msgstr "Не удалось создать новую звуковую дорожку" -#: ardour_ui.cc:1448 +#: ardour_ui.cc:1451 #, fuzzy msgid "could not create %1 new audio busses" msgstr "Не удалось создать %1 новых звуковых дорожек" -#: ardour_ui.cc:1565 +#: ardour_ui.cc:1568 #, fuzzy msgid "" "Please create one or more tracks before trying to record.\n" @@ -908,14 +926,14 @@ msgstr "" "как пытаться что-либо записать.\n" "Используйте меню «Сеанс > Добавить дорожку/шину»." -#: ardour_ui.cc:1943 +#: ardour_ui.cc:1946 msgid "" "The audio backend (JACK) was shutdown because:\n" "\n" "%1" msgstr "" -#: ardour_ui.cc:1945 +#: ardour_ui.cc:1948 msgid "" "JACK has either been shutdown or it\n" "disconnected %1 because %1\n" @@ -926,19 +944,19 @@ msgstr "" "с %1 и отсоединил его. Необходимо перезапустить \n" "JACK, восстановить соединение и сохранить сеанс." -#: ardour_ui.cc:1970 +#: ardour_ui.cc:1973 msgid "Unable to start the session running" msgstr "Невозможно запустить уже выполняемый сеанс" -#: ardour_ui.cc:2046 +#: ardour_ui.cc:2049 msgid "Take Snapshot" msgstr "Создать снимок" -#: ardour_ui.cc:2047 +#: ardour_ui.cc:2050 msgid "Name of new snapshot" msgstr "Название нового снимка" -#: ardour_ui.cc:2071 +#: ardour_ui.cc:2074 #, fuzzy msgid "" "To ensure compatibility with various systems\n" @@ -947,27 +965,27 @@ msgstr "" "Для обеспечения совместимости с различными системами\n" "названия снимков не могут содержать символ '/'." -#: ardour_ui.cc:2083 +#: ardour_ui.cc:2086 msgid "Confirm Snapshot Overwrite" msgstr "Подтвердите перезапись снимка" -#: ardour_ui.cc:2084 +#: ardour_ui.cc:2087 msgid "A snapshot already exists with that name. Do you want to overwrite it?" msgstr "Снимок с таким названием уже есть. Перезаписать его?" -#: ardour_ui.cc:2087 +#: ardour_ui.cc:2090 msgid "Overwrite" msgstr "Перезаписать" -#: ardour_ui.cc:2121 +#: ardour_ui.cc:2124 msgid "Rename Session" msgstr "Переименовать сеанс" -#: ardour_ui.cc:2122 +#: ardour_ui.cc:2125 msgid "New session name" msgstr "Новое название сеанса" -#: ardour_ui.cc:2136 ardour_ui.cc:2501 ardour_ui.cc:2547 +#: ardour_ui.cc:2139 ardour_ui.cc:2490 ardour_ui.cc:2536 #, fuzzy msgid "" "To ensure compatibility with various systems\n" @@ -976,30 +994,30 @@ msgstr "" "Для обеспечения совместимости с различными системами\n" "названия сеансов не могут содержать символ '/'." -#: ardour_ui.cc:2144 +#: ardour_ui.cc:2147 msgid "" "That name is already in use by another directory/folder. Please try again." msgstr "" -#: ardour_ui.cc:2153 +#: ardour_ui.cc:2156 msgid "" "Renaming this session failed.\n" "Things could be seriously messed up at this point" msgstr "" -#: ardour_ui.cc:2268 +#: ardour_ui.cc:2271 msgid "Save Template" msgstr "Сохранить шаблон" -#: ardour_ui.cc:2269 +#: ardour_ui.cc:2272 msgid "Name for template:" msgstr "Название шаблона:" -#: ardour_ui.cc:2270 +#: ardour_ui.cc:2273 msgid "-template" msgstr "-шаблон" -#: ardour_ui.cc:2308 +#: ardour_ui.cc:2311 msgid "" "This session\n" "%1\n" @@ -1009,54 +1027,53 @@ msgstr "" "%1\n" "уже существует. Открыть его?" -#: ardour_ui.cc:2318 +#: ardour_ui.cc:2321 msgid "Open Existing Session" msgstr "Открыть существующий сеанс" -#: ardour_ui.cc:2538 +#: ardour_ui.cc:2527 msgid "There is no existing session at \"%1\"" msgstr "По адресу \"%1\" не существующего сеанса" -#: ardour_ui.cc:2625 +#: ardour_ui.cc:2614 msgid "Please wait while %1 loads your session" msgstr "Дождитесь завершения загрузки сеанса в %1" -#: ardour_ui.cc:2640 +#: ardour_ui.cc:2629 msgid "Port Registration Error" msgstr "Ошибка регистрации порта" -#: ardour_ui.cc:2641 +#: ardour_ui.cc:2630 msgid "Click the Close button to try again." msgstr "Щелкните кнопку «Закрыть» для возврата к предыдущему диалогу." -#: ardour_ui.cc:2662 +#: ardour_ui.cc:2651 msgid "Session \"%1 (snapshot %2)\" did not load successfully" msgstr "Не удалось загрузить сеанс \"%1 (снимок %2)\"" -#: ardour_ui.cc:2668 +#: ardour_ui.cc:2657 msgid "Loading Error" msgstr "Ошибка при загрузке" -#: ardour_ui.cc:2669 +#: ardour_ui.cc:2658 msgid "Click the Refresh button to try again." msgstr "Щёлкните кнопку «Обновить» для повторной попытки." -#: ardour_ui.cc:2751 +#: ardour_ui.cc:2740 msgid "Could not create session in \"%1\"" msgstr "Не удалось создать сеанс «%1»" -#: ardour_ui.cc:2870 -#, fuzzy +#: ardour_ui.cc:2868 msgid "No files were ready for clean-up" msgstr "Нет готовых к удалению звуковых файлов" -#: ardour_ui.cc:2874 ardour_ui.cc:2884 ardour_ui.cc:3001 ardour_ui.cc:3008 +#: ardour_ui.cc:2872 ardour_ui.cc:2882 ardour_ui.cc:2999 ardour_ui.cc:3006 #: ardour_ui_ed.cc:104 #, fuzzy msgid "Clean-up" msgstr "Очистить" -#: ardour_ui.cc:2875 +#: ardour_ui.cc:2873 msgid "" "If this seems suprising, \n" "check for any existing snapshots.\n" @@ -1068,12 +1085,12 @@ msgstr "" "Они могут включать области, которым\n" "нужны неиспользуемые файлы." -#: ardour_ui.cc:2996 +#: ardour_ui.cc:2994 #, fuzzy msgid "Are you sure you want to clean-up?" msgstr "Вы уверены, что хотите выполнить очистку?" -#: ardour_ui.cc:3003 +#: ardour_ui.cc:3001 #, fuzzy msgid "" "Clean-up is a destructive operation.\n" @@ -1085,16 +1102,16 @@ msgstr "" "После очистки все неиспользуемые звуковые файлы\n" "будут перемещены в зону «мертвых» звуков." -#: ardour_ui.cc:3011 +#: ardour_ui.cc:3009 #, fuzzy msgid "CleanupDialog" msgstr "Очистка" -#: ardour_ui.cc:3042 +#: ardour_ui.cc:3040 msgid "Cleaned Files" msgstr "Очищенные файлы" -#: ardour_ui.cc:3043 +#: ardour_ui.cc:3041 #, fuzzy msgid "" "The following %1 files were not in use and \n" @@ -1113,7 +1130,7 @@ msgstr "" "Последующая очистка корзины освободит\n" "%2 мегабайт места на диске.\n" -#: ardour_ui.cc:3051 +#: ardour_ui.cc:3049 #, fuzzy msgid "" "The following file was not in use and \n" @@ -1131,11 +1148,11 @@ msgstr "" "Последующая очистка корзины освободит\n" "%2 мегабайт места на диске.\n" -#: ardour_ui.cc:3078 +#: ardour_ui.cc:3076 msgid "deleted file" msgstr "удалён файл" -#: ardour_ui.cc:3079 +#: ardour_ui.cc:3077 #, fuzzy msgid "" "The following %1 files were deleted from\n" @@ -1144,7 +1161,7 @@ msgid "" msgstr "" "Следующие %1 файлов были удалены, освободив при этом %2 Мб места на диске" -#: ardour_ui.cc:3082 +#: ardour_ui.cc:3080 #, fuzzy msgid "" "The following file was deleted from\n" @@ -1153,11 +1170,11 @@ msgid "" msgstr "" "Следующие %1 файлов были удалены, освободив при этом %2 Мб места на диске" -#: ardour_ui.cc:3223 +#: ardour_ui.cc:3229 msgid "Recording was stopped because your system could not keep up." msgstr "Запись остановлена из-за недостаточного быстродействия системы" -#: ardour_ui.cc:3252 +#: ardour_ui.cc:3258 #, fuzzy msgid "" "The disk system on your computer\n" @@ -1172,7 +1189,7 @@ msgstr "" "В частности ей не удалось записать данные на диск\n" "достаточно быстро для фиксации захваченных данных.\n" -#: ardour_ui.cc:3271 +#: ardour_ui.cc:3277 #, fuzzy msgid "" "The disk system on your computer\n" @@ -1187,11 +1204,11 @@ msgstr "" "В частности ей не удалось прочитать данные\n" "с диска достаточно быстро для воспроизведения.\n" -#: ardour_ui.cc:3311 +#: ardour_ui.cc:3317 msgid "Crash Recovery" msgstr "Восстановление данных" -#: ardour_ui.cc:3312 +#: ardour_ui.cc:3318 #, fuzzy msgid "" "This session appears to have been in\n" @@ -1208,19 +1225,19 @@ msgstr "" "Ardour может восстановить записанные данные,\n" "либо проигнорировать их. Примите решение.\n" -#: ardour_ui.cc:3324 +#: ardour_ui.cc:3330 msgid "Ignore crash data" msgstr "Проигнорировать" -#: ardour_ui.cc:3325 +#: ardour_ui.cc:3331 msgid "Recover from crash" msgstr "Восстановить данные" -#: ardour_ui.cc:3345 +#: ardour_ui.cc:3351 msgid "Sample Rate Mismatch" msgstr "Несовпадение частот сэмплирования" -#: ardour_ui.cc:3346 +#: ardour_ui.cc:3352 #, fuzzy msgid "" "This session was created with a sample rate of %1 Hz, but\n" @@ -1231,98 +1248,98 @@ msgstr "" "\n" "Сейчас же звуковой движок работает с частотой %2 Гц\n" -#: ardour_ui.cc:3355 +#: ardour_ui.cc:3361 msgid "Do not load session" msgstr "Не загружать сеанс" -#: ardour_ui.cc:3356 +#: ardour_ui.cc:3362 msgid "Load session anyway" msgstr "Все равно загрузить" -#: ardour_ui.cc:3377 +#: ardour_ui.cc:3383 msgid "Could not disconnect from JACK" msgstr "Не удалось отсоединиться от сервера JACK" -#: ardour_ui.cc:3390 +#: ardour_ui.cc:3396 msgid "Could not reconnect to JACK" msgstr "Не удалось соединиться с сервером JACK" -#: ardour_ui.cc:3611 +#: ardour_ui.cc:3617 msgid "Translations disabled" -msgstr "" +msgstr "Локализация отключена" -#: ardour_ui.cc:3611 +#: ardour_ui.cc:3617 msgid "Translations enabled" -msgstr "" +msgstr "Локализация включена" -#: ardour_ui.cc:3615 +#: ardour_ui.cc:3621 msgid "You must restart %1 for this to take effect." msgstr "Необходимо перезапустить %1 для учёта изменений." -#: ardour_ui2.cc:74 +#: ardour_ui2.cc:73 msgid "UI: cannot setup editor" msgstr "Интерфейс: не удалось инициализировать редактор" -#: ardour_ui2.cc:79 +#: ardour_ui2.cc:78 msgid "UI: cannot setup mixer" msgstr "Интерфейс: не удалось инициализировать микшер" -#: ardour_ui2.cc:129 +#: ardour_ui2.cc:128 msgid "Play from playhead" msgstr "Воспроизвести от указателя" -#: ardour_ui2.cc:130 +#: ardour_ui2.cc:129 msgid "Stop playback" msgstr "Стоп" -#: ardour_ui2.cc:131 +#: ardour_ui2.cc:130 msgid "Toggle record" msgstr "Переключить готовность к записи" -#: ardour_ui2.cc:132 +#: ardour_ui2.cc:131 msgid "Play range/selection" msgstr "Воспроизвести выделение" -#: ardour_ui2.cc:133 +#: ardour_ui2.cc:132 msgid "Go to start of session" msgstr "В начало сеанса" -#: ardour_ui2.cc:134 +#: ardour_ui2.cc:133 msgid "Go to end of session" msgstr "В конец сеанса" -#: ardour_ui2.cc:135 +#: ardour_ui2.cc:134 msgid "Play loop range" msgstr "Воспроизвести выделение в петле" -#: ardour_ui2.cc:136 +#: ardour_ui2.cc:135 msgid "" "MIDI Panic\n" "Send note off and reset controller messages on all MIDI channels" msgstr "" -#: ardour_ui2.cc:137 +#: ardour_ui2.cc:136 #, fuzzy msgid "Always Play Range Selection (if any)" msgstr "Всегда воспроизводить область или выделение" -#: ardour_ui2.cc:138 +#: ardour_ui2.cc:137 msgid "Return to last playback start when stopped" msgstr "Вернуться к точке начала воспроизведения" -#: ardour_ui2.cc:139 +#: ardour_ui2.cc:138 msgid "Start playback after any locate" msgstr "" -#: ardour_ui2.cc:140 +#: ardour_ui2.cc:139 msgid "Be sensible about input monitoring" msgstr "" -#: ardour_ui2.cc:141 +#: ardour_ui2.cc:140 msgid "Enable/Disable audio click" msgstr "Включить или выключить метроном" -#: ardour_ui2.cc:142 monitor_section.cc:84 +#: ardour_ui2.cc:141 monitor_section.cc:82 msgid "" "When active, something is soloed.\n" "Click to de-solo everything" @@ -1330,7 +1347,7 @@ msgstr "" "Если включено, что-то солирует.\n" "Щёлкните, чтобы снять солирование везде." -#: ardour_ui2.cc:143 +#: ardour_ui2.cc:142 msgid "" "When active, auditioning is taking place\n" "Click to stop the audition" @@ -1338,51 +1355,51 @@ msgstr "" "Если включено, выполняется прослушивание.\n" "Щёлкните, чтобы прекратить его." -#: ardour_ui2.cc:144 +#: ardour_ui2.cc:143 msgid "When active, there is a feedback loop." msgstr "" -#: ardour_ui2.cc:145 editor_actions.cc:121 +#: ardour_ui2.cc:144 editor_actions.cc:118 msgid "Primary Clock" msgstr "Основной счётчик" -#: ardour_ui2.cc:146 editor_actions.cc:128 +#: ardour_ui2.cc:145 editor_actions.cc:125 msgid "Secondary Clock" msgstr "Дополнительный счётчик" -#: ardour_ui2.cc:178 +#: ardour_ui2.cc:177 msgid "[ERROR]: " msgstr "[ОШИБКА]: " -#: ardour_ui2.cc:180 +#: ardour_ui2.cc:179 msgid "[WARNING]: " msgstr "[ПРЕДУПРЕЖДЕНИЕ]:" -#: ardour_ui2.cc:182 +#: ardour_ui2.cc:181 msgid "[INFO]: " msgstr "[СПРАВКА]:" -#: ardour_ui2.cc:246 ardour_ui_ed.cc:406 +#: ardour_ui2.cc:245 ardour_ui_ed.cc:406 msgid "Auto Return" msgstr "Автовозврат" -#: ardour_ui2.cc:247 ardour_ui_ed.cc:403 +#: ardour_ui2.cc:246 ardour_ui_ed.cc:403 msgid "Auto Play" msgstr "Автовоспр." -#: ardour_ui2.cc:248 ardour_ui_ed.cc:400 +#: ardour_ui2.cc:247 ardour_ui_ed.cc:400 msgid "Auto Input" msgstr "Автовход" -#: ardour_ui2.cc:639 rc_option_editor.cc:876 rc_option_editor.cc:894 -#: rc_option_editor.cc:897 rc_option_editor.cc:899 rc_option_editor.cc:901 -#: rc_option_editor.cc:909 rc_option_editor.cc:917 rc_option_editor.cc:919 -#: rc_option_editor.cc:927 rc_option_editor.cc:934 rc_option_editor.cc:943 -#: rc_option_editor.cc:945 rc_option_editor.cc:947 rc_option_editor.cc:955 -#: rc_option_editor.cc:957 session_option_editor.cc:271 -#: session_option_editor.cc:273 session_option_editor.cc:294 -#: session_option_editor.cc:296 session_option_editor.cc:298 -#: session_option_editor.cc:305 +#: ardour_ui2.cc:646 rc_option_editor.cc:867 rc_option_editor.cc:885 +#: rc_option_editor.cc:888 rc_option_editor.cc:890 rc_option_editor.cc:892 +#: rc_option_editor.cc:900 rc_option_editor.cc:908 rc_option_editor.cc:910 +#: rc_option_editor.cc:918 rc_option_editor.cc:925 rc_option_editor.cc:934 +#: rc_option_editor.cc:936 rc_option_editor.cc:938 rc_option_editor.cc:946 +#: rc_option_editor.cc:948 session_option_editor.cc:267 +#: session_option_editor.cc:269 session_option_editor.cc:290 +#: session_option_editor.cc:292 session_option_editor.cc:294 +#: session_option_editor.cc:301 msgid "Misc" msgstr "Прочее" @@ -1398,15 +1415,15 @@ msgstr "Настройка микшера" msgid "Reload Session History" msgstr "Повторная загрузка истории сеансов" -#: ardour_ui_dialogs.cc:206 +#: ardour_ui_dialogs.cc:210 msgid "Don't close" msgstr "Не закрывать" -#: ardour_ui_dialogs.cc:207 +#: ardour_ui_dialogs.cc:211 msgid "Just close" msgstr "Просто закрыть" -#: ardour_ui_dialogs.cc:208 +#: ardour_ui_dialogs.cc:212 msgid "Save and close" msgstr "Сохранить и закрыть" @@ -1414,12 +1431,12 @@ msgstr "Сохранить и закрыть" msgid "Session" msgstr "Сеанс" -#: ardour_ui_ed.cc:106 editor_actions.cc:136 editor_regions.cc:114 -#: port_group.cc:448 +#: ardour_ui_ed.cc:106 editor_actions.cc:133 editor_regions.cc:114 +#: port_group.cc:445 msgid "Sync" msgstr "Синхронизация" -#: ardour_ui_ed.cc:107 engine_dialog.cc:390 +#: ardour_ui_ed.cc:107 engine_dialog.cc:361 msgid "Options" msgstr "Параметры" @@ -1443,7 +1460,7 @@ msgstr "Формат звуковых файлов" msgid "File Type" msgstr "Тип файла" -#: ardour_ui_ed.cc:113 export_format_dialog.cc:64 +#: ardour_ui_ed.cc:113 export_format_dialog.cc:65 msgid "Sample Format" msgstr "Формат сэмпла" @@ -1451,11 +1468,11 @@ msgstr "Формат сэмпла" msgid "Control Surfaces" msgstr "Устройства управления" -#: ardour_ui_ed.cc:115 rc_option_editor.cc:1290 route_time_axis.cc:414 +#: ardour_ui_ed.cc:115 rc_option_editor.cc:1275 route_time_axis.cc:419 msgid "Plugins" msgstr "Расширения" -#: ardour_ui_ed.cc:116 rc_option_editor.cc:1620 +#: ardour_ui_ed.cc:116 rc_option_editor.cc:1605 msgid "Metering" msgstr "Индикаторы" @@ -1483,7 +1500,7 @@ msgstr "Открыть..." msgid "Recent..." msgstr "Недавние сеансы..." -#: ardour_ui_ed.cc:127 +#: ardour_ui_ed.cc:127 panner_editor.cc:29 playlist_selector.cc:65 msgid "Close" msgstr "Закрыть" @@ -1503,8 +1520,8 @@ msgstr "Создать снимок..." msgid "Save As..." msgstr "Сохранить как..." -#: ardour_ui_ed.cc:154 editor_actions.cc:1531 editor_markers.cc:834 -#: editor_snapshots.cc:124 mixer_strip.cc:1446 route_time_axis.cc:1495 +#: ardour_ui_ed.cc:154 editor_actions.cc:1528 editor_markers.cc:859 +#: editor_snapshots.cc:123 mixer_strip.cc:1447 route_time_axis.cc:1495 msgid "Rename..." msgstr "Переименовать..." @@ -1533,7 +1550,7 @@ msgstr "В звуковые файлы..." msgid "Stem export..." msgstr "Экспортировать..." -#: ardour_ui_ed.cc:176 editor_export_audio.cc:64 export_dialog.cc:133 +#: ardour_ui_ed.cc:176 editor_export_audio.cc:63 export_dialog.cc:128 msgid "Export" msgstr "Экспортировать" @@ -1546,11 +1563,11 @@ msgstr "Очистить неиспользуемые источники..." msgid "Flush Wastebasket" msgstr "Очистить корзину" -#: ardour_ui_ed.cc:190 keyeditor.cc:250 rc_option_editor.cc:1204 +#: ardour_ui_ed.cc:190 keyeditor.cc:247 rc_option_editor.cc:1189 msgid "JACK" msgstr "JACK" -#: ardour_ui_ed.cc:191 route_params_ui.cc:109 +#: ardour_ui_ed.cc:191 route_params_ui.cc:104 msgid "Latency" msgstr "Задержка отклика" @@ -1558,8 +1575,8 @@ msgstr "Задержка отклика" msgid "Reconnect" msgstr "Пересоединиться" -#: ardour_ui_ed.cc:196 global_port_matrix.cc:184 io_selector.cc:213 -#: mixer_strip.cc:698 mixer_strip.cc:820 +#: ardour_ui_ed.cc:196 global_port_matrix.cc:186 io_selector.cc:210 +#: mixer_strip.cc:695 mixer_strip.cc:821 msgid "Disconnect" msgstr "Отсоединиться" @@ -1572,13 +1589,12 @@ msgid "Maximise Editor Space" msgstr "Редактор на полный экран" #: ardour_ui_ed.cc:228 -msgid "Toolbars when Maximised" -msgstr "Видимость панелей в развёрнутом окне" +msgid "Show Toolbars" +msgstr "Показывать панели" -#: ardour_ui_ed.cc:231 mixer_ui.cc:1806 mixer_ui.cc:1812 -#, fuzzy +#: ardour_ui_ed.cc:231 mixer_ui.cc:1757 mixer_ui.cc:1763 msgid "Window|Mixer" -msgstr "Окна" +msgstr "Микшер" #: ardour_ui_ed.cc:232 msgid "Mixer on Top" @@ -1592,11 +1608,11 @@ msgstr "Параметры" msgid "Properties" msgstr "Свойства" -#: ardour_ui_ed.cc:235 route_params_ui.cc:62 route_params_ui.cc:609 +#: ardour_ui_ed.cc:235 route_params_ui.cc:57 route_params_ui.cc:604 msgid "Tracks and Busses" msgstr "Дорожки и шины" -#: ardour_ui_ed.cc:238 location_ui.cc:1132 +#: ardour_ui_ed.cc:238 location_ui.cc:1130 msgid "Locations" msgstr "Позиции" @@ -1636,15 +1652,15 @@ msgstr "Справка" msgid "Reference" msgstr "Справка в Интернете" -#: ardour_ui_ed.cc:255 theme_manager.cc:56 theme_manager.cc:62 +#: ardour_ui_ed.cc:255 theme_manager.cc:55 theme_manager.cc:62 msgid "Theme Manager" msgstr "Стиль оформления..." -#: ardour_ui_ed.cc:256 keyeditor.cc:56 +#: ardour_ui_ed.cc:256 keyeditor.cc:53 msgid "Key Bindings" msgstr "Клавиатурные комбинации..." -#: ardour_ui_ed.cc:257 bundle_manager.cc:264 +#: ardour_ui_ed.cc:257 bundle_manager.cc:265 msgid "Bundle Manager" msgstr "Управление пакетами" @@ -1660,18 +1676,17 @@ msgstr "Добавить звуковую шину" msgid "Add MIDI Track" msgstr "Добавить MIDI-дорожку" -#: ardour_ui_ed.cc:269 plugin_ui.cc:452 +#: ardour_ui_ed.cc:269 plugin_ui.cc:459 msgid "Save" msgstr "Сохранить" -#: ardour_ui_ed.cc:277 rc_option_editor.cc:968 rc_option_editor.cc:976 -#: rc_option_editor.cc:984 rc_option_editor.cc:992 rc_option_editor.cc:1000 -#: rc_option_editor.cc:1008 rc_option_editor.cc:1016 rc_option_editor.cc:1024 -#: rc_option_editor.cc:1032 +#: ardour_ui_ed.cc:277 rc_option_editor.cc:959 rc_option_editor.cc:967 +#: rc_option_editor.cc:975 rc_option_editor.cc:983 rc_option_editor.cc:991 +#: rc_option_editor.cc:999 rc_option_editor.cc:1007 msgid "Transport" msgstr "Транспорт" -#: ardour_ui_ed.cc:283 engine_dialog.cc:86 sfdb_ui.cc:556 +#: ardour_ui_ed.cc:283 engine_dialog.cc:83 sfdb_ui.cc:555 msgid "Stop" msgstr "Стоп" @@ -1733,7 +1748,7 @@ msgstr "Перемотать назад (медленно)" msgid "Rewind (Fast)" msgstr "Перемотать назад (быстро)" -#: ardour_ui_ed.cc:341 startup.cc:687 +#: ardour_ui_ed.cc:341 startup.cc:682 msgid "Forward" msgstr "Перемотать вперёд" @@ -1765,17 +1780,17 @@ msgstr "К текущему времени" msgid "Focus On Clock" msgstr "" -#: ardour_ui_ed.cc:367 ardour_ui_ed.cc:376 audio_clock.cc:1942 editor.cc:250 -#: editor_actions.cc:531 export_timespan_selector.cc:89 -#: session_option_editor.cc:54 session_option_editor.cc:56 -#: session_option_editor.cc:76 session_option_editor.cc:88 -#: session_option_editor.cc:90 session_option_editor.cc:114 -#: session_option_editor.cc:125 session_option_editor.cc:127 -#: session_option_editor.cc:134 session_option_editor.cc:136 +#: ardour_ui_ed.cc:367 ardour_ui_ed.cc:376 audio_clock.cc:1938 editor.cc:247 +#: editor_actions.cc:528 export_timespan_selector.cc:88 +#: session_option_editor.cc:50 session_option_editor.cc:52 +#: session_option_editor.cc:72 session_option_editor.cc:84 +#: session_option_editor.cc:86 session_option_editor.cc:110 +#: session_option_editor.cc:121 session_option_editor.cc:123 +#: session_option_editor.cc:130 session_option_editor.cc:132 msgid "Timecode" msgstr "Тайм-код" -#: ardour_ui_ed.cc:369 ardour_ui_ed.cc:378 editor_actions.cc:529 +#: ardour_ui_ed.cc:369 ardour_ui_ed.cc:378 editor_actions.cc:526 msgid "Bars & Beats" msgstr "Такты и доли" @@ -1783,8 +1798,8 @@ msgstr "Такты и доли" msgid "Minutes & Seconds" msgstr "Минуты и секунды" -#: ardour_ui_ed.cc:373 ardour_ui_ed.cc:382 audio_clock.cc:1946 editor.cc:251 -#: editor_actions.cc:530 +#: ardour_ui_ed.cc:373 ardour_ui_ed.cc:382 audio_clock.cc:1942 editor.cc:248 +#: editor_actions.cc:527 msgid "Samples" msgstr "Сэмплы" @@ -1792,7 +1807,7 @@ msgstr "Сэмплы" msgid "Punch In" msgstr "Начало врезки" -#: ardour_ui_ed.cc:386 mixer_strip.cc:1842 route_ui.cc:134 +#: ardour_ui_ed.cc:386 mixer_strip.cc:1843 route_ui.cc:131 #: time_info_box.cc:111 msgid "In" msgstr "Вход" @@ -1813,7 +1828,7 @@ msgstr "Врезка" msgid "In/Out" msgstr "Вх/Вых" -#: ardour_ui_ed.cc:397 rc_option_editor.cc:943 +#: ardour_ui_ed.cc:397 rc_option_editor.cc:934 msgid "Click" msgstr "Метроном" @@ -1851,7 +1866,7 @@ msgstr "Передавать MMC" msgid "Use MMC" msgstr "Использовать MMC" -#: ardour_ui_ed.cc:437 rc_option_editor.cc:1450 +#: ardour_ui_ed.cc:437 rc_option_editor.cc:1435 msgid "Send MIDI Clock" msgstr "Отправлять MIDI Clock" @@ -1861,7 +1876,7 @@ msgstr "Отправлять MIDI Feedback" #: ardour_ui_ed.cc:444 msgid "Enable Translations" -msgstr "" +msgstr "Использовать локализованный интерфейс" #: ardour_ui_ed.cc:456 msgid "Panic" @@ -1891,63 +1906,63 @@ msgstr "" msgid "File Format" msgstr "Формат файлов" -#: ardour_ui_options.cc:66 +#: ardour_ui_options.cc:65 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:311 +#: ardour_ui_options.cc:310 msgid "Internal" msgstr "Внутренний" -#: ardour_ui_options.cc:457 +#: ardour_ui_options.cc:456 #, fuzzy msgid "Enable/Disable external positional sync" msgstr "Включить или выключить метроном" -#: ardour_ui_options.cc:459 +#: ardour_ui_options.cc:458 msgid "Sync to JACK is not possible: video pull up/down is set" msgstr "" -#: audio_clock.cc:995 +#: audio_clock.cc:994 msgid "pullup: \\u2012" msgstr "" -#: audio_clock.cc:997 +#: audio_clock.cc:996 #, c-format msgid "pullup %-6.4f" msgstr "" -#: audio_clock.cc:1734 audio_streamview.cc:120 editor_actions.cc:862 -#: midi_region_view.cc:2912 +#: audio_clock.cc:1730 audio_streamview.cc:116 editor_actions.cc:859 +#: midi_region_view.cc:3019 msgid "programming error: %1" msgstr "Ошибка в программе: %1" -#: audio_clock.cc:1851 audio_clock.cc:1876 +#: audio_clock.cc:1847 audio_clock.cc:1872 msgid "programming error: %1 %2" msgstr "ошибка в программе: %1 %2" -#: audio_clock.cc:1944 editor.cc:249 export_timespan_selector.cc:99 +#: audio_clock.cc:1940 editor.cc:246 export_timespan_selector.cc:98 msgid "Bars:Beats" msgstr "Такты : Доли" -#: audio_clock.cc:1945 export_timespan_selector.cc:94 +#: audio_clock.cc:1941 export_timespan_selector.cc:93 msgid "Minutes:Seconds" msgstr "Минуты : Секунды" -#: audio_clock.cc:1950 +#: audio_clock.cc:1946 #, fuzzy msgid "Set From Playhead" msgstr "Указатель по центру" -#: audio_clock.cc:1951 +#: audio_clock.cc:1947 #, fuzzy msgid "Locate to This Time" msgstr "Переместить сюда указатель" -#: audio_region_editor.cc:63 control_point_dialog.cc:49 rhythm_ferret.cc:109 -#: rhythm_ferret.cc:114 rhythm_ferret.cc:119 +#: audio_region_editor.cc:63 control_point_dialog.cc:49 rhythm_ferret.cc:106 +#: rhythm_ferret.cc:111 rhythm_ferret.cc:116 msgid "dB" msgstr "Дб" @@ -1955,7 +1970,7 @@ msgstr "Дб" msgid "Region gain:" msgstr "Усиление области:" -#: audio_region_editor.cc:76 export_format_dialog.cc:42 +#: audio_region_editor.cc:76 export_format_dialog.cc:43 msgid "dBFS" msgstr "dBFS" @@ -1967,36 +1982,36 @@ msgstr "Пиковая амплитуда:" msgid "Calculating..." msgstr "Производится вычисление..." -#: audio_region_view.cc:1063 +#: audio_region_view.cc:1054 msgid "add gain control point" msgstr "добавление точки усиления" -#: audio_time_axis.cc:400 +#: audio_time_axis.cc:389 msgid "Fader" msgstr "Фейдер" -#: audio_time_axis.cc:407 +#: audio_time_axis.cc:396 msgid "Pan" msgstr "Панорама" -#: automation_line.cc:243 automation_line.cc:362 +#: automation_line.cc:249 automation_line.cc:432 msgid "automation event move" msgstr "смещение события автоматизации" -#: automation_line.cc:389 automation_line.cc:409 +#: automation_line.cc:459 automation_line.cc:479 #, fuzzy msgid "automation range move" msgstr "смещение события автоматизации" -#: automation_line.cc:682 region_gain_line.cc:73 +#: automation_line.cc:751 region_gain_line.cc:73 msgid "remove control point" msgstr "удаление контрольной точки" -#: automation_line.cc:797 +#: automation_line.cc:871 msgid "Ignoring illegal points on AutomationLine \"%1\"" msgstr "" -#: automation_region_view.cc:162 automation_time_axis.cc:584 +#: automation_region_view.cc:160 automation_time_axis.cc:584 #, fuzzy msgid "add automation event" msgstr "автомат" @@ -2010,28 +2025,27 @@ msgid "hide track" msgstr "Скрыть дорожку" #: automation_time_axis.cc:255 automation_time_axis.cc:307 -#: automation_time_axis.cc:505 gain_meter.cc:207 generic_pluginui.cc:452 -#: generic_pluginui.cc:729 panner_ui.cc:150 -#, fuzzy +#: automation_time_axis.cc:505 gain_meter.cc:212 generic_pluginui.cc:452 +#: generic_pluginui.cc:729 panner_ui.cc:147 msgid "Automation|Manual" -msgstr "Автоматизация" +msgstr "Ручное" #: automation_time_axis.cc:257 automation_time_axis.cc:318 -#: automation_time_axis.cc:510 editor.cc:1942 editor.cc:2019 -#: editor_actions.cc:120 editor_actions.cc:1675 gain_meter.cc:210 -#: generic_pluginui.cc:455 generic_pluginui.cc:731 panner_ui.cc:153 +#: automation_time_axis.cc:510 editor.cc:1940 editor.cc:2017 +#: editor_actions.cc:117 editor_actions.cc:1672 gain_meter.cc:215 +#: generic_pluginui.cc:455 generic_pluginui.cc:731 panner_ui.cc:150 msgid "Play" msgstr "Воспроизвести" #: automation_time_axis.cc:259 automation_time_axis.cc:329 -#: automation_time_axis.cc:515 gain_meter.cc:213 generic_pluginui.cc:458 -#: generic_pluginui.cc:733 panner_ui.cc:156 +#: automation_time_axis.cc:515 gain_meter.cc:218 generic_pluginui.cc:458 +#: generic_pluginui.cc:733 panner_ui.cc:153 msgid "Write" msgstr "Записать" #: automation_time_axis.cc:261 automation_time_axis.cc:340 -#: automation_time_axis.cc:520 gain_meter.cc:216 generic_pluginui.cc:461 -#: generic_pluginui.cc:735 panner_ui.cc:159 +#: automation_time_axis.cc:520 gain_meter.cc:221 generic_pluginui.cc:461 +#: generic_pluginui.cc:735 panner_ui.cc:156 msgid "Touch" msgstr "Касание" @@ -2043,8 +2057,8 @@ msgstr "???" msgid "clear automation" msgstr "Очистить автоматизацию" -#: automation_time_axis.cc:494 editor_actions.cc:569 editor_markers.cc:833 -#: location_ui.cc:56 route_time_axis.cc:720 +#: automation_time_axis.cc:494 editor_actions.cc:566 editor_markers.cc:858 +#: location_ui.cc:54 route_time_axis.cc:725 msgid "Hide" msgstr "Скрыть" @@ -2060,68 +2074,68 @@ msgstr "Состояние" msgid "Discrete" msgstr "Дискретный" -#: automation_time_axis.cc:546 editor.cc:1466 editor.cc:1473 editor.cc:1529 -#: editor.cc:1535 export_format_dialog.cc:469 +#: automation_time_axis.cc:546 editor.cc:1464 editor.cc:1471 editor.cc:1527 +#: editor.cc:1533 export_format_dialog.cc:476 msgid "Linear" msgstr "Линейная" -#: automation_time_axis.cc:552 rhythm_ferret.cc:94 route_time_axis.cc:655 +#: automation_time_axis.cc:552 rhythm_ferret.cc:91 route_time_axis.cc:660 #: shuttle_control.cc:177 msgid "Mode" msgstr "Режим" -#: bundle_manager.cc:184 +#: bundle_manager.cc:183 msgid "Disassociate" msgstr "Разорвать связь" -#: bundle_manager.cc:188 +#: bundle_manager.cc:187 msgid "Edit Bundle" msgstr "Изменение пакета" -#: bundle_manager.cc:203 +#: bundle_manager.cc:202 msgid "Direction:" msgstr "Направление:" -#: bundle_manager.cc:208 bundle_manager.cc:212 mixer_strip.cc:159 -#: mixer_strip.cc:2072 +#: bundle_manager.cc:207 bundle_manager.cc:211 mixer_strip.cc:156 +#: mixer_strip.cc:2073 msgid "Input" msgstr "Вход" -#: bundle_manager.cc:209 bundle_manager.cc:214 bundle_manager.cc:246 -#: mixer_strip.cc:163 mixer_strip.cc:2075 +#: bundle_manager.cc:208 bundle_manager.cc:213 bundle_manager.cc:247 +#: mixer_strip.cc:160 mixer_strip.cc:2076 msgid "Output" msgstr "Выход" -#: bundle_manager.cc:265 editor.cc:1983 editor_actions.cc:92 -#: editor_actions.cc:102 +#: bundle_manager.cc:266 editor.cc:1981 editor_actions.cc:89 +#: editor_actions.cc:99 msgid "Edit" msgstr "Правка" -#: bundle_manager.cc:266 editor.cc:5462 editor_actions.cc:312 -#: editor_actions.cc:370 plugin_ui.cc:453 processor_box.cc:2197 -#: route_time_axis.cc:725 +#: bundle_manager.cc:267 editor.cc:5457 editor_actions.cc:309 +#: editor_actions.cc:367 plugin_ui.cc:460 processor_box.cc:2210 +#: route_time_axis.cc:730 msgid "Delete" msgstr "Удалить" -#: bundle_manager.cc:272 bundle_manager.cc:440 editor_route_groups.cc:97 -#: editor_routes.cc:201 midi_list_editor.cc:106 rc_option_editor.cc:667 -#: session_metadata_dialog.cc:524 +#: bundle_manager.cc:273 bundle_manager.cc:441 editor_route_groups.cc:97 +#: editor_routes.cc:200 midi_list_editor.cc:106 rc_option_editor.cc:658 +#: session_metadata_dialog.cc:523 msgid "Name" msgstr "Имя" -#: bundle_manager.cc:283 +#: bundle_manager.cc:284 msgid "New" msgstr "Создать" -#: bundle_manager.cc:333 +#: bundle_manager.cc:334 msgid "Bundle" msgstr "Пакет" -#: bundle_manager.cc:418 +#: bundle_manager.cc:419 msgid "Add Channel" msgstr "Добавить канал" -#: bundle_manager.cc:425 +#: bundle_manager.cc:426 msgid "Rename Channel" msgstr "Переименовать канал" @@ -2225,608 +2239,630 @@ msgstr "Контрольная точка" msgid "Value" msgstr "Значение" -#: edit_note_dialog.cc:38 +#: edit_note_dialog.cc:42 msgid "Note" msgstr "Нота" -#: edit_note_dialog.cc:49 midi_list_editor.cc:104 patch_change_dialog.cc:61 -#: step_entry.cc:394 +#: edit_note_dialog.cc:45 +msgid "Set selected notes to this channel" +msgstr "Назначить этот канал всем выбранным нотам" + +#: edit_note_dialog.cc:46 +msgid "Set selected notes to this pitch" +msgstr "Назначить эту высоту тона всем выбранным нотам" + +#: edit_note_dialog.cc:47 +msgid "Set selected notes to this velocity" +msgstr "Назначить эту силу нажатия всем выбранным нотам" + +#: edit_note_dialog.cc:49 +msgid "Set selected notes to this time" +msgstr "Назначить это время всем выбранным нотам" + +#: edit_note_dialog.cc:51 +msgid "Set selected notes to this length" +msgstr "Назначить эту длительность всем выбранным нотам" + +#: edit_note_dialog.cc:58 midi_list_editor.cc:104 patch_change_dialog.cc:89 +#: step_entry.cc:393 msgid "Channel" msgstr "Канал" -#: edit_note_dialog.cc:59 +#: edit_note_dialog.cc:68 msgid "Pitch" msgstr "Высота тона" -#: edit_note_dialog.cc:69 step_entry.cc:408 +#: edit_note_dialog.cc:78 step_entry.cc:407 msgid "Velocity" msgstr "Сила нажатия" -#: edit_note_dialog.cc:79 patch_change_dialog.cc:50 +#: edit_note_dialog.cc:88 patch_change_dialog.cc:65 msgid "Time" msgstr "Время" -#: edit_note_dialog.cc:89 editor_regions.cc:113 -#: export_timespan_selector.cc:362 export_timespan_selector.cc:426 -#: location_ui.cc:311 midi_list_editor.cc:114 time_info_box.cc:103 +#: edit_note_dialog.cc:98 editor_regions.cc:113 +#: export_timespan_selector.cc:361 export_timespan_selector.cc:425 +#: location_ui.cc:309 midi_list_editor.cc:114 time_info_box.cc:103 msgid "Length" msgstr "Длительность" -#: edit_note_dialog.cc:123 +#: edit_note_dialog.cc:168 #, fuzzy msgid "edit note" msgstr "Добавить темп" -#: editor.cc:147 editor.cc:3412 +#: editor.cc:141 editor.cc:3413 msgid "CD Frames" msgstr "Выборки CD" -#: editor.cc:148 editor.cc:3414 +#: editor.cc:142 editor.cc:3415 #, fuzzy msgid "Timecode Frames" msgstr "Скорость (FPS) тайм-кода" -#: editor.cc:149 editor.cc:3416 +#: editor.cc:143 editor.cc:3417 #, fuzzy msgid "Timecode Seconds" msgstr "Скорость (FPS) тайм-кода" -#: editor.cc:150 editor.cc:3418 +#: editor.cc:144 editor.cc:3419 #, fuzzy msgid "Timecode Minutes" msgstr "Скорость (FPS) тайм-кода" -#: editor.cc:151 editor.cc:3420 +#: editor.cc:145 editor.cc:3421 msgid "Seconds" msgstr "Секунды" -#: editor.cc:152 editor.cc:3422 +#: editor.cc:146 editor.cc:3423 msgid "Minutes" msgstr "Минуты" -#: editor.cc:153 editor.cc:3396 quantize_dialog.cc:37 quantize_dialog.cc:141 +#: editor.cc:147 editor.cc:3397 quantize_dialog.cc:37 quantize_dialog.cc:141 msgid "Beats/128" msgstr "Доли/128" -#: editor.cc:154 editor.cc:3394 quantize_dialog.cc:38 quantize_dialog.cc:143 +#: editor.cc:148 editor.cc:3395 quantize_dialog.cc:38 quantize_dialog.cc:143 msgid "Beats/64" msgstr "Доли/64" -#: editor.cc:155 editor.cc:3392 quantize_dialog.cc:39 quantize_dialog.cc:145 +#: editor.cc:149 editor.cc:3393 quantize_dialog.cc:39 quantize_dialog.cc:145 msgid "Beats/32" msgstr "Доли/32" -#: editor.cc:156 editor.cc:3390 +#: editor.cc:150 editor.cc:3391 msgid "Beats/28" msgstr "Доли/28" -#: editor.cc:157 editor.cc:3388 +#: editor.cc:151 editor.cc:3389 msgid "Beats/24" msgstr "Доли/24" -#: editor.cc:158 editor.cc:3386 +#: editor.cc:152 editor.cc:3387 msgid "Beats/20" msgstr "Доли/20" -#: editor.cc:159 editor.cc:3384 quantize_dialog.cc:40 quantize_dialog.cc:147 +#: editor.cc:153 editor.cc:3385 quantize_dialog.cc:40 quantize_dialog.cc:147 msgid "Beats/16" msgstr "Доли/16" -#: editor.cc:160 editor.cc:3382 +#: editor.cc:154 editor.cc:3383 msgid "Beats/14" msgstr "Доли/14" -#: editor.cc:161 editor.cc:3380 +#: editor.cc:155 editor.cc:3381 msgid "Beats/12" msgstr "Доли/12" -#: editor.cc:162 editor.cc:3378 +#: editor.cc:156 editor.cc:3379 msgid "Beats/10" msgstr "Доли/10" -#: editor.cc:163 editor.cc:3376 quantize_dialog.cc:41 quantize_dialog.cc:149 +#: editor.cc:157 editor.cc:3377 quantize_dialog.cc:41 quantize_dialog.cc:149 msgid "Beats/8" msgstr "Доли/8" -#: editor.cc:164 editor.cc:3374 +#: editor.cc:158 editor.cc:3375 msgid "Beats/7" msgstr "Доли/7" -#: editor.cc:165 editor.cc:3372 +#: editor.cc:159 editor.cc:3373 msgid "Beats/6" msgstr "Доли/6" -#: editor.cc:166 editor.cc:3370 +#: editor.cc:160 editor.cc:3371 msgid "Beats/5" msgstr "Доли/5" -#: editor.cc:167 editor.cc:3368 quantize_dialog.cc:42 quantize_dialog.cc:151 +#: editor.cc:161 editor.cc:3369 quantize_dialog.cc:42 quantize_dialog.cc:151 msgid "Beats/4" msgstr "Доли/4" -#: editor.cc:168 editor.cc:3366 quantize_dialog.cc:43 quantize_dialog.cc:153 +#: editor.cc:162 editor.cc:3367 quantize_dialog.cc:43 quantize_dialog.cc:153 msgid "Beats/3" msgstr "Доли/3" -#: editor.cc:169 editor.cc:3364 quantize_dialog.cc:44 quantize_dialog.cc:155 +#: editor.cc:163 editor.cc:3365 quantize_dialog.cc:44 quantize_dialog.cc:155 msgid "Beats/2" msgstr "Доли/2" -#: editor.cc:170 editor.cc:3398 quantize_dialog.cc:45 quantize_dialog.cc:157 +#: editor.cc:164 editor.cc:3399 quantize_dialog.cc:45 quantize_dialog.cc:157 msgid "Beats" msgstr "Доли" -#: editor.cc:171 editor.cc:3400 +#: editor.cc:165 editor.cc:3401 msgid "Bars" msgstr "Такты" -#: editor.cc:172 editor.cc:3402 +#: editor.cc:166 editor.cc:3403 msgid "Marks" msgstr "Метки" -#: editor.cc:173 editor.cc:3404 +#: editor.cc:167 editor.cc:3405 msgid "Region starts" msgstr "Начала областей" -#: editor.cc:174 editor.cc:3406 +#: editor.cc:168 editor.cc:3407 msgid "Region ends" msgstr "Концы областей" -#: editor.cc:175 editor.cc:3410 +#: editor.cc:169 editor.cc:3411 msgid "Region syncs" msgstr "Синхр. областей" -#: editor.cc:176 editor.cc:3408 +#: editor.cc:170 editor.cc:3409 msgid "Region bounds" msgstr "Границы областей" -#: editor.cc:181 editor.cc:3438 editor_actions.cc:472 +#: editor.cc:175 editor.cc:3439 editor_actions.cc:469 msgid "No Grid" msgstr "Без сетки" -#: editor.cc:182 editor.cc:3440 editor_actions.cc:473 +#: editor.cc:176 editor.cc:3441 editor_actions.cc:470 msgid "Grid" msgstr "По сетке" -#: editor.cc:183 editor.cc:3442 editor_actions.cc:474 +#: editor.cc:177 editor.cc:3443 editor_actions.cc:471 msgid "Magnetic" msgstr "Магнит" -#: editor.cc:188 editor.cc:198 editor.cc:3481 editor.cc:3506 -#: editor_actions.cc:119 editor_actions.cc:455 +#: editor.cc:182 editor.cc:192 editor.cc:3482 editor.cc:3507 +#: editor_actions.cc:116 editor_actions.cc:452 msgid "Playhead" msgstr "Указатель воспр." -#: editor.cc:189 editor.cc:3479 editor_actions.cc:457 +#: editor.cc:183 editor.cc:3480 editor_actions.cc:454 msgid "Marker" msgstr "Метка" -#: editor.cc:190 editor.cc:199 editor.cc:3508 editor_actions.cc:456 +#: editor.cc:184 editor.cc:193 editor.cc:3509 editor_actions.cc:453 msgid "Mouse" msgstr "Мышь" -#: editor.cc:195 editor.cc:3500 +#: editor.cc:189 editor.cc:3501 mono_panner_editor.cc:42 msgid "Left" msgstr "Влево" -#: editor.cc:196 editor.cc:3502 +#: editor.cc:190 editor.cc:3503 mono_panner_editor.cc:47 msgid "Right" msgstr "Вправо" -#: editor.cc:197 editor.cc:3504 +#: editor.cc:191 editor.cc:3505 msgid "Center" msgstr "По центру" -#: editor.cc:200 editor.cc:3072 editor.cc:3510 +#: editor.cc:194 editor.cc:3073 editor.cc:3511 msgid "Edit point" msgstr "Курсор редактора" -#: editor.cc:206 +#: editor.cc:200 +#, fuzzy msgid "Mushy" msgstr "Кашу" -#: editor.cc:207 +#: editor.cc:201 #, fuzzy msgid "Smooth" msgstr "Соло" -#: editor.cc:208 +#: editor.cc:202 msgid "Balanced multitimbral mixture" msgstr "Сбалансированный многотембральный микс" -#: editor.cc:209 +#: editor.cc:203 msgid "Unpitched percussion with stable notes" msgstr "Перкуссионное соло без коррекции высоты тона с выделяющимися нотами" -#: editor.cc:210 +#: editor.cc:204 msgid "Crisp monophonic instrumental" msgstr "Чистое монофоническое инструментальное соло" -#: editor.cc:211 +#: editor.cc:205 msgid "Unpitched solo percussion" msgstr "Перкуссионное соло без коррекции высоты тона" -#: editor.cc:212 +#: editor.cc:206 msgid "Resample without preserving pitch" msgstr "" -#: editor.cc:248 +#: editor.cc:245 msgid "Mins:Secs" msgstr "Минуты : Секунды" -#: editor.cc:252 editor_actions.cc:137 editor_actions.cc:523 +#: editor.cc:249 editor_actions.cc:134 editor_actions.cc:520 msgid "Tempo" msgstr "Темп" -#: editor.cc:253 editor_actions.cc:524 +#: editor.cc:250 editor_actions.cc:521 msgid "Meter" -msgstr "Счётчик" +msgstr "Размер" -#: editor.cc:254 +#: editor.cc:251 msgid "Location Markers" msgstr "Метки позиций" -#: editor.cc:255 +#: editor.cc:252 msgid "Range Markers" msgstr "Метки выделений" -#: editor.cc:256 +#: editor.cc:253 msgid "Loop/Punch Ranges" msgstr "Области петель/врезок" -#: editor.cc:257 editor_actions.cc:527 +#: editor.cc:254 editor_actions.cc:524 msgid "CD Markers" msgstr "Метки CD" -#: editor.cc:272 +#: editor.cc:269 msgid "mode" msgstr "Режим" -#: editor.cc:548 +#: editor.cc:547 msgid "Regions" msgstr "Области" -#: editor.cc:549 +#: editor.cc:548 msgid "Tracks & Busses" msgstr "Дорожки и шины" -#: editor.cc:550 +#: editor.cc:549 msgid "Snapshots" msgstr "Снимки" -#: editor.cc:551 +#: editor.cc:550 #, fuzzy msgid "Track & Bus Groups" msgstr "Дорожки и шины" -#: editor.cc:552 +#: editor.cc:551 msgid "Ranges & Marks" msgstr "Области и метки" -#: editor.cc:694 editor.cc:5313 rc_option_editor.cc:1042 -#: rc_option_editor.cc:1050 rc_option_editor.cc:1058 rc_option_editor.cc:1066 -#: rc_option_editor.cc:1074 rc_option_editor.cc:1082 rc_option_editor.cc:1090 -#: rc_option_editor.cc:1108 rc_option_editor.cc:1120 rc_option_editor.cc:1122 -#: rc_option_editor.cc:1130 rc_option_editor.cc:1138 rc_option_editor.cc:1146 -#: rc_option_editor.cc:1154 rc_option_editor.cc:1162 rc_option_editor.cc:1170 +#: editor.cc:693 editor.cc:5308 rc_option_editor.cc:1017 +#: rc_option_editor.cc:1025 rc_option_editor.cc:1033 rc_option_editor.cc:1041 +#: rc_option_editor.cc:1049 rc_option_editor.cc:1057 rc_option_editor.cc:1065 +#: rc_option_editor.cc:1085 rc_option_editor.cc:1097 rc_option_editor.cc:1099 +#: rc_option_editor.cc:1107 rc_option_editor.cc:1115 rc_option_editor.cc:1123 +#: rc_option_editor.cc:1131 rc_option_editor.cc:1139 rc_option_editor.cc:1147 +#: rc_option_editor.cc:1155 msgid "Editor" msgstr "Редактор" -#: editor.cc:1224 editor.cc:1234 editor.cc:4398 editor.cc:4425 -#: editor_actions.cc:132 editor_actions.cc:1623 +#: editor.cc:1222 editor.cc:1232 editor.cc:4370 editor.cc:4397 +#: editor_actions.cc:129 editor_actions.cc:1620 msgid "Loop" msgstr "Петля" -#: editor.cc:1240 editor.cc:1250 editor_actions.cc:133 time_info_box.cc:65 +#: editor.cc:1238 editor.cc:1248 editor_actions.cc:130 time_info_box.cc:65 msgid "Punch" msgstr "Врезка" -#: editor.cc:1361 +#: editor.cc:1359 msgid "Linear (for highly correlated material)" msgstr "" -#: editor.cc:1371 +#: editor.cc:1369 msgid "ConstantPower" msgstr "" -#: editor.cc:1380 editor.cc:1501 editor.cc:1563 +#: editor.cc:1378 editor.cc:1499 editor.cc:1561 msgid "Symmetric" msgstr "" -#: editor.cc:1390 editor.cc:1483 editor.cc:1545 +#: editor.cc:1388 editor.cc:1481 editor.cc:1543 msgid "Slow" msgstr "Медленно" -#: editor.cc:1399 editor.cc:1492 editor.cc:1554 sfdb_ui.cc:1453 -#: sfdb_ui.cc:1555 +#: editor.cc:1397 editor.cc:1490 editor.cc:1552 sfdb_ui.cc:1471 +#: sfdb_ui.cc:1573 msgid "Fast" msgstr "Быстро" -#: editor.cc:1446 +#: editor.cc:1444 #, fuzzy msgid "programming error: fade in canvas item has no regionview data pointer!" msgstr "ошибка в программе: line canvas item has no line pointer!" -#: editor.cc:1457 editor.cc:1521 +#: editor.cc:1455 editor.cc:1519 msgid "Deactivate" msgstr "Деактивировать" -#: editor.cc:1459 editor.cc:1523 +#: editor.cc:1457 editor.cc:1521 msgid "Activate" msgstr "Активировать" -#: editor.cc:1467 editor.cc:1530 +#: editor.cc:1465 editor.cc:1528 msgid "Slowest" msgstr "Медленнее всего" -#: editor.cc:1508 editor.cc:1570 +#: editor.cc:1506 editor.cc:1568 msgid "Constant Power" msgstr "" -#: editor.cc:1581 route_time_axis.cc:1851 selection.cc:925 selection.cc:976 +#: editor.cc:1579 route_time_axis.cc:1885 selection.cc:931 selection.cc:982 msgid "programming error: " msgstr "Ошибка в программе: " -#: editor.cc:1682 editor.cc:1690 editor_ops.cc:3450 +#: editor.cc:1680 editor.cc:1688 editor_ops.cc:3471 msgid "Freeze" msgstr "Заморозить" -#: editor.cc:1686 +#: editor.cc:1684 msgid "Unfreeze" msgstr "Разморозить" -#: editor.cc:1825 +#: editor.cc:1823 msgid "Selected Regions" msgstr "Выделенные области" -#: editor.cc:1861 editor_markers.cc:871 +#: editor.cc:1859 editor_markers.cc:896 msgid "Play Range" msgstr "Воспроизвести выделение" -#: editor.cc:1862 editor_markers.cc:875 +#: editor.cc:1860 editor_markers.cc:900 msgid "Loop Range" msgstr "Создать петлю из выделения" -#: editor.cc:1871 editor_actions.cc:334 +#: editor.cc:1869 editor_actions.cc:331 msgid "Move Range Start to Previous Region Boundary" msgstr "Переместить начало выделения к границе предыдущей области" -#: editor.cc:1878 editor_actions.cc:341 +#: editor.cc:1876 editor_actions.cc:338 msgid "Move Range Start to Next Region Boundary" msgstr "Переместить начало выделения к границе следующей области" -#: editor.cc:1885 editor_actions.cc:348 +#: editor.cc:1883 editor_actions.cc:345 msgid "Move Range End to Previous Region Boundary" msgstr "Переместить конец выделения к границе предыдущей области" -#: editor.cc:1892 editor_actions.cc:355 +#: editor.cc:1890 editor_actions.cc:352 msgid "Move Range End to Next Region Boundary" msgstr "Переместить конец выделения к границе следующей области" -#: editor.cc:1898 +#: editor.cc:1896 msgid "Convert to Region In-Place" msgstr "" -#: editor.cc:1899 +#: editor.cc:1897 msgid "Convert to Region in Region List" msgstr "" -#: editor.cc:1902 editor_markers.cc:902 +#: editor.cc:1900 editor_markers.cc:927 msgid "Select All in Range" msgstr "Выбрать всё в выделении" -#: editor.cc:1905 +#: editor.cc:1903 msgid "Set Loop from Range" msgstr "Создать петлю из выделения" -#: editor.cc:1906 +#: editor.cc:1904 msgid "Set Punch from Range" msgstr "Создать врезку из выделения" -#: editor.cc:1909 +#: editor.cc:1907 msgid "Add Range Markers" msgstr "Добавить метки областей" -#: editor.cc:1912 +#: editor.cc:1910 msgid "Crop Region to Range" msgstr "Обрезать область по выделению" -#: editor.cc:1913 +#: editor.cc:1911 msgid "Fill Range with Region" msgstr "Заполнить выделение областью" -#: editor.cc:1914 editor_actions.cc:291 +#: editor.cc:1912 editor_actions.cc:288 msgid "Duplicate Range" msgstr "Продублировать область" -#: editor.cc:1917 +#: editor.cc:1915 msgid "Consolidate Range" msgstr "Объединить выделение" -#: editor.cc:1918 +#: editor.cc:1916 msgid "Consolidate Range With Processing" msgstr "Объединить выделение с обработкой" -#: editor.cc:1919 +#: editor.cc:1917 msgid "Bounce Range to Region List" msgstr "Свести выделение в список областей" -#: editor.cc:1920 +#: editor.cc:1918 msgid "Bounce Range to Region List With Processing" msgstr "Свести выделение в список областей с обработкой" -#: editor.cc:1921 editor_markers.cc:885 +#: editor.cc:1919 editor_markers.cc:910 msgid "Export Range..." msgstr "Экспортировать область…" -#: editor.cc:1936 editor.cc:2017 editor_actions.cc:283 +#: editor.cc:1934 editor.cc:2015 editor_actions.cc:280 msgid "Play From Edit Point" msgstr "Воспроизвести от курсора редактора" -#: editor.cc:1937 editor.cc:2018 +#: editor.cc:1935 editor.cc:2016 msgid "Play From Start" msgstr "Воспроизвести с начала" -#: editor.cc:1938 +#: editor.cc:1936 msgid "Play Region" msgstr "Воспроизвести область" -#: editor.cc:1940 +#: editor.cc:1938 msgid "Loop Region" msgstr "Создать петлю из области" -#: editor.cc:1950 editor.cc:2027 +#: editor.cc:1948 editor.cc:2025 msgid "Select All in Track" msgstr "Выделить всё на дорожке" -#: editor.cc:1951 editor.cc:2028 editor_actions.cc:187 -#: export_timespan_selector.cc:54 processor_box.cc:2205 +#: editor.cc:1949 editor.cc:2026 editor_actions.cc:184 +#: export_timespan_selector.cc:53 processor_box.cc:2218 msgid "Select All" msgstr "Выделить всё" -#: editor.cc:1952 editor.cc:2029 +#: editor.cc:1950 editor.cc:2027 msgid "Invert Selection in Track" msgstr "Обратить выделение на дорожке" -#: editor.cc:1953 editor.cc:2030 editor_actions.cc:189 +#: editor.cc:1951 editor.cc:2028 editor_actions.cc:186 msgid "Invert Selection" msgstr "Обратить выделение" -#: editor.cc:1955 +#: editor.cc:1953 #, fuzzy msgid "Set Range to Loop Range" msgstr "Создать выделение из петли" -#: editor.cc:1956 +#: editor.cc:1954 #, fuzzy msgid "Set Range to Punch Range" msgstr "Создать выделение из врезки" -#: editor.cc:1958 editor.cc:2032 editor_actions.cc:190 +#: editor.cc:1956 editor.cc:2030 editor_actions.cc:187 msgid "Select All After Edit Point" msgstr "Выделить всё после курсора редактора" -#: editor.cc:1959 editor.cc:2033 editor_actions.cc:191 +#: editor.cc:1957 editor.cc:2031 editor_actions.cc:188 msgid "Select All Before Edit Point" msgstr "Выделить всё до курсора редактора" -#: editor.cc:1960 editor.cc:2034 +#: editor.cc:1958 editor.cc:2032 msgid "Select All After Playhead" msgstr "Выделить всё после указателя" -#: editor.cc:1961 editor.cc:2035 +#: editor.cc:1959 editor.cc:2033 msgid "Select All Before Playhead" msgstr "Выделить всё до указателя" -#: editor.cc:1962 +#: editor.cc:1960 msgid "Select All Between Playhead and Edit Point" msgstr "Выделить всё между указателем и курсором редактора" -#: editor.cc:1963 +#: editor.cc:1961 #, fuzzy msgid "Select All Within Playhead and Edit Point" msgstr "Выделить всё после указателя" -#: editor.cc:1964 +#: editor.cc:1962 #, fuzzy msgid "Select Range Between Playhead and Edit Point" msgstr "Создать выделение между указателем и курсором редактора" -#: editor.cc:1966 editor.cc:2037 editor_actions.cc:129 editor_actions.cc:130 +#: editor.cc:1964 editor.cc:2035 editor_actions.cc:126 editor_actions.cc:127 msgid "Select" msgstr "Выделить" -#: editor.cc:1974 editor.cc:2045 editor_actions.cc:311 processor_box.cc:2190 +#: editor.cc:1972 editor.cc:2043 editor_actions.cc:308 processor_box.cc:2203 msgid "Cut" msgstr "Вырезать" -#: editor.cc:1975 editor.cc:2046 editor_actions.cc:314 processor_box.cc:2193 +#: editor.cc:1973 editor.cc:2044 editor_actions.cc:311 processor_box.cc:2206 msgid "Copy" msgstr "Копировать" -#: editor.cc:1976 editor.cc:2047 editor_actions.cc:315 processor_box.cc:2201 +#: editor.cc:1974 editor.cc:2045 editor_actions.cc:312 processor_box.cc:2214 msgid "Paste" msgstr "Вставить" -#: editor.cc:1980 editor_actions.cc:89 +#: editor.cc:1978 editor_actions.cc:86 msgid "Align" msgstr "Выровнять" -#: editor.cc:1981 +#: editor.cc:1979 msgid "Align Relative" msgstr "Выровнять относительно" -#: editor.cc:1988 +#: editor.cc:1986 msgid "Insert Selected Region" msgstr "Вставить выделенную область" -#: editor.cc:1989 +#: editor.cc:1987 msgid "Insert Existing Media" msgstr "Вставить существующие данные" -#: editor.cc:1998 editor.cc:2054 +#: editor.cc:1996 editor.cc:2052 #, fuzzy msgid "Nudge Entire Track Later" msgstr "Толкнуть всю дорожку вперёд" -#: editor.cc:1999 editor.cc:2055 +#: editor.cc:1997 editor.cc:2053 #, fuzzy msgid "Nudge Track After Edit Point Later" msgstr "Толкнуть дорожку после курсора редактора вперёд" -#: editor.cc:2000 editor.cc:2056 +#: editor.cc:1998 editor.cc:2054 #, fuzzy msgid "Nudge Entire Track Earlier" msgstr "Толкнуть всю дорожку вперёд" -#: editor.cc:2001 editor.cc:2057 +#: editor.cc:1999 editor.cc:2055 #, fuzzy msgid "Nudge Track After Edit Point Earlier" msgstr "Толкнуть дорожку после курсора редактора вперёд" -#: editor.cc:2003 editor.cc:2059 +#: editor.cc:2001 editor.cc:2057 msgid "Nudge" msgstr "Толкнуть" -#: editor.cc:3052 +#: editor.cc:3053 msgid "Select/Move Objects" msgstr "Выбирать/двигать объекты" -#: editor.cc:3053 +#: editor.cc:3054 msgid "Select/Move Ranges" msgstr "Выбирать или двигать области" -#: editor.cc:3054 +#: editor.cc:3055 msgid "Draw/Edit MIDI Notes" msgstr "Рисовать или менять ноты MIDI" -#: editor.cc:3055 +#: editor.cc:3056 #, fuzzy msgid "Draw Region Gain" msgstr "Понизить громкость области" -#: editor.cc:3056 +#: editor.cc:3057 msgid "Select Zoom Range" msgstr "Изменить масштаб вида проекта" -#: editor.cc:3057 +#: editor.cc:3058 msgid "Stretch/Shrink Regions and MIDI Notes" msgstr "Растянуть или сжать области и ноты MIDI" -#: editor.cc:3058 +#: editor.cc:3059 msgid "Listen to Specific Regions" msgstr "Воспроизвести выделенную область" -#: editor.cc:3059 +#: editor.cc:3060 #, fuzzy msgid "Smart Mode (Select/Move Objects + Ranges)" msgstr "Выбирать и перемещать объекты или области" -#: editor.cc:3060 +#: editor.cc:3061 msgid "Edit Region Contents (e.g. notes)" msgstr "Менять содержимое области (например, ноты)" -#: editor.cc:3061 +#: editor.cc:3062 msgid "" "Groups: click to (de)activate\n" "Context-click for other operations" @@ -2834,1400 +2870,1394 @@ msgstr "" "Группы: щёлкните для (де)активации\n" "Щелчок другой клавишей вызывает контекстное меню" -#: editor.cc:3062 +#: editor.cc:3063 #, fuzzy msgid "Nudge Region/Selection Later" msgstr "Толкнуть область выделение вперёд" -#: editor.cc:3063 +#: editor.cc:3064 #, fuzzy msgid "Nudge Region/Selection Earlier" msgstr "Толкнуть область выделение вперёд" -#: editor.cc:3064 editor_actions.cc:244 +#: editor.cc:3065 editor_actions.cc:241 msgid "Zoom In" msgstr "Увеличить" -#: editor.cc:3065 editor_actions.cc:243 +#: editor.cc:3066 editor_actions.cc:240 msgid "Zoom Out" msgstr "Уменьшить" -#: editor.cc:3066 editor_actions.cc:245 +#: editor.cc:3067 editor_actions.cc:242 msgid "Zoom to Session" msgstr "Показать всё" -#: editor.cc:3067 +#: editor.cc:3068 msgid "Zoom focus" msgstr "Фокус при масштабировании" -#: editor.cc:3068 +#: editor.cc:3069 msgid "Expand Tracks" msgstr "Увеличить дорожки по высоте" -#: editor.cc:3069 +#: editor.cc:3070 msgid "Shrink Tracks" msgstr "Уменьшить дорожки по высоте" -#: editor.cc:3070 +#: editor.cc:3071 msgid "Snap/Grid Units" msgstr "Единица прилипания/сетки" -#: editor.cc:3071 +#: editor.cc:3072 msgid "Snap/Grid Mode" msgstr "Режим прилипания/сетки" -#: editor.cc:3073 +#: editor.cc:3074 msgid "Edit Mode" msgstr "Режим редактирования" -#: editor.cc:3074 +#: editor.cc:3075 msgid "" "Nudge Clock\n" "(controls distance used to nudge regions and selections)" msgstr "" -#: editor.cc:3176 +#: editor.cc:3177 msgid "malformed URL passed to drag-n-drop code" msgstr "" -#: editor.cc:3238 editor_actions.cc:293 +#: editor.cc:3239 editor_actions.cc:290 msgid "Command|Undo" msgstr "Отменить" -#: editor.cc:3240 +#: editor.cc:3241 msgid "Command|Undo (%1)" msgstr "Отменить (%1)" -#: editor.cc:3247 editor_actions.cc:294 +#: editor.cc:3248 editor_actions.cc:291 msgid "Redo" msgstr "Вернуть" -#: editor.cc:3249 +#: editor.cc:3250 msgid "Redo (%1)" msgstr "Вернуть (%1)" -#: editor.cc:3274 editor.cc:3298 editor_actions.cc:108 editor_actions.cc:1604 +#: editor.cc:3275 editor.cc:3299 editor_actions.cc:105 editor_actions.cc:1601 msgid "Duplicate" msgstr "Продублировать" -#: editor.cc:3275 +#: editor.cc:3276 msgid "Number of duplications:" msgstr "Количество копий:" -#: editor.cc:3821 +#: editor.cc:3822 msgid "Playlist Deletion" msgstr "Удаление списка воспроизведения" -#: editor.cc:3822 +#: editor.cc:3823 msgid "" "Playlist %1 is currently unused.\n" "If it is kept, its audio files will not be cleaned.\n" "If it is deleted, audio files used by it alone will be cleaned." msgstr "" -#: editor.cc:3832 +#: editor.cc:3833 msgid "Delete Playlist" msgstr "Удалить список воспроизведения" -#: editor.cc:3833 +#: editor.cc:3834 msgid "Keep Playlist" msgstr "Сохранить список воспроизведения" -#: editor.cc:3834 editor_audio_import.cc:651 editor_ops.cc:5726 -#: processor_box.cc:1943 processor_box.cc:1968 +#: editor.cc:3835 editor_audio_import.cc:645 editor_ops.cc:5739 +#: processor_box.cc:1956 processor_box.cc:1981 msgid "Cancel" msgstr "Отмена" -#: editor.cc:3984 +#: editor.cc:3979 msgid "new playlists" msgstr "Создать списки воспроизведения" -#: editor.cc:4000 +#: editor.cc:3995 msgid "copy playlists" msgstr "Скопировать списки воспроизведения" -#: editor.cc:4015 +#: editor.cc:4010 msgid "clear playlists" msgstr "Очистить списки воспроизведения" -#: editor.cc:4663 -#, fuzzy +#: editor.cc:4652 msgid "Please wait while %1 loads visual data." -msgstr "Дождитесь загрузки визуальных данных в %1" +msgstr "Дождитесь загрузки визуальных данных в %1." -#: editor.cc:5461 editor_markers.cc:917 processor_box.cc:2221 +#: editor.cc:5456 editor_markers.cc:942 panner_ui.cc:390 processor_box.cc:2234 msgid "Edit..." -msgstr "Изменить..." +msgstr "Изменить" -#: editor_actions.cc:90 +#: editor_actions.cc:87 msgid "Autoconnect" msgstr "Автосоединение" -#: editor_actions.cc:91 +#: editor_actions.cc:88 msgid "Crossfades" msgstr "Кроссфейды" -#: editor_actions.cc:93 +#: editor_actions.cc:90 msgid "Move Selected Marker" msgstr "Переместить выделенную метку" -#: editor_actions.cc:94 +#: editor_actions.cc:91 #, fuzzy msgid "Select Range Operations" msgstr "Действия с выделенной областью" -#: editor_actions.cc:95 +#: editor_actions.cc:92 #, fuzzy msgid "Select Regions" msgstr "Выделение областей" -#: editor_actions.cc:96 +#: editor_actions.cc:93 msgid "Edit Point" msgstr "Точка редактирования" -#: editor_actions.cc:97 +#: editor_actions.cc:94 msgid "Fade" msgstr "Фейд" -#: editor_actions.cc:98 +#: editor_actions.cc:95 #, fuzzy msgid "Latch" msgstr "Задержка отклика" -#: editor_actions.cc:99 editor_regions.cc:110 region_editor.cc:47 +#: editor_actions.cc:96 editor_regions.cc:110 region_editor.cc:45 msgid "Region" msgstr "Область" -#: editor_actions.cc:100 +#: editor_actions.cc:97 msgid "Layering" msgstr "Слои" -#: editor_actions.cc:101 editor_regions.cc:111 gtk-custom-ruler.c:152 +#: editor_actions.cc:98 editor_regions.cc:111 gtk-custom-ruler.c:152 +#: stereo_panner_editor.cc:44 msgid "Position" msgstr "Положение" -#: editor_actions.cc:103 gain_meter.cc:145 gain_meter.cc:746 panner_ui.cc:177 -#: panner_ui.cc:588 +#: editor_actions.cc:100 gain_meter.cc:150 gain_meter.cc:751 panner_ui.cc:174 +#: panner_ui.cc:581 msgid "Trim" msgstr "Обрезать" -#: editor_actions.cc:104 editor_actions.cc:124 route_group_dialog.cc:40 +#: editor_actions.cc:101 editor_actions.cc:121 route_group_dialog.cc:40 msgid "Gain" msgstr "Усиление" -#: editor_actions.cc:105 editor_actions.cc:525 +#: editor_actions.cc:102 editor_actions.cc:522 msgid "Ranges" msgstr "Выделения" -#: editor_actions.cc:106 editor_actions.cc:1600 session_option_editor.cc:155 -#: session_option_editor.cc:168 session_option_editor.cc:170 -#: session_option_editor.cc:179 session_option_editor.cc:188 -#: session_option_editor.cc:195 session_option_editor.cc:202 +#: editor_actions.cc:103 editor_actions.cc:1597 session_option_editor.cc:151 +#: session_option_editor.cc:164 session_option_editor.cc:166 +#: session_option_editor.cc:175 session_option_editor.cc:184 +#: session_option_editor.cc:191 session_option_editor.cc:198 msgid "Fades" msgstr "Фейды" -#: editor_actions.cc:109 +#: editor_actions.cc:106 msgid "Link" msgstr "Связь" -#: editor_actions.cc:110 editor_actions.cc:143 +#: editor_actions.cc:107 editor_actions.cc:140 msgid "Zoom Focus" msgstr "Фокус при масштабировании" -#: editor_actions.cc:111 -#, fuzzy +#: editor_actions.cc:108 msgid "Locate to Markers" -msgstr "Метки позиций" +msgstr "Перейти к маркерам" -#: editor_actions.cc:112 editor_actions.cc:526 +#: editor_actions.cc:109 editor_actions.cc:523 msgid "Markers" msgstr "Метки" -#: editor_actions.cc:113 +#: editor_actions.cc:110 msgid "Meter falloff" msgstr "Спад индикатора" -#: editor_actions.cc:114 +#: editor_actions.cc:111 msgid "Meter hold" msgstr "Задержка индикатора" -#: editor_actions.cc:115 session_option_editor.cc:271 +#: editor_actions.cc:112 session_option_editor.cc:267 msgid "MIDI Options" msgstr "Параметры MIDI" -#: editor_actions.cc:116 +#: editor_actions.cc:113 msgid "Misc Options" msgstr "Прочие параметры" -#: editor_actions.cc:117 rc_option_editor.cc:1184 route_group_dialog.cc:49 -#: session_option_editor.cc:255 session_option_editor.cc:262 +#: editor_actions.cc:114 rc_option_editor.cc:1169 route_group_dialog.cc:49 +#: session_option_editor.cc:251 session_option_editor.cc:258 msgid "Monitoring" msgstr "Контроль" -#: editor_actions.cc:118 +#: editor_actions.cc:115 msgid "Active Mark" msgstr "Активная метка" -#: editor_actions.cc:122 +#: editor_actions.cc:119 msgid "Pullup / Pulldown" msgstr "" -#: editor_actions.cc:123 +#: editor_actions.cc:120 msgid "Region operations" msgstr "Действия с областями" -#: editor_actions.cc:125 +#: editor_actions.cc:122 msgid "Rulers" msgstr "Линейки" -#: editor_actions.cc:126 +#: editor_actions.cc:123 msgid "Views" msgstr "Виды" -#: editor_actions.cc:127 +#: editor_actions.cc:124 msgid "Scroll" msgstr "Прокрутка" -#: editor_actions.cc:131 editor_actions.cc:299 +#: editor_actions.cc:128 editor_actions.cc:296 msgid "Separate" msgstr "Разделить" -#: editor_actions.cc:134 mixer_strip.cc:1854 route_time_axis.cc:208 -#: route_time_axis.cc:2374 +#: editor_actions.cc:131 mixer_strip.cc:1855 route_time_axis.cc:214 +#: route_time_axis.cc:2412 msgid "Solo" msgstr "Соло" -#: editor_actions.cc:135 +#: editor_actions.cc:132 msgid "Subframes" msgstr "Подвыборки" -#: editor_actions.cc:138 +#: editor_actions.cc:135 msgid "Timecode fps" msgstr "Скорость (FPS) тайм-кода" -#: editor_actions.cc:139 route_time_axis.cc:438 +#: editor_actions.cc:136 route_time_axis.cc:443 msgid "Height" msgstr "Высота" -#: editor_actions.cc:141 +#: editor_actions.cc:138 msgid "Tools" msgstr "Инструменты" -#: editor_actions.cc:142 +#: editor_actions.cc:139 msgid "View" msgstr "Вид" -#: editor_actions.cc:144 +#: editor_actions.cc:141 msgid "Zoom" msgstr "Масштаб" -#: editor_actions.cc:150 +#: editor_actions.cc:147 msgid "Break drag or deselect all" msgstr "" -#: editor_actions.cc:152 +#: editor_actions.cc:149 msgid "Show Editor Mixer" msgstr "Показывать микшер редактора" -#: editor_actions.cc:153 +#: editor_actions.cc:150 msgid "Show Editor List" msgstr "Показывать список редактирования" -#: editor_actions.cc:155 +#: editor_actions.cc:152 msgid "Playhead to Next Region Boundary" msgstr "К следующей границе области" -#: editor_actions.cc:156 +#: editor_actions.cc:153 msgid "Playhead to Next Region Boundary (No Track Selection)" msgstr "" "Указатель воспроизведения к следующей границе области (без выделения дорожки)" -#: editor_actions.cc:157 +#: editor_actions.cc:154 msgid "Playhead to Previous Region Boundary" msgstr "К предыдущей границе области" -#: editor_actions.cc:158 +#: editor_actions.cc:155 #, fuzzy msgid "Playhead to Previous Region Boundary (No Track Selection)" msgstr "" "Указатель воспроизведения к предыдущей границе области (без выделения " "дорожки)" -#: editor_actions.cc:160 +#: editor_actions.cc:157 msgid "Playhead to Next Region Start" msgstr "Указатель к началу следующей области" -#: editor_actions.cc:161 +#: editor_actions.cc:158 msgid "Playhead to Next Region End" msgstr "Указатель к концу следующей области" -#: editor_actions.cc:162 +#: editor_actions.cc:159 msgid "Playhead to Next Region Sync" msgstr "Указатель воспроизведения к следующему синхронизатору области" -#: editor_actions.cc:164 +#: editor_actions.cc:161 msgid "Playhead to Previous Region Start" msgstr "Указатель к началу предыдущей области" -#: editor_actions.cc:165 +#: editor_actions.cc:162 msgid "Playhead to Previous Region End" msgstr "Указатель к концу предыдущей области" -#: editor_actions.cc:166 +#: editor_actions.cc:163 msgid "Playhead to Previous Region Sync" msgstr "Указатель воспроизведения к предыдущему синхронизатору области" -#: editor_actions.cc:168 +#: editor_actions.cc:165 #, fuzzy msgid "To Next Region Boundary" msgstr "К следующей границе области" -#: editor_actions.cc:169 +#: editor_actions.cc:166 #, fuzzy msgid "To Next Region Boundary (No Track Selection)" msgstr "к следующей границе области (без выделения дорожки)" -#: editor_actions.cc:170 +#: editor_actions.cc:167 #, fuzzy msgid "To Previous Region Boundary" msgstr "К предыдущей границе области" -#: editor_actions.cc:171 +#: editor_actions.cc:168 #, fuzzy msgid "To Previous Region Boundary (No Track Selection)" msgstr "к предыдущей границе области (без выделения дорожки)" -#: editor_actions.cc:173 +#: editor_actions.cc:170 msgid "To Next Region Start" msgstr "К началу следующей области" -#: editor_actions.cc:174 +#: editor_actions.cc:171 msgid "To Next Region End" msgstr "К концу следующей области" -#: editor_actions.cc:175 +#: editor_actions.cc:172 msgid "To Next Region Sync" msgstr "К следующему синхронизатору области" -#: editor_actions.cc:177 +#: editor_actions.cc:174 msgid "To Previous Region Start" msgstr "К началу предыдущей области" -#: editor_actions.cc:178 +#: editor_actions.cc:175 msgid "To Previous Region End" msgstr "К концу предыдущей области" -#: editor_actions.cc:179 +#: editor_actions.cc:176 msgid "To Previous Region Sync" msgstr "К предыдущему синхронизатору области" -#: editor_actions.cc:181 +#: editor_actions.cc:178 msgid "To Range Start" msgstr "К началу области" -#: editor_actions.cc:182 +#: editor_actions.cc:179 msgid "To Range End" msgstr "К концу области" -#: editor_actions.cc:184 +#: editor_actions.cc:181 msgid "Playhead to Range Start" msgstr "Указатель к началу области" -#: editor_actions.cc:185 +#: editor_actions.cc:182 msgid "Playhead to Range End" msgstr "Указатель к концу области" -#: editor_actions.cc:188 export_timespan_selector.cc:62 processor_box.cc:2207 +#: editor_actions.cc:185 export_timespan_selector.cc:61 processor_box.cc:2220 msgid "Deselect All" msgstr "Снять все выделения" -#: editor_actions.cc:193 +#: editor_actions.cc:190 msgid "Select All Overlapping Edit Range" msgstr "Выделить всю пересекающуюся область правки" -#: editor_actions.cc:194 +#: editor_actions.cc:191 msgid "Select All Inside Edit Range" msgstr "Выделить всё внутри области правки" -#: editor_actions.cc:196 +#: editor_actions.cc:193 msgid "Select Edit Range" msgstr "Выделить область правки" -#: editor_actions.cc:198 +#: editor_actions.cc:195 msgid "Select All in Punch Range" msgstr "Выделить все в области врезки" -#: editor_actions.cc:199 +#: editor_actions.cc:196 msgid "Select All in Loop Range" msgstr "Выделить всё в закольцованной области" -#: editor_actions.cc:201 +#: editor_actions.cc:198 msgid "Select Next Track or Bus" msgstr "Выбрать следующую дорожку или шину" -#: editor_actions.cc:202 +#: editor_actions.cc:199 msgid "Select Previous Track or Bus" msgstr "Выбрать предыдущую дорожку или шину" -#: editor_actions.cc:204 +#: editor_actions.cc:201 msgid "Toggle Record Enable" msgstr "Переключить готовность к записи" -#: editor_actions.cc:206 +#: editor_actions.cc:203 #, fuzzy msgid "Toggle Solo" msgstr "Изолировать соло" -#: editor_actions.cc:208 +#: editor_actions.cc:205 #, fuzzy msgid "Toggle Mute" msgstr "Переключить активность" -#: editor_actions.cc:210 +#: editor_actions.cc:207 #, fuzzy msgid "Toggle Solo Isolate" msgstr "Соло" -#: editor_actions.cc:215 +#: editor_actions.cc:212 msgid "Save View %1" msgstr "Сохранить вид %1" -#: editor_actions.cc:221 +#: editor_actions.cc:218 msgid "Goto View %1" msgstr "Перейти к виду %1" -#: editor_actions.cc:227 +#: editor_actions.cc:224 msgid "Locate to Mark %1" msgstr "Перейти к метке %1" -#: editor_actions.cc:231 +#: editor_actions.cc:228 #, fuzzy msgid "Jump to Next Mark" msgstr "К этой метке" -#: editor_actions.cc:232 +#: editor_actions.cc:229 #, fuzzy msgid "Jump to Previous Mark" msgstr "До предыдущей области" -#: editor_actions.cc:233 +#: editor_actions.cc:230 msgid "Add Mark from Playhead" msgstr "Добавить метку по указателю" -#: editor_actions.cc:235 +#: editor_actions.cc:232 #, fuzzy msgid "Nudge Next Later" msgstr "Толкнуть следующую вперёд" -#: editor_actions.cc:236 +#: editor_actions.cc:233 #, fuzzy msgid "Nudge Next Earlier" msgstr "Толкнуть следующую вперёд" -#: editor_actions.cc:238 +#: editor_actions.cc:235 msgid "Nudge Playhead Forward" msgstr "Толкнуть указатель вперёд" -#: editor_actions.cc:239 +#: editor_actions.cc:236 msgid "Nudge Playhead Backward" msgstr "Толкнуть указатель назад" -#: editor_actions.cc:240 +#: editor_actions.cc:237 #, fuzzy msgid "Playhead To Next Grid" msgstr "Указатель к концу следующей области" -#: editor_actions.cc:241 +#: editor_actions.cc:238 #, fuzzy msgid "Playhead To Previous Grid" msgstr "Указатель к концу предыдущей области" -#: editor_actions.cc:246 +#: editor_actions.cc:243 msgid "Zoom to Region" msgstr "Масштабировать в область" -#: editor_actions.cc:247 +#: editor_actions.cc:244 msgid "Zoom to Region (Width and Height)" msgstr "Масштабировать в область (в ширину и высоту)" -#: editor_actions.cc:248 +#: editor_actions.cc:245 msgid "Toggle Zoom State" msgstr "Переключить состояния масштаба" -#: editor_actions.cc:250 +#: editor_actions.cc:247 msgid "Expand Track Height" msgstr "Увеличить высоту дорожки" -#: editor_actions.cc:251 +#: editor_actions.cc:248 msgid "Shrink Track Height" msgstr "Уменьшить высоту дорожки" -#: editor_actions.cc:253 +#: editor_actions.cc:250 msgid "Move Selected Tracks Up" msgstr "Поднять выбранные дорожки" -#: editor_actions.cc:255 +#: editor_actions.cc:252 msgid "Move Selected Tracks Down" msgstr "Опустить выбранные дорожки" -#: editor_actions.cc:258 +#: editor_actions.cc:255 msgid "Scroll Tracks Up" msgstr "Прокрутить дорожки вверх" -#: editor_actions.cc:260 +#: editor_actions.cc:257 msgid "Scroll Tracks Down" msgstr "Прокрутить дорожки вниз" -#: editor_actions.cc:262 +#: editor_actions.cc:259 #, fuzzy msgid "Step Tracks Up" msgstr "Скрыть трек" -#: editor_actions.cc:264 +#: editor_actions.cc:261 msgid "Step Tracks Down" msgstr "" -#: editor_actions.cc:267 +#: editor_actions.cc:264 msgid "Scroll Backward" msgstr "Прокрутить назад" -#: editor_actions.cc:268 +#: editor_actions.cc:265 msgid "Scroll Forward" msgstr "Прокрутить вперёд" -#: editor_actions.cc:269 +#: editor_actions.cc:266 msgid "Center Playhead" msgstr "Указатель по центру" -#: editor_actions.cc:270 +#: editor_actions.cc:267 #, fuzzy msgid "Center Edit Point" msgstr "Изменить точку редактирования" -#: editor_actions.cc:272 +#: editor_actions.cc:269 msgid "Playhead Forward" msgstr "Указатель вперёд" -#: editor_actions.cc:273 +#: editor_actions.cc:270 msgid "Playhead Backward" msgstr "Указатель назад" -#: editor_actions.cc:275 +#: editor_actions.cc:272 msgid "Playhead to Active Mark" msgstr "Указатель к активной метке" -#: editor_actions.cc:276 +#: editor_actions.cc:273 msgid "Active Mark to Playhead" msgstr "Активная метка к указателю" -#: editor_actions.cc:278 +#: editor_actions.cc:275 #, fuzzy msgid "Set Loop from Edit Range" msgstr "Создать петлю из редактируемого выделения" -#: editor_actions.cc:279 +#: editor_actions.cc:276 #, fuzzy msgid "Set Punch from Edit Range" msgstr "Создать врезку из редактируемого выделения" -#: editor_actions.cc:282 +#: editor_actions.cc:279 #, fuzzy msgid "Play Selected Regions" msgstr "Воспроизвести выбранные области" -#: editor_actions.cc:284 +#: editor_actions.cc:281 #, fuzzy msgid "Play from Edit Point and Return" msgstr "Воспроизвести от курсора редактора и вернуться" -#: editor_actions.cc:286 +#: editor_actions.cc:283 msgid "Play Edit Range" msgstr "Воспроизвести изменяемое выделение" -#: editor_actions.cc:288 +#: editor_actions.cc:285 msgid "Playhead to Mouse" msgstr "Указатель к курсору мыши" -#: editor_actions.cc:289 +#: editor_actions.cc:286 msgid "Active Marker to Mouse" msgstr "Активную метку к указателю мыши" -#: editor_actions.cc:296 -#, fuzzy +#: editor_actions.cc:293 msgid "Export Audio" -msgstr "Экспортировать сессию" +msgstr "Экспортировать звук" -#: editor_actions.cc:297 export_dialog.cc:411 +#: editor_actions.cc:294 export_dialog.cc:394 msgid "Export Range" msgstr "Экспортировать область" -#: editor_actions.cc:302 +#: editor_actions.cc:299 msgid "Separate Using Punch Range" msgstr "Разделить по выделению врезки" -#: editor_actions.cc:305 +#: editor_actions.cc:302 msgid "Separate Using Loop Range" msgstr "Разделить по выделению петли" -#: editor_actions.cc:308 editor_actions.cc:325 +#: editor_actions.cc:305 editor_actions.cc:322 msgid "Crop" msgstr "Обрезать" -#: editor_actions.cc:317 -#, fuzzy +#: editor_actions.cc:314 msgid "Set Tempo from Edit Range = Bar" -msgstr "Создать область из выделенного" +msgstr "" -#: editor_actions.cc:319 +#: editor_actions.cc:316 msgid "Log" msgstr "Журнал" -#: editor_actions.cc:322 +#: editor_actions.cc:319 #, fuzzy msgid "Move Later to Transient" msgstr "Воспроизвести выделение" -#: editor_actions.cc:323 +#: editor_actions.cc:320 #, fuzzy msgid "Move Earlier to Transient" msgstr "Воспроизвести выделение" -#: editor_actions.cc:327 +#: editor_actions.cc:324 msgid "Start Range" msgstr "Начать выделение" -#: editor_actions.cc:328 +#: editor_actions.cc:325 msgid "Finish Range" msgstr "Закончить выделение" -#: editor_actions.cc:329 +#: editor_actions.cc:326 #, fuzzy msgid "Finish Add Range" msgstr "Закончить добавку выделения" -#: editor_actions.cc:359 +#: editor_actions.cc:356 msgid "Follow Playhead" msgstr "Следовать за указателем" -#: editor_actions.cc:360 +#: editor_actions.cc:357 msgid "Remove Last Capture" msgstr "Удалить последнюю запись" -#: editor_actions.cc:362 +#: editor_actions.cc:359 msgid "Stationary Playhead" msgstr "Неподвижный указатель" -#: editor_actions.cc:364 insert_time_dialog.cc:32 +#: editor_actions.cc:361 insert_time_dialog.cc:32 msgid "Insert Time" msgstr "Вставить время" -#: editor_actions.cc:367 +#: editor_actions.cc:364 msgid "Toggle Active" msgstr "Переключить активность" -#: editor_actions.cc:372 editor_actions.cc:1528 editor_markers.cc:852 -#: editor_markers.cc:918 editor_snapshots.cc:122 mixer_strip.cc:1470 -#: route_time_axis.cc:722 +#: editor_actions.cc:369 editor_actions.cc:1525 editor_markers.cc:877 +#: editor_markers.cc:943 editor_snapshots.cc:121 mixer_strip.cc:1471 +#: route_time_axis.cc:727 msgid "Remove" msgstr "Удалить" -#: editor_actions.cc:376 +#: editor_actions.cc:373 msgid "Fit Selected Tracks" msgstr "Только выделенные дорожки" -#: editor_actions.cc:378 time_axis_view.cc:1292 +#: editor_actions.cc:375 time_axis_view.cc:1297 msgid "Largest" msgstr "Огромная" -#: editor_actions.cc:381 time_axis_view.cc:1293 +#: editor_actions.cc:378 time_axis_view.cc:1298 msgid "Larger" msgstr "Больше" -#: editor_actions.cc:384 time_axis_view.cc:1294 +#: editor_actions.cc:381 time_axis_view.cc:1299 msgid "Large" msgstr "Большая" -#: editor_actions.cc:390 time_axis_view.cc:1296 +#: editor_actions.cc:387 time_axis_view.cc:1301 msgid "Small" msgstr "Маленькая" -#: editor_actions.cc:394 +#: editor_actions.cc:391 #, fuzzy msgid "Sound Selected MIDI Notes" msgstr "Выбирать/двигать области" -#: editor_actions.cc:399 +#: editor_actions.cc:396 msgid "Zoom Focus Left" msgstr "Фокус влево" -#: editor_actions.cc:400 +#: editor_actions.cc:397 msgid "Zoom Focus Right" msgstr "Фокус вправо" -#: editor_actions.cc:401 +#: editor_actions.cc:398 msgid "Zoom Focus Center" msgstr "Фокус по центру" -#: editor_actions.cc:402 +#: editor_actions.cc:399 msgid "Zoom Focus Playhead" msgstr "Фокус по указателю" -#: editor_actions.cc:403 +#: editor_actions.cc:400 msgid "Zoom Focus Mouse" msgstr "Фокус по курсору мыши" -#: editor_actions.cc:404 +#: editor_actions.cc:401 #, fuzzy msgid "Zoom Focus Edit Point" msgstr "Фокус по курсору" -#: editor_actions.cc:409 +#: editor_actions.cc:406 msgid "Object Tool" msgstr "Объект" -#: editor_actions.cc:414 +#: editor_actions.cc:411 msgid "Range Tool" msgstr "Выделение" -#: editor_actions.cc:419 +#: editor_actions.cc:416 #, fuzzy msgid "Note Drawing Tool" msgstr "Усиление" -#: editor_actions.cc:424 +#: editor_actions.cc:421 #, fuzzy msgid "Link Object / Range Tools" msgstr "Объект" -#: editor_actions.cc:427 +#: editor_actions.cc:424 msgid "Gain Tool" msgstr "Усиление" -#: editor_actions.cc:432 +#: editor_actions.cc:429 msgid "Zoom Tool" msgstr "Лупа" -#: editor_actions.cc:437 +#: editor_actions.cc:434 #, fuzzy msgid "Audition Tool" msgstr "Контроль" -#: editor_actions.cc:442 +#: editor_actions.cc:439 #, fuzzy msgid "Time FX Tool" msgstr "Время" -#: editor_actions.cc:447 +#: editor_actions.cc:444 #, fuzzy msgid "Step Mouse Mode" msgstr "Режим мыши" -#: editor_actions.cc:449 -#, fuzzy +#: editor_actions.cc:446 msgid "Edit MIDI" -msgstr "Правка" +msgstr "Изменить MIDI" -#: editor_actions.cc:459 +#: editor_actions.cc:456 msgid "Change Edit Point" msgstr "Изменить точку редактирования" -#: editor_actions.cc:460 +#: editor_actions.cc:457 msgid "Change Edit Point Including Marker" msgstr "Изменить точку редактирования, включая маркер" -#: editor_actions.cc:462 +#: editor_actions.cc:459 msgid "Splice" msgstr "Стыковка" -#: editor_actions.cc:464 +#: editor_actions.cc:461 msgid "Slide" msgstr "Скольжение" -#: editor_actions.cc:465 editor_actions.cc:1549 editor_markers.cc:836 -#: location_ui.cc:57 +#: editor_actions.cc:462 editor_actions.cc:1546 editor_markers.cc:861 +#: location_ui.cc:55 msgid "Lock" msgstr "Блок" -#: editor_actions.cc:466 +#: editor_actions.cc:463 msgid "Toggle Edit Mode" msgstr "Переключить режим редактирования" -#: editor_actions.cc:468 +#: editor_actions.cc:465 msgid "Snap to" msgstr "Прилипание" -#: editor_actions.cc:469 +#: editor_actions.cc:466 msgid "Snap Mode" msgstr "Режим прилипания" -#: editor_actions.cc:476 +#: editor_actions.cc:473 msgid "Next Snap Mode" msgstr "Следующий режим прилипания" -#: editor_actions.cc:477 +#: editor_actions.cc:474 msgid "Next Snap Choice" msgstr "Следующий выбор прилипания" -#: editor_actions.cc:478 +#: editor_actions.cc:475 #, fuzzy msgid "Next Musical Snap Choice" msgstr "Следующий выбор прилипания" -#: editor_actions.cc:479 +#: editor_actions.cc:476 #, fuzzy msgid "Previous Snap Choice" msgstr "Следующий выбор прилипания" -#: editor_actions.cc:480 +#: editor_actions.cc:477 msgid "Previous Musical Snap Choice" msgstr "" -#: editor_actions.cc:485 +#: editor_actions.cc:482 msgid "Snap to CD Frame" msgstr "К выборкам CD" -#: editor_actions.cc:486 +#: editor_actions.cc:483 msgid "Snap to Timecode Frame" msgstr "К кадрам таймкода" -#: editor_actions.cc:487 +#: editor_actions.cc:484 msgid "Snap to Timecode Seconds" msgstr "К секундам таймкода" -#: editor_actions.cc:488 +#: editor_actions.cc:485 msgid "Snap to Timecode Minutes" msgstr "К минутам таймкода" -#: editor_actions.cc:489 +#: editor_actions.cc:486 msgid "Snap to Seconds" msgstr "К секундам" -#: editor_actions.cc:490 +#: editor_actions.cc:487 msgid "Snap to Minutes" msgstr "К минутам" -#: editor_actions.cc:492 +#: editor_actions.cc:489 #, fuzzy msgid "Snap to One Twenty Eighths" msgstr "К 1/28" -#: editor_actions.cc:493 +#: editor_actions.cc:490 #, fuzzy msgid "Snap to Sixty Fourths" msgstr "К 1/24" -#: editor_actions.cc:494 +#: editor_actions.cc:491 msgid "Snap to Thirty Seconds" msgstr "К 30 секундам" -#: editor_actions.cc:495 +#: editor_actions.cc:492 msgid "Snap to Twenty Eighths" msgstr "К 1/28" -#: editor_actions.cc:496 +#: editor_actions.cc:493 msgid "Snap to Twenty Fourths" msgstr "К 1/24" -#: editor_actions.cc:497 +#: editor_actions.cc:494 msgid "Snap to Twentieths" msgstr "К 1/20" -#: editor_actions.cc:498 +#: editor_actions.cc:495 msgid "Snap to Sixteenths" msgstr "К 1/16" -#: editor_actions.cc:499 +#: editor_actions.cc:496 msgid "Snap to Fourteenths" msgstr "К 1/14" -#: editor_actions.cc:500 +#: editor_actions.cc:497 #, fuzzy msgid "Snap to Twelfths" msgstr "К 1/12" -#: editor_actions.cc:501 +#: editor_actions.cc:498 msgid "Snap to Tenths" msgstr "К 1/10" -#: editor_actions.cc:502 +#: editor_actions.cc:499 msgid "Snap to Eighths" msgstr "К 1/8" -#: editor_actions.cc:503 +#: editor_actions.cc:500 msgid "Snap to Sevenths" msgstr "К 1/7" -#: editor_actions.cc:504 +#: editor_actions.cc:501 msgid "Snap to Sixths" msgstr "К 1/6" -#: editor_actions.cc:505 +#: editor_actions.cc:502 msgid "Snap to Fifths" msgstr "К 1/5" -#: editor_actions.cc:506 +#: editor_actions.cc:503 msgid "Snap to Quarters" msgstr "К 1/4" -#: editor_actions.cc:507 +#: editor_actions.cc:504 msgid "Snap to Thirds" msgstr "К 1/3" -#: editor_actions.cc:508 +#: editor_actions.cc:505 msgid "Snap to Halves" msgstr "К 1/2" -#: editor_actions.cc:510 +#: editor_actions.cc:507 msgid "Snap to Beat" msgstr "К долям" -#: editor_actions.cc:511 +#: editor_actions.cc:508 msgid "Snap to Bar" msgstr "К тактам" -#: editor_actions.cc:512 +#: editor_actions.cc:509 msgid "Snap to Mark" msgstr "К меткам" -#: editor_actions.cc:513 +#: editor_actions.cc:510 msgid "Snap to Region Start" msgstr "К началам областей" -#: editor_actions.cc:514 +#: editor_actions.cc:511 msgid "Snap to Region End" msgstr "К концам областей" -#: editor_actions.cc:515 +#: editor_actions.cc:512 msgid "Snap to Region Sync" msgstr "К синхронизаторам областей" -#: editor_actions.cc:516 +#: editor_actions.cc:513 msgid "Snap to Region Boundary" msgstr "К границам областей" -#: editor_actions.cc:518 +#: editor_actions.cc:515 msgid "Show Marker Lines" msgstr "Показывать линии маркеров" -#: editor_actions.cc:528 +#: editor_actions.cc:525 msgid "Loop/Punch" msgstr "Петли/Врезки" -#: editor_actions.cc:532 +#: editor_actions.cc:529 msgid "Min:Sec" msgstr "Мин:С" -#: editor_actions.cc:564 +#: editor_actions.cc:561 msgid "Sort" msgstr "Сортировать" -#: editor_actions.cc:566 region_editor.cc:52 +#: editor_actions.cc:563 region_editor.cc:50 msgid "Audition" msgstr "Контроль" -#: editor_actions.cc:575 editor_routes.cc:468 mixer_ui.cc:1106 +#: editor_actions.cc:572 editor_routes.cc:467 mixer_ui.cc:1058 msgid "Show All" msgstr "Показать всё" -#: editor_actions.cc:576 +#: editor_actions.cc:573 msgid "Show Automatic Regions" msgstr "Показать автомат. области" -#: editor_actions.cc:578 +#: editor_actions.cc:575 msgid "Ascending" msgstr "По возрастанию" -#: editor_actions.cc:580 +#: editor_actions.cc:577 msgid "Descending" msgstr "По убыванию" -#: editor_actions.cc:583 +#: editor_actions.cc:580 msgid "By Region Name" msgstr "По имени области" -#: editor_actions.cc:585 +#: editor_actions.cc:582 msgid "By Region Length" msgstr "По длительности области" -#: editor_actions.cc:587 +#: editor_actions.cc:584 msgid "By Region Position" msgstr "По расположению области" -#: editor_actions.cc:589 +#: editor_actions.cc:586 msgid "By Region Timestamp" msgstr "По времени создания области" -#: editor_actions.cc:591 +#: editor_actions.cc:588 msgid "By Region Start in File" msgstr "По началу области в файле" -#: editor_actions.cc:593 +#: editor_actions.cc:590 msgid "By Region End in File" msgstr "По концу области в файле" -#: editor_actions.cc:595 +#: editor_actions.cc:592 msgid "By Source File Name" msgstr "По имени исходного файла" -#: editor_actions.cc:597 +#: editor_actions.cc:594 msgid "By Source File Length" msgstr "По длительности исходного файла" -#: editor_actions.cc:599 +#: editor_actions.cc:596 msgid "By Source File Creation Date" msgstr "По дате создания исходного файла" -#: editor_actions.cc:601 +#: editor_actions.cc:598 msgid "By Source Filesystem" msgstr "По исходной файловой системе" -#: editor_actions.cc:604 +#: editor_actions.cc:601 #, fuzzy msgid "Remove Unused" msgstr "Удаление шины" -#: editor_actions.cc:608 editor_audio_import.cc:351 +#: editor_actions.cc:605 editor_audio_import.cc:345 #: session_import_dialog.cc:74 session_import_dialog.cc:94 -#: session_metadata_dialog.cc:296 +#: session_metadata_dialog.cc:295 msgid "Import" msgstr "Импортировать" -#: editor_actions.cc:611 +#: editor_actions.cc:608 msgid "Import to Region List..." msgstr "Импортировать в список областей…" -#: editor_actions.cc:614 session_import_dialog.cc:43 +#: editor_actions.cc:611 session_import_dialog.cc:43 msgid "Import From Session" msgstr "Импортировать из сеанса" -#: editor_actions.cc:617 +#: editor_actions.cc:614 msgid "Show Summary" msgstr "Показывать сводку" -#: editor_actions.cc:619 +#: editor_actions.cc:616 msgid "Show Group Tabs" msgstr "Показывать вкладки групп" -#: editor_actions.cc:621 +#: editor_actions.cc:618 msgid "Show Measures" msgstr "Показывать линии тактов" -#: editor_actions.cc:625 +#: editor_actions.cc:622 msgid "Show Logo" msgstr "Показать логотип" -#: editor_actions.cc:649 -#, fuzzy +#: editor_actions.cc:646 msgid "Loaded editor bindings from %1" -msgstr "Загружаются меню из %1" +msgstr "" -#: editor_actions.cc:651 +#: editor_actions.cc:648 msgid "Could not find editor.bindings in search path %1" msgstr "" -#: editor_actions.cc:851 editor_actions.cc:1247 editor_actions.cc:1258 -#: editor_actions.cc:1311 editor_actions.cc:1322 editor_actions.cc:1369 -#: editor_actions.cc:1379 editor_regions.cc:1564 +#: editor_actions.cc:848 editor_actions.cc:1244 editor_actions.cc:1255 +#: editor_actions.cc:1308 editor_actions.cc:1319 editor_actions.cc:1366 +#: editor_actions.cc:1376 editor_regions.cc:1563 msgid "programming error: %1: %2" msgstr "Ошибка в программе: %1: %2" -#: editor_actions.cc:1534 +#: editor_actions.cc:1531 msgid "Raise" msgstr "Поднять" -#: editor_actions.cc:1537 +#: editor_actions.cc:1534 msgid "Raise to Top" msgstr "На самый верх" -#: editor_actions.cc:1540 gtk-custom-ruler.c:132 +#: editor_actions.cc:1537 gtk-custom-ruler.c:132 msgid "Lower" msgstr "Опустить" -#: editor_actions.cc:1543 +#: editor_actions.cc:1540 msgid "Lower to Bottom" msgstr "В самый низ" -#: editor_actions.cc:1546 +#: editor_actions.cc:1543 msgid "Move to Original Position" msgstr "К исходной позиции" -#: editor_actions.cc:1554 editor_markers.cc:843 +#: editor_actions.cc:1551 editor_markers.cc:868 msgid "Glue to Bars and Beats" msgstr "Приклеить к тактам и долям" -#: editor_actions.cc:1559 +#: editor_actions.cc:1556 msgid "Remove Sync" msgstr "Удалить синхронизатор" -#: editor_actions.cc:1562 mixer_strip.cc:1841 route_time_axis.cc:209 +#: editor_actions.cc:1559 mixer_strip.cc:1842 route_time_axis.cc:215 msgid "Mute" msgstr "Молча" -#: editor_actions.cc:1565 +#: editor_actions.cc:1562 msgid "Normalize..." msgstr "Нормализовать..." -#: editor_actions.cc:1568 +#: editor_actions.cc:1565 msgid "Reverse" msgstr "Развернуть" -#: editor_actions.cc:1571 +#: editor_actions.cc:1568 msgid "Make Mono Regions" msgstr "Создать моно-области" -#: editor_actions.cc:1574 +#: editor_actions.cc:1571 msgid "Boost Gain" msgstr "Повысить громкость области" -#: editor_actions.cc:1577 +#: editor_actions.cc:1574 msgid "Cut Gain" msgstr "Понизить громкость области" -#: editor_actions.cc:1580 +#: editor_actions.cc:1577 msgid "Pitch Shift..." msgstr "Смена высоты тона…" -#: editor_actions.cc:1583 +#: editor_actions.cc:1580 msgid "Transpose..." msgstr "Транспозиция…" -#: editor_actions.cc:1586 +#: editor_actions.cc:1583 msgid "Opaque" msgstr "Непрозрачно" -#: editor_actions.cc:1590 editor_regions.cc:115 +#: editor_actions.cc:1587 editor_regions.cc:115 msgid "Fade In" msgstr "Нарастание" -#: editor_actions.cc:1595 editor_regions.cc:116 +#: editor_actions.cc:1592 editor_regions.cc:116 msgid "Fade Out" msgstr "Затухание" -#: editor_actions.cc:1610 +#: editor_actions.cc:1607 msgid "Multi-Duplicate..." msgstr "Продублировать многократно..." -#: editor_actions.cc:1615 +#: editor_actions.cc:1612 msgid "Fill Track" msgstr "Заполнить дорожку" -#: editor_actions.cc:1619 editor_markers.cc:932 +#: editor_actions.cc:1616 editor_markers.cc:957 msgid "Set Loop Range" msgstr "Установить область петли" -#: editor_actions.cc:1626 +#: editor_actions.cc:1623 msgid "Set Punch" msgstr "Установить врезку" -#: editor_actions.cc:1630 +#: editor_actions.cc:1627 #, fuzzy msgid "Add Single Range Marker" msgstr "Добавить 1 метку области" -#: editor_actions.cc:1635 +#: editor_actions.cc:1632 #, fuzzy msgid "Add Range Marker Per Region" msgstr "Добавить метки областей" -#: editor_actions.cc:1639 +#: editor_actions.cc:1636 #, fuzzy msgid "Snap Position To Grid" msgstr "Прилипать к сетке" -#: editor_actions.cc:1642 +#: editor_actions.cc:1639 msgid "Close Gaps" msgstr "Закрыть интервалы" -#: editor_actions.cc:1645 +#: editor_actions.cc:1642 msgid "Rhythm Ferret..." msgstr "Ритмический хорёк..." -#: editor_actions.cc:1648 +#: editor_actions.cc:1645 msgid "Export..." msgstr "Экспортировать..." -#: editor_actions.cc:1654 +#: editor_actions.cc:1651 #, fuzzy msgid "Separate Under" msgstr "Разделить" -#: editor_actions.cc:1658 +#: editor_actions.cc:1655 msgid "Set Fade In Length" msgstr "Установить длину фейда нарастания" -#: editor_actions.cc:1659 +#: editor_actions.cc:1656 msgid "Set Fade Out Length" msgstr "Установить длину фейда затухания" -#: editor_actions.cc:1660 +#: editor_actions.cc:1657 #, fuzzy msgid "Set Tempo from Region = Bar" msgstr "Создать область из выделенного" -#: editor_actions.cc:1665 +#: editor_actions.cc:1662 msgid "Split at Percussion Onsets" msgstr "Разделить по атакам перкуссии" -#: editor_actions.cc:1670 +#: editor_actions.cc:1667 msgid "List Editor..." msgstr "Редактор списка событий" -#: editor_actions.cc:1673 +#: editor_actions.cc:1670 msgid "Properties..." msgstr "Свойства..." -#: editor_actions.cc:1677 +#: editor_actions.cc:1674 msgid "Bounce (with processing)" msgstr "Свести (с обработкой)" -#: editor_actions.cc:1678 +#: editor_actions.cc:1675 msgid "Bounce (without processing)" msgstr "Свести (без обработки)" -#: editor_actions.cc:1679 +#: editor_actions.cc:1676 msgid "Combine" msgstr "Объединить" -#: editor_actions.cc:1680 +#: editor_actions.cc:1677 msgid "Uncombine" msgstr "Снять объединение" -#: editor_actions.cc:1682 +#: editor_actions.cc:1679 msgid "Spectral Analysis..." msgstr "Спектральный анализ..." -#: editor_actions.cc:1684 +#: editor_actions.cc:1681 msgid "Reset Envelope" msgstr "Сбросить огибающую" -#: editor_actions.cc:1686 +#: editor_actions.cc:1683 msgid "Reset Gain" msgstr "Сбросить усиление" -#: editor_actions.cc:1691 +#: editor_actions.cc:1688 msgid "Envelope Active" msgstr "Огибающая активна" -#: editor_actions.cc:1695 -#, fuzzy +#: editor_actions.cc:1692 msgid "Quantize..." -msgstr "Квантование" +msgstr "Квантование..." -#: editor_actions.cc:1696 editor_actions.cc:1697 +#: editor_actions.cc:1693 editor_actions.cc:1694 msgid "Insert Patch Change..." msgstr "Вставить смену программы..." -#: editor_actions.cc:1698 +#: editor_actions.cc:1695 msgid "Fork" msgstr "Клонировать" -#: editor_actions.cc:1699 +#: editor_actions.cc:1696 msgid "Strip Silence..." msgstr "Вырезать тишину..." -#: editor_actions.cc:1700 +#: editor_actions.cc:1697 msgid "Set Range Selection" msgstr "Создать выделение из области" -#: editor_actions.cc:1702 +#: editor_actions.cc:1699 #, fuzzy msgid "Nudge Later" msgstr "Толкнуть вперёд" -#: editor_actions.cc:1703 +#: editor_actions.cc:1700 #, fuzzy msgid "Nudge Earlier" msgstr "Толкнуть вперёд" -#: editor_actions.cc:1708 +#: editor_actions.cc:1705 #, fuzzy msgid "Nudge Later by Capture Offset" msgstr "Толкнуть вперёд на смещение захвата" -#: editor_actions.cc:1715 +#: editor_actions.cc:1712 #, fuzzy msgid "Nudge Earlier by Capture Offset" msgstr "Толкнуть вперёд на смещение захвата" -#: editor_actions.cc:1719 +#: editor_actions.cc:1716 msgid "Trim to Loop" msgstr "В петлю" -#: editor_actions.cc:1720 +#: editor_actions.cc:1717 msgid "Trim to Punch" msgstr "Во врезку" -#: editor_actions.cc:1722 +#: editor_actions.cc:1719 msgid "Trim to Previous" msgstr "До предыдущей области" -#: editor_actions.cc:1723 +#: editor_actions.cc:1720 msgid "Trim to Next" msgstr "До следующей области" -#: editor_actions.cc:1730 +#: editor_actions.cc:1727 msgid "Insert Region From Region List" msgstr "Вставить область из списка областей" -#: editor_actions.cc:1736 +#: editor_actions.cc:1733 msgid "Set Sync Position" msgstr "Установить синхронизатор области" -#: editor_actions.cc:1737 +#: editor_actions.cc:1734 #, fuzzy msgid "Place Transient" msgstr "Воспроизвести выделение" -#: editor_actions.cc:1738 +#: editor_actions.cc:1735 msgid "Split" msgstr "Разделить" -#: editor_actions.cc:1739 +#: editor_actions.cc:1736 msgid "Trim Start at Edit Point" msgstr "Начало по курсору редактора" -#: editor_actions.cc:1740 +#: editor_actions.cc:1737 msgid "Trim End at Edit Point" msgstr "Конец по курсору редактора" -#: editor_actions.cc:1745 +#: editor_actions.cc:1742 msgid "Align Start" msgstr "Выровнять начала областей" -#: editor_actions.cc:1752 +#: editor_actions.cc:1749 msgid "Align Start Relative" msgstr "Выровнять относительно начал областей" -#: editor_actions.cc:1756 +#: editor_actions.cc:1753 msgid "Align End" msgstr "Выровнять концы областей" -#: editor_actions.cc:1761 +#: editor_actions.cc:1758 msgid "Align End Relative" msgstr "Выровнять относительно концов областей" -#: editor_actions.cc:1768 +#: editor_actions.cc:1765 msgid "Align Sync" msgstr "Выровнять по синхронизаторам областей" -#: editor_actions.cc:1775 +#: editor_actions.cc:1772 msgid "Align Sync Relative" msgstr "Выровнять относительно синхронизаторов областей" -#: editor_actions.cc:1779 editor_actions.cc:1782 +#: editor_actions.cc:1776 editor_actions.cc:1779 msgid "Choose Top..." msgstr "Выбрать верхнюю область..." -#: editor_audio_import.cc:83 editor_audio_import.cc:105 +#: editor_audio_import.cc:77 editor_audio_import.cc:99 msgid "You can't import or embed an audiofile until you have a session loaded." msgstr "" "Вы не можете импортировать или внедрить звуковой файл без открытого сеанса." -#: editor_audio_import.cc:89 editor_audio_import.cc:133 +#: editor_audio_import.cc:83 editor_audio_import.cc:127 msgid "Add Existing Media" msgstr "Добавить существующие данные" -#: editor_audio_import.cc:249 +#: editor_audio_import.cc:243 #, fuzzy msgid "" "The session already contains a source file named %1. Do you want to import " @@ -4236,7 +4266,7 @@ msgstr "" "В этом сеансе уже есть исходный файл с именем %1. Этот файл будет " "импортирован как новый, подтвердите." -#: editor_audio_import.cc:251 +#: editor_audio_import.cc:245 #, fuzzy msgid "" "The session already contains a source file named %1. Do you want to import " @@ -4245,32 +4275,32 @@ msgstr "" "В этом сеансе уже есть исходный файл с именем %1. Этот файл будет " "импортирован как новый, подтвердите." -#: editor_audio_import.cc:351 +#: editor_audio_import.cc:345 msgid "Cancel Import" msgstr "Отменить импорт" -#: editor_audio_import.cc:613 +#: editor_audio_import.cc:607 msgid "Editor: cannot open file \"%1\", (%2)" msgstr "Редактор: не удаётся открыть файл \"%1\", (%2)" -#: editor_audio_import.cc:621 +#: editor_audio_import.cc:615 msgid "Cancel entire import" msgstr "Отменить весь импорт" -#: editor_audio_import.cc:622 +#: editor_audio_import.cc:616 msgid "Don't embed it" msgstr "Не встраивать" -#: editor_audio_import.cc:623 +#: editor_audio_import.cc:617 msgid "Embed all without questions" msgstr "Встроить без лишних вопросов" -#: editor_audio_import.cc:626 editor_audio_import.cc:655 -#: export_format_dialog.cc:57 +#: editor_audio_import.cc:620 editor_audio_import.cc:649 +#: export_format_dialog.cc:58 msgid "Sample rate" msgstr "Частота сэмплирования" -#: editor_audio_import.cc:627 editor_audio_import.cc:656 +#: editor_audio_import.cc:621 editor_audio_import.cc:650 msgid "" "%1\n" "This audiofile's sample rate doesn't match the session sample rate!" @@ -4279,68 +4309,60 @@ msgstr "" "Выбранный звуковой файл имеет частоту сэмплирования,\n" "отличную от частоты активного сеанса!" -#: editor_audio_import.cc:652 +#: editor_audio_import.cc:646 msgid "Embed it anyway" msgstr "Всё равно встроить" -#: editor_audio_import.cc:701 +#: editor_audio_import.cc:695 msgid "could not open %1" msgstr "не удалось открыть %1" -#: editor_drag.cc:423 editor_routes.cc:523 editor_routes.cc:560 -#: editor_routes.cc:655 editor_routes.cc:656 editor_routes.cc:842 -#: editor_routes.cc:853 editor_routes.cc:1196 editor_routes.cc:1373 -#: editor_routes.cc:1384 -msgid "editor" -msgstr "редактор" - -#: editor_drag.cc:1000 +#: editor_drag.cc:1001 msgid "fixed time region drag" msgstr "" -#: editor_drag.cc:1968 +#: editor_drag.cc:1969 msgid "copy meter mark" msgstr "скопировать метку счетчика" -#: editor_drag.cc:1976 +#: editor_drag.cc:1977 msgid "move meter mark" msgstr "переместить метку счетчика" -#: editor_drag.cc:2088 +#: editor_drag.cc:2089 msgid "copy tempo mark" msgstr "скопировать метку темпа" -#: editor_drag.cc:2096 +#: editor_drag.cc:2097 msgid "move tempo mark" msgstr "переместить метку темпа" -#: editor_drag.cc:2304 +#: editor_drag.cc:2316 msgid "change fade in length" msgstr "смена длительности фейда нарастания" -#: editor_drag.cc:2427 +#: editor_drag.cc:2439 msgid "change fade out length" msgstr "смена длительности фейда затухания" -#: editor_drag.cc:2743 +#: editor_drag.cc:2755 msgid "move marker" msgstr "смещение метки" -#: editor_drag.cc:3291 +#: editor_drag.cc:3312 msgid "An error occurred while executing time stretch operation" msgstr "" -#: editor_drag.cc:3770 +#: editor_drag.cc:3791 editor_markers.cc:681 msgid "new range marker" msgstr "новая метка выделения" -#: editor_drag.cc:4433 +#: editor_drag.cc:4472 #, fuzzy msgid "rubberband selection" msgstr "Воспроизвести выделенное" #: editor_route_groups.cc:66 -#, fuzzy msgid "No Selection = All Tracks?" msgstr "Нет выделения = все дорожки" @@ -4355,18 +4377,16 @@ msgid "Group Tab Color" msgstr "Цвет дорожки" #: editor_route_groups.cc:97 -#, fuzzy msgid "Name of Group" -msgstr "Нет группы" +msgstr "Название группы" -#: editor_route_groups.cc:98 editor_routes.cc:202 +#: editor_route_groups.cc:98 editor_routes.cc:201 msgid "V" msgstr "" #: editor_route_groups.cc:98 -#, fuzzy msgid "Group is visible?" -msgstr "Кроссфейды видимы" +msgstr "Группа видима" #: editor_route_groups.cc:99 #, fuzzy @@ -4375,12 +4395,11 @@ msgstr "O" #: editor_route_groups.cc:99 msgid "Group is enabled?" -msgstr "" +msgstr "Группа включена" #: editor_route_groups.cc:100 -#, fuzzy msgid "group|G" -msgstr "Подгруппа" +msgstr "Г" #: editor_route_groups.cc:100 msgid "Sharing Gain?" @@ -4413,7 +4432,7 @@ msgstr "Соло" msgid "Sharing Solo?" msgstr "" -#: editor_route_groups.cc:104 mixer_strip.cc:1840 +#: editor_route_groups.cc:104 mixer_strip.cc:1841 msgid "Rec" msgstr "Зап" @@ -4437,9 +4456,8 @@ msgid "selection|Sel" msgstr "Выделение" #: editor_route_groups.cc:106 -#, fuzzy msgid "Sharing Selected Status?" -msgstr "Только выделенные дорожки" +msgstr "Разделять статус выделенности" #: editor_route_groups.cc:107 #, fuzzy @@ -4452,9 +4470,8 @@ msgid "Sharing Editing?" msgstr "Изменить точку редактирования" #: editor_route_groups.cc:108 -#, fuzzy msgid "active|A" -msgstr "Активность" +msgstr "А" #: editor_route_groups.cc:108 msgid "Sharing Active Status?" @@ -4464,20 +4481,29 @@ msgstr "" msgid "Activate this button to operate on all tracks when none are selected." msgstr "" -#: editor_route_groups.cc:453 mixer_ui.cc:1394 +#: editor_route_groups.cc:453 mixer_ui.cc:1346 msgid "unnamed" msgstr "безымянный" -#: editor_export_audio.cc:91 editor_markers.cc:671 editor_markers.cc:758 -#: editor_markers.cc:944 editor_markers.cc:962 editor_markers.cc:980 -#: editor_markers.cc:999 editor_markers.cc:1018 editor_markers.cc:1048 -#: editor_markers.cc:1079 editor_markers.cc:1109 editor_markers.cc:1137 -#: editor_markers.cc:1176 editor_markers.cc:1201 editor_markers.cc:1252 -#: editor_markers.cc:1296 editor_markers.cc:1322 editor_markers.cc:1499 -#: editor_mouse.cc:2489 +#: editor_export_audio.cc:90 editor_markers.cc:696 editor_markers.cc:783 +#: editor_markers.cc:969 editor_markers.cc:987 editor_markers.cc:1005 +#: editor_markers.cc:1024 editor_markers.cc:1043 editor_markers.cc:1073 +#: editor_markers.cc:1104 editor_markers.cc:1134 editor_markers.cc:1162 +#: editor_markers.cc:1201 editor_markers.cc:1226 editor_markers.cc:1277 +#: editor_markers.cc:1321 editor_markers.cc:1347 editor_markers.cc:1524 +#: editor_mouse.cc:2480 msgid "programming error: marker canvas item has no marker object pointer!" msgstr "Ошибка в программе: marker canvas item has no marker object pointer!" +#: editor_export_audio.cc:143 editor_export_audio.cc:148 +msgid "File Exists!" +msgstr "Файл уже существует!" + +#: editor_export_audio.cc:151 +#, fuzzy +msgid "Overwrite Existing File" +msgstr "Вставить существующие данные" + #: editor_group_tabs.cc:162 msgid "Fit to Window" msgstr "Уместить в окне" @@ -4490,110 +4516,115 @@ msgstr "Начало" msgid "end" msgstr "Конец" -#: editor_markers.cc:647 editor_ops.cc:1721 editor_ops.cc:1741 -#: editor_ops.cc:1765 editor_ops.cc:1792 location_ui.cc:1003 +#: editor_markers.cc:647 editor_ops.cc:1743 editor_ops.cc:1763 +#: editor_ops.cc:1787 editor_ops.cc:1814 location_ui.cc:1001 msgid "add marker" msgstr "добавка метки" -#: editor_markers.cc:689 location_ui.cc:838 +#: editor_markers.cc:678 +#, fuzzy +msgid "range" +msgstr "Диапазон" + +#: editor_markers.cc:714 location_ui.cc:836 msgid "remove marker" msgstr "удаление метки" -#: editor_markers.cc:825 +#: editor_markers.cc:850 msgid "Locate to Here" msgstr "Переместить сюда указатель" -#: editor_markers.cc:826 +#: editor_markers.cc:851 msgid "Play from Here" msgstr "Воспроизвести отсюда" -#: editor_markers.cc:827 +#: editor_markers.cc:852 msgid "Move Mark to Playhead" msgstr "Метка к указателю воспроизведения" -#: editor_markers.cc:831 +#: editor_markers.cc:856 msgid "Create Range to Next Marker" msgstr "Создать выделение до след. метки" -#: editor_markers.cc:872 +#: editor_markers.cc:897 msgid "Locate to Range Mark" msgstr "Указатель воспроизведения к метке выделения" -#: editor_markers.cc:873 +#: editor_markers.cc:898 msgid "Play from Range Mark" msgstr "Воспроизвести от метки выделения" -#: editor_markers.cc:877 +#: editor_markers.cc:902 msgid "Set Range Mark from Playhead" msgstr "Установить метку выделения по указателю" -#: editor_markers.cc:879 +#: editor_markers.cc:904 msgid "Set Range from Range Selection" msgstr "Создать выделение из выделения области" -#: editor_markers.cc:882 +#: editor_markers.cc:907 #, fuzzy msgid "Zoom to Range" msgstr "Масштабировать в область" -#: editor_markers.cc:889 +#: editor_markers.cc:914 msgid "Hide Range" msgstr "Скрыть выделение" -#: editor_markers.cc:890 +#: editor_markers.cc:915 msgid "Rename Range..." msgstr "Переименовать область…" -#: editor_markers.cc:894 +#: editor_markers.cc:919 msgid "Remove Range" msgstr "Удалить выделение" -#: editor_markers.cc:901 +#: editor_markers.cc:926 msgid "Separate Regions in Range" msgstr "Разделить области в выделении" -#: editor_markers.cc:904 +#: editor_markers.cc:929 msgid "Select Range" msgstr "Выбрать выделение" -#: editor_markers.cc:933 +#: editor_markers.cc:958 msgid "Set Punch Range" msgstr "Установить область врезки" -#: editor_markers.cc:1336 editor_ops.cc:1676 +#: editor_markers.cc:1361 editor_ops.cc:1698 msgid "New Name:" -msgstr "Новое имя: " +msgstr "Новое название:" -#: editor_markers.cc:1339 +#: editor_markers.cc:1364 msgid "Rename Mark" msgstr "Переименовать метку" -#: editor_markers.cc:1341 +#: editor_markers.cc:1366 msgid "Rename Range" msgstr "Переименовать выделение" -#: editor_markers.cc:1348 editor_mouse.cc:2521 processor_box.cc:1747 -#: processor_box.cc:2203 route_time_axis.cc:994 route_ui.cc:1473 +#: editor_markers.cc:1373 editor_mouse.cc:2512 processor_box.cc:1760 +#: processor_box.cc:2216 route_time_axis.cc:994 route_ui.cc:1470 msgid "Rename" msgstr "Переименовать" -#: editor_markers.cc:1361 +#: editor_markers.cc:1386 msgid "rename marker" msgstr "переименование метки" -#: editor_markers.cc:1384 +#: editor_markers.cc:1409 msgid "set loop range" msgstr "Создать петлю из области" -#: editor_markers.cc:1390 +#: editor_markers.cc:1415 msgid "set punch range" msgstr "создание выделения врезки" -#: editor_mouse.cc:178 +#: editor_mouse.cc:172 msgid "Editor::event_frame() used on unhandled event type %1" msgstr "" -#: editor_mouse.cc:2269 editor_mouse.cc:2294 editor_mouse.cc:2307 +#: editor_mouse.cc:2259 editor_mouse.cc:2284 editor_mouse.cc:2297 msgid "" "programming error: control point canvas item has no control point object " "pointer!" @@ -4601,185 +4632,185 @@ msgstr "" "ошибка в программе: control point canvas item has no control point object " "pointer!" -#: editor_mouse.cc:2427 +#: editor_mouse.cc:2418 #, fuzzy msgid "start point trim" msgstr "обрезка начальной точки" -#: editor_mouse.cc:2452 +#: editor_mouse.cc:2443 msgid "End point trim" msgstr "" -#: editor_mouse.cc:2519 +#: editor_mouse.cc:2510 msgid "Name for region:" msgstr "Название области: " -#: editor_ops.cc:141 +#: editor_ops.cc:139 msgid "split" msgstr "разделение" -#: editor_ops.cc:257 +#: editor_ops.cc:255 msgid "alter selection" msgstr "изменение выделения" -#: editor_ops.cc:299 +#: editor_ops.cc:297 msgid "nudge regions forward" msgstr "толчок областей вперед" -#: editor_ops.cc:322 editor_ops.cc:407 +#: editor_ops.cc:320 editor_ops.cc:405 msgid "nudge location forward" msgstr "толчок позиции вперед" -#: editor_ops.cc:380 +#: editor_ops.cc:378 msgid "nudge regions backward" msgstr "толчок областей назад" -#: editor_ops.cc:469 +#: editor_ops.cc:467 msgid "nudge forward" msgstr "толчок вперед" -#: editor_ops.cc:493 +#: editor_ops.cc:491 #, fuzzy msgid "nudge backward" msgstr "Толкнуть назад" -#: editor_ops.cc:558 +#: editor_ops.cc:556 msgid "build_region_boundary_cache called with snap_type = %1" msgstr "build_region_boundary_cache called with snap_type = %1" -#: editor_ops.cc:1678 +#: editor_ops.cc:1700 msgid "New Location Marker" msgstr "Новая метка позиции" -#: editor_ops.cc:1765 +#: editor_ops.cc:1787 msgid "add markers" msgstr "добавка меток" -#: editor_ops.cc:1871 +#: editor_ops.cc:1893 msgid "clear markers" msgstr "очистка меток" -#: editor_ops.cc:1884 +#: editor_ops.cc:1906 msgid "clear ranges" msgstr "" -#: editor_ops.cc:1906 +#: editor_ops.cc:1928 msgid "clear locations" msgstr "очистка позиций" -#: editor_ops.cc:1977 +#: editor_ops.cc:1999 msgid "insert dragged region" msgstr "вставка перетащенной области" -#: editor_ops.cc:2055 +#: editor_ops.cc:2077 msgid "insert region" msgstr "вставка области" -#: editor_ops.cc:2189 +#: editor_ops.cc:2211 #, fuzzy msgid "raise regions" msgstr "Нормализация областей" -#: editor_ops.cc:2191 +#: editor_ops.cc:2213 #, fuzzy msgid "raise region" msgstr "Поднять область" -#: editor_ops.cc:2197 +#: editor_ops.cc:2219 #, fuzzy msgid "raise regions to top" msgstr "Обрезать область по выделению" -#: editor_ops.cc:2199 +#: editor_ops.cc:2221 #, fuzzy msgid "raise region to top" msgstr "Поднять область" -#: editor_ops.cc:2205 +#: editor_ops.cc:2227 #, fuzzy msgid "lower regions" msgstr "Опустить область" -#: editor_ops.cc:2207 editor_ops.cc:2215 +#: editor_ops.cc:2229 editor_ops.cc:2237 #, fuzzy msgid "lower region" msgstr "Опустить область" -#: editor_ops.cc:2213 +#: editor_ops.cc:2235 #, fuzzy msgid "lower regions to bottom" msgstr "В самый низ" -#: editor_ops.cc:2298 +#: editor_ops.cc:2320 msgid "Rename Region" msgstr "Переименовать область..." -#: editor_ops.cc:2300 processor_box.cc:1745 route_ui.cc:1471 +#: editor_ops.cc:2322 processor_box.cc:1758 route_ui.cc:1468 msgid "New name:" -msgstr "Новое название: " +msgstr "Новое название:" -#: editor_ops.cc:2611 +#: editor_ops.cc:2633 msgid "separate" msgstr "отделение" -#: editor_ops.cc:2724 +#: editor_ops.cc:2746 #, fuzzy msgid "separate region under" msgstr "Разделить области в выделении" -#: editor_ops.cc:2845 +#: editor_ops.cc:2867 msgid "trim to selection" msgstr "обрезание по выделению" -#: editor_ops.cc:2981 +#: editor_ops.cc:3003 msgid "set sync point" msgstr "установка точки синхронизации" -#: editor_ops.cc:3005 +#: editor_ops.cc:3027 msgid "remove region sync" msgstr "удаление синхронизатора области" -#: editor_ops.cc:3027 +#: editor_ops.cc:3049 msgid "move regions to original position" msgstr "перемещение областей в исходную позицию" -#: editor_ops.cc:3029 +#: editor_ops.cc:3051 msgid "move region to original position" msgstr "перемещение области в исходную позицию" -#: editor_ops.cc:3050 +#: editor_ops.cc:3072 msgid "align selection" msgstr "выравнивание выделения" -#: editor_ops.cc:3124 +#: editor_ops.cc:3146 msgid "align selection (relative)" msgstr "выравнивание выделения (относительное)" -#: editor_ops.cc:3158 +#: editor_ops.cc:3180 msgid "align region" msgstr "выравнивание области" -#: editor_ops.cc:3209 +#: editor_ops.cc:3231 msgid "trim front" msgstr "обрезка впереди" -#: editor_ops.cc:3209 +#: editor_ops.cc:3231 msgid "trim back" msgstr "обрезка сзади" -#: editor_ops.cc:3237 +#: editor_ops.cc:3259 msgid "trim to loop" msgstr "обрезка в петлю" -#: editor_ops.cc:3247 +#: editor_ops.cc:3269 msgid "trim to punch" msgstr "обрезка во врезку" -#: editor_ops.cc:3309 +#: editor_ops.cc:3331 msgid "trim to region" msgstr "обрезка в область" -#: editor_ops.cc:3420 +#: editor_ops.cc:3441 msgid "" "This track/bus cannot be frozen because the signal adds or loses channels " "before reaching the outputs.\n" @@ -4787,12 +4818,12 @@ msgid "" "input or vice versa." msgstr "" -#: editor_ops.cc:3423 +#: editor_ops.cc:3444 #, fuzzy msgid "Cannot freeze" msgstr "Отменить замораживание" -#: editor_ops.cc:3429 +#: editor_ops.cc:3450 msgid "" "%1\n" "\n" @@ -4801,26 +4832,26 @@ msgid "" "Freezing will only process the signal as far as the first send/insert/return." msgstr "" -#: editor_ops.cc:3433 +#: editor_ops.cc:3454 #, fuzzy msgid "Freeze anyway" msgstr "Заморозить" -#: editor_ops.cc:3434 +#: editor_ops.cc:3455 #, fuzzy msgid "Don't freeze" msgstr "Отменить замораживание" -#: editor_ops.cc:3435 +#: editor_ops.cc:3456 #, fuzzy msgid "Freeze Limits" msgstr "Заморозить" -#: editor_ops.cc:3450 +#: editor_ops.cc:3471 msgid "Cancel Freeze" msgstr "Отменить замораживание" -#: editor_ops.cc:3481 +#: editor_ops.cc:3502 msgid "" "You can't perform this operation because the processing of the signal will " "cause one or more of the tracks will end up with a region with more channels " @@ -4829,52 +4860,52 @@ msgid "" "You can do this without processing, which is a different operation." msgstr "" -#: editor_ops.cc:3485 +#: editor_ops.cc:3506 msgid "Cannot bounce" msgstr "" -#: editor_ops.cc:3496 +#: editor_ops.cc:3517 msgid "bounce range" msgstr "сведение области" -#: editor_ops.cc:3606 +#: editor_ops.cc:3627 #, fuzzy msgid "delete" msgstr "Удалить" -#: editor_ops.cc:3609 +#: editor_ops.cc:3630 msgid "cut" msgstr "вырезать" -#: editor_ops.cc:3612 +#: editor_ops.cc:3633 msgid "copy" msgstr "копировать" -#: editor_ops.cc:3615 +#: editor_ops.cc:3636 msgid "clear" msgstr "Очистить" -#: editor_ops.cc:3669 +#: editor_ops.cc:3690 msgid " objects" msgstr " объекты" -#: editor_ops.cc:3704 +#: editor_ops.cc:3725 msgid " range" msgstr "" -#: editor_ops.cc:3842 editor_ops.cc:3869 +#: editor_ops.cc:3863 editor_ops.cc:3890 msgid "remove region" msgstr "удаление области" -#: editor_ops.cc:4273 +#: editor_ops.cc:4297 msgid "duplicate selection" msgstr "дублирование выделения" -#: editor_ops.cc:4351 +#: editor_ops.cc:4375 msgid "nudge track" msgstr "смещение дорожки" -#: editor_ops.cc:4388 +#: editor_ops.cc:4412 msgid "" "Do you really want to destroy the last capture?\n" "(This is destructive and cannot be undone)" @@ -4882,138 +4913,138 @@ msgstr "" "Последнюю запись будет удалена. Вы уверены?\n" "(отмена операции невозможна)" -#: editor_ops.cc:4391 editor_ops.cc:6374 editor_regions.cc:460 -#: editor_snapshots.cc:159 route_ui.cc:1415 +#: editor_ops.cc:4415 editor_ops.cc:6393 editor_regions.cc:459 +#: editor_snapshots.cc:158 route_ui.cc:1412 msgid "No, do nothing." msgstr "Нет" -#: editor_ops.cc:4392 +#: editor_ops.cc:4416 msgid "Yes, destroy it." msgstr "Да" -#: editor_ops.cc:4394 +#: editor_ops.cc:4418 #, fuzzy msgid "Destroy last capture" msgstr "Проверять удаление последней записи" -#: editor_ops.cc:4455 +#: editor_ops.cc:4479 msgid "normalize" msgstr "нормализация" -#: editor_ops.cc:4550 +#: editor_ops.cc:4574 msgid "reverse regions" msgstr "разворот областей" -#: editor_ops.cc:4584 +#: editor_ops.cc:4608 #, fuzzy msgid "strip silence" msgstr "Каналы" -#: editor_ops.cc:4645 +#: editor_ops.cc:4669 #, fuzzy msgid "Fork Region(s)" msgstr "как область(-и)" -#: editor_ops.cc:4839 +#: editor_ops.cc:4871 msgid "reset region gain" msgstr "сброс усиления области" -#: editor_ops.cc:4892 +#: editor_ops.cc:4924 #, fuzzy msgid "region gain envelope active" msgstr "Огибающая активна" -#: editor_ops.cc:4919 +#: editor_ops.cc:4951 #, fuzzy msgid "toggle region lock" msgstr "дополнительный счётчик" -#: editor_ops.cc:4943 +#: editor_ops.cc:4975 #, fuzzy msgid "region lock style" msgstr "дополнительный счётчик" -#: editor_ops.cc:4968 +#: editor_ops.cc:5000 #, fuzzy msgid "change region opacity" msgstr "Действия с областями" -#: editor_ops.cc:5083 +#: editor_ops.cc:5115 msgid "set fade in length" msgstr "установка длины фейда нарастания" -#: editor_ops.cc:5090 +#: editor_ops.cc:5122 msgid "set fade out length" msgstr "установка длины фейда затухания" -#: editor_ops.cc:5135 +#: editor_ops.cc:5167 msgid "set fade in shape" msgstr "установка формы фейда нарастания" -#: editor_ops.cc:5166 +#: editor_ops.cc:5198 msgid "set fade out shape" msgstr "установка формы фейда затухания" -#: editor_ops.cc:5196 +#: editor_ops.cc:5228 msgid "set fade in active" msgstr "установка активности фейда нарастания" -#: editor_ops.cc:5225 +#: editor_ops.cc:5257 msgid "set fade out active" msgstr "установка активности фейда затухания" -#: editor_ops.cc:5508 +#: editor_ops.cc:5521 msgid "set loop range from selection" msgstr "установка петли из выделения" -#: editor_ops.cc:5530 +#: editor_ops.cc:5543 #, fuzzy msgid "set loop range from edit range" msgstr "Создать область из выделенного" -#: editor_ops.cc:5559 +#: editor_ops.cc:5572 msgid "set loop range from region" msgstr "установка петли из области" -#: editor_ops.cc:5577 +#: editor_ops.cc:5590 msgid "set punch range from selection" msgstr "установка врезки из выделения" -#: editor_ops.cc:5594 +#: editor_ops.cc:5607 #, fuzzy msgid "set punch range from edit range" msgstr "Выбрать текущий интервал" -#: editor_ops.cc:5618 +#: editor_ops.cc:5631 msgid "set punch range from region" msgstr "установка врезки из области" -#: editor_ops.cc:5727 +#: editor_ops.cc:5740 msgid "Add new marker" msgstr "Создать метку" -#: editor_ops.cc:5728 +#: editor_ops.cc:5741 msgid "Set global tempo" msgstr "Установить общий темп" -#: editor_ops.cc:5731 +#: editor_ops.cc:5744 msgid "Define one bar" msgstr "" -#: editor_ops.cc:5732 +#: editor_ops.cc:5745 #, fuzzy msgid "Do you want to set the global tempo or add a new tempo marker?" msgstr "Вы хотите установить общий темп или добавить новую метку темпа?" -#: editor_ops.cc:5758 +#: editor_ops.cc:5771 msgid "set tempo from region" msgstr "установка темпа из области" -#: editor_ops.cc:5786 +#: editor_ops.cc:5799 msgid "split regions" msgstr "разделение выделений" -#: editor_ops.cc:5828 +#: editor_ops.cc:5841 msgid "" "You are about to split\n" "%1\n" @@ -5025,11 +5056,11 @@ msgstr "" "на %2 частей.\n" "Это может занять много времени." -#: editor_ops.cc:5835 +#: editor_ops.cc:5848 msgid "Call for the Ferret!" msgstr "Вызвать хорька!" -#: editor_ops.cc:5836 +#: editor_ops.cc:5849 msgid "" "Press OK to continue with this split operation\n" "or ask the Ferret dialog to tune the analysis" @@ -5037,55 +5068,55 @@ msgstr "" "Нажмите OK для выполнения разделения\n" "или попросите Хорька скорректировать анализ." -#: editor_ops.cc:5838 +#: editor_ops.cc:5851 msgid "Press OK to continue with this split operation" msgstr "Нажмите OK для выполнения разделения" -#: editor_ops.cc:5841 +#: editor_ops.cc:5854 msgid "Excessive split?" msgstr "Массовое разделение?" -#: editor_ops.cc:5985 +#: editor_ops.cc:6006 #, fuzzy msgid "place transient" msgstr "Продублировать выделение" -#: editor_ops.cc:6020 +#: editor_ops.cc:6041 #, fuzzy msgid "snap regions to grid" msgstr "Обрезать область по выделению" -#: editor_ops.cc:6059 +#: editor_ops.cc:6080 msgid "Close Region Gaps" msgstr "Закрытие интервалов между областями" -#: editor_ops.cc:6064 +#: editor_ops.cc:6085 msgid "Crossfade length" msgstr "Длительность кроссфейда" -#: editor_ops.cc:6074 editor_ops.cc:6086 rhythm_ferret.cc:104 -#: session_option_editor.cc:176 session_option_editor.cc:185 +#: editor_ops.cc:6094 editor_ops.cc:6105 rhythm_ferret.cc:101 +#: session_option_editor.cc:172 session_option_editor.cc:181 msgid "ms" msgstr "мс" -#: editor_ops.cc:6076 +#: editor_ops.cc:6096 msgid "Pull-back length" msgstr "" -#: editor_ops.cc:6090 +#: editor_ops.cc:6109 msgid "Ok" msgstr "ОК" -#: editor_ops.cc:6105 +#: editor_ops.cc:6124 #, fuzzy msgid "close region gaps" msgstr "сброс усиления области" -#: editor_ops.cc:6323 route_ui.cc:1389 +#: editor_ops.cc:6342 route_ui.cc:1386 msgid "That would be bad news ...." msgstr "" -#: editor_ops.cc:6328 route_ui.cc:1394 +#: editor_ops.cc:6347 route_ui.cc:1391 msgid "" "Removing the master or monitor bus is such a bad idea\n" "that %1 is not going to allow it.\n" @@ -5095,15 +5126,15 @@ msgid "" "\"allow-special-bus-removal\" option to be \"yes\"" msgstr "" -#: editor_ops.cc:6347 +#: editor_ops.cc:6366 route_ui.cc:1745 msgid "track" msgstr "дорожка" -#: editor_ops.cc:6353 +#: editor_ops.cc:6372 route_ui.cc:1745 msgid "bus" msgstr "шина" -#: editor_ops.cc:6358 +#: editor_ops.cc:6377 msgid "" "Do you really want to remove %1 %2 and %3 %4?\n" "(You may also lose the playlists associated with the %2)\n" @@ -5115,7 +5146,7 @@ msgstr "" "\n" "Это действие невозможно отменить, файл сеанса будет перезаписан." -#: editor_ops.cc:6363 +#: editor_ops.cc:6382 msgid "" "Do you really want to remove %1 %2?\n" "(You may also lose the playlists associated with the %2)\n" @@ -5127,7 +5158,7 @@ msgstr "" "\n" "Это действие невозможно отменить, файл сеанса будет перезаписан." -#: editor_ops.cc:6369 +#: editor_ops.cc:6388 msgid "" "Do you really want to remove %1 %2?\n" "\n" @@ -5137,45 +5168,45 @@ msgstr "" "\n" "Это действие невозможно отменить, файл сеанса будет перезаписан." -#: editor_ops.cc:6376 +#: editor_ops.cc:6395 msgid "Yes, remove them." msgstr "Да, удалить их." -#: editor_ops.cc:6378 editor_snapshots.cc:160 route_ui.cc:1416 +#: editor_ops.cc:6397 editor_snapshots.cc:159 route_ui.cc:1413 msgid "Yes, remove it." msgstr "Да, удалить" -#: editor_ops.cc:6383 editor_ops.cc:6385 +#: editor_ops.cc:6402 editor_ops.cc:6404 msgid "Remove %1" msgstr "Удалить %1" -#: editor_ops.cc:6444 +#: editor_ops.cc:6463 msgid "insert time" msgstr "вставка времени" -#: editor_ops.cc:6601 +#: editor_ops.cc:6620 msgid "There are too many tracks to fit in the current window" msgstr "Такое количество дорожек в окне не поместится" -#: editor_ops.cc:6701 +#: editor_ops.cc:6720 #, c-format msgid "Saved view %u" msgstr "Сохраненный вид %u" -#: editor_ops.cc:6726 +#: editor_ops.cc:6745 msgid "mute regions" msgstr "приглушение областей" -#: editor_ops.cc:6728 +#: editor_ops.cc:6747 msgid "mute region" msgstr "приглушение области" -#: editor_ops.cc:6765 +#: editor_ops.cc:6784 #, fuzzy msgid "combine regions" msgstr "Нормализация областей" -#: editor_ops.cc:6803 +#: editor_ops.cc:6822 #, fuzzy msgid "uncombine regions" msgstr "отключить воспроизведение этой области" @@ -5189,7 +5220,7 @@ msgstr "" msgid "Position of start of region" msgstr "В начало сеанса" -#: editor_regions.cc:112 editor_regions.cc:854 time_info_box.cc:96 +#: editor_regions.cc:112 editor_regions.cc:853 time_info_box.cc:96 msgid "End" msgstr "Конец" @@ -5215,8 +5246,8 @@ msgstr "" msgid "Length of region fade-out (units: secondary clock), () if dsisabled" msgstr "" -#: editor_regions.cc:117 mixer_strip.cc:639 mono_panner.cc:179 -#: stereo_panner.cc:216 stereo_panner.cc:239 +#: editor_regions.cc:117 mixer_strip.cc:636 mono_panner.cc:179 +#: stereo_panner.cc:217 stereo_panner.cc:240 msgid "L" msgstr "L" @@ -5233,8 +5264,8 @@ msgstr "" msgid "Region position glued to Bars|Beats time?" msgstr "" -#: editor_regions.cc:119 editor_routes.cc:206 gain_meter.cc:714 -#: mixer_strip.cc:1870 panner_ui.cc:556 stereo_panner.cc:236 +#: editor_regions.cc:119 editor_routes.cc:205 gain_meter.cc:719 +#: mixer_strip.cc:1871 panner_ui.cc:549 stereo_panner.cc:237 msgid "M" msgstr "В" @@ -5251,15 +5282,15 @@ msgstr "O" msgid "Region opaque (blocks regions below it from being heard)?" msgstr "" -#: editor_regions.cc:310 editor_regions.cc:315 editor_regions.cc:317 +#: editor_regions.cc:309 editor_regions.cc:314 editor_regions.cc:316 msgid "Hidden" msgstr "Скрытый" -#: editor_regions.cc:389 +#: editor_regions.cc:388 msgid "(MISSING) " msgstr "" -#: editor_regions.cc:457 +#: editor_regions.cc:456 #, fuzzy msgid "" "Do you really want to remove unused regions?\n" @@ -5268,135 +5299,133 @@ msgstr "" "Последнюю запись будет удалена. Вы уверены?\n" "(отмена операции невозможна)" -#: editor_regions.cc:461 +#: editor_regions.cc:460 msgid "Yes, remove." msgstr "Да, удалить" -#: editor_regions.cc:463 +#: editor_regions.cc:462 #, fuzzy msgid "Remove unused regions" msgstr "Переместить приклеенные области" -#: editor_regions.cc:821 editor_regions.cc:835 editor_regions.cc:849 -#, fuzzy +#: editor_regions.cc:820 editor_regions.cc:834 editor_regions.cc:848 msgid "Mult." -msgstr "Молча" +msgstr "" -#: editor_regions.cc:852 engine_dialog.cc:85 midi_list_editor.cc:103 +#: editor_regions.cc:851 engine_dialog.cc:82 midi_list_editor.cc:103 #: time_info_box.cc:89 msgid "Start" msgstr "Начало" -#: editor_regions.cc:870 editor_regions.cc:886 +#: editor_regions.cc:869 editor_regions.cc:885 #, fuzzy msgid "Multiple" msgstr "Тихо" -#: editor_regions.cc:955 +#: editor_regions.cc:954 msgid "MISSING " msgstr "" -#: editor_routes.cc:177 editor_routes.cc:209 +#: editor_routes.cc:176 editor_routes.cc:208 #, fuzzy msgid "SS" msgstr "SCMS" -#: editor_routes.cc:201 +#: editor_routes.cc:200 #, fuzzy msgid "Track/Bus Name" msgstr "Дорожи/шины" -#: editor_routes.cc:202 +#: editor_routes.cc:201 #, fuzzy msgid "Track/Bus visible ?" msgstr "Дорожки/Шины" -#: editor_routes.cc:203 mixer_strip.cc:1887 route_time_axis.cc:2364 +#: editor_routes.cc:202 mixer_strip.cc:1888 route_time_axis.cc:2402 msgid "A" msgstr "A" -#: editor_routes.cc:203 +#: editor_routes.cc:202 #, fuzzy msgid "Track/Bus active ?" msgstr "Дорожи/шины" -#: editor_routes.cc:204 mixer_strip.cc:1871 +#: editor_routes.cc:203 mixer_strip.cc:1872 msgid "I" msgstr "ВХ" -#: editor_routes.cc:204 +#: editor_routes.cc:203 #, fuzzy msgid "MIDI input enabled" msgstr "Входы MIDI\n" -#: editor_routes.cc:205 mixer_strip.cc:1869 mono_panner.cc:198 -#: stereo_panner.cc:214 stereo_panner.cc:241 +#: editor_routes.cc:204 mixer_strip.cc:1870 mono_panner.cc:198 +#: stereo_panner.cc:215 stereo_panner.cc:242 msgid "R" msgstr "" -#: editor_routes.cc:205 +#: editor_routes.cc:204 #, fuzzy msgid "Record enabled" msgstr "Готовность к записи" -#: editor_routes.cc:206 -#, fuzzy +#: editor_routes.cc:205 msgid "Muted" -msgstr "Молча" +msgstr "" -#: editor_routes.cc:207 mixer_strip.cc:1883 +#: editor_routes.cc:206 mixer_strip.cc:1884 msgid "S" msgstr "S" -#: editor_routes.cc:207 +#: editor_routes.cc:206 #, fuzzy msgid "Soloed" msgstr "Солирующих..." -#: editor_routes.cc:208 +#: editor_routes.cc:207 #, fuzzy msgid "SI" msgstr "S" -#: editor_routes.cc:208 mixer_strip.cc:351 rc_option_editor.cc:1597 +#: editor_routes.cc:207 mixer_strip.cc:348 rc_option_editor.cc:1582 #, fuzzy msgid "Solo Isolated" msgstr "Соло" -#: editor_routes.cc:209 +#: editor_routes.cc:208 #, fuzzy msgid "Solo Safe (Locked)" msgstr "Соло" -#: editor_routes.cc:469 mixer_ui.cc:1107 +#: editor_routes.cc:468 mixer_ui.cc:1059 msgid "Hide All" msgstr "Скрыть всё" -#: editor_routes.cc:470 mixer_ui.cc:1108 +#: editor_routes.cc:469 mixer_ui.cc:1060 msgid "Show All Audio Tracks" msgstr "Показать все звуковые дорожки" -#: editor_routes.cc:471 mixer_ui.cc:1109 +#: editor_routes.cc:470 mixer_ui.cc:1061 msgid "Hide All Audio Tracks" msgstr "Скрыть все звуковые дорожки" -#: editor_routes.cc:472 mixer_ui.cc:1110 +#: editor_routes.cc:471 mixer_ui.cc:1062 msgid "Show All Audio Busses" msgstr "Показать все звуковые шины" -#: editor_routes.cc:473 mixer_ui.cc:1111 +#: editor_routes.cc:472 mixer_ui.cc:1063 msgid "Hide All Audio Busses" msgstr "Скрыть все звуковые шины" -#: editor_routes.cc:474 +#: editor_routes.cc:473 msgid "Show All Midi Tracks" msgstr "Показать все MIDI-дорожки" -#: editor_routes.cc:475 +#: editor_routes.cc:474 msgid "Hide All Midi Tracks" msgstr "Скрыть все MIDI-дорожки" -#: editor_routes.cc:476 +#: editor_routes.cc:475 msgid "Show Tracks With Regions Under Playhead" msgstr "" @@ -5412,6 +5441,11 @@ msgstr "Стереть все позиции" msgid "Unhide locations" msgstr "Раскрыть позиции" +#: editor_rulers.cc:345 +#, fuzzy +msgid "New range" +msgstr "Создать область" + #: editor_rulers.cc:346 msgid "Clear all ranges" msgstr "Очистить все области" @@ -5428,76 +5462,74 @@ msgstr "Создать метку CD" msgid "New Tempo" msgstr "Вставить новый темп" -#: editor_rulers.cc:367 +#: editor_rulers.cc:367 tempo_dialog.cc:255 msgid "New Meter" -msgstr "Новый счётчик" +msgstr "Новый размер" -#: editor_selection.cc:870 editor_selection.cc:913 -#, fuzzy +#: editor_selection.cc:889 editor_selection.cc:932 msgid "set selected regions" -msgstr "Воспроизвести выделенную область" +msgstr "" -#: editor_selection.cc:1362 +#: editor_selection.cc:1368 msgid "select all" msgstr "Выделить всё" -#: editor_selection.cc:1454 +#: editor_selection.cc:1460 #, fuzzy msgid "select all within" msgstr "Выделить всё" -#: editor_selection.cc:1512 +#: editor_selection.cc:1518 msgid "set selection from range" msgstr "создание выделения из области" -#: editor_selection.cc:1552 +#: editor_selection.cc:1558 msgid "select all from range" msgstr "выделение всего в области" -#: editor_selection.cc:1583 +#: editor_selection.cc:1589 msgid "select all from punch" msgstr "выделение всего во врезке" -#: editor_selection.cc:1614 +#: editor_selection.cc:1620 msgid "select all from loop" msgstr "выделение всего в петле" -#: editor_selection.cc:1650 +#: editor_selection.cc:1656 msgid "select all after cursor" msgstr "выделение всего после указателя" -#: editor_selection.cc:1652 +#: editor_selection.cc:1658 msgid "select all before cursor" msgstr "выделение всего перед указателем" -#: editor_selection.cc:1701 +#: editor_selection.cc:1707 msgid "select all after edit" msgstr "выделение всего после курсора" -#: editor_selection.cc:1703 +#: editor_selection.cc:1709 msgid "select all before edit" msgstr "выделение всего до курсора" -#: editor_selection.cc:1836 +#: editor_selection.cc:1842 msgid "No edit range defined" msgstr "" -#: editor_selection.cc:1842 +#: editor_selection.cc:1848 msgid "" "the edit point is Selected Marker\n" "but there is no selected marker." msgstr "" -#: editor_snapshots.cc:137 -#, fuzzy +#: editor_snapshots.cc:136 msgid "Rename Snapshot" -msgstr "Удалить точку синхронизации" +msgstr "Переименовать снимок" -#: editor_snapshots.cc:139 +#: editor_snapshots.cc:138 msgid "New name of snapshot" msgstr "Новое название снимка" -#: editor_snapshots.cc:157 +#: editor_snapshots.cc:156 #, fuzzy msgid "" "Do you really want to remove snapshot \"%1\" ?\n" @@ -5506,10 +5538,9 @@ msgstr "" "Вы действительно хотите удалить снимок «%1»?\n" "(отмена невозможна)" -#: editor_snapshots.cc:162 -#, fuzzy +#: editor_snapshots.cc:161 msgid "Remove snapshot" -msgstr "Удалить точку синхронизации" +msgstr "Удалить снимок" #: editor_tempodisplay.cc:193 editor_tempodisplay.cc:236 msgid "add" @@ -5556,228 +5587,224 @@ msgid "" msgstr "" "ошибка в программе: meter marker canvas item has no marker object pointer!" -#: editor_timefx.cc:70 +#: editor_timefx.cc:68 #, fuzzy msgid "stretch/shrink" msgstr "Растянуть/Сжать" -#: editor_timefx.cc:131 +#: editor_timefx.cc:129 msgid "pitch shift" msgstr "смена высоты тона" -#: editor_timefx.cc:303 +#: editor_timefx.cc:301 msgid "timefx cannot be started - thread creation error" msgstr "" -#: engine_dialog.cc:76 +#: engine_dialog.cc:73 #, fuzzy msgid "Realtime" msgstr "Переименовать" -#: engine_dialog.cc:77 +#: engine_dialog.cc:74 msgid "Do not lock memory" msgstr "Не блокировать память" -#: engine_dialog.cc:78 +#: engine_dialog.cc:75 msgid "Unlock memory" msgstr "Разблокировать память" -#: engine_dialog.cc:79 +#: engine_dialog.cc:76 msgid "No zombies" msgstr "Без зомби" -#: engine_dialog.cc:80 +#: engine_dialog.cc:77 msgid "Provide monitor ports" msgstr "Предоставить контрольные порты" -#: engine_dialog.cc:81 +#: engine_dialog.cc:78 msgid "Force 16 bit" msgstr "Принудительно 16 разрядов" -#: engine_dialog.cc:82 +#: engine_dialog.cc:79 msgid "H/W monitoring" msgstr "Аппаратный контроль" -#: engine_dialog.cc:83 +#: engine_dialog.cc:80 msgid "H/W metering" msgstr "Аппаратный замер" -#: engine_dialog.cc:84 +#: engine_dialog.cc:81 msgid "Verbose output" msgstr "Подробный вывод" -#: engine_dialog.cc:104 +#: engine_dialog.cc:101 msgid "8000Hz" msgstr "8000 Гц" -#: engine_dialog.cc:105 +#: engine_dialog.cc:102 msgid "22050Hz" msgstr "22,05 КГц" -#: engine_dialog.cc:106 +#: engine_dialog.cc:103 msgid "44100Hz" msgstr "44,1 КГц" -#: engine_dialog.cc:107 +#: engine_dialog.cc:104 msgid "48000Hz" msgstr "48 КГц" -#: engine_dialog.cc:108 +#: engine_dialog.cc:105 msgid "88200Hz" msgstr "88,2 КГц" -#: engine_dialog.cc:109 +#: engine_dialog.cc:106 msgid "96000Hz" msgstr "96 КГц" -#: engine_dialog.cc:110 +#: engine_dialog.cc:107 msgid "192000Hz" msgstr "192КГц" -#: engine_dialog.cc:128 engine_dialog.cc:133 engine_dialog.cc:168 -#: engine_dialog.cc:571 midi_channel_selector.cc:147 sfdb_ui.cc:542 +#: engine_dialog.cc:125 engine_dialog.cc:130 engine_dialog.cc:165 +#: engine_dialog.cc:540 midi_channel_selector.cc:147 sfdb_ui.cc:541 msgid "None" msgstr "Нет" -#: engine_dialog.cc:129 engine_dialog.cc:572 +#: engine_dialog.cc:126 engine_dialog.cc:541 msgid "Triangular" msgstr "Треугольное" -#: engine_dialog.cc:130 engine_dialog.cc:574 +#: engine_dialog.cc:127 engine_dialog.cc:543 msgid "Rectangular" msgstr "Прямоугольное" -#: engine_dialog.cc:131 engine_dialog.cc:576 +#: engine_dialog.cc:128 engine_dialog.cc:545 msgid "Shaped" msgstr "По очертаниям" -#: engine_dialog.cc:157 +#: engine_dialog.cc:154 msgid "Playback/recording on 1 device" msgstr "Воспроизведение и запись на 1 устройстве" -#: engine_dialog.cc:158 +#: engine_dialog.cc:155 msgid "Playback/recording on 2 devices" msgstr "Воспроизведение и запись на 2 устройствах" -#: engine_dialog.cc:159 engine_dialog.cc:512 engine_dialog.cc:987 +#: engine_dialog.cc:156 engine_dialog.cc:481 engine_dialog.cc:948 msgid "Playback only" msgstr "Только воспроизведение" -#: engine_dialog.cc:160 engine_dialog.cc:514 engine_dialog.cc:990 +#: engine_dialog.cc:157 engine_dialog.cc:483 engine_dialog.cc:951 msgid "Recording only" msgstr "Только запись" -#: engine_dialog.cc:169 engine_dialog.cc:590 +#: engine_dialog.cc:166 engine_dialog.cc:559 msgid "seq" msgstr "" -#: engine_dialog.cc:170 engine_dialog.cc:592 +#: engine_dialog.cc:167 engine_dialog.cc:561 msgid "raw" msgstr "" -#: engine_dialog.cc:176 +#: engine_dialog.cc:173 msgid "Driver:" msgstr "Драйвер:" -#: engine_dialog.cc:182 +#: engine_dialog.cc:178 #, fuzzy msgid "Audio Interface:" msgstr "Интерфейс:" -#: engine_dialog.cc:188 sfdb_ui.cc:148 sfdb_ui.cc:261 sfdb_ui.cc:266 +#: engine_dialog.cc:183 sfdb_ui.cc:147 sfdb_ui.cc:260 sfdb_ui.cc:265 msgid "Sample rate:" msgstr "Частота сэмплирования:" -#: engine_dialog.cc:194 +#: engine_dialog.cc:188 msgid "Buffer size:" msgstr "Размер буфера:" -#: engine_dialog.cc:201 +#: engine_dialog.cc:194 msgid "Number of buffers:" msgstr "Число буферов:" -#: engine_dialog.cc:209 +#: engine_dialog.cc:201 msgid "Approximate latency:" msgstr "Примерная задержка:" -#: engine_dialog.cc:223 +#: engine_dialog.cc:214 msgid "Audio mode:" msgstr "Звуковой режим:" -#: engine_dialog.cc:266 -msgid "Realtime Priority" -msgstr "Приоритет реального времени" - -#: engine_dialog.cc:295 engine_dialog.cc:421 +#: engine_dialog.cc:276 engine_dialog.cc:392 msgid "Ignore" msgstr "Игнорировать" -#: engine_dialog.cc:303 +#: engine_dialog.cc:284 msgid "Client timeout" msgstr "Ошибка времени ожидания клиента" -#: engine_dialog.cc:310 +#: engine_dialog.cc:291 msgid "Number of ports:" msgstr "Число портов:" -#: engine_dialog.cc:316 +#: engine_dialog.cc:296 msgid "MIDI driver:" msgstr "Драйвер MIDI:" -#: engine_dialog.cc:323 +#: engine_dialog.cc:302 msgid "Dither:" msgstr "Подмешивание шума:" -#: engine_dialog.cc:333 +#: engine_dialog.cc:311 msgid "" "No JACK server found anywhere on this system. Please install JACK and restart" msgstr "Сервер JACK в системе не обнаружен. Установить его и попробуйте снова." -#: engine_dialog.cc:341 +#: engine_dialog.cc:319 msgid "Server:" msgstr "Сервер:" -#: engine_dialog.cc:354 +#: engine_dialog.cc:331 msgid "Input device:" msgstr "Устройство входа:" -#: engine_dialog.cc:359 +#: engine_dialog.cc:335 msgid "Output device:" msgstr "Устройство выхода:" -#: engine_dialog.cc:365 +#: engine_dialog.cc:340 msgid "Hardware input latency:" msgstr "Задержка аппаратных входов:" -#: engine_dialog.cc:369 engine_dialog.cc:377 +#: engine_dialog.cc:343 engine_dialog.cc:349 msgid "samples" msgstr "сэмплов" -#: engine_dialog.cc:373 +#: engine_dialog.cc:346 msgid "Hardware output latency:" msgstr "Задержка аппаратных выходов:" -#: engine_dialog.cc:389 +#: engine_dialog.cc:360 msgid "Device" msgstr "Устройство" -#: engine_dialog.cc:391 +#: engine_dialog.cc:362 msgid "Advanced" msgstr "Дополнительно" -#: engine_dialog.cc:492 engine_dialog.cc:981 +#: engine_dialog.cc:461 engine_dialog.cc:942 msgid "Playback/Recording on 1 Device" msgstr "Воспроизведение/Запись на 1 устройстве" -#: engine_dialog.cc:496 engine_dialog.cc:549 engine_dialog.cc:984 +#: engine_dialog.cc:465 engine_dialog.cc:518 engine_dialog.cc:945 msgid "Playback/Recording on 2 Devices" msgstr "Воспроизведение/Запись на 2 устройствах" -#: engine_dialog.cc:654 +#: engine_dialog.cc:623 msgid "cannot open JACK rc file %1 to store parameters" msgstr "" -#: engine_dialog.cc:797 +#: engine_dialog.cc:758 msgid "" "You do not have any audio devices capable of\n" "simultaneous playback and recording.\n" @@ -5794,112 +5821,110 @@ msgid "" "Ardour and choose the relevant device then." msgstr "" -#: engine_dialog.cc:810 +#: engine_dialog.cc:771 msgid "No suitable audio devices" msgstr "Нет подходящих звуковых устройств" -#: engine_dialog.cc:1024 +#: engine_dialog.cc:985 msgid "JACK appears to be missing from the %1 bundle" msgstr "" -#: engine_dialog.cc:1094 +#: engine_dialog.cc:1055 msgid "You need to choose an audio device first." msgstr "Для начала нужно выбрать звуковое устройство." -#: engine_dialog.cc:1110 +#: engine_dialog.cc:1072 msgid "Audio device \"%1\" not known on this computer." msgstr "Звуковое устройство \"%1\" в этом компьютере не обнаружено." -#: engine_dialog.cc:1266 +#: engine_dialog.cc:1224 msgid "AudioSetup value for %1 is missing data" msgstr "Значению AudioSetup для %1 не хватает данных" -#: engine_dialog.cc:1348 +#: engine_dialog.cc:1303 msgid "configuration files contain a JACK server path that doesn't exist (%1)" msgstr "" -#: export_channel_selector.cc:48 sfdb_ui.cc:146 +#: export_channel_selector.cc:45 sfdb_ui.cc:145 msgid "Channels:" msgstr "Каналов:" -#: export_channel_selector.cc:49 +#: export_channel_selector.cc:46 msgid "Split to mono files" msgstr "Разделить на монофонические файлы" -#: export_channel_selector.cc:183 +#: export_channel_selector.cc:180 msgid "Bus or Track" msgstr "Шина или дорожка" -#: export_channel_selector.cc:460 +#: export_channel_selector.cc:457 msgid "Region contents without fades nor region gain (channels: %1)" msgstr "" -#: export_channel_selector.cc:464 +#: export_channel_selector.cc:461 msgid "Region contents with fades and region gain (channels: %1)" msgstr "" -#: export_channel_selector.cc:468 +#: export_channel_selector.cc:465 #, fuzzy msgid "Track output (channels: %1)" msgstr "Выходящие каналы" -#: export_dialog.cc:45 +#: export_dialog.cc:43 msgid "" "Some already existing files will be overwritten." msgstr "" -#: export_dialog.cc:46 -#, fuzzy +#: export_dialog.cc:44 msgid "List files" -msgstr "Вставить внешний аудиофайл" +msgstr "" -#: export_dialog.cc:169 export_timespan_selector.cc:358 -#: export_timespan_selector.cc:422 +#: export_dialog.cc:163 export_timespan_selector.cc:357 +#: export_timespan_selector.cc:421 msgid "Time Span" msgstr "Отрезок времени" -#: export_dialog.cc:181 +#: export_dialog.cc:175 msgid "Channels" msgstr "Каналы" -#: export_dialog.cc:192 -msgid "Advanced options" -msgstr "Расширенные параметры" +#: export_dialog.cc:186 +msgid "Time span and channel options" +msgstr "Параметры отрезка времени и каналов" -#: export_dialog.cc:226 +#: export_dialog.cc:220 msgid "" "Export has been aborted due to an error!\n" "See the Log for details." msgstr "" -#: export_dialog.cc:296 +#: export_dialog.cc:289 msgid "Files that will be overwritten" msgstr "" -#: export_dialog.cc:330 +#: export_dialog.cc:315 msgid "Stop Export" msgstr "Остановить экспорт" -#: export_dialog.cc:360 +#: export_dialog.cc:344 #, fuzzy msgid "Normalizing '%3' (timespan %1 of %2)" msgstr "Импортируется файл: %1 из %2" -#: export_dialog.cc:364 -#, fuzzy +#: export_dialog.cc:348 msgid "Exporting '%3' (timespan %1 of %2)" -msgstr "Импортируется файл: %1 из %2" +msgstr "Экспортируется '%3' (отрезок времени %1 из %2)" -#: export_dialog.cc:388 export_dialog.cc:390 +#: export_dialog.cc:371 export_dialog.cc:373 msgid "Error: " msgstr "Ошибка: " -#: export_dialog.cc:400 +#: export_dialog.cc:383 msgid "Warning: " msgstr "Предупреждение: " -#: export_dialog.cc:402 +#: export_dialog.cc:385 msgid "" "\n" "Warning: " @@ -5907,75 +5932,85 @@ msgstr "" "\n" "Предупреждение: " -#: export_dialog.cc:425 +#: export_dialog.cc:408 msgid "Export Selection" msgstr "Экспортировать выделение" -#: export_dialog.cc:438 +#: export_dialog.cc:421 msgid "Export Region" msgstr "Экспортировать область" -#: export_dialog.cc:448 +#: export_dialog.cc:431 msgid "Source" msgstr "Источник" -#: export_dialog.cc:463 +#: export_dialog.cc:446 #, fuzzy msgid "Stem Export" msgstr "Остановить экспорт" -#: export_file_notebook.cc:40 -msgid " Click here to add another format" +#: export_file_notebook.cc:38 +#, fuzzy +msgid "Add another format" msgstr "Щёлкните для добавления формата" -#: export_file_notebook.cc:180 +#: export_file_notebook.cc:178 msgid "Format" msgstr "Формат" -#: export_file_notebook.cc:181 +#: export_file_notebook.cc:179 msgid "Location" msgstr "Расположение" -#: export_filename_selector.cc:34 +#: export_file_notebook.cc:255 +#, fuzzy +msgid "No format!" +msgstr "Формат" + +#: export_file_notebook.cc:267 +msgid "Format %1: %2" +msgstr "Формат %1: %2" + +#: export_filename_selector.cc:30 msgid "Include in Filename(s):" msgstr "Включить в название файлов:" -#: export_filename_selector.cc:36 +#: export_filename_selector.cc:32 msgid "Label:" msgstr "Метка:" -#: export_filename_selector.cc:37 +#: export_filename_selector.cc:33 msgid "Session Name" msgstr "Название сеанса" -#: export_filename_selector.cc:38 +#: export_filename_selector.cc:34 msgid "Revision:" msgstr "Редакция:" -#: export_filename_selector.cc:40 +#: export_filename_selector.cc:36 msgid "Folder:" msgstr "Папка:" -#: export_filename_selector.cc:41 session_import_dialog.cc:44 +#: export_filename_selector.cc:37 session_import_dialog.cc:44 msgid "Browse" msgstr "Указать" -#: export_filename_selector.cc:214 +#: export_filename_selector.cc:210 msgid "Sorry, no example filename can be shown at the moment" msgstr "Извините, показать пример имени файла сейчас невозможно" -#: export_filename_selector.cc:216 +#: export_filename_selector.cc:212 msgid "Example filename: \"%1\"" msgstr "Пример имени файла: \"%1\"" -#: export_filename_selector.cc:253 export_filename_selector.cc:339 +#: export_filename_selector.cc:249 export_filename_selector.cc:335 msgid "" "%1: this is only the directory/folder name, not the filename.\n" "The filename will be chosen from the information just above the folder " "selector." msgstr "" -#: export_filename_selector.cc:325 +#: export_filename_selector.cc:321 msgid "Choose export folder" msgstr "Выберите папку для экспорта данных" @@ -5991,87 +6026,87 @@ msgstr "Изменить профиль формата экспорта" msgid "Label: " msgstr "Название:" -#: export_format_dialog.cc:40 normalize_dialog.cc:42 +#: export_format_dialog.cc:41 normalize_dialog.cc:42 msgid "Normalize to:" msgstr "Нормализовать до:" -#: export_format_dialog.cc:45 +#: export_format_dialog.cc:46 msgid "Trim silence at start" msgstr "Отрезать тишину в начале" -#: export_format_dialog.cc:46 +#: export_format_dialog.cc:47 msgid "Add silence at start:" msgstr "Добавить тишину в начало:" -#: export_format_dialog.cc:49 +#: export_format_dialog.cc:50 msgid "Trim silence at end" msgstr "Отрезать тишину в начале" -#: export_format_dialog.cc:50 +#: export_format_dialog.cc:51 msgid "Add silence at end:" msgstr "Добавить тишину в конец:" -#: export_format_dialog.cc:54 +#: export_format_dialog.cc:55 msgid "Compatibility" msgstr "Совместимость" -#: export_format_dialog.cc:55 +#: export_format_dialog.cc:56 msgid "Quality" msgstr "Качество" -#: export_format_dialog.cc:56 +#: export_format_dialog.cc:57 msgid "File format" -msgstr "Формат файлов" +msgstr "Формат" -#: export_format_dialog.cc:58 +#: export_format_dialog.cc:59 msgid "Sample rate conversion quality:" msgstr "Качество преобразования частоты сэмплирования:" -#: export_format_dialog.cc:65 +#: export_format_dialog.cc:66 msgid "Dithering" msgstr "Подмешивание шума" -#: export_format_dialog.cc:67 +#: export_format_dialog.cc:68 msgid "Create CUE file for disk-at-once CD/DVD creation" msgstr "Записать файл CUE для создания CD/DVD" -#: export_format_dialog.cc:68 +#: export_format_dialog.cc:69 msgid "Create TOC file for disk-at-once CD/DVD creation" msgstr "Записать файл TOC для создания CD/DVD" -#: export_format_dialog.cc:70 +#: export_format_dialog.cc:71 msgid "Tag file with session's metadata" msgstr "Добавить в файла метаданные сеанса" -#: export_format_dialog.cc:454 +#: export_format_dialog.cc:461 msgid "Best (sinc)" -msgstr "" +msgstr "Наилучшее (sinc)" -#: export_format_dialog.cc:459 +#: export_format_dialog.cc:466 msgid "Medium (sinc)" -msgstr "" +msgstr "Среднее (sinc)" -#: export_format_dialog.cc:464 +#: export_format_dialog.cc:471 msgid "Fast (sinc)" -msgstr "" +msgstr "Быстро (sinc)" -#: export_format_dialog.cc:474 +#: export_format_dialog.cc:481 msgid "Zero order hold" msgstr "" -#: export_format_dialog.cc:865 +#: export_format_dialog.cc:879 msgid "Linear encoding options" msgstr "Параметры линейного кодирования" -#: export_format_dialog.cc:881 +#: export_format_dialog.cc:895 msgid "Ogg Vorbis options" msgstr "Параметры Ogg Vorbis" -#: export_format_dialog.cc:894 +#: export_format_dialog.cc:908 msgid "FLAC options" msgstr "Параметры FLAC" -#: export_format_dialog.cc:911 +#: export_format_dialog.cc:925 msgid "Broadcast Wave options" msgstr "Параметры Broadcast Wave" @@ -6085,48 +6120,48 @@ msgid "" "Perhaps it references a format that has been removed?" msgstr "" -#: export_timespan_selector.cc:47 +#: export_timespan_selector.cc:46 msgid "Show Times as:" msgstr "Показать время как:" -#: export_timespan_selector.cc:207 +#: export_timespan_selector.cc:206 msgid " to " msgstr " до " -#: export_timespan_selector.cc:351 export_timespan_selector.cc:412 +#: export_timespan_selector.cc:350 export_timespan_selector.cc:411 msgid "Range" msgstr "Диапазон" -#: gain_meter.cc:130 gain_meter.cc:418 gain_meter.cc:811 +#: gain_meter.cc:135 gain_meter.cc:423 gain_meter.cc:816 msgid "-inf" msgstr "-inf" -#: gain_meter.cc:136 gain_meter.cc:857 +#: gain_meter.cc:141 gain_meter.cc:862 msgid "Fader automation mode" msgstr "Режим автоматизации фейдера" -#: gain_meter.cc:137 gain_meter.cc:858 +#: gain_meter.cc:142 gain_meter.cc:863 msgid "Fader automation type" msgstr "Тип автоматизации фейдера" -#: gain_meter.cc:146 gain_meter.cc:750 panner_ui.cc:178 panner_ui.cc:592 +#: gain_meter.cc:151 gain_meter.cc:755 panner_ui.cc:175 panner_ui.cc:585 msgid "Abs" msgstr "Абс" -#: gain_meter.cc:345 +#: gain_meter.cc:350 msgid "-Inf" msgstr "-Inf" -#: gain_meter.cc:717 mixer_strip.cc:1890 panner_ui.cc:559 -#: route_time_axis.cc:2368 +#: gain_meter.cc:722 mixer_strip.cc:1891 panner_ui.cc:552 +#: route_time_axis.cc:2406 msgid "P" msgstr "P" -#: gain_meter.cc:720 panner_ui.cc:562 +#: gain_meter.cc:725 panner_ui.cc:555 msgid "T" msgstr "К" -#: gain_meter.cc:723 panner_ui.cc:565 +#: gain_meter.cc:728 panner_ui.cc:558 msgid "W" msgstr "З" @@ -6139,7 +6174,7 @@ msgstr "Профили" msgid "Switches" msgstr "Высота тона" -#: generic_pluginui.cc:242 generic_pluginui.cc:372 processor_box.cc:2180 +#: generic_pluginui.cc:242 generic_pluginui.cc:372 processor_box.cc:2193 msgid "Controls" msgstr "Управление" @@ -6161,7 +6196,7 @@ msgstr "Контроль автоматизации" msgid "Mgnual" msgstr "сигнал" -#: global_port_matrix.cc:190 io_selector.cc:219 +#: global_port_matrix.cc:192 io_selector.cc:216 msgid "port" msgstr "порт" @@ -6250,9 +6285,8 @@ msgid "Draw current ruler position" msgstr "Нарисовать текущее положение на линейке" #: insert_time_dialog.cc:46 -#, fuzzy msgid "Time to insert:" -msgstr "JACK-счётчик - мастер" +msgstr "" #: insert_time_dialog.cc:54 msgid "Intersected regions should:" @@ -6308,69 +6342,69 @@ msgstr "Вставить область" msgid "Importing file: %1 of %2" msgstr "Импортируется файл: %1 из %2" -#: io_selector.cc:223 +#: io_selector.cc:220 #, fuzzy msgid "I/O selector" msgstr "Обратить выделение" -#: io_selector.cc:271 +#: io_selector.cc:268 msgid "%1 input" msgstr "%1 вход" -#: io_selector.cc:273 +#: io_selector.cc:270 msgid "%1 output" msgstr "%1 выход" -#: keyboard.cc:69 +#: keyboard.cc:66 msgid "your own" msgstr "" -#: keyboard.cc:132 keyboard.cc:156 +#: keyboard.cc:129 keyboard.cc:153 #, fuzzy msgid "Default keybindings not found - %1 will be hard to use!" msgstr "" "Конфигурация комбинаций клавиш недоступна, работать с программой будет " "сложно!" -#: keyboard.cc:135 keyboard.cc:159 +#: keyboard.cc:132 keyboard.cc:156 msgid "Key bindings file \"%1\" not found. Default bindings used instead" msgstr "" -#: keyeditor.cc:57 +#: keyeditor.cc:54 msgid "Remove shortcut" msgstr "Удалить комбинацию" -#: keyeditor.cc:67 +#: keyeditor.cc:64 msgid "Action" msgstr "Действие" -#: keyeditor.cc:68 +#: keyeditor.cc:65 msgid "Shortcut" msgstr "Комбинация клавиш" -#: keyeditor.cc:86 +#: keyeditor.cc:83 msgid "Select an action, then press the key(s) to (re)set its shortcut" msgstr "Выберите действие и нажмите комбинацию клавиш для него" -#: keyeditor.cc:248 +#: keyeditor.cc:245 msgid "Main_menu" msgstr "" -#: keyeditor.cc:252 +#: keyeditor.cc:249 msgid "redirectmenu" msgstr "" -#: keyeditor.cc:254 +#: keyeditor.cc:251 #, fuzzy msgid "Editor_menus" msgstr "Редактор" -#: keyeditor.cc:256 +#: keyeditor.cc:253 #, fuzzy msgid "RegionList" msgstr "Области" -#: keyeditor.cc:258 +#: keyeditor.cc:255 #, fuzzy msgid "ProcessorMenu" msgstr "Переименовать обработчик" @@ -6387,102 +6421,99 @@ msgstr "мс" msgid "period" msgstr "период" -#: latency_gui.cc:71 panner_ui.cc:403 +#: latency_gui.cc:71 panner_ui.cc:389 msgid "Reset" msgstr "Сбросить" -#: latency_gui.cc:150 rhythm_ferret.cc:258 sfdb_ui.cc:1574 +#: latency_gui.cc:150 rhythm_ferret.cc:255 sfdb_ui.cc:1592 msgid "programming error: %1 (%2)" msgstr "Ошибка в программе: %1 (%2)" -#: location_ui.cc:51 location_ui.cc:53 +#: location_ui.cc:49 location_ui.cc:51 msgid "Use PH" msgstr "Исп. УВ" -#: location_ui.cc:55 +#: location_ui.cc:53 msgid "CD" msgstr "CD" -#: location_ui.cc:58 +#: location_ui.cc:56 msgid "Glue" msgstr "Приклеить" -#: location_ui.cc:83 +#: location_ui.cc:81 #, fuzzy msgid "Performer:" msgstr "Производительность" -#: location_ui.cc:84 -#, fuzzy +#: location_ui.cc:82 msgid "Composer:" -msgstr "Композитор" +msgstr "Композитор:" -#: location_ui.cc:86 +#: location_ui.cc:84 msgid "Pre-Emphasis" msgstr "" -#: location_ui.cc:308 -#, fuzzy +#: location_ui.cc:306 msgid "Remove this range" -msgstr "создание выделения врезки" +msgstr "Удалить эту область" -#: location_ui.cc:309 +#: location_ui.cc:307 msgid "Start time - middle click to locate here" msgstr "" -#: location_ui.cc:310 +#: location_ui.cc:308 msgid "End time - middle click to locate here" msgstr "" -#: location_ui.cc:313 +#: location_ui.cc:311 #, fuzzy msgid "Set range start from playhead location" msgstr "Установить метку выделения по указателю" -#: location_ui.cc:314 +#: location_ui.cc:312 #, fuzzy msgid "Set range end from playhead location" msgstr "Создать выделение из выделения области" -#: location_ui.cc:318 -#, fuzzy +#: location_ui.cc:316 msgid "Remove this marker" -msgstr "Забыть эту метку" +msgstr "Удалить эту метку" -#: location_ui.cc:319 +#: location_ui.cc:317 msgid "Position - middle click to locate here" msgstr "" -#: location_ui.cc:321 +#: location_ui.cc:319 #, fuzzy msgid "Set marker time from playhead location" msgstr "Создать выделение из выделения области" -#: location_ui.cc:460 +#: location_ui.cc:458 msgid "You cannot put a CD marker at the start of the session" msgstr "Размещение метки CD в начале сеанса невозможно" -#: location_ui.cc:706 +#: location_ui.cc:704 msgid "New Marker" msgstr "Создать метку" -#: location_ui.cc:707 +#: location_ui.cc:705 msgid "New Range" msgstr "Создать область" -#: location_ui.cc:720 +#: location_ui.cc:718 msgid "Loop/Punch Ranges" msgstr "Области петель/врезок" -#: location_ui.cc:745 +#: location_ui.cc:743 msgid "Markers (Including CD Index)" msgstr "Метки (включая индекс CD)" -#: location_ui.cc:780 +#: location_ui.cc:778 msgid "Ranges (Including CD Track Ranges)" msgstr "Области (включая области дорожек CD)" -#: location_ui.cc:1022 +#: location_ui.cc:1020 msgid "add range marker" msgstr "добавка метки выделения" @@ -6508,25 +6539,20 @@ msgstr "" "\n" "Пожалуйста, проверьте все варианты; возможно потребуется (пере)запуск JACK." -#: main.cc:217 -#, fuzzy -msgid "Could not create user configuration directory" -msgstr "Ardour: не удалось прочитать файл конфигурации интерфейса \"%1\"" +#: main.cc:185 main.cc:274 +msgid "cannot create user ardour folder %1 (%2)" +msgstr "Не удалось создать папку Ardour %1 (%2)" -#: main.cc:226 main.cc:355 +#: main.cc:192 main.cc:281 #, fuzzy msgid "cannot open pango.rc file %1" msgstr "не удалось отобразить заставку (файл \"%1\")" -#: main.cc:344 -msgid "cannot create user ardour folder %1 (%2)" -msgstr "Не удалось создать папку Ardour %1 (%2)" - -#: main.cc:381 main.cc:397 +#: main.cc:312 main.cc:328 msgid "JACK exited" msgstr "JACk завершил работу" -#: main.cc:384 +#: main.cc:315 msgid "" "JACK exited unexpectedly, and without notifying %1.\n" "\n" @@ -6535,7 +6561,7 @@ msgid "" "Click OK to exit %1." msgstr "" -#: main.cc:399 +#: main.cc:330 msgid "" "JACK exited unexpectedly, and without notifying %1.\n" "\n" @@ -6544,20 +6570,19 @@ msgid "" "session at this time, because we would lose your connection information.\n" msgstr "" -#: main.cc:490 +#: main.cc:417 msgid " (built using " msgstr "" -#: main.cc:493 +#: main.cc:420 msgid " and GCC version " msgstr ", при помощи GCC версии " -#: main.cc:503 -#, fuzzy +#: main.cc:430 msgid "Copyright (C) 1999-2012 Paul Davis" -msgstr "Авторские права © 1999-2010 Paul Davis" +msgstr "Авторские права © 1999-2012 Paul Davis" -#: main.cc:504 +#: main.cc:431 msgid "" "Some portions Copyright (C) Steve Harris, Ari Johnson, Brett Viren, Joel " "Baker" @@ -6565,30 +6590,35 @@ msgstr "" "Частичные авторские права © Steve Harris, Ari Johnson, Brett Viren, Joel " "Baker" -#: main.cc:506 +#: main.cc:433 msgid "%1 comes with ABSOLUTELY NO WARRANTY" msgstr "%1 распространяется БЕЗО ВСЯКИХ ГАРАНТИЙ" -#: main.cc:507 +#: main.cc:434 msgid "not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." msgstr "" -#: main.cc:508 +#: main.cc:435 msgid "This is free software, and you are welcome to redistribute it " msgstr "Это свободное программное обеспечение, Вы можете распространять его" -#: main.cc:509 +#: main.cc:436 msgid "under certain conditions; see the source for copying conditions." msgstr "на определённых условиях; подробнее об этом читайте в файле COPYING." -#: main.cc:518 +#: main.cc:445 msgid "Cannot xinstall SIGPIPE error handler" msgstr "" -#: main.cc:524 +#: main.cc:451 msgid "could not create ARDOUR GUI" msgstr "не удалось создать графический интерфейс для ARDOUR" +#: main_clock.cc:51 +#, fuzzy +msgid "Display delta to edit cursor" +msgstr "Основной счётчик показывается разницу с курсором редактора" + #: marker.cc:251 msgid "MarkerText" msgstr "ТекстМетки" @@ -6605,6 +6635,10 @@ msgstr "Инверсия" msgid "Force" msgstr "Принуд." +#: midi_export_dialog.cc:31 +msgid "Export MIDI: %1" +msgstr "Экспорт MIDI: %1" + #: midi_list_editor.cc:55 msgid "Whole" msgstr "Целая" @@ -6671,32 +6705,31 @@ msgstr "Добавить темп" msgid "edit note length" msgstr "смена длительности нот" -#: midi_list_editor.cc:461 -#, fuzzy +#: midi_list_editor.cc:460 msgid "insert new note" -msgstr "вставка времени" +msgstr "" -#: midi_list_editor.cc:525 +#: midi_list_editor.cc:524 #, fuzzy msgid "delete notes (from list)" msgstr "удаление ноты" -#: midi_list_editor.cc:600 +#: midi_list_editor.cc:599 #, fuzzy msgid "change note channel" msgstr "смена канала" -#: midi_list_editor.cc:608 +#: midi_list_editor.cc:607 #, fuzzy msgid "change note number" msgstr "смена длительности нот" -#: midi_list_editor.cc:618 +#: midi_list_editor.cc:617 #, fuzzy msgid "change note velocity" msgstr "смена силы нажатия" -#: midi_list_editor.cc:688 +#: midi_list_editor.cc:687 #, fuzzy msgid "change note length" msgstr "смена длительности нот" @@ -6713,157 +6746,166 @@ msgstr "Название порта:" msgid "MidiPortDialog" msgstr "" -#: midi_region_view.cc:794 +#: midi_region_view.cc:838 msgid "channel edit" msgstr "" -#: midi_region_view.cc:852 +#: midi_region_view.cc:874 +#, fuzzy +msgid "velocity edit" +msgstr "Сила нажатия" + +#: midi_region_view.cc:932 #, fuzzy msgid "add note" msgstr "Добавить темп" -#: midi_region_view.cc:1684 +#: midi_region_view.cc:1784 msgid "step add" msgstr "" -#: midi_region_view.cc:1750 midi_region_view.cc:1770 +#: midi_region_view.cc:1863 midi_region_view.cc:1883 msgid "alter patch change" msgstr "" -#: midi_region_view.cc:1804 +#: midi_region_view.cc:1917 msgid "add patch change" msgstr "добавка смены программы" -#: midi_region_view.cc:1822 +#: midi_region_view.cc:1935 msgid "move patch change" msgstr "перемещение смены программы" -#: midi_region_view.cc:1833 +#: midi_region_view.cc:1946 msgid "delete patch change" msgstr "удаление смены программы" -#: midi_region_view.cc:1918 +#: midi_region_view.cc:2015 msgid "delete selection" msgstr "удаление выделения" -#: midi_region_view.cc:1934 +#: midi_region_view.cc:2031 msgid "delete note" msgstr "удаление ноты" -#: midi_region_view.cc:2360 +#: midi_region_view.cc:2454 msgid "move notes" msgstr "перемещение ноты" -#: midi_region_view.cc:2582 +#: midi_region_view.cc:2676 msgid "resize notes" msgstr "смена размера ноты" -#: midi_region_view.cc:2835 +#: midi_region_view.cc:2930 msgid "change velocities" msgstr "смена силы нажатия" -#: midi_region_view.cc:2888 +#: midi_region_view.cc:2995 msgid "transpose" msgstr "транспозиция" -#: midi_region_view.cc:2922 +#: midi_region_view.cc:3029 msgid "change note lengths" msgstr "смена длительности нот" -#: midi_region_view.cc:2991 +#: midi_region_view.cc:3098 msgid "nudge" msgstr "толчок" -#: midi_region_view.cc:3006 +#: midi_region_view.cc:3113 msgid "change channel" msgstr "смена канала" -#: midi_region_view.cc:3051 +#: midi_region_view.cc:3158 msgid "Bank:" msgstr "Банк:" -#: midi_region_view.cc:3051 +#: midi_region_view.cc:3159 msgid "Program:" msgstr "Программа:" -#: midi_region_view.cc:3051 +#: midi_region_view.cc:3160 msgid "Channel:" msgstr "Канал:" -#: midi_region_view.cc:3198 midi_region_view.cc:3200 +#: midi_region_view.cc:3309 midi_region_view.cc:3311 msgid "paste" msgstr "вставка" -#: midi_time_axis.cc:379 +#: midi_time_axis.cc:222 +msgid "External MIDI Device" +msgstr "Внешнее MIDI-устройство" + +#: midi_time_axis.cc:223 +msgid "External Device Mode" +msgstr "Режим внешнего устройства" + +#: midi_time_axis.cc:396 msgid "Show Full Range" msgstr "Показать все октавы" -#: midi_time_axis.cc:383 +#: midi_time_axis.cc:400 msgid "Fit Contents" msgstr "Уместить содержимое" -#: midi_time_axis.cc:387 +#: midi_time_axis.cc:404 msgid "Note Range" msgstr "Нотный диапазон" -#: midi_time_axis.cc:388 +#: midi_time_axis.cc:405 #, fuzzy msgid "Note Mode" msgstr "Тип нот" -#: midi_time_axis.cc:390 -msgid "MIDI Thru" -msgstr "MIDI Thru" - -#: midi_time_axis.cc:442 +#: midi_time_axis.cc:443 msgid "Bender" msgstr "Высота звука" -#: midi_time_axis.cc:444 +#: midi_time_axis.cc:445 msgid "Pressure" msgstr "Сила нажатия" -#: midi_time_axis.cc:455 +#: midi_time_axis.cc:456 msgid "Controllers" msgstr "Контроллеры" -#: midi_time_axis.cc:458 +#: midi_time_axis.cc:459 msgid "No MIDI Channels selected" msgstr "" -#: midi_time_axis.cc:511 midi_time_axis.cc:638 +#: midi_time_axis.cc:512 midi_time_axis.cc:639 msgid "Hide all channels" msgstr "Скрыть все каналы" -#: midi_time_axis.cc:514 midi_time_axis.cc:641 +#: midi_time_axis.cc:515 midi_time_axis.cc:642 msgid "Show all channels" msgstr "Показать все каналы" -#: midi_time_axis.cc:524 midi_time_axis.cc:651 +#: midi_time_axis.cc:525 midi_time_axis.cc:652 msgid "Channel %1" msgstr "Канал %1" -#: midi_time_axis.cc:713 +#: midi_time_axis.cc:714 msgid "Controllers %1-%2" msgstr "Контроллеры %1-%2" -#: midi_time_axis.cc:727 +#: midi_time_axis.cc:728 msgid "Sustained" msgstr "Хроматические" -#: midi_time_axis.cc:732 +#: midi_time_axis.cc:733 msgid "Percussive" msgstr "Перкуссия" -#: midi_time_axis.cc:750 +#: midi_time_axis.cc:751 msgid "Meter Colors" msgstr "Цвета индикатора" -#: midi_time_axis.cc:756 +#: midi_time_axis.cc:757 msgid "Channel Colors" msgstr "Цвета канала" -#: midi_time_axis.cc:762 +#: midi_time_axis.cc:763 msgid "Track Color" msgstr "Цвет дорожки" @@ -6880,7 +6922,7 @@ msgstr "Автопрокрутка" msgid "Decimal" msgstr "Десятичный" -#: midi_tracer.cc:53 rc_option_editor.cc:670 +#: midi_tracer.cc:53 rc_option_editor.cc:661 msgid "Enabled" msgstr "Включено" @@ -6893,6 +6935,11 @@ msgstr "Время начала" msgid "Port:" msgstr "Порт:" +#: midi_velocity_dialog.cc:31 +#, fuzzy +msgid "New velocity" +msgstr "Сила нажатия" + #: missing_file_dialog.cc:34 msgid "Missing File!" msgstr "Файл отсутствует!" @@ -6945,318 +6992,312 @@ msgstr "" msgid "Click to choose an additional folder" msgstr "Выберите дополнительную папку:" -#: missing_plugin_dialog.cc:30 +#: missing_plugin_dialog.cc:29 msgid "Missing Plugins" -msgstr "" +msgstr "Отсутствующие модули" -#: missing_plugin_dialog.cc:34 +#: missing_plugin_dialog.cc:33 msgid "OK" msgstr "ОК" -#: mixer_actor.cc:57 +#: mixer_actor.cc:55 msgid "Toggle Solo on Mixer-Selected Tracks/Busses" msgstr "" -#: mixer_actor.cc:58 +#: mixer_actor.cc:56 msgid "Toggle Mute on Mixer-Selected Tracks/Busses" msgstr "" -#: mixer_actor.cc:59 +#: mixer_actor.cc:57 msgid "Toggle Rec-enable on Mixer-Selected Tracks/Busses" msgstr "" -#: mixer_actor.cc:60 +#: mixer_actor.cc:58 msgid "Decrease Gain on Mixer-Selected Tracks/Busses" msgstr "" -#: mixer_actor.cc:61 +#: mixer_actor.cc:59 msgid "Increase Gain on Mixer-Selected Tracks/Busses" msgstr "" -#: mixer_actor.cc:62 +#: mixer_actor.cc:60 msgid "Set Gain to 0dB on Mixer-Selected Tracks/Busses" msgstr "" -#: mixer_actor.cc:65 +#: mixer_actor.cc:63 msgid "Copy Selected Processors" msgstr "Скопировать выбранные обработчики" -#: mixer_actor.cc:66 +#: mixer_actor.cc:64 msgid "Cut Selected Processors" msgstr "Вырезать выбранные обработчики" -#: mixer_actor.cc:67 +#: mixer_actor.cc:65 msgid "Paste Selected Processors" msgstr "Вставить выбранные обработчики" -#: mixer_actor.cc:68 +#: mixer_actor.cc:66 msgid "Delete Selected Processors" msgstr "Удалить выбранные обработчики" -#: mixer_actor.cc:69 +#: mixer_actor.cc:67 msgid "Select All (visible) Processors" msgstr "Выбрать все (видимые) обработчики" -#: mixer_actor.cc:70 +#: mixer_actor.cc:68 msgid "Toggle Selected Processors" msgstr "Переключить выбранные обработчики" -#: mixer_actor.cc:71 +#: mixer_actor.cc:69 msgid "Toggle Selected Plugins" msgstr "Переключить выбранные модули" -#: mixer_actor.cc:74 mixer_actor.cc:75 +#: mixer_actor.cc:72 mixer_actor.cc:73 msgid "Scroll Mixer Window to the left" msgstr "" -#: mixer_actor.cc:89 -#, fuzzy +#: mixer_actor.cc:87 msgid "Loaded mixer bindings from %1" -msgstr "Загружаются меню из %1" +msgstr "" -#: mixer_actor.cc:91 +#: mixer_actor.cc:89 msgid "Could not find mixer.bindings in search path %1" msgstr "" -#: mixer_strip.cc:94 mixer_strip.cc:122 mixer_strip.cc:1700 +#: mixer_strip.cc:91 mixer_strip.cc:119 mixer_strip.cc:1701 msgid "pre" msgstr "lj" -#: mixer_strip.cc:96 mixer_strip.cc:124 mixer_strip.cc:352 mixer_strip.cc:1274 -#: rc_option_editor.cc:1598 +#: mixer_strip.cc:93 mixer_strip.cc:121 mixer_strip.cc:349 mixer_strip.cc:1275 +#: rc_option_editor.cc:1583 msgid "Comments" msgstr "Комментарии" -#: mixer_strip.cc:148 +#: mixer_strip.cc:145 msgid "Click to toggle the width of this mixer strip." msgstr "Щёлкните для переключения ширины полоски микшера" -#: mixer_strip.cc:150 +#: mixer_strip.cc:147 msgid "" "\n" "%1-%2-click to toggle the width of all strips." msgstr "" -#: mixer_strip.cc:157 +#: mixer_strip.cc:154 msgid "Hide this mixer strip" msgstr "Скрыть полоску микшера" -#: mixer_strip.cc:167 +#: mixer_strip.cc:164 msgid "Select metering point" msgstr "Выберите точку измерения" -#: mixer_strip.cc:173 +#: mixer_strip.cc:170 msgid "tupni" msgstr "" -#: mixer_strip.cc:192 +#: mixer_strip.cc:189 msgid "Isolate Solo" msgstr "Изолировать соло" -#: mixer_strip.cc:201 +#: mixer_strip.cc:198 msgid "Lock Solo Status" msgstr "Статус блокировки солирования" -#: mixer_strip.cc:203 mixer_strip.cc:615 +#: mixer_strip.cc:200 mixer_strip.cc:612 msgid "lock" msgstr "Блок" -#: mixer_strip.cc:204 mixer_strip.cc:614 +#: mixer_strip.cc:201 mixer_strip.cc:611 msgid "iso" msgstr "Изол" -#: mixer_strip.cc:256 +#: mixer_strip.cc:253 msgid "Mix group" msgstr "Группа микса" -#: mixer_strip.cc:349 rc_option_editor.cc:1595 +#: mixer_strip.cc:346 rc_option_editor.cc:1580 #, fuzzy msgid "Phase Invert" msgstr "Инверсия" -#: mixer_strip.cc:350 rc_option_editor.cc:1596 route_ui.cc:1153 +#: mixer_strip.cc:347 rc_option_editor.cc:1581 route_ui.cc:1150 #, fuzzy msgid "Solo Safe" msgstr "Соло" -#: mixer_strip.cc:353 mixer_ui.cc:120 rc_option_editor.cc:1599 +#: mixer_strip.cc:350 mixer_ui.cc:119 rc_option_editor.cc:1584 +#: route_time_axis.cc:690 msgid "Group" msgstr "Группа" -#: mixer_strip.cc:354 rc_option_editor.cc:1600 +#: mixer_strip.cc:351 rc_option_editor.cc:1585 #, fuzzy msgid "Meter Point" msgstr "Индикаторы" -#: mixer_strip.cc:452 -#, fuzzy +#: mixer_strip.cc:449 msgid "Enable/Disable MIDI input" -msgstr "Включить или выключить метроном" +msgstr "Включить или выключить MIDI-вход" -#: mixer_strip.cc:598 +#: mixer_strip.cc:595 #, fuzzy msgid "" "Aux\n" "Sends" msgstr "Посылы" -#: mixer_strip.cc:623 +#: mixer_strip.cc:620 msgid "Snd" msgstr "Псл" -#: mixer_strip.cc:638 +#: mixer_strip.cc:635 #, fuzzy msgid "i" msgstr "вх" -#: mixer_strip.cc:680 mixer_strip.cc:804 processor_box.cc:2108 +#: mixer_strip.cc:677 mixer_strip.cc:805 processor_box.cc:2121 msgid "Not connected to JACK - no I/O changes are possible" msgstr "Нет соединения с JACK, любые изменения входа-выхода невозможны" -#: mixer_strip.cc:1083 +#: mixer_strip.cc:1084 msgid "INPUT to %1" -msgstr "" +msgstr "ВХОД в %1" -#: mixer_strip.cc:1086 +#: mixer_strip.cc:1087 msgid "OUTPUT from %1" -msgstr "" +msgstr "ВЫХОД из %1" -#: mixer_strip.cc:1161 +#: mixer_strip.cc:1162 msgid "Disconnected" msgstr "Нет соединения" -#: mixer_strip.cc:1277 +#: mixer_strip.cc:1278 msgid "*Comments*" msgstr "*Кмт*" -#: mixer_strip.cc:1284 +#: mixer_strip.cc:1285 msgid "Cmt" msgstr "Кмт" -#: mixer_strip.cc:1287 +#: mixer_strip.cc:1288 msgid "*Cmt*" msgstr "*Кмт*" -#: mixer_strip.cc:1293 +#: mixer_strip.cc:1294 msgid "Click to Add/Edit Comments" msgstr "Нажмите для добавления/правки комментариев" -#: mixer_strip.cc:1332 +#: mixer_strip.cc:1333 msgid ": comment editor" msgstr ": редактор комментариев" -#: mixer_strip.cc:1410 +#: mixer_strip.cc:1411 msgid "Grp" msgstr "Грп" -#: mixer_strip.cc:1413 +#: mixer_strip.cc:1414 msgid "~G" msgstr "нГр" -#: mixer_strip.cc:1442 +#: mixer_strip.cc:1443 msgid "Comments..." msgstr "Комментарии..." -#: mixer_strip.cc:1444 +#: mixer_strip.cc:1445 msgid "Save As Template..." msgstr "Сохранить как шаблон..." -#: mixer_strip.cc:1450 route_group_dialog.cc:39 route_time_axis.cc:708 +#: mixer_strip.cc:1451 route_group_dialog.cc:39 route_time_axis.cc:713 msgid "Active" msgstr "Активность" -#: mixer_strip.cc:1457 +#: mixer_strip.cc:1458 msgid "Adjust Latency..." msgstr "Скорректировать задержку..." -#: mixer_strip.cc:1460 +#: mixer_strip.cc:1461 msgid "Protect Against Denormals" msgstr "Защищать от отклонений" -#: mixer_strip.cc:1466 route_time_axis.cc:443 +#: mixer_strip.cc:1467 route_time_axis.cc:448 msgid "Remote Control ID..." msgstr "ID для удалённого управления..." -#: mixer_strip.cc:1696 +#: mixer_strip.cc:1697 msgid "in" msgstr "вх" -#: mixer_strip.cc:1704 +#: mixer_strip.cc:1705 msgid "post" msgstr "после" -#: mixer_strip.cc:1708 +#: mixer_strip.cc:1709 msgid "out" msgstr "вых" -#: mixer_strip.cc:1713 +#: mixer_strip.cc:1714 msgid "custom" msgstr "" -#: mixer_strip.cc:1843 route_ui.cc:140 +#: mixer_strip.cc:1844 route_ui.cc:137 msgid "Disk" msgstr "Диск" -#: mixer_strip.cc:1858 monitor_section.cc:46 +#: mixer_strip.cc:1859 monitor_section.cc:44 msgid "AFL" msgstr "AFL" -#: mixer_strip.cc:1861 monitor_section.cc:47 +#: mixer_strip.cc:1862 monitor_section.cc:45 msgid "PFL" msgstr "PFL" -#: mixer_strip.cc:1872 +#: mixer_strip.cc:1873 #, fuzzy msgid "D" msgstr "CD" -#: mixer_strip.cc:2073 +#: mixer_strip.cc:2074 #, fuzzy msgid "Pre-fader" msgstr "Предфейдер" -#: mixer_strip.cc:2074 +#: mixer_strip.cc:2075 #, fuzzy msgid "Post-fader" msgstr "Послефейдер" -#: mixer_ui.cc:367 mixer_ui.cc:368 mixer_ui.cc:418 mixer_ui.cc:430 -#: mixer_ui.cc:848 mixer_ui.cc:890 mixer_ui.cc:1014 -msgid "signal" -msgstr "сигнал" - -#: mixer_ui.cc:1134 +#: mixer_ui.cc:1086 msgid "track display list item for renamed strip not found!" msgstr "" -#: mixer_ui.cc:1218 +#: mixer_ui.cc:1170 msgid "-all-" msgstr "-все-" -#: mixer_ui.cc:1735 +#: mixer_ui.cc:1687 msgid "Strips" msgstr "Каналы" -#: monitor_section.cc:45 +#: monitor_section.cc:43 msgid "SiP" msgstr "" -#: monitor_section.cc:69 +#: monitor_section.cc:67 #, fuzzy msgid "soloing" msgstr "Соло" -#: monitor_section.cc:73 +#: monitor_section.cc:71 #, fuzzy msgid "isolated" msgstr "отсоединено" -#: monitor_section.cc:77 +#: monitor_section.cc:75 #, fuzzy msgid "auditioning" msgstr "Контроль" -#: monitor_section.cc:87 +#: monitor_section.cc:85 #, fuzzy msgid "" "When active, something is solo-isolated.\n" @@ -7265,7 +7306,7 @@ msgstr "" "Если включено, что-то солирует.\n" "Щёлкните, чтобы снять солирование везде." -#: monitor_section.cc:90 +#: monitor_section.cc:88 #, fuzzy msgid "" "When active, auditioning is active.\n" @@ -7274,134 +7315,144 @@ msgstr "" "Если включено, выполняется прослушивание.\n" "Щёлкните, чтобы прекратить его." -#: monitor_section.cc:107 +#: monitor_section.cc:105 #, fuzzy msgid "Solo controls affect solo-in-place" msgstr "Управление солированием работает как управление прослушиванием" -#: monitor_section.cc:113 +#: monitor_section.cc:111 #, fuzzy msgid "Solo controls toggle after-fader-listen" msgstr "Управление солированием работает как управление прослушиванием" -#: monitor_section.cc:119 +#: monitor_section.cc:117 #, fuzzy msgid "Solo controls toggle pre-fader-listen" msgstr "Управление солированием работает как управление прослушиванием" -#: monitor_section.cc:127 +#: monitor_section.cc:125 msgid "Gain increase for soloed signals (0dB is normal)" msgstr "" -#: monitor_section.cc:133 +#: monitor_section.cc:131 #, fuzzy msgid "Solo Boost" msgstr "Соло" -#: monitor_section.cc:145 +#: monitor_section.cc:143 msgid "" "Gain reduction non-soloed signals\n" "A value above -inf dB causes \"solo-in-front\"" msgstr "" -#: monitor_section.cc:147 +#: monitor_section.cc:145 #, fuzzy msgid "SiP Cut" msgstr "Вырезать" -#: monitor_section.cc:159 +#: monitor_section.cc:157 msgid "Gain reduction to use when dimming monitor outputs" msgstr "" -#: monitor_section.cc:164 +#: monitor_section.cc:162 #, fuzzy msgid "Dim" msgstr "Средне" -#: monitor_section.cc:173 +#: monitor_section.cc:171 #, fuzzy msgid "excl. solo" msgstr "Эксклюзивное солирование" -#: monitor_section.cc:175 +#: monitor_section.cc:173 msgid "Exclusive solo means that only 1 solo is active at a time" msgstr "" -#: monitor_section.cc:182 +#: monitor_section.cc:180 #, fuzzy msgid "solo » mute" msgstr "Соло/Приглушение" -#: monitor_section.cc:184 +#: monitor_section.cc:182 msgid "" "If enabled, solo will override mute\n" "(a soloed & muted track or bus will be audible)" msgstr "" -#: monitor_section.cc:210 +#: monitor_section.cc:208 #, fuzzy msgid "mute" msgstr "Снять приглушение" -#: monitor_section.cc:221 +#: monitor_section.cc:219 #, fuzzy msgid "dim" msgstr "Средне" -#: monitor_section.cc:228 +#: monitor_section.cc:226 msgid "mono" msgstr "Моно" -#: monitor_section.cc:249 +#: monitor_section.cc:247 #, fuzzy msgid "Monitor" msgstr "Контроль" -#: monitor_section.cc:688 +#: monitor_section.cc:686 #, fuzzy msgid "Cut monitor channel %1" msgstr "Создать контрольную шину" -#: monitor_section.cc:693 +#: monitor_section.cc:691 #, fuzzy msgid "Dim monitor channel %1" msgstr "Создать контрольную шину" -#: monitor_section.cc:698 +#: monitor_section.cc:696 #, fuzzy msgid "Solo monitor channel %1" msgstr "Создать контрольную шину" -#: monitor_section.cc:703 +#: monitor_section.cc:701 #, fuzzy msgid "Invert monitor channel %1" msgstr "Панорама для канала %zu" -#: nag.cc:22 +#: mono_panner_editor.cc:33 +#, fuzzy +msgid "Mono Panner" +msgstr "Панорамирование" + +#: mono_panner_editor.cc:44 mono_panner_editor.cc:49 +#: stereo_panner_editor.cc:46 stereo_panner_editor.cc:51 +msgid "%" +msgstr "%" + +#: nag.cc:21 msgid "Support Ardour Development" msgstr "Поддержите разработку Ardour" -#: nag.cc:23 +#: nag.cc:22 msgid "I'd like to make a one-time donation" msgstr "Я бы хотел сделать одноразовое пожертвование" -#: nag.cc:24 +#: nag.cc:23 msgid "Tell me more about becoming a subscriber" msgstr "Расскажите больше о подписке" -#: nag.cc:25 +#: nag.cc:24 msgid "I'm already a subscriber!" msgstr "Я уже оплатил подписку!" -#: nag.cc:26 +#: nag.cc:25 msgid "Ask about this the next time I export" msgstr "Спросить при следующем экспорте" -#: nag.cc:27 +#: nag.cc:26 msgid "Never ever ask me about this again" msgstr "Никогда больше не спрашивать об этом" -#: nag.cc:30 +#: nag.cc:29 msgid "" "Congratulations on your session export.\n" "\n" @@ -7429,7 +7480,7 @@ msgstr "" "\n" "Спасибо за использование Ardour!" -#: nag.cc:39 +#: nag.cc:38 msgid "" "Congratulations on your session export.\n" "\n" @@ -7470,7 +7521,7 @@ msgstr "Нормализация областей" msgid "Normalize region" msgstr "Нормализация области" -#: normalize_dialog.cc:49 strip_silence_dialog.cc:72 +#: normalize_dialog.cc:49 strip_silence_dialog.cc:70 msgid "dbFS" msgstr "dbFS" @@ -7585,7 +7636,7 @@ msgstr "" msgid "Panner (2D)" msgstr "Панорамирование (2D)" -#: panner2d.cc:783 panner_ui.cc:395 plugin_ui.cc:485 +#: panner2d.cc:783 panner_ui.cc:381 plugin_ui.cc:492 msgid "Bypass" msgstr "Обход" @@ -7593,44 +7644,40 @@ msgstr "Обход" msgid "Panner" msgstr "Панорамирование" -#: panner_ui.cc:74 +#: panner_ui.cc:71 msgid "Pan automation mode" msgstr "Режим автоматизации панорамы" -#: panner_ui.cc:75 +#: panner_ui.cc:72 msgid "Pan automation type" msgstr "Тип автоматизации панорамы" -#: panner_ui.cc:306 +#: panner_ui.cc:292 msgid "" "No panner user interface is currently available for %1-in/2out tracks/busses" msgstr "" -#: playlist_selector.cc:45 +#: playlist_selector.cc:43 msgid "Playlists" msgstr "Списки воспроизведения" -#: playlist_selector.cc:57 +#: playlist_selector.cc:55 msgid "Playlists grouped by track" msgstr "Списки, сгруппированные по дорожке" -#: playlist_selector.cc:67 -msgid "close" -msgstr "Закрыть" - -#: playlist_selector.cc:104 +#: playlist_selector.cc:102 msgid "Playlist for %1" msgstr "Список воспроизведения для %1" -#: playlist_selector.cc:117 +#: playlist_selector.cc:115 msgid "Other tracks" msgstr "Другие дорожки" -#: playlist_selector.cc:142 +#: playlist_selector.cc:140 msgid "unassigned" msgstr "" -#: playlist_selector.cc:197 +#: playlist_selector.cc:195 #, fuzzy msgid "Imported" msgstr "Импортировать" @@ -7643,315 +7690,306 @@ msgstr "Масштаб в Дб" msgid "Show phase" msgstr "Показывать фазу" -#: plugin_selector.cc:55 plugin_selector.cc:223 +#: plugin_selector.cc:53 plugin_selector.cc:221 msgid "Name contains" msgstr "Название содержит" -#: plugin_selector.cc:56 plugin_selector.cc:227 +#: plugin_selector.cc:54 plugin_selector.cc:225 msgid "Type contains" msgstr "Тип содержит" -#: plugin_selector.cc:57 plugin_selector.cc:225 +#: plugin_selector.cc:55 plugin_selector.cc:223 msgid "Category contains" msgstr "Название категории содержит" -#: plugin_selector.cc:58 plugin_selector.cc:247 +#: plugin_selector.cc:56 plugin_selector.cc:245 msgid "Author contains" msgstr "Имя автора содержит" -#: plugin_selector.cc:59 plugin_selector.cc:249 +#: plugin_selector.cc:57 plugin_selector.cc:247 msgid "Library contains" msgstr "Библиотека содержит" -#: plugin_selector.cc:60 plugin_selector.cc:213 plugin_selector.cc:524 +#: plugin_selector.cc:58 plugin_selector.cc:211 plugin_selector.cc:522 msgid "Favorites only" msgstr "Только любимые" -#: plugin_selector.cc:61 plugin_selector.cc:217 plugin_selector.cc:524 +#: plugin_selector.cc:59 plugin_selector.cc:215 plugin_selector.cc:522 msgid "Hidden only" msgstr "Только скрытые" -#: plugin_selector.cc:66 +#: plugin_selector.cc:64 msgid "Plugin Manager" msgstr "Управление модулями" -#: plugin_selector.cc:87 +#: plugin_selector.cc:85 msgid "Fav" msgstr "Любим." -#: plugin_selector.cc:88 +#: plugin_selector.cc:86 msgid "Hid" msgstr "Скрытый" -#: plugin_selector.cc:89 +#: plugin_selector.cc:87 msgid "Available Plugins" msgstr "Доступные эффекты" -#: plugin_selector.cc:90 +#: plugin_selector.cc:88 msgid "Type" msgstr "Тип" -#: plugin_selector.cc:91 +#: plugin_selector.cc:89 msgid "Category" msgstr "Категория" -#: plugin_selector.cc:92 +#: plugin_selector.cc:90 msgid "Creator" msgstr "Создатель" -#: plugin_selector.cc:93 +#: plugin_selector.cc:91 msgid "# Audio In" msgstr "# Звук. вх." -#: plugin_selector.cc:94 +#: plugin_selector.cc:92 msgid "# Audio Out" msgstr "# Звук. вых." -#: plugin_selector.cc:95 +#: plugin_selector.cc:93 msgid "# MIDI In" msgstr "# MIDI-вх." -#: plugin_selector.cc:96 +#: plugin_selector.cc:94 msgid "# MIDI Out" msgstr "# MIDI-вых." -#: plugin_selector.cc:118 +#: plugin_selector.cc:116 msgid "Plugins to be connected" msgstr "Подключаемые эффекты" -#: plugin_selector.cc:131 +#: plugin_selector.cc:129 msgid "Add a plugin to the effect list" msgstr "Добавить расширение в список эффектов" -#: plugin_selector.cc:135 +#: plugin_selector.cc:133 msgid "Remove a plugin from the effect list" msgstr "Удалить расширение из списка эффектов" -#: plugin_selector.cc:137 +#: plugin_selector.cc:135 msgid "Update available plugins" msgstr "Обновить доступные расширения" -#: plugin_selector.cc:174 +#: plugin_selector.cc:172 msgid "Insert Plugin(s)" msgstr "Вставить эффект(ы)" -#: plugin_selector.cc:323 plugin_selector.cc:324 plugin_selector.cc:325 -#: plugin_selector.cc:326 +#: plugin_selector.cc:321 plugin_selector.cc:322 plugin_selector.cc:323 +#: plugin_selector.cc:324 msgid "variable" msgstr "" -#: plugin_selector.cc:483 +#: plugin_selector.cc:481 msgid "" "The plugin \"%1\" could not be loaded\n" "\n" "See the Log window for more details (maybe)" msgstr "" -#: plugin_selector.cc:631 +#: plugin_selector.cc:629 msgid "Favorites" msgstr "Любимые" -#: plugin_selector.cc:633 +#: plugin_selector.cc:631 msgid "Plugin Manager..." msgstr "Управление модулями..." -#: plugin_selector.cc:637 +#: plugin_selector.cc:635 msgid "By Creator" msgstr "По создателю" -#: plugin_selector.cc:640 +#: plugin_selector.cc:638 msgid "By Category" msgstr "По категории" -#: plugin_ui.cc:115 +#: plugin_ui.cc:118 msgid "Eh? LADSPA plugins don't have editors!" msgstr "Что? У эффектов LADSPA нет своих редакторов!" -#: plugin_ui.cc:124 plugin_ui.cc:265 +#: plugin_ui.cc:127 plugin_ui.cc:268 msgid "" "unknown type of editor-supplying plugin (note: no VST support in this " "version of ardour)" msgstr "" -#: plugin_ui.cc:127 +#: plugin_ui.cc:130 msgid "unknown type of editor-supplying plugin" msgstr "" -#: plugin_ui.cc:295 +#: plugin_ui.cc:298 msgid "" "unknown type of editor-supplying plugin (note: no linuxVST support in this " "version of ardour)" msgstr "" -#: plugin_ui.cc:363 +#: plugin_ui.cc:370 msgid "create_lv2_editor called on non-LV2 plugin" msgstr "" -#: plugin_ui.cc:451 +#: plugin_ui.cc:458 msgid "Add" msgstr "Добавить" -#: plugin_ui.cc:455 +#: plugin_ui.cc:462 msgid "Description" msgstr "Описание" -#: plugin_ui.cc:456 +#: plugin_ui.cc:463 msgid "Plugin analysis" msgstr "Частотный анализ эффекта" -#: plugin_ui.cc:463 +#: plugin_ui.cc:470 msgid "" "Presets (if any) for this plugin\n" "(Both factory and user-created)" msgstr "" -#: plugin_ui.cc:464 +#: plugin_ui.cc:471 msgid "Save a new preset" msgstr "Сохранить новый профиль" -#: plugin_ui.cc:465 +#: plugin_ui.cc:472 msgid "Save the current preset" msgstr "Сохранить текущий профиль" -#: plugin_ui.cc:466 +#: plugin_ui.cc:473 msgid "Delete the current preset" msgstr "Удалить текущий профиль" -#: plugin_ui.cc:467 +#: plugin_ui.cc:474 msgid "Disable signal processing by the plugin" msgstr "Выключить обработку сигнала этим модулем" -#: plugin_ui.cc:500 plugin_ui.cc:654 +#: plugin_ui.cc:507 plugin_ui.cc:673 msgid "" "Click to allow the plugin to receive keyboard events that %1 would normally " "use as a shortcut" msgstr "" -#: plugin_ui.cc:501 +#: plugin_ui.cc:508 msgid "Click to enable/disable this plugin" msgstr "Щелкните, чтобы включить или отключить этот эффект" -#: plugin_ui.cc:540 +#: plugin_ui.cc:547 msgid "latency (%1 samples)" msgstr "Задержка (%1 сэмплов)" -#: plugin_ui.cc:542 +#: plugin_ui.cc:549 msgid "latency (%1 ms)" msgstr "Задержка (%1 мс)" -#: plugin_ui.cc:553 +#: plugin_ui.cc:560 msgid "Edit Latency" msgstr "Изменить задержку" -#: plugin_ui.cc:584 +#: plugin_ui.cc:600 msgid "Plugin preset %1 not found" msgstr "Профиль эффекта %1 не обнаружен" -#: plugin_ui.cc:661 +#: plugin_ui.cc:680 msgid "Click to allow normal use of %1 keyboard shortcuts" msgstr "" -#: port_group.cc:337 +#: port_group.cc:334 msgid "%1 Busses" msgstr "Шины %1" -#: port_group.cc:338 +#: port_group.cc:335 msgid "%1 Tracks" msgstr "Дорожки %1" -#: port_group.cc:339 +#: port_group.cc:336 msgid "Hardware" msgstr "Аппаратное обеспечение" -#: port_group.cc:340 +#: port_group.cc:337 msgid "%1 Misc" msgstr "Прочее" -#: port_group.cc:341 +#: port_group.cc:338 msgid "Other" msgstr "Прочее" -#: port_group.cc:453 -#, fuzzy +#: port_group.cc:450 msgid "MTC in" -msgstr "MTC" +msgstr "" + +#: port_group.cc:453 +msgid "MIDI control in" +msgstr "" #: port_group.cc:456 -#, fuzzy -msgid "MIDI control in" -msgstr "Использовать управление по MIDI" +msgid "MIDI clock in" +msgstr "" #: port_group.cc:459 -#, fuzzy -msgid "MIDI clock in" -msgstr "Передавать отклик MIDI" - -#: port_group.cc:462 -#, fuzzy msgid "MMC in" -msgstr "MMC" +msgstr "" + +#: port_group.cc:463 +msgid "MTC out" +msgstr "" #: port_group.cc:466 -#, fuzzy -msgid "MTC out" -msgstr "Вырезать" +msgid "MIDI control out" +msgstr "" #: port_group.cc:469 -#, fuzzy -msgid "MIDI control out" -msgstr "Использовать управление по MIDI" +msgid "MIDI clock out" +msgstr "" #: port_group.cc:472 -#, fuzzy -msgid "MIDI clock out" -msgstr "Передавать отклик MIDI" - -#: port_group.cc:475 msgid "MMC out" msgstr "" -#: port_group.cc:530 +#: port_group.cc:527 msgid ":monitor" msgstr "" -#: port_group.cc:542 +#: port_group.cc:539 msgid "system:" msgstr "" -#: port_group.cc:543 +#: port_group.cc:540 msgid "alsa_pcm" msgstr "alsa_pcm" -#: port_insert_ui.cc:47 +#: port_insert_ui.cc:40 msgid "Measure Latency" msgstr "Измерить задержку" -#: port_insert_ui.cc:58 +#: port_insert_ui.cc:51 msgid "Send/Output" msgstr "Посыл/Выход" -#: port_insert_ui.cc:59 +#: port_insert_ui.cc:52 msgid "Return/Input" msgstr "Возврат/Вход" -#: port_insert_ui.cc:78 port_insert_ui.cc:106 -#, fuzzy +#: port_insert_ui.cc:71 port_insert_ui.cc:99 msgid "Disconnected from audio engine" -msgstr "Нет соединения со звуковым движком" +msgstr "Выполнено отсоединение от звукового движка" -#: port_insert_ui.cc:93 +#: port_insert_ui.cc:86 msgid "No signal detected" msgstr "" -#: port_insert_ui.cc:142 +#: port_insert_ui.cc:135 #, fuzzy msgid "Detecting ..." msgstr "Воспроизвести выделение" -#: port_insert_ui.cc:173 -#, fuzzy +#: port_insert_ui.cc:166 msgid "Port Insert " -msgstr "Название порта" +msgstr "" #: port_matrix.cc:323 port_matrix.cc:342 msgid "Sources" @@ -7984,41 +8022,45 @@ msgstr "%s все" msgid "Rescan" msgstr "Просканировать заново" -#: port_matrix.cc:507 +#: port_matrix.cc:508 msgid "Show individual ports" msgstr "Показывать порты раздельно" -#: port_matrix.cc:696 +#: port_matrix.cc:514 +msgid "Flip" +msgstr "" + +#: port_matrix.cc:702 msgid "" "It is not possible to add a port here, as the first processor in the track " "or buss cannot support the new configuration." msgstr "" -#: port_matrix.cc:699 +#: port_matrix.cc:705 msgid "Cannot add port" msgstr "Невозможно добавить порт" -#: port_matrix.cc:721 +#: port_matrix.cc:727 msgid "Port removal not allowed" msgstr "Удаление портов не разрешено" -#: port_matrix.cc:722 +#: port_matrix.cc:728 msgid "" "This port cannot be removed, as the first plugin in the track or buss cannot " "accept the new number of inputs." msgstr "" -#: port_matrix.cc:939 +#: port_matrix.cc:945 #, c-format msgid "Remove '%s'" msgstr "Удалить '%s'" -#: port_matrix.cc:954 +#: port_matrix.cc:960 #, c-format msgid "%s all from '%s'" msgstr "%s все из '%s'" -#: port_matrix.cc:1016 +#: port_matrix.cc:1026 msgid "channel" msgstr "канал" @@ -8030,23 +8072,23 @@ msgstr "Нет доступных портов." msgid "There are no %1 ports to connect." msgstr "нет соединяемых портов %1." -#: processor_box.cc:376 +#: processor_box.cc:382 msgid "Show All Controls" msgstr "Показать все регуляторы" -#: processor_box.cc:380 +#: processor_box.cc:386 msgid "Hide All Controls" msgstr "Скрыть все регуляторы" -#: processor_box.cc:463 +#: processor_box.cc:475 msgid "on" msgstr "вкл" -#: processor_box.cc:463 rc_option_editor.cc:1629 rc_option_editor.cc:1643 +#: processor_box.cc:475 rc_option_editor.cc:1614 rc_option_editor.cc:1628 msgid "off" msgstr "выкл" -#: processor_box.cc:730 +#: processor_box.cc:742 msgid "" "Right-click to add/remove/edit\n" "plugins,inserts,sends and more" @@ -8054,15 +8096,15 @@ msgstr "" "Щелчком правой клавишей мыши можно добавлять, \n" "изменять и удалять модули, посылы, возвраты и прочее." -#: processor_box.cc:1163 processor_box.cc:1556 +#: processor_box.cc:1176 processor_box.cc:1569 msgid "Plugin Incompatibility" msgstr "Несовместимость эффектов" -#: processor_box.cc:1166 +#: processor_box.cc:1179 msgid "You attempted to add the plugin \"%1\" in slot %2.\n" msgstr "Вы пытались добавить модуль \"%1\" в слот %2.\n" -#: processor_box.cc:1172 +#: processor_box.cc:1185 msgid "" "\n" "This plugin has:\n" @@ -8070,21 +8112,21 @@ msgstr "" "\n" "У этого эффекта:\n" -#: processor_box.cc:1175 +#: processor_box.cc:1188 msgid "\t%1 MIDI input\n" msgid_plural "\t%1 MIDI inputs\n" msgstr[0] "\t%1 MIDI-вход\n" msgstr[1] "\t%1 MIDI-входа\n" msgstr[2] "\t%1 MIDI-входов\n" -#: processor_box.cc:1179 +#: processor_box.cc:1192 msgid "\t%1 audio input\n" msgid_plural "\t%1 audio inputs\n" msgstr[0] "\t%1 звуковой вход\n" msgstr[1] "\t%1 звуковых входа\n" msgstr[2] "\t%1 звуковых входов\n" -#: processor_box.cc:1182 +#: processor_box.cc:1195 msgid "" "\n" "but at the insertion point, there are:\n" @@ -8092,21 +8134,21 @@ msgstr "" "\n" "но в точке вставки сейчас:\n" -#: processor_box.cc:1185 +#: processor_box.cc:1198 msgid "\t%1 MIDI channel\n" msgid_plural "\t%1 MIDI channels\n" msgstr[0] "\t%1 MIDI-канал\n" msgstr[1] "\t%1 MIDI-канала\n" msgstr[2] "\t%1 MIDI-каналов\n" -#: processor_box.cc:1189 +#: processor_box.cc:1202 msgid "\t%1 audio channel\n" msgid_plural "\t%1 audio channels\n" msgstr[0] "\t%1 звуковой канал\n" msgstr[1] "\t%1 звуковых канала\n" msgstr[2] "\t%1 звуковых каналов\n" -#: processor_box.cc:1192 +#: processor_box.cc:1205 msgid "" "\n" "%1 is unable to insert this plugin here.\n" @@ -8114,11 +8156,11 @@ msgstr "" "\n" "%1 не может вставить сюда этот эффект или инструмент.\n" -#: processor_box.cc:1229 +#: processor_box.cc:1242 msgid "Cannot set up new send: %1" msgstr "Невозможно настроить новый посыл: %1" -#: processor_box.cc:1559 +#: processor_box.cc:1572 msgid "" "You cannot reorder these plugins/sends/inserts\n" "in that way because the inputs and\n" @@ -8128,22 +8170,22 @@ msgstr "" "посылы и возвраты подобным образом, поскольку \n" "входы и выходы перестанут корректно работать" -#: processor_box.cc:1744 +#: processor_box.cc:1757 msgid "Rename Processor" msgstr "Переименовать обработчик" -#: processor_box.cc:1775 +#: processor_box.cc:1788 msgid "At least 100 IO objects exist with a name like %1 - name not changed" msgstr "" -#: processor_box.cc:1894 +#: processor_box.cc:1907 msgid "" "Copying the set of processors on the clipboard failed,\n" "probably because the I/O configuration of the plugins\n" "could not match the configuration of this track." msgstr "" -#: processor_box.cc:1940 +#: processor_box.cc:1953 msgid "" "Do you really want to remove all processors from %1?\n" "(this cannot be undone)" @@ -8152,15 +8194,15 @@ msgstr "" "обработчики из \"%1\" ?\n" "(отмена невозможна)" -#: processor_box.cc:1944 processor_box.cc:1969 +#: processor_box.cc:1957 processor_box.cc:1982 msgid "Yes, remove them all" msgstr "Да, удалить их все" -#: processor_box.cc:1946 processor_box.cc:1971 +#: processor_box.cc:1959 processor_box.cc:1984 msgid "Remove processors" msgstr "Удалить обработчики" -#: processor_box.cc:1961 +#: processor_box.cc:1974 msgid "" "Do you really want to remove all pre-fader processors from %1?\n" "(this cannot be undone)" @@ -8169,7 +8211,7 @@ msgstr "" "предфейдерные обработчики из \"%1\" ?\n" "(отмена невозможна)" -#: processor_box.cc:1964 +#: processor_box.cc:1977 msgid "" "Do you really want to remove all post-fader processors from %1?\n" "(this cannot be undone)" @@ -8178,63 +8220,71 @@ msgstr "" "послефейдерные обработчики из \"%1\" ?\n" "(отмена невозможна)" -#: processor_box.cc:2168 +#: processor_box.cc:2181 msgid "New Plugin" msgstr "Добавить модуль" -#: processor_box.cc:2171 +#: processor_box.cc:2184 msgid "New Insert" msgstr "Добавить возврат" -#: processor_box.cc:2174 +#: processor_box.cc:2187 msgid "New External Send ..." msgstr "Добавить внешний посыл с портом JACK..." -#: processor_box.cc:2178 +#: processor_box.cc:2191 msgid "New Aux Send ..." msgstr "Добавить внешний посыл без порта JACK..." -#: processor_box.cc:2182 +#: processor_box.cc:2195 msgid "Clear (all)" msgstr "Очистить (всё)" -#: processor_box.cc:2184 +#: processor_box.cc:2197 msgid "Clear (pre-fader)" msgstr "Очистить (до фейдера)" -#: processor_box.cc:2186 +#: processor_box.cc:2199 msgid "Clear (post-fader)" msgstr "Очистить (после фейдера)" -#: processor_box.cc:2212 +#: processor_box.cc:2225 msgid "Activate All" msgstr "Активировать все" -#: processor_box.cc:2214 +#: processor_box.cc:2227 msgid "Deactivate All" msgstr "Деактивировать все" -#: processor_box.cc:2216 +#: processor_box.cc:2229 msgid "A/B Plugins" msgstr "Отключить все" -#: processor_box.cc:2225 +#: processor_box.cc:2238 msgid "Edit with basic controls..." -msgstr "" +msgstr "Изменить средствами хоста" -#: processor_box.cc:2471 +#: processor_box.cc:2484 msgid "%1: %2 (by %3)" msgstr "%1: %2 (автор — %3)" -#: patch_change_dialog.cc:36 +#: patch_change_dialog.cc:49 msgid "Patch Change" msgstr "Смена программы" -#: patch_change_dialog.cc:69 step_entry.cc:430 +#: patch_change_dialog.cc:75 +msgid "Patch Bank" +msgstr "" + +#: patch_change_dialog.cc:82 +msgid "Patch" +msgstr "" + +#: patch_change_dialog.cc:97 step_entry.cc:429 msgid "Program" msgstr "Программа" -#: patch_change_dialog.cc:77 step_entry.cc:422 +#: patch_change_dialog.cc:105 step_entry.cc:421 msgid "Bank" msgstr "Банк" @@ -8270,659 +8320,659 @@ msgstr "Конец привязки ноты" msgid "Click audio file:" msgstr "Файл щелчка доли:" -#: rc_option_editor.cc:72 rc_option_editor.cc:80 +#: rc_option_editor.cc:71 rc_option_editor.cc:78 msgid "Browse..." msgstr "Просмотр..." -#: rc_option_editor.cc:76 +#: rc_option_editor.cc:75 msgid "Click emphasis audio file:" msgstr "Файл щелчка сильной доли:" -#: rc_option_editor.cc:109 +#: rc_option_editor.cc:107 msgid "Choose Click" msgstr "Выберите щелчок метронома" -#: rc_option_editor.cc:132 +#: rc_option_editor.cc:130 msgid "Choose Click Emphasis" msgstr "Выберите акцентирующий щелчок метронома" -#: rc_option_editor.cc:164 +#: rc_option_editor.cc:162 msgid "Limit undo history to" msgstr "Ограничивать историю действий" -#: rc_option_editor.cc:165 +#: rc_option_editor.cc:163 msgid "Save undo history of" msgstr "Ограничивать сохранение истории действий" -#: rc_option_editor.cc:174 rc_option_editor.cc:182 +#: rc_option_editor.cc:172 rc_option_editor.cc:179 msgid "commands" msgstr "командами" -#: rc_option_editor.cc:321 +#: rc_option_editor.cc:317 msgid "Edit using:" msgstr "Редактировать с:" -#: rc_option_editor.cc:328 rc_option_editor.cc:355 rc_option_editor.cc:383 +#: rc_option_editor.cc:323 rc_option_editor.cc:349 rc_option_editor.cc:376 msgid "+ button" msgstr "+ клавиша" -#: rc_option_editor.cc:348 +#: rc_option_editor.cc:343 msgid "Delete using:" msgstr "Удалять с:" -#: rc_option_editor.cc:376 +#: rc_option_editor.cc:370 msgid "Insert note using:" msgstr "Вставлять ноты с:" -#: rc_option_editor.cc:404 +#: rc_option_editor.cc:397 msgid "Toggle snap using:" msgstr "Переключать прилипание с:" -#: rc_option_editor.cc:421 +#: rc_option_editor.cc:413 msgid "Keyboard layout:" msgstr "Раскладка клавиатуры:" -#: rc_option_editor.cc:545 +#: rc_option_editor.cc:536 msgid "Font scaling:" msgstr "Масштаб шрифта:" -#: rc_option_editor.cc:597 +#: rc_option_editor.cc:588 msgid "Playback (seconds of buffering):" msgstr "Воспроизведение (в секундах):" -#: rc_option_editor.cc:610 +#: rc_option_editor.cc:601 msgid "Recording (seconds of buffering):" msgstr "Запись (в секундах):" -#: rc_option_editor.cc:671 +#: rc_option_editor.cc:662 msgid "Feedback" msgstr "Отклик" -#: rc_option_editor.cc:676 +#: rc_option_editor.cc:667 msgid "Double-click on a name to edit settings for an enabled protocol" msgstr "" "Двойной щелчок по названию открывает редактор параметров включённого " "протокола" -#: rc_option_editor.cc:867 +#: rc_option_editor.cc:858 msgid "%1 Preferences" msgstr "Параметры %1" -#: rc_option_editor.cc:876 +#: rc_option_editor.cc:867 msgid "DSP CPU Utilization" msgstr "Использование центрального процессора" -#: rc_option_editor.cc:880 +#: rc_option_editor.cc:871 msgid "Signal processing uses" msgstr "При обработке используются" -#: rc_option_editor.cc:885 +#: rc_option_editor.cc:876 msgid "all but one processor" msgstr "Все процессоры кроме одного" -#: rc_option_editor.cc:886 +#: rc_option_editor.cc:877 msgid "all available processors" msgstr "Все доступные процессоры" -#: rc_option_editor.cc:889 +#: rc_option_editor.cc:880 msgid "%1 processors" msgstr "%1 процессора" -#: rc_option_editor.cc:892 +#: rc_option_editor.cc:883 msgid "This setting will only take effect when %1 is restarted." msgstr "Это изменение вступит в силу при следующем запуске %1." -#: rc_option_editor.cc:897 +#: rc_option_editor.cc:888 msgid "Options|Undo" msgstr "История действий" -#: rc_option_editor.cc:904 +#: rc_option_editor.cc:895 msgid "Verify removal of last capture" msgstr "Проверять удаление последней записи" -#: rc_option_editor.cc:912 +#: rc_option_editor.cc:903 msgid "Make periodic backups of the session file" msgstr "Периодически создавать резервные копии файла сеанса" -#: rc_option_editor.cc:917 +#: rc_option_editor.cc:908 msgid "Session Management" msgstr "Управление сеансами" -#: rc_option_editor.cc:922 +#: rc_option_editor.cc:913 msgid "Always copy imported files" msgstr "Всегда копировать импортируемые файлы" -#: rc_option_editor.cc:929 -#, fuzzy +#: rc_option_editor.cc:920 msgid "Default folder for new sessions:" -msgstr "Папка для новых сеансов по умолчанию" +msgstr "Папка для новых сеансов по умолчанию:" -#: rc_option_editor.cc:937 +#: rc_option_editor.cc:928 msgid "Maximum number of recent sessions" msgstr "Максимальное число недавних сеансов" -#: rc_option_editor.cc:950 -msgid "Click Gain Level" -msgstr "Уровень щелчка метронома:" +#: rc_option_editor.cc:941 +msgid "Click gain level" +msgstr "Уровень щелчка метронома" -#: rc_option_editor.cc:955 route_time_axis.cc:216 route_time_axis.cc:687 +#: rc_option_editor.cc:946 route_time_axis.cc:221 route_time_axis.cc:693 msgid "Automation" msgstr "Автоматизация" -#: rc_option_editor.cc:960 +#: rc_option_editor.cc:951 msgid "Thinning factor (larger value => less data)" msgstr "" -#: rc_option_editor.cc:971 +#: rc_option_editor.cc:962 msgid "Keep record-enable engaged on stop" msgstr "Готовность к записи сохраняется после остановки" -#: rc_option_editor.cc:979 +#: rc_option_editor.cc:970 msgid "Stop recording when an xrun occurs" msgstr "Останавливать запись при рассинхронизации" -#: rc_option_editor.cc:987 +#: rc_option_editor.cc:978 msgid "Create markers where xruns occur" msgstr "Создавать метки в точках рассинхронизации" -#: rc_option_editor.cc:995 +#: rc_option_editor.cc:986 msgid "Stop at the end of the session" msgstr "Останавливаться в конце сеанса" -#: rc_option_editor.cc:1003 +#: rc_option_editor.cc:994 msgid "Do seamless looping (not possible when slaved to MTC, JACK etc)" msgstr "" "Бесшовное циклическое воспроизведение (невозможно, когда Ardour ведом по " "MTC, JACK и т.д.)" -#: rc_option_editor.cc:1011 -msgid "Primary clock delta to edit cursor" -msgstr "Основной счётчик показывается разницу с курсором редактора" - -#: rc_option_editor.cc:1019 -msgid "Secondary clock delta to edit cursor" -msgstr "Дополнительный счётчик показывается разницу с курсором редактора" - -#: rc_option_editor.cc:1027 +#: rc_option_editor.cc:1002 msgid "Disable per-track record disarm while rolling" msgstr "" -#: rc_option_editor.cc:1035 +#: rc_option_editor.cc:1010 msgid "12dB gain reduction during fast-forward and fast-rewind" msgstr "Приглушение громкости на 12Дб при перемотке" -#: rc_option_editor.cc:1045 +#: rc_option_editor.cc:1020 msgid "Link selection of regions and tracks" msgstr "Связывать выделение областей и дорожек" -#: rc_option_editor.cc:1053 +#: rc_option_editor.cc:1028 msgid "Move relevant automation when audio regions are moved" msgstr "Перемещать автоматизацию вместе с областями" -#: rc_option_editor.cc:1061 +#: rc_option_editor.cc:1036 msgid "Show meters on tracks in the editor" msgstr "Показывать индикаторы громкости в дорожках" -#: rc_option_editor.cc:1069 +#: rc_option_editor.cc:1044 msgid "Use overlap equivalency for regions" msgstr "Использовать эквивалент перекрытия для областей" -#: rc_option_editor.cc:1077 +#: rc_option_editor.cc:1052 msgid "Make rubberband selection rectangle snap to the grid" msgstr "Прямоугольное выделение прилипает к сетке" -#: rc_option_editor.cc:1085 +#: rc_option_editor.cc:1060 msgid "Show waveforms in regions" msgstr "Показывать форму волны в областях" -#: rc_option_editor.cc:1093 +#: rc_option_editor.cc:1068 msgid "Show gain envelopes in audio regions" -msgstr "Показывать огибающие усиления в областях" +msgstr "Показывать огибающие усиления" -#: rc_option_editor.cc:1100 +#: rc_option_editor.cc:1069 +msgid "in all modes" +msgstr "Во всех режимах" + +#: rc_option_editor.cc:1070 +msgid "only in region gain mode" +msgstr "Только в режиме правки огибающей" + +#: rc_option_editor.cc:1077 msgid "Waveform scale" msgstr "Масштаб сигнала" -#: rc_option_editor.cc:1105 +#: rc_option_editor.cc:1082 msgid "linear" msgstr "Линейный" -#: rc_option_editor.cc:1106 +#: rc_option_editor.cc:1083 msgid "logarithmic" msgstr "Логарифмический" -#: rc_option_editor.cc:1112 +#: rc_option_editor.cc:1089 msgid "Waveform shape" msgstr "Форма сигнала" -#: rc_option_editor.cc:1117 +#: rc_option_editor.cc:1094 msgid "traditional" msgstr "Обычная" -#: rc_option_editor.cc:1118 +#: rc_option_editor.cc:1095 msgid "rectified" msgstr "От низа" -#: rc_option_editor.cc:1125 +#: rc_option_editor.cc:1102 msgid "Show waveforms for audio while it is being recorded" msgstr "Показывать форму сигнала при записи" -#: rc_option_editor.cc:1133 +#: rc_option_editor.cc:1110 msgid "Show zoom toolbar" msgstr "Показывать панель для управления масштабом" -#: rc_option_editor.cc:1141 +#: rc_option_editor.cc:1118 msgid "Color regions using their track's color" msgstr "Раскрашивать области цветом дорожки" -#: rc_option_editor.cc:1149 +#: rc_option_editor.cc:1126 msgid "Update editor window during drags of the summary" msgstr "" -#: rc_option_editor.cc:1157 -#, fuzzy +#: rc_option_editor.cc:1134 msgid "Synchronise editor and mixer track order" msgstr "Синхронизировать порядок дорожек в редакторе и микшере" -#: rc_option_editor.cc:1165 -#, fuzzy +#: rc_option_editor.cc:1142 msgid "Synchronise editor and mixer selection" -msgstr "Синхронизировать порядок дорожек в редакторе и микшере" +msgstr "Синхронизировать выделение в редакторе и микшере" -#: rc_option_editor.cc:1173 +#: rc_option_editor.cc:1150 msgid "Name new markers" msgstr "Спрашивать об имени каждой новой метки" -#: rc_option_editor.cc:1180 +#: rc_option_editor.cc:1158 +msgid "Auto-scroll editor window when dragging near its edges" +msgstr "" + +#: rc_option_editor.cc:1165 msgid "Buffering" msgstr "Буферизация" -#: rc_option_editor.cc:1189 +#: rc_option_editor.cc:1174 msgid "Use a monitor bus (allows AFL/PFL and more control)" msgstr "" "Использовать шину монитора (больше контроля, можно использовать AFL/PFL )" -#: rc_option_editor.cc:1196 +#: rc_option_editor.cc:1181 msgid "Record monitoring handled by" msgstr "Мониторинг записи выполняет" -#: rc_option_editor.cc:1207 +#: rc_option_editor.cc:1192 msgid "ardour" msgstr "Ardour" -#: rc_option_editor.cc:1208 +#: rc_option_editor.cc:1193 msgid "audio hardware" msgstr "Аппаратное обеспечение" -#: rc_option_editor.cc:1215 +#: rc_option_editor.cc:1200 msgid "Tape machine mode" msgstr "Режим плёночного магнитофона" -#: rc_option_editor.cc:1220 +#: rc_option_editor.cc:1205 msgid "Connection of tracks and busses" msgstr "Соединение дорожек и шин" -#: rc_option_editor.cc:1225 +#: rc_option_editor.cc:1210 msgid "Auto-connect master/monitor busses" msgstr "Автоматически соединять шины master/monitor" -#: rc_option_editor.cc:1232 +#: rc_option_editor.cc:1217 msgid "Connect track inputs" msgstr "Соединять входы дорожек" -#: rc_option_editor.cc:1237 +#: rc_option_editor.cc:1222 msgid "automatically to physical inputs" msgstr "Автоматически с физическими входами" -#: rc_option_editor.cc:1238 rc_option_editor.cc:1251 +#: rc_option_editor.cc:1223 rc_option_editor.cc:1236 msgid "manually" msgstr "Вручную" -#: rc_option_editor.cc:1244 +#: rc_option_editor.cc:1229 msgid "Connect track and bus outputs" msgstr "Соединять выходы дорожек и шин" -#: rc_option_editor.cc:1249 +#: rc_option_editor.cc:1234 msgid "automatically to physical outputs" msgstr "Автоматически с физическими выходами" -#: rc_option_editor.cc:1250 +#: rc_option_editor.cc:1235 msgid "automatically to master bus" msgstr "Автоматически с общей шиной" -#: rc_option_editor.cc:1255 +#: rc_option_editor.cc:1240 msgid "Denormals" msgstr "Отклонения сигнала" -#: rc_option_editor.cc:1260 +#: rc_option_editor.cc:1245 #, fuzzy msgid "Use DC bias to protect against denormals" msgstr "Защищать от отклонений" -#: rc_option_editor.cc:1267 +#: rc_option_editor.cc:1252 msgid "Processor handling" msgstr "" -#: rc_option_editor.cc:1272 +#: rc_option_editor.cc:1257 msgid "no processor handling" msgstr "" -#: rc_option_editor.cc:1277 +#: rc_option_editor.cc:1262 msgid "use FlushToZero" msgstr "Использовать FlushToZero" -#: rc_option_editor.cc:1281 +#: rc_option_editor.cc:1266 msgid "use DenormalsAreZero" msgstr "Использовать DenormalsAreZero" -#: rc_option_editor.cc:1285 +#: rc_option_editor.cc:1270 #, fuzzy msgid "use FlushToZero and DenormalsAreZero" msgstr "Использовать FlushToZero и DenormalsAreZero" -#: rc_option_editor.cc:1295 +#: rc_option_editor.cc:1280 #, fuzzy msgid "Silence plugins when the transport is stopped" msgstr "Останавливать эффекты вместе с транспортом" -#: rc_option_editor.cc:1303 +#: rc_option_editor.cc:1288 msgid "Disable plugins during recording" msgstr "Отключать эффекты при записи" -#: rc_option_editor.cc:1311 +#: rc_option_editor.cc:1296 msgid "Make new plugins active" msgstr "Делать новые эффекты/инструменты активными" -#: rc_option_editor.cc:1319 +#: rc_option_editor.cc:1304 msgid "Enable automatic analysis of audio" msgstr "Включить автоматический анализ звука" -#: rc_option_editor.cc:1327 +#: rc_option_editor.cc:1312 msgid "Replicate missing region channels" msgstr "Воссоздавать отсутствующие каналы области" -#: rc_option_editor.cc:1334 rc_option_editor.cc:1349 rc_option_editor.cc:1361 -#: rc_option_editor.cc:1373 rc_option_editor.cc:1385 rc_option_editor.cc:1389 -#: rc_option_editor.cc:1397 rc_option_editor.cc:1405 rc_option_editor.cc:1413 -#: rc_option_editor.cc:1415 rc_option_editor.cc:1423 rc_option_editor.cc:1431 -#: rc_option_editor.cc:1439 +#: rc_option_editor.cc:1319 rc_option_editor.cc:1334 rc_option_editor.cc:1346 +#: rc_option_editor.cc:1358 rc_option_editor.cc:1370 rc_option_editor.cc:1374 +#: rc_option_editor.cc:1382 rc_option_editor.cc:1390 rc_option_editor.cc:1398 +#: rc_option_editor.cc:1400 rc_option_editor.cc:1408 rc_option_editor.cc:1416 +#: rc_option_editor.cc:1424 msgid "Solo / mute" msgstr "Соло/Приглушение" -#: rc_option_editor.cc:1337 +#: rc_option_editor.cc:1322 #, fuzzy msgid "Solo-in-place mute cut (dB)" msgstr "Солирование на месте" -#: rc_option_editor.cc:1344 +#: rc_option_editor.cc:1329 msgid "Solo controls are Listen controls" msgstr "Управление солированием работает как управление прослушиванием" -#: rc_option_editor.cc:1353 +#: rc_option_editor.cc:1338 msgid "Listen Position" msgstr "Положение прослушивания" -#: rc_option_editor.cc:1358 +#: rc_option_editor.cc:1343 #, fuzzy msgid "after-fader (AFL)" msgstr "после фейдера (AFL)" -#: rc_option_editor.cc:1359 +#: rc_option_editor.cc:1344 #, fuzzy msgid "pre-fader (PFL)" msgstr "до фейдера (PFL)" -#: rc_option_editor.cc:1365 +#: rc_option_editor.cc:1350 msgid "PFL signals come from" msgstr "Источник сигнала PFL" -#: rc_option_editor.cc:1370 +#: rc_option_editor.cc:1355 msgid "before pre-fader processors" msgstr "до послефейдерных обработчиков" -#: rc_option_editor.cc:1371 +#: rc_option_editor.cc:1356 msgid "pre-fader but after pre-fader processors" msgstr "до фейдера, но после предфейдерных обработчиков" -#: rc_option_editor.cc:1377 +#: rc_option_editor.cc:1362 msgid "AFL signals come from" msgstr "Источник сигнала AFL" -#: rc_option_editor.cc:1382 +#: rc_option_editor.cc:1367 #, fuzzy msgid "immediately post-fader" msgstr "Очистить (после фейдера)" -#: rc_option_editor.cc:1383 +#: rc_option_editor.cc:1368 #, fuzzy msgid "after post-fader processors (before pan)" msgstr "после постфейдерных обработчиков" -#: rc_option_editor.cc:1392 +#: rc_option_editor.cc:1377 msgid "Exclusive solo" msgstr "Эксклюзивное солирование" -#: rc_option_editor.cc:1400 +#: rc_option_editor.cc:1385 msgid "Show solo muting" msgstr "Показывать приглушение при солировании" -#: rc_option_editor.cc:1408 +#: rc_option_editor.cc:1393 msgid "Soloing overrides muting" msgstr "Солирование приоритетнее приглушения" -#: rc_option_editor.cc:1413 +#: rc_option_editor.cc:1398 msgid "Default track / bus muting options" msgstr "Параметры приглушения дорожки/шины по умолчанию" -#: rc_option_editor.cc:1418 +#: rc_option_editor.cc:1403 msgid "Mute affects pre-fader sends" msgstr "Приглушение затрагивает предфейдерные посылы" -#: rc_option_editor.cc:1426 +#: rc_option_editor.cc:1411 msgid "Mute affects post-fader sends" msgstr "Приглушение затрагивает послефейдерные посылы" -#: rc_option_editor.cc:1434 +#: rc_option_editor.cc:1419 msgid "Mute affects control outputs" msgstr "" -#: rc_option_editor.cc:1442 +#: rc_option_editor.cc:1427 msgid "Mute affects main outputs" msgstr "Приглушение затрагивает основные выходы" -#: rc_option_editor.cc:1458 +#: rc_option_editor.cc:1443 msgid "Send MIDI Time Code" msgstr "Передавать MIDI Time Code" -#: rc_option_editor.cc:1466 +#: rc_option_editor.cc:1451 msgid "Percentage either side of normal transport speed to transmit MTC" msgstr "" -#: rc_option_editor.cc:1475 +#: rc_option_editor.cc:1460 msgid "Obey MIDI Machine Control commands" msgstr "Выполнять команды MIDI Machine Control" -#: rc_option_editor.cc:1483 +#: rc_option_editor.cc:1468 msgid "Send MIDI Machine Control commands" msgstr "Отправлять команды MIDI Machine Control" -#: rc_option_editor.cc:1491 +#: rc_option_editor.cc:1476 msgid "Send MIDI control feedback" msgstr "Отправлять отклик на контрольные события MIDI" -#: rc_option_editor.cc:1499 -#, fuzzy +#: rc_option_editor.cc:1484 msgid "Inbound MMC device ID" msgstr "Идентификатор входящего устройства MMC" -#: rc_option_editor.cc:1508 +#: rc_option_editor.cc:1493 #, fuzzy msgid "Outbound MMC device ID" msgstr "Идентификатор исходящего устройства MMC" -#: rc_option_editor.cc:1517 +#: rc_option_editor.cc:1502 msgid "Initial program change" msgstr "Исходная смена программы" -#: rc_option_editor.cc:1526 +#: rc_option_editor.cc:1511 msgid "Display first MIDI bank/program as 0" msgstr "Показывать первый банк/программу MIDI как 0" -#: rc_option_editor.cc:1534 +#: rc_option_editor.cc:1519 msgid "Never display periodic MIDI messages (MTC, MIDI Clock)" msgstr "Никогда не показывать периодические сообщения MIDI (MTC, MIDI Clock)" -#: rc_option_editor.cc:1542 +#: rc_option_editor.cc:1527 msgid "Sound MIDI notes as they are selected" msgstr "Воспроизводить ноты MIDI при их выделении" -#: rc_option_editor.cc:1549 rc_option_editor.cc:1551 rc_option_editor.cc:1553 -#: rc_option_editor.cc:1555 rc_option_editor.cc:1568 +#: rc_option_editor.cc:1534 rc_option_editor.cc:1536 rc_option_editor.cc:1538 +#: rc_option_editor.cc:1540 rc_option_editor.cc:1553 msgid "User interaction" msgstr "Взаимодействие с пользователем" -#: rc_option_editor.cc:1549 +#: rc_option_editor.cc:1534 msgid "Keyboard" msgstr "Клавиатура" -#: rc_option_editor.cc:1553 +#: rc_option_editor.cc:1538 msgid "Control surfaces" msgstr "Устройства управления" -#: rc_option_editor.cc:1559 +#: rc_option_editor.cc:1544 msgid "Control surface remote ID" msgstr "ID для удалённого управления" -#: rc_option_editor.cc:1564 +#: rc_option_editor.cc:1549 msgid "assigned by user" msgstr "Назначенные пользователем" -#: rc_option_editor.cc:1565 +#: rc_option_editor.cc:1550 msgid "follows order of mixer" msgstr "Следуют порядку микшера" -#: rc_option_editor.cc:1566 +#: rc_option_editor.cc:1551 msgid "follows order of editor" msgstr "Следуют порядку редактора" -#: rc_option_editor.cc:1572 rc_option_editor.cc:1582 rc_option_editor.cc:1584 -#: rc_option_editor.cc:1603 rc_option_editor.cc:1612 rc_option_editor.cc:1620 -#: rc_option_editor.cc:1634 rc_option_editor.cc:1651 +#: rc_option_editor.cc:1557 rc_option_editor.cc:1567 rc_option_editor.cc:1569 +#: rc_option_editor.cc:1588 rc_option_editor.cc:1597 rc_option_editor.cc:1605 +#: rc_option_editor.cc:1619 rc_option_editor.cc:1636 msgid "Visual|Interface" msgstr "Интерфейс" -#: rc_option_editor.cc:1575 +#: rc_option_editor.cc:1560 msgid "Graphically indicate mouse pointer hovering over various widgets" msgstr "Подсвечивать элементы интерфейса под указателем мыши" -#: rc_option_editor.cc:1587 +#: rc_option_editor.cc:1572 msgid "Use plugins' own interfaces instead of Ardour's" msgstr "По возможности использовать собственный интерфейс модулей" -#: rc_option_editor.cc:1605 +#: rc_option_editor.cc:1590 msgid "Mixer Strip" msgstr "Полоса микшера" -#: rc_option_editor.cc:1615 -msgid "Use narrow mixer strips by default" +#: rc_option_editor.cc:1600 +#, fuzzy +msgid "Use narrow strips in the mixer by default" msgstr "Использовать тонкие полоски в микшере по умолчанию" -#: rc_option_editor.cc:1624 +#: rc_option_editor.cc:1609 msgid "Meter hold time" msgstr "Задержка индикатора" -#: rc_option_editor.cc:1630 session_option_editor.cc:153 +#: rc_option_editor.cc:1615 session_option_editor.cc:149 msgid "short" msgstr "Короткое" -#: rc_option_editor.cc:1631 rc_option_editor.cc:1646 +#: rc_option_editor.cc:1616 rc_option_editor.cc:1631 msgid "medium" msgstr "Среднее" -#: rc_option_editor.cc:1632 +#: rc_option_editor.cc:1617 msgid "long" msgstr "Долгое" -#: rc_option_editor.cc:1638 +#: rc_option_editor.cc:1623 msgid "Meter fall-off" msgstr "Спадание индикатора" -#: rc_option_editor.cc:1644 +#: rc_option_editor.cc:1629 msgid "slowest" msgstr "Самое медленное" -#: rc_option_editor.cc:1645 +#: rc_option_editor.cc:1630 msgid "slow" msgstr "Медленное" -#: rc_option_editor.cc:1647 +#: rc_option_editor.cc:1632 msgid "fast" msgstr "Быстрое" -#: rc_option_editor.cc:1648 +#: rc_option_editor.cc:1633 msgid "faster" msgstr "Ещё более быстрее" -#: rc_option_editor.cc:1649 +#: rc_option_editor.cc:1634 msgid "fastest" msgstr "Скорейшее" -#: region_editor.cc:80 +#: region_editor.cc:78 msgid "audition this region" msgstr "прослушать область" -#: region_editor.cc:89 region_layering_order_editor.cc:71 +#: region_editor.cc:87 region_layering_order_editor.cc:71 msgid "Position:" msgstr "Позиция:" -#: region_editor.cc:91 +#: region_editor.cc:89 msgid "End:" msgstr "Конец:" -#: region_editor.cc:93 sfdb_ui.cc:140 +#: region_editor.cc:91 sfdb_ui.cc:139 msgid "Length:" msgstr "Длительность:" -#: region_editor.cc:95 +#: region_editor.cc:93 msgid "Sync point (relative to region):" msgstr "Точка синхронизации (относительно области):" -#: region_editor.cc:97 +#: region_editor.cc:95 msgid "Sync point (absolute):" msgstr "Точка синхронизации (абсолютная:" -#: region_editor.cc:99 +#: region_editor.cc:97 msgid "File start:" msgstr "Начало файла:" -#: region_editor.cc:103 +#: region_editor.cc:101 msgid "Sources:" msgstr "Источники:" -#: region_editor.cc:105 +#: region_editor.cc:103 msgid "Source:" msgstr "Источник:" -#: region_editor.cc:168 +#: region_editor.cc:166 msgid "Region '%1'" msgstr "Область %1" -#: region_editor.cc:275 +#: region_editor.cc:273 msgid "change region start position" msgstr "смена позиции начала области" -#: region_editor.cc:291 +#: region_editor.cc:289 msgid "change region end position" msgstr "смена позиции конца области" -#: region_editor.cc:311 +#: region_editor.cc:309 msgid "change region length" msgstr "смена длительности области" -#: region_editor.cc:405 region_editor.cc:417 -#, fuzzy +#: region_editor.cc:403 region_editor.cc:415 msgid "change region sync point" -msgstr "смена позиции конца области" +msgstr "смена синхронизатора областей" #: region_layering_order_editor.cc:38 msgid "RegionLayeringOrderEditor" @@ -8940,35 +8990,34 @@ msgstr "Дорожка:" msgid "Choose Top Region" msgstr "Выбрать верхнюю область" -#: region_view.cc:276 -#, fuzzy +#: region_view.cc:274 msgid "SilenceText" -msgstr "Переименовать область" +msgstr "SilenceText" -#: region_view.cc:292 region_view.cc:311 +#: region_view.cc:290 region_view.cc:309 msgid "minutes" msgstr "минут" -#: region_view.cc:295 region_view.cc:314 +#: region_view.cc:293 region_view.cc:312 msgid "msecs" msgstr "мс" -#: region_view.cc:298 region_view.cc:317 +#: region_view.cc:296 region_view.cc:315 msgid "secs" msgstr "с" -#: region_view.cc:301 +#: region_view.cc:299 msgid "%1 silent segment" msgid_plural "%1 silent segments" msgstr[0] "%1 тихий сегмент" msgstr[1] "%1 тихих сегмента" msgstr[2] "%1 тихих сегментов" -#: region_view.cc:303 +#: region_view.cc:301 msgid "shortest = %1 %2" msgstr "кратчайший = %1 %2" -#: region_view.cc:320 +#: region_view.cc:318 msgid "" "\n" " (shortest audible segment = %1 %2)" @@ -8976,95 +9025,95 @@ msgstr "" "\n" " (кратчайший слышимый сегмент = %1 %2)" -#: return_ui.cc:104 +#: return_ui.cc:103 msgid "Return " msgstr "" -#: rhythm_ferret.cc:33 +#: rhythm_ferret.cc:30 msgid "Percussive Onset" msgstr "Атака перкуссии" -#: rhythm_ferret.cc:34 +#: rhythm_ferret.cc:31 msgid "Note Onset" msgstr "Начало ноты" -#: rhythm_ferret.cc:39 +#: rhythm_ferret.cc:36 msgid "Energy Based" msgstr "На основе энергии" -#: rhythm_ferret.cc:40 +#: rhythm_ferret.cc:37 msgid "Spectral Difference" msgstr "Спектральная разница" -#: rhythm_ferret.cc:41 +#: rhythm_ferret.cc:38 msgid "High-Frequency Content" msgstr "Высокочастотное содержимое" -#: rhythm_ferret.cc:42 +#: rhythm_ferret.cc:39 msgid "Complex Domain" msgstr "Сложный интервал" -#: rhythm_ferret.cc:43 +#: rhythm_ferret.cc:40 msgid "Phase Deviation" msgstr "Отклонение фазы" -#: rhythm_ferret.cc:44 +#: rhythm_ferret.cc:41 msgid "Kullback-Liebler" msgstr "Кулбека-Либлера" -#: rhythm_ferret.cc:45 +#: rhythm_ferret.cc:42 msgid "Modified Kullback-Liebler" msgstr "Изменённая Кулбека-Либлера" -#: rhythm_ferret.cc:50 +#: rhythm_ferret.cc:47 msgid "Split region" msgstr "Разделить область" -#: rhythm_ferret.cc:51 +#: rhythm_ferret.cc:48 msgid "Snap regions" msgstr "" -#: rhythm_ferret.cc:52 +#: rhythm_ferret.cc:49 msgid "Conform regions" msgstr "Согласовать области" -#: rhythm_ferret.cc:57 +#: rhythm_ferret.cc:54 msgid "Rhythm Ferret" msgstr "Ритмический хорёк" -#: rhythm_ferret.cc:63 +#: rhythm_ferret.cc:60 msgid "Analyze" msgstr "Проанализировать" -#: rhythm_ferret.cc:98 +#: rhythm_ferret.cc:95 msgid "Detection function" msgstr "Функция определения" -#: rhythm_ferret.cc:102 +#: rhythm_ferret.cc:99 msgid "Trigger gap" msgstr "Интервал триггера" -#: rhythm_ferret.cc:107 strip_silence_dialog.cc:70 +#: rhythm_ferret.cc:104 strip_silence_dialog.cc:68 msgid "Threshold" msgstr "Порог" -#: rhythm_ferret.cc:112 +#: rhythm_ferret.cc:109 msgid "Peak threshold" msgstr "Порог пика" -#: rhythm_ferret.cc:117 +#: rhythm_ferret.cc:114 msgid "Silence threshold" msgstr "Порог тишины" -#: rhythm_ferret.cc:122 +#: rhythm_ferret.cc:119 msgid "Sensitivity" msgstr "Чувствительность" -#: rhythm_ferret.cc:126 +#: rhythm_ferret.cc:123 msgid "Operation" msgstr "Действие" -#: rhythm_ferret.cc:340 +#: rhythm_ferret.cc:337 msgid "split regions (rhythm ferret)" msgstr "разделение областей (хорьком)" @@ -9097,18 +9146,16 @@ msgid "Editing" msgstr "Редактирование" #: route_group_dialog.cc:47 -#, fuzzy msgid "Active state" -msgstr "Активировать" +msgstr "Активное состояние" #: route_group_dialog.cc:48 route_group_dialog.cc:78 theme_manager.cc:69 msgid "Color" msgstr "Цвет" #: route_group_dialog.cc:55 -#, fuzzy msgid "RouteGroupDialog" -msgstr "Очистка" +msgstr "RouteGroupDialog" #: route_group_dialog.cc:94 msgid "Sharing" @@ -9119,143 +9166,142 @@ msgid "" "A route group of this name already exists. Please use a different name." msgstr "" -#: route_params_ui.cc:87 +#: route_params_ui.cc:82 msgid "Tracks/Busses" msgstr "Дорожки/Шины" -#: route_params_ui.cc:106 +#: route_params_ui.cc:101 msgid "Inputs" msgstr "Входы" -#: route_params_ui.cc:107 +#: route_params_ui.cc:102 msgid "Outputs" msgstr "Выходы" -#: route_params_ui.cc:108 +#: route_params_ui.cc:103 msgid "Plugins, Inserts & Sends" msgstr "Модули, возвраты и посылы" -#: route_params_ui.cc:216 +#: route_params_ui.cc:211 msgid "route display list item for renamed route not found!" msgstr "" -#: route_params_ui.cc:263 route_params_ui.cc:291 +#: route_params_ui.cc:258 route_params_ui.cc:286 #, c-format msgid "Playback delay: % samples" msgstr "Задержка воспроизведения: % сэмплов" -#: route_params_ui.cc:483 +#: route_params_ui.cc:478 msgid "NO TRACK" msgstr "НЕТ ДОРОЖЕК" -#: route_params_ui.cc:616 route_params_ui.cc:617 +#: route_params_ui.cc:611 route_params_ui.cc:612 msgid "No Track or Bus Selected" msgstr "Нет выбранных дорожек или шин" -#: route_time_axis.cc:116 +#: route_time_axis.cc:111 msgid "g" msgstr "г" -#: route_time_axis.cc:117 +#: route_time_axis.cc:112 msgid "p" msgstr "сп" -#: route_time_axis.cc:118 +#: route_time_axis.cc:113 msgid "a" msgstr "а" -#: route_time_axis.cc:186 +#: route_time_axis.cc:183 msgid "Record (Right-click for Step Edit)" msgstr "Запись (правая клавиша мыши активирует пошаговый ввод)" -#: route_time_axis.cc:188 +#: route_time_axis.cc:185 msgid "Record" msgstr "Запись" -#: route_time_axis.cc:210 route_time_axis.cc:684 +#: route_time_axis.cc:216 msgid "Route Group" msgstr "Группа маршрутизации" -#: route_time_axis.cc:211 route_time_axis.cc:666 -msgid "Playlist" -msgstr "Список" - -#: route_time_axis.cc:214 +#: route_time_axis.cc:219 msgid "MIDI Controllers and Automation" msgstr "MIDI-контроллеры и автоматизация" -#: route_time_axis.cc:400 +#: route_time_axis.cc:405 msgid "Show All Automation" msgstr "Показать всю автоматизацию" -#: route_time_axis.cc:403 +#: route_time_axis.cc:408 msgid "Show Existing Automation" msgstr "Показать существующую автоматизацию" -#: route_time_axis.cc:406 +#: route_time_axis.cc:411 msgid "Hide All Automation" msgstr "Скрыть всю автоматизацию" -#: route_time_axis.cc:432 +#: route_time_axis.cc:437 msgid "Color..." msgstr "Цвет..." -#: route_time_axis.cc:487 +#: route_time_axis.cc:494 msgid "Overlaid" msgstr "" -#: route_time_axis.cc:494 +#: route_time_axis.cc:500 msgid "Stacked" msgstr "" -#: route_time_axis.cc:503 +#: route_time_axis.cc:508 msgid "Layers" msgstr "Слои" -#: route_time_axis.cc:572 +#: route_time_axis.cc:577 msgid "Automatic (based on I/O connections)" msgstr "Автоматическое (по соединениям входа-выхода)" -#: route_time_axis.cc:581 +#: route_time_axis.cc:586 msgid "(Currently: Existing Material)" msgstr "(Сейчас: с записанным материалом)" -#: route_time_axis.cc:584 +#: route_time_axis.cc:589 msgid "(Currently: Capture Time)" msgstr "(Сейчас: по времени захвата)" -#: route_time_axis.cc:592 +#: route_time_axis.cc:597 msgid "Align With Existing Material" msgstr "С записанным материалом" -#: route_time_axis.cc:597 +#: route_time_axis.cc:602 msgid "Align With Capture Time" msgstr "По времени захвата" -#: route_time_axis.cc:602 +#: route_time_axis.cc:607 msgid "Alignment" msgstr "Выравнивание" -#: route_time_axis.cc:637 +#: route_time_axis.cc:642 msgid "Normal Mode" msgstr "Обычный режим" -#: route_time_axis.cc:643 +#: route_time_axis.cc:648 msgid "Tape Mode" msgstr "Плёночный режим" -#: route_time_axis.cc:649 +#: route_time_axis.cc:654 msgid "Non-Layered Mode" msgstr "Бесслойный режим" -#: route_time_axis.cc:660 +#: route_time_axis.cc:665 msgid "Color Mode" msgstr "Режим раскрашивания" +#: route_time_axis.cc:671 route_time_axis.cc:1609 +msgid "Playlist" +msgstr "Список" + #: route_time_axis.cc:991 -#, fuzzy msgid "Rename Playlist" -msgstr "Имя списка воспроизведения" +msgstr "Переименовать список воспроизведения" #: route_time_axis.cc:992 #, fuzzy @@ -9273,9 +9319,8 @@ msgid "Name for new playlist:" msgstr "Имя списка воспроизведения" #: route_time_axis.cc:1130 -#, fuzzy msgid "New Playlist" -msgstr "Создать списки воспроизведения" +msgstr "Новый список воспроизведения" #: route_time_axis.cc:1319 #, fuzzy @@ -9287,14 +9332,12 @@ msgid "New Copy..." msgstr "Создать копию..." #: route_time_axis.cc:1504 -#, fuzzy msgid "New Take" -msgstr "Новое имя: " +msgstr "Новый дубль" #: route_time_axis.cc:1505 -#, fuzzy msgid "Copy Take" -msgstr "Копировать" +msgstr "Скопировать дубль" #: route_time_axis.cc:1510 msgid "Clear Current" @@ -9305,147 +9348,151 @@ msgstr "Очистить текущий" msgid "Select From All..." msgstr "Выбрать из всех..." -#: route_time_axis.cc:2244 +#: route_time_axis.cc:1601 +msgid "Take: %1.%2" +msgstr "" + +#: route_time_axis.cc:2282 #, fuzzy msgid "Underlays" msgstr "Раскрыть области" -#: route_time_axis.cc:2247 +#: route_time_axis.cc:2285 msgid "Remove \"%1\"" msgstr "Удалить «%1»" -#: route_time_axis.cc:2297 route_time_axis.cc:2334 +#: route_time_axis.cc:2335 route_time_axis.cc:2372 #, fuzzy msgid "programming error: underlay reference pointer pairs are inconsistent!" msgstr "ошибка в программе: line canvas item has no line pointer!" -#: route_time_axis.cc:2365 +#: route_time_axis.cc:2403 #, fuzzy msgid "After-fade listen (AFL)" msgstr "после фейдера (AFL)" -#: route_time_axis.cc:2369 +#: route_time_axis.cc:2407 #, fuzzy msgid "Pre-fade listen (PFL)" msgstr "до фейдера (PFL)" -#: route_time_axis.cc:2373 +#: route_time_axis.cc:2411 msgid "s" msgstr "с" -#: route_time_axis.cc:2377 +#: route_time_axis.cc:2415 msgid "m" msgstr "м" -#: route_ui.cc:117 +#: route_ui.cc:114 msgid "Mute this track" msgstr "Приглушить эту дорожку" -#: route_ui.cc:121 +#: route_ui.cc:118 msgid "Mute other (non-soloed) tracks" msgstr "Приглушить другие (не солирующие) дорожки" -#: route_ui.cc:126 +#: route_ui.cc:123 msgid "Enable recording on this track" msgstr "Включить записываемость этой дорожки" -#: route_ui.cc:130 +#: route_ui.cc:127 msgid "make mixer strips show sends to this bus" msgstr "" -#: route_ui.cc:135 +#: route_ui.cc:132 msgid "Monitor input" msgstr "" -#: route_ui.cc:141 +#: route_ui.cc:138 msgid "Monitor playback" msgstr "" -#: route_ui.cc:539 +#: route_ui.cc:536 msgid "Not connected to JACK - cannot engage record" msgstr "" -#: route_ui.cc:721 +#: route_ui.cc:718 msgid "Step Entry" msgstr "Пошаговый ввод" -#: route_ui.cc:794 +#: route_ui.cc:791 msgid "Assign all tracks (prefader)" msgstr "" -#: route_ui.cc:798 +#: route_ui.cc:795 #, fuzzy msgid "Assign all tracks and buses (prefader)" msgstr "в выделенные дорожки" -#: route_ui.cc:802 +#: route_ui.cc:799 msgid "Assign all tracks (postfader)" msgstr "" -#: route_ui.cc:806 +#: route_ui.cc:803 #, fuzzy msgid "Assign all tracks and buses (postfader)" msgstr "в выделенные дорожки" -#: route_ui.cc:810 +#: route_ui.cc:807 #, fuzzy msgid "Assign selected tracks (prefader)" msgstr "в выделенные дорожки" -#: route_ui.cc:814 +#: route_ui.cc:811 #, fuzzy msgid "Assign selected tracks and buses (prefader)" msgstr "в выделенные дорожки" -#: route_ui.cc:817 +#: route_ui.cc:814 #, fuzzy msgid "Assign selected tracks (postfader)" msgstr "в выделенные дорожки" -#: route_ui.cc:821 +#: route_ui.cc:818 #, fuzzy msgid "Assign selected tracks and buses (postfader)" msgstr "в выделенные дорожки" -#: route_ui.cc:824 +#: route_ui.cc:821 #, fuzzy msgid "Copy track/bus gains to sends" msgstr "Скопировать файлы в сеанс" -#: route_ui.cc:825 +#: route_ui.cc:822 msgid "Set sends gain to -inf" msgstr "" -#: route_ui.cc:826 +#: route_ui.cc:823 msgid "Set sends gain to 0dB" msgstr "" -#: route_ui.cc:1146 +#: route_ui.cc:1143 #, fuzzy msgid "Solo Isolate" msgstr "Соло" -#: route_ui.cc:1175 +#: route_ui.cc:1172 msgid "Pre Fader" msgstr "Предфейдер" -#: route_ui.cc:1181 +#: route_ui.cc:1178 msgid "Post Fader" msgstr "Послефейдер" -#: route_ui.cc:1187 +#: route_ui.cc:1184 msgid "Control Outs" msgstr "Контрольные выходы" -#: route_ui.cc:1193 +#: route_ui.cc:1190 msgid "Main Outs" msgstr "Главные выходы" -#: route_ui.cc:1325 +#: route_ui.cc:1322 msgid "Color Selection" msgstr "Выбор цвета" -#: route_ui.cc:1410 +#: route_ui.cc:1407 msgid "" "Do you really want to remove track \"%1\" ?\n" "\n" @@ -9459,7 +9506,7 @@ msgstr "" "\n" "Это действие невозможно отменить, файл сеанса будет перезаписан." -#: route_ui.cc:1412 +#: route_ui.cc:1409 msgid "" "Do you really want to remove bus \"%1\" ?\n" "\n" @@ -9469,62 +9516,77 @@ msgstr "" "\n" "Это действие невозможно отменить, файл сеанса будет перезаписан." -#: route_ui.cc:1420 +#: route_ui.cc:1417 msgid "Remove track" msgstr "Удаление дорожки" -#: route_ui.cc:1422 +#: route_ui.cc:1419 msgid "Remove bus" msgstr "Удаление шины" -#: route_ui.cc:1449 +#: route_ui.cc:1446 msgid "" "The use of colons (':') is discouraged in track and bus names.\n" "Do you want to use this new name?" msgstr "" -#: route_ui.cc:1453 +#: route_ui.cc:1450 #, fuzzy msgid "Use the new name" msgstr "новое имя: " -#: route_ui.cc:1454 +#: route_ui.cc:1451 msgid "Re-edit the name" msgstr "" -#: route_ui.cc:1467 +#: route_ui.cc:1464 msgid "Rename Track" msgstr "Переименование дорожки" -#: route_ui.cc:1469 +#: route_ui.cc:1466 msgid "Rename Bus" msgstr "Переименование шины" -#: route_ui.cc:1628 +#: route_ui.cc:1625 msgid " latency" msgstr " задержка" -#: route_ui.cc:1641 +#: route_ui.cc:1638 msgid "Cannot create route template directory %1" msgstr "Не удалось создать папку с шаблонами маршрутизации %1" -#: route_ui.cc:1647 +#: route_ui.cc:1644 msgid "Save As Template" msgstr "Сохранить как шаблон" -#: route_ui.cc:1648 +#: route_ui.cc:1645 msgid "Template name:" msgstr "Название шаблона:" -#: route_ui.cc:1721 +#: route_ui.cc:1718 msgid "Remote Control ID" msgstr "ID для удалённого управления" -#: route_ui.cc:1727 +#: route_ui.cc:1728 msgid "Remote control ID:" msgstr "ID для удалённого управления:" -#: route_ui.cc:1782 +#: route_ui.cc:1741 +msgid "" +"Remote Control IDs are currently determined by track/bus ordering in %1\n" +"\n" +"This %2 has remote control ID %3\n" +"\n" +"\n" +"Use the User Interaction tab of the " +"Preferences window if you want to change this" +msgstr "" + +#: route_ui.cc:1744 +msgid "the mixer" +msgstr "" + +#: route_ui.cc:1794 msgid "" "Left-click to invert (phase reverse) channel %1 of this track. Right-click " "to show menu." @@ -9532,7 +9594,7 @@ msgstr "" "Щелчком левой клавиши мыши инвертируется (инверсия фазы) \n" "канал %1 этой дорожки. По правой клавише вызывается меню." -#: route_ui.cc:1784 +#: route_ui.cc:1796 msgid "Click to show a menu of channels for inversion (phase reverse)" msgstr "" @@ -9548,7 +9610,7 @@ msgstr "Щёлкните для добавления нового располо msgid "the session folder" msgstr "в папке сеанса" -#: send_ui.cc:123 +#: send_ui.cc:122 msgid "Send " msgstr "Посыл" @@ -9576,171 +9638,171 @@ msgstr "Импортировать из сеанса" msgid "This will select all elements of this type!" msgstr "Будут выбраны все элементы этого типа!" -#: session_metadata_dialog.cc:301 +#: session_metadata_dialog.cc:300 msgid "Field" msgstr "Поле" -#: session_metadata_dialog.cc:305 +#: session_metadata_dialog.cc:304 msgid "Values (current value on top)" msgstr "Значения (текущее ­— сверху)" -#: session_metadata_dialog.cc:519 +#: session_metadata_dialog.cc:518 msgid "User" msgstr "Пользователь" -#: session_metadata_dialog.cc:527 +#: session_metadata_dialog.cc:526 msgid "Email" msgstr "Эл. почта" -#: session_metadata_dialog.cc:530 +#: session_metadata_dialog.cc:529 msgid "Web" msgstr "Веб-сайт" -#: session_metadata_dialog.cc:533 +#: session_metadata_dialog.cc:532 msgid "Organization" msgstr "Организация" -#: session_metadata_dialog.cc:536 +#: session_metadata_dialog.cc:535 msgid "Country" msgstr "Страна" -#: session_metadata_dialog.cc:550 +#: session_metadata_dialog.cc:549 msgid "Title" msgstr "Название" -#: session_metadata_dialog.cc:553 +#: session_metadata_dialog.cc:552 msgid "Track Number" msgstr "Номер дорожки" -#: session_metadata_dialog.cc:556 +#: session_metadata_dialog.cc:555 msgid "Subtitle" msgstr "Подзаголовок" -#: session_metadata_dialog.cc:559 +#: session_metadata_dialog.cc:558 msgid "Grouping" msgstr "Группирование" -#: session_metadata_dialog.cc:562 +#: session_metadata_dialog.cc:561 msgid "Artist" msgstr "Исполнитель" -#: session_metadata_dialog.cc:565 +#: session_metadata_dialog.cc:564 msgid "Genre" msgstr "Жанр" -#: session_metadata_dialog.cc:568 +#: session_metadata_dialog.cc:567 msgid "Comment" msgstr "Комментарий" -#: session_metadata_dialog.cc:571 +#: session_metadata_dialog.cc:570 msgid "Copyright" msgstr "Авторские права" -#: session_metadata_dialog.cc:579 session_metadata_dialog.cc:584 +#: session_metadata_dialog.cc:578 session_metadata_dialog.cc:583 msgid "Album" msgstr "Альбом" -#: session_metadata_dialog.cc:587 +#: session_metadata_dialog.cc:586 msgid "Year" msgstr "Год" -#: session_metadata_dialog.cc:590 +#: session_metadata_dialog.cc:589 msgid "Album Artist" msgstr "Исполнитель альбома" -#: session_metadata_dialog.cc:593 +#: session_metadata_dialog.cc:592 msgid "Total Tracks" msgstr "Всего дорожек" -#: session_metadata_dialog.cc:596 +#: session_metadata_dialog.cc:595 msgid "Disc Subtitle" msgstr "Подзаголовок диска" -#: session_metadata_dialog.cc:599 +#: session_metadata_dialog.cc:598 msgid "Disc Number" msgstr "Номер диска" -#: session_metadata_dialog.cc:602 +#: session_metadata_dialog.cc:601 msgid "Total Discs" msgstr "Всего дисков" -#: session_metadata_dialog.cc:605 +#: session_metadata_dialog.cc:604 msgid "Compilation" msgstr "Сборник" -#: session_metadata_dialog.cc:608 +#: session_metadata_dialog.cc:607 msgid "ISRC" msgstr "ISRC" -#: session_metadata_dialog.cc:616 +#: session_metadata_dialog.cc:615 msgid "People" msgstr "Люди" -#: session_metadata_dialog.cc:621 +#: session_metadata_dialog.cc:620 msgid "Lyricist" msgstr "Автор слов" -#: session_metadata_dialog.cc:624 +#: session_metadata_dialog.cc:623 msgid "Composer" msgstr "Композитор" -#: session_metadata_dialog.cc:627 +#: session_metadata_dialog.cc:626 msgid "Conductor" msgstr "Дирижер" -#: session_metadata_dialog.cc:630 +#: session_metadata_dialog.cc:629 msgid "Remixer" msgstr "Автор ремикса" -#: session_metadata_dialog.cc:633 +#: session_metadata_dialog.cc:632 msgid "Arranger" msgstr "Аранжировщик" -#: session_metadata_dialog.cc:636 +#: session_metadata_dialog.cc:635 msgid "Engineer" msgstr "Звукоинженер" -#: session_metadata_dialog.cc:639 +#: session_metadata_dialog.cc:638 msgid "Producer" msgstr "Продюсер" -#: session_metadata_dialog.cc:642 +#: session_metadata_dialog.cc:641 msgid "DJ Mixer" msgstr "Диджей" -#: session_metadata_dialog.cc:645 +#: session_metadata_dialog.cc:644 msgid "Metadata|Mixer" msgstr "Звукооператор" -#: session_metadata_dialog.cc:653 +#: session_metadata_dialog.cc:652 msgid "School" msgstr "Обучение" -#: session_metadata_dialog.cc:658 +#: session_metadata_dialog.cc:657 msgid "Instructor" msgstr "Инструктор" -#: session_metadata_dialog.cc:661 +#: session_metadata_dialog.cc:660 msgid "Course" msgstr "Курс" -#: session_metadata_dialog.cc:669 +#: session_metadata_dialog.cc:668 msgid "Edit Session Metadata" msgstr "Метаданные сеанса" -#: session_metadata_dialog.cc:700 +#: session_metadata_dialog.cc:699 msgid "Import session metadata" msgstr "Импортировать метаданные сеанса" -#: session_metadata_dialog.cc:721 +#: session_metadata_dialog.cc:720 msgid "Choose session to import metadata from" msgstr "Выберите сеанс, из которого будут импортированы метаданные" -#: session_metadata_dialog.cc:759 +#: session_metadata_dialog.cc:758 msgid "This session file could not be read!" msgstr "Не удалось прочитать файл сеанса!" -#: session_metadata_dialog.cc:769 +#: session_metadata_dialog.cc:768 msgid "" "The session file didn't contain metadata!\n" "Maybe this is an old session format?" @@ -9748,136 +9810,136 @@ msgstr "" "В этом файле сеанса нет метаданных!\n" "Возможно, это файл в старом формате?" -#: session_metadata_dialog.cc:788 +#: session_metadata_dialog.cc:787 msgid "Import all from:" msgstr "Импортировать все из:" -#: session_option_editor.cc:35 +#: session_option_editor.cc:31 msgid "Session Properties" msgstr "Свойства сеанса" -#: session_option_editor.cc:46 +#: session_option_editor.cc:42 msgid "External timecode source" msgstr "Внешний источник синхросигнала" -#: session_option_editor.cc:56 +#: session_option_editor.cc:52 msgid "Timecode Settings" msgstr "Параметры тайм-кода" -#: session_option_editor.cc:60 +#: session_option_editor.cc:56 msgid "Timecode frames-per-second" msgstr "FPS синхросигнала" -#: session_option_editor.cc:65 +#: session_option_editor.cc:61 msgid "23.976" msgstr "23.976" -#: session_option_editor.cc:66 +#: session_option_editor.cc:62 msgid "24" msgstr "24" -#: session_option_editor.cc:67 +#: session_option_editor.cc:63 msgid "24.976" msgstr "24.976" -#: session_option_editor.cc:68 +#: session_option_editor.cc:64 msgid "25" msgstr "25" -#: session_option_editor.cc:69 +#: session_option_editor.cc:65 msgid "29.97" msgstr "29.97" -#: session_option_editor.cc:70 +#: session_option_editor.cc:66 msgid "29.97 drop" msgstr "" -#: session_option_editor.cc:71 +#: session_option_editor.cc:67 msgid "30" msgstr "30" -#: session_option_editor.cc:72 +#: session_option_editor.cc:68 msgid "30 drop" msgstr "" -#: session_option_editor.cc:73 +#: session_option_editor.cc:69 msgid "59.94" msgstr "59.94" -#: session_option_editor.cc:74 +#: session_option_editor.cc:70 msgid "60" msgstr "60" -#: session_option_editor.cc:80 +#: session_option_editor.cc:76 msgid "Subframes per frame" msgstr "Подвыборок на выборку" -#: session_option_editor.cc:85 +#: session_option_editor.cc:81 msgid "80" msgstr "80" -#: session_option_editor.cc:86 +#: session_option_editor.cc:82 msgid "100" msgstr "100" -#: session_option_editor.cc:92 +#: session_option_editor.cc:88 msgid "Timecode source shares sample clock with audio interface" msgstr "У источника тайм-кода и звукового интерфеса один синхросигнал" -#: session_option_editor.cc:99 +#: session_option_editor.cc:95 msgid "Pull-up / pull-down" msgstr "" -#: session_option_editor.cc:104 +#: session_option_editor.cc:100 msgid "4.1667 + 0.1%" msgstr "4.1667 + 0.1%" -#: session_option_editor.cc:105 +#: session_option_editor.cc:101 msgid "4.1667" msgstr "4.1667" -#: session_option_editor.cc:106 +#: session_option_editor.cc:102 msgid "4.1667 - 0.1%" msgstr "4.1667 - 0.1%" -#: session_option_editor.cc:107 +#: session_option_editor.cc:103 msgid "0.1" msgstr "0.1" -#: session_option_editor.cc:108 +#: session_option_editor.cc:104 msgid "none" msgstr "нет" -#: session_option_editor.cc:109 +#: session_option_editor.cc:105 msgid "-0.1" msgstr "-0.1" -#: session_option_editor.cc:110 +#: session_option_editor.cc:106 msgid "-4.1667 + 0.1%" msgstr "-4.1667 + 0.1%" -#: session_option_editor.cc:111 +#: session_option_editor.cc:107 msgid "-4.1667" msgstr "-4.1667" -#: session_option_editor.cc:112 +#: session_option_editor.cc:108 msgid "-4.1667 - 0.1%" msgstr "-4.1667 - 0.1%" -#: session_option_editor.cc:118 +#: session_option_editor.cc:114 #, fuzzy msgid "Timecode offset" msgstr "Смещение тайм-кода" -#: session_option_editor.cc:129 +#: session_option_editor.cc:125 msgid "Timecode Offset Negative" msgstr "Смещение тайм-кода отрицательно" -#: session_option_editor.cc:134 +#: session_option_editor.cc:130 msgid "JACK Transport/Time Settings" msgstr "Параметры времени и транспорта в JACK" -#: session_option_editor.cc:138 +#: session_option_editor.cc:134 #, fuzzy msgid "" "%1 is JACK Time Master (provides Bar|Beat|Tick and other information to JACK)" @@ -9885,126 +9947,126 @@ msgstr "" "Ardour является ведущим для отсчёта времени в JACK (передаёт JACK данные о " "тактах, долях и тиках)" -#: session_option_editor.cc:147 +#: session_option_editor.cc:143 msgid "Crossfades are created" msgstr "Кроссфейды создаются" -#: session_option_editor.cc:152 +#: session_option_editor.cc:148 msgid "to span entire overlap" msgstr "Через всё пересечение" -#: session_option_editor.cc:159 +#: session_option_editor.cc:155 msgid "Crossfade type" msgstr "Тип кроссфейда" -#: session_option_editor.cc:164 +#: session_option_editor.cc:160 msgid "constant power (-3dB)" msgstr "" -#: session_option_editor.cc:165 +#: session_option_editor.cc:161 msgid "constant power (-6dB)" msgstr "" -#: session_option_editor.cc:166 +#: session_option_editor.cc:162 msgid "use existing region fade shape" msgstr "Форма существующего фейда области" -#: session_option_editor.cc:171 +#: session_option_editor.cc:167 msgid "short-xfade-seconds" msgstr "" -#: session_option_editor.cc:172 +#: session_option_editor.cc:168 msgid "Short crossfade length" msgstr "Длительность короткого кроссфейда" -#: session_option_editor.cc:180 +#: session_option_editor.cc:176 msgid "destructive-xfade-seconds" msgstr "" -#: session_option_editor.cc:181 +#: session_option_editor.cc:177 msgid "Destructive crossfade length" msgstr "Длительность разрушающего кроссфейда" -#: session_option_editor.cc:190 +#: session_option_editor.cc:186 msgid "Create crossfades automatically" msgstr "Автоматически создавать кроссфейды" -#: session_option_editor.cc:197 +#: session_option_editor.cc:193 msgid "Region fades active" msgstr "Фейды области активны" -#: session_option_editor.cc:204 +#: session_option_editor.cc:200 msgid "Region fades visible" msgstr "Фейды области видны" -#: session_option_editor.cc:211 session_option_editor.cc:224 -#: session_option_editor.cc:238 session_option_editor.cc:240 -#: session_option_editor.cc:245 session_option_editor.cc:251 +#: session_option_editor.cc:207 session_option_editor.cc:220 +#: session_option_editor.cc:234 session_option_editor.cc:236 +#: session_option_editor.cc:241 session_option_editor.cc:247 msgid "Media" msgstr "Данные" -#: session_option_editor.cc:211 +#: session_option_editor.cc:207 msgid "Audio file format" msgstr "Формат звуковых файлов" -#: session_option_editor.cc:215 +#: session_option_editor.cc:211 msgid "Sample format" msgstr "Формат сэмплов" -#: session_option_editor.cc:220 +#: session_option_editor.cc:216 msgid "32-bit floating point" -msgstr "32-разрядные с плавающей точкой" +msgstr "32-bit floating point" -#: session_option_editor.cc:221 +#: session_option_editor.cc:217 msgid "24-bit integer" -msgstr "24-разрядные integer" +msgstr "24-bit integer" -#: session_option_editor.cc:222 +#: session_option_editor.cc:218 msgid "16-bit integer" -msgstr "16-разрядные integer" +msgstr "16-bit integer" -#: session_option_editor.cc:228 +#: session_option_editor.cc:224 msgid "File type" msgstr "Тип файлов" -#: session_option_editor.cc:233 +#: session_option_editor.cc:229 msgid "Broadcast WAVE" msgstr "Broadcast WAVE" -#: session_option_editor.cc:234 +#: session_option_editor.cc:230 msgid "WAVE" msgstr "WAVE" -#: session_option_editor.cc:235 +#: session_option_editor.cc:231 msgid "WAVE-64" msgstr "WAVE-64" -#: session_option_editor.cc:240 +#: session_option_editor.cc:236 msgid "File locations" msgstr "Расположение файлов" -#: session_option_editor.cc:242 +#: session_option_editor.cc:238 msgid "Search for audio files in:" msgstr "Где искать звуковые файлы:" -#: session_option_editor.cc:247 +#: session_option_editor.cc:243 msgid "Search for MIDI files in:" msgstr "Где искать файлы MIDI:" -#: session_option_editor.cc:257 +#: session_option_editor.cc:253 msgid "Monitoring automatically follows transport state (\"auto-input\")" msgstr "Контроль автоматически следует состоянию транспорта («автовход»)" -#: session_option_editor.cc:264 +#: session_option_editor.cc:260 #, fuzzy msgid "Use monitor section in this session" msgstr "Указать дополнительные параметры для этого сеанса" -#: session_option_editor.cc:275 +#: session_option_editor.cc:271 msgid "MIDI region copies are independent" msgstr "Копии MIDI-областей независимы" -#: session_option_editor.cc:282 +#: session_option_editor.cc:278 #, fuzzy msgid "" "Policy for handling overlapping notes\n" @@ -10013,234 +10075,225 @@ msgstr "" "Политика обработки перекрытия\n" "одинаковых нот и каналов" -#: session_option_editor.cc:287 +#: session_option_editor.cc:283 msgid "never allow them" msgstr "Никогда не допускать их" -#: session_option_editor.cc:288 +#: session_option_editor.cc:284 msgid "don't do anything in particular" msgstr "Ничего не делать" -#: session_option_editor.cc:289 +#: session_option_editor.cc:285 msgid "replace any overlapped existing note" msgstr "Заменять любые перекрывающиеся ноты" -#: session_option_editor.cc:290 +#: session_option_editor.cc:286 msgid "shorten the overlapped existing note" msgstr "Укорачивать существующую ноту" -#: session_option_editor.cc:291 +#: session_option_editor.cc:287 msgid "shorten the overlapping new note" msgstr "Укорачивать добавляемую ноту" -#: session_option_editor.cc:292 +#: session_option_editor.cc:288 msgid "replace both overlapping notes with a single note" msgstr "Заменять обе ноты одной новой" -#: session_option_editor.cc:296 +#: session_option_editor.cc:292 msgid "Glue to bars and beats" msgstr "Приклевание к тактам и долям" -#: session_option_editor.cc:300 +#: session_option_editor.cc:296 msgid "Glue new markers to bars and beats" msgstr "Приклеивать новые маркеры к тактам и долям" -#: session_option_editor.cc:307 +#: session_option_editor.cc:303 #, fuzzy msgid "Glue new regions to bars and beats" msgstr "Приклеивать новые маркеры к тактам и долям" -#: sfdb_ui.cc:87 sfdb_ui.cc:107 sfdb_ui.cc:116 +#: sfdb_ui.cc:86 sfdb_ui.cc:106 sfdb_ui.cc:115 msgid "as new tracks" msgstr "как новые дорожки" -#: sfdb_ui.cc:89 sfdb_ui.cc:109 +#: sfdb_ui.cc:88 sfdb_ui.cc:108 msgid "to selected tracks" msgstr "в выделенные дорожки" -#: sfdb_ui.cc:91 sfdb_ui.cc:111 +#: sfdb_ui.cc:90 sfdb_ui.cc:110 msgid "to region list" msgstr "в список областей" -#: sfdb_ui.cc:93 sfdb_ui.cc:113 +#: sfdb_ui.cc:92 sfdb_ui.cc:112 msgid "as new tape tracks" msgstr "как новые плёночные дорожки" -#: sfdb_ui.cc:97 +#: sfdb_ui.cc:96 msgid "programming error: unknown import mode string %1" msgstr "Ошибка в программе: неизвестная строка режима импорта %1" -#: sfdb_ui.cc:124 +#: sfdb_ui.cc:123 msgid "Auto-play" msgstr "Автовоспр." -#: sfdb_ui.cc:130 sfdb_ui.cc:237 +#: sfdb_ui.cc:129 sfdb_ui.cc:236 msgid "Sound File Information" msgstr "Информация о файле" -#: sfdb_ui.cc:142 +#: sfdb_ui.cc:141 msgid "Timestamp:" msgstr "Отметка времени:" -#: sfdb_ui.cc:144 +#: sfdb_ui.cc:143 msgid "Format:" msgstr "Формат:" -#: sfdb_ui.cc:183 sfdb_ui.cc:530 +#: sfdb_ui.cc:182 sfdb_ui.cc:529 msgid "Tags:" msgstr "Метки:" -#: sfdb_ui.cc:320 +#: sfdb_ui.cc:319 msgid "Auditioning of MIDI files is not yet supported" msgstr "Прослушивание файлов MIDI пока что не реализовано" -#: sfdb_ui.cc:327 +#: sfdb_ui.cc:326 msgid "Could not read file: %1 (%2)." msgstr "Не удалось прочитать файл: %1 (%2)" -#: sfdb_ui.cc:349 +#: sfdb_ui.cc:348 msgid "Could not access soundfile: " msgstr "Файл недоступен: " -#: sfdb_ui.cc:403 +#: sfdb_ui.cc:402 msgid "SoundFileBox: Could not tokenize string: " msgstr "" -#: sfdb_ui.cc:423 sfdb_ui.cc:425 +#: sfdb_ui.cc:422 sfdb_ui.cc:424 msgid "Search" msgstr "Искать" -#: sfdb_ui.cc:451 -#, fuzzy +#: sfdb_ui.cc:450 msgid "Audio and MIDI files" -msgstr "Звуковые файлы" +msgstr "Звуковые и MIDI-файлы" -#: sfdb_ui.cc:454 +#: sfdb_ui.cc:453 msgid "Audio files" msgstr "Звуковые файлы" -#: sfdb_ui.cc:457 +#: sfdb_ui.cc:456 msgid "MIDI files" msgstr "Файлы MIDI" -#: sfdb_ui.cc:460 +#: sfdb_ui.cc:459 msgid "All files" msgstr "Все файлы" -#: sfdb_ui.cc:477 +#: sfdb_ui.cc:476 msgid "Browse Files" msgstr "Обзор файлов" -#: sfdb_ui.cc:504 +#: sfdb_ui.cc:503 msgid "Paths" msgstr "Расположения" -#: sfdb_ui.cc:515 +#: sfdb_ui.cc:514 msgid "Search Tags" msgstr "Поиск по меткам" -#: sfdb_ui.cc:535 -#, fuzzy +#: sfdb_ui.cc:534 msgid "Sort:" -msgstr "Сортировать" +msgstr "Критерий сортировки:" + +#: sfdb_ui.cc:542 +msgid "Longest" +msgstr "Более длинные" #: sfdb_ui.cc:543 -#, fuzzy -msgid "Longest" -msgstr "Огромная" +msgid "Shortest" +msgstr "Более короткие" #: sfdb_ui.cc:544 -#, fuzzy -msgid "Shortest" -msgstr "Комбинация клавиш" +msgid "Newest" +msgstr "Более новые" #: sfdb_ui.cc:545 -#, fuzzy -msgid "Newest" -msgstr "Медленнее всего" +msgid "Oldest" +msgstr "Более старые" #: sfdb_ui.cc:546 -msgid "Oldest" -msgstr "" +msgid "Most downloaded" +msgstr "Чаще скачиваемые" #: sfdb_ui.cc:547 -msgid "Most downloaded" -msgstr "" +msgid "Least downloaded" +msgstr "Реже скачиваемые" #: sfdb_ui.cc:548 -#, fuzzy -msgid "Least downloaded" -msgstr "Начать скачивание" +msgid "Highest rated" +msgstr "Выше оценённые" #: sfdb_ui.cc:549 -msgid "Highest rated" -msgstr "" - -#: sfdb_ui.cc:550 msgid "Lowest rated" -msgstr "" +msgstr "Ниже оценённые" + +#: sfdb_ui.cc:565 +msgid "ID" +msgstr "ID" #: sfdb_ui.cc:566 -#, fuzzy -msgid "ID" -msgstr "ВХ" - -#: sfdb_ui.cc:567 -#, fuzzy msgid "Filename" -msgstr "Переименовать" +msgstr "Имя файла" -#: sfdb_ui.cc:569 -#, fuzzy +#: sfdb_ui.cc:568 msgid "Duration" -msgstr "Длительность (с)" +msgstr "Длительность" -#: sfdb_ui.cc:579 +#: sfdb_ui.cc:578 msgid "Search Freesound" msgstr "Поиск по Freesound" -#: sfdb_ui.cc:798 +#: sfdb_ui.cc:800 msgid "SoundFileBrowser: Could not tokenize string: " msgstr "" -#: sfdb_ui.cc:845 +#: sfdb_ui.cc:847 msgid "Page %1, [Stop]->" -msgstr "" +msgstr "Страница %1, [Стоп]->" -#: sfdb_ui.cc:1133 sfdb_ui.cc:1432 sfdb_ui.cc:1475 sfdb_ui.cc:1493 +#: sfdb_ui.cc:1143 sfdb_ui.cc:1450 sfdb_ui.cc:1493 sfdb_ui.cc:1511 msgid "one track per file" msgstr "одна дорожка на файл" -#: sfdb_ui.cc:1136 sfdb_ui.cc:1476 sfdb_ui.cc:1494 +#: sfdb_ui.cc:1146 sfdb_ui.cc:1494 sfdb_ui.cc:1512 msgid "one track per channel" msgstr "одна дорожка на канал" -#: sfdb_ui.cc:1144 sfdb_ui.cc:1478 sfdb_ui.cc:1495 +#: sfdb_ui.cc:1154 sfdb_ui.cc:1496 sfdb_ui.cc:1513 #, fuzzy msgid "sequence files" msgstr "очищенные файлы" -#: sfdb_ui.cc:1147 sfdb_ui.cc:1483 +#: sfdb_ui.cc:1157 sfdb_ui.cc:1501 msgid "all files in one track" msgstr "все файлы в одну дорожку" -#: sfdb_ui.cc:1148 sfdb_ui.cc:1477 +#: sfdb_ui.cc:1158 sfdb_ui.cc:1495 msgid "merge files" msgstr "объединить файлы" -#: sfdb_ui.cc:1154 sfdb_ui.cc:1480 +#: sfdb_ui.cc:1164 sfdb_ui.cc:1498 msgid "one region per file" msgstr "одна область на файл" -#: sfdb_ui.cc:1157 sfdb_ui.cc:1481 +#: sfdb_ui.cc:1167 sfdb_ui.cc:1499 msgid "one region per channel" msgstr "одна область на канал" -#: sfdb_ui.cc:1162 sfdb_ui.cc:1482 sfdb_ui.cc:1496 +#: sfdb_ui.cc:1172 sfdb_ui.cc:1500 sfdb_ui.cc:1514 msgid "all files in one region" msgstr "все файлы в одной области" -#: sfdb_ui.cc:1219 +#: sfdb_ui.cc:1238 msgid "" "One or more of the selected files\n" "cannot be used by %1" @@ -10248,55 +10301,55 @@ msgstr "" "Один или более выбранных файлов\n" "не могут быть использованы в %1" -#: sfdb_ui.cc:1360 +#: sfdb_ui.cc:1378 msgid "Copy files to session" msgstr "Скопировать файлы в сеанс" -#: sfdb_ui.cc:1377 sfdb_ui.cc:1533 +#: sfdb_ui.cc:1395 sfdb_ui.cc:1551 msgid "file timestamp" msgstr "по отметке времени файла" -#: sfdb_ui.cc:1378 sfdb_ui.cc:1535 +#: sfdb_ui.cc:1396 sfdb_ui.cc:1553 msgid "edit point" msgstr "по курсору редактора" -#: sfdb_ui.cc:1379 sfdb_ui.cc:1537 +#: sfdb_ui.cc:1397 sfdb_ui.cc:1555 msgid "playhead" msgstr "по указателю воспр." -#: sfdb_ui.cc:1380 +#: sfdb_ui.cc:1398 msgid "session start" msgstr "в начало сеанса" -#: sfdb_ui.cc:1385 +#: sfdb_ui.cc:1403 msgid "Add files:" msgstr "Добавить файлы:" -#: sfdb_ui.cc:1407 +#: sfdb_ui.cc:1425 msgid "Insert at:" msgstr "Вставить:" -#: sfdb_ui.cc:1420 +#: sfdb_ui.cc:1438 msgid "Mapping:" msgstr "Раскладка:" -#: sfdb_ui.cc:1438 +#: sfdb_ui.cc:1456 msgid "Conversion quality:" msgstr "Качество преобразования:" -#: sfdb_ui.cc:1450 sfdb_ui.cc:1549 +#: sfdb_ui.cc:1468 sfdb_ui.cc:1567 msgid "Best" msgstr "Наилучшее" -#: sfdb_ui.cc:1451 sfdb_ui.cc:1551 +#: sfdb_ui.cc:1469 sfdb_ui.cc:1569 msgid "Good" msgstr "Хорошее" -#: sfdb_ui.cc:1452 sfdb_ui.cc:1553 +#: sfdb_ui.cc:1470 sfdb_ui.cc:1571 msgid "Quick" msgstr "Быстрое преобразование" -#: sfdb_ui.cc:1454 +#: sfdb_ui.cc:1472 msgid "Fastest" msgstr "Быстрее всего" @@ -10312,11 +10365,11 @@ msgstr "Проценты" msgid "Units" msgstr "Единица измерения" -#: shuttle_control.cc:168 shuttle_control.cc:562 +#: shuttle_control.cc:168 shuttle_control.cc:569 msgid "Sprung" msgstr "Прыжок" -#: shuttle_control.cc:172 shuttle_control.cc:565 +#: shuttle_control.cc:172 shuttle_control.cc:572 msgid "Wheel" msgstr "Переход" @@ -10324,27 +10377,26 @@ msgstr "Переход" msgid "Maximum speed" msgstr "Макс. скорость" -#: shuttle_control.cc:525 +#: shuttle_control.cc:532 #, fuzzy msgid "Playing" msgstr "Воспроизвести" -#: shuttle_control.cc:540 +#: shuttle_control.cc:547 #, c-format msgid "<<< %+d semitones" msgstr "<<< %+d полутон" -#: shuttle_control.cc:542 +#: shuttle_control.cc:549 #, c-format msgid ">>> %+d semitones" msgstr ">>> %+d полутон" -#: shuttle_control.cc:547 -#, fuzzy +#: shuttle_control.cc:554 msgid "Stopped" -msgstr "Стоп" +msgstr "Остановлено" -#: splash.cc:45 +#: splash.cc:69 msgid "%1 loading ..." msgstr "Загружается %1..." @@ -10361,9 +10413,8 @@ msgid "Azimuth:" msgstr "Азимут:" #: startup.cc:68 -#, fuzzy msgid "Create a new session" -msgstr "Открыть новый сеанс" +msgstr "Начать новый сеанс" #: startup.cc:69 msgid "Open an existing session" @@ -10386,7 +10437,7 @@ msgstr "Дать %1 воспроизводить материал при его msgid "I'd like more options for this session" msgstr "Указать дополнительные параметры для этого сеанса" -#: startup.cc:182 +#: startup.cc:172 #, fuzzy msgid "" "Welcome to this BETA release of Ardour 3.0\n" @@ -10438,16 +10489,15 @@ msgstr "" "\n" " http://ardour.org/support\n" -#: startup.cc:208 -#, fuzzy +#: startup.cc:198 msgid "This is a BETA RELEASE" -msgstr "Это АЛЬФА-версия программы" +msgstr "Это БЕТА-версия программы" -#: startup.cc:325 +#: startup.cc:315 msgid "Audio / MIDI Setup" msgstr "Параметры звука и MIDI" -#: startup.cc:337 +#: startup.cc:327 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 " @@ -10464,15 +10514,15 @@ msgstr "" "\n" "Перед началом работы с программой необходимо кое-что настроить." -#: startup.cc:363 +#: startup.cc:353 msgid "Welcome to %1" msgstr "Приветствуем вас в %1" -#: startup.cc:386 +#: startup.cc:376 msgid "Default folder for %1 sessions" msgstr "Папка для сеансов %1 по умолчанию" -#: startup.cc:392 +#: startup.cc:382 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" @@ -10490,11 +10540,11 @@ msgstr "" "(Сохранять сеансы можно будет где угодно, просто указанная\n" "папка будет использоваться по умолчанию)" -#: startup.cc:414 +#: startup.cc:404 msgid "Default folder for new sessions" msgstr "Папка для новых сеансов по умолчанию" -#: startup.cc:434 +#: startup.cc:424 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" @@ -10519,15 +10569,15 @@ msgstr "" "Если вы не понимаете смысл этого параметра, просто используйте \n" "предлагаемый по умолчанию вариант." -#: startup.cc:455 +#: startup.cc:445 msgid "Monitoring Choices" msgstr "Способ мониторинга" -#: startup.cc:478 +#: startup.cc:468 msgid "Use a Master bus directly" msgstr "Использовать мастер-шину напрямую" -#: startup.cc:480 +#: startup.cc:470 #, fuzzy msgid "" "Connect the Master bus directly to your hardware outputs. This is preferable " @@ -10536,11 +10586,11 @@ msgstr "" "Соединить мастер-шину напрямую с выходами звукового интерфейса.\n" "Предпочтительно для простого использования." -#: startup.cc:489 +#: startup.cc:479 msgid "Use an additional Monitor bus" msgstr "Использовать дополнительную шину мониторинга" -#: startup.cc:492 +#: startup.cc:482 msgid "" "Use a Monitor bus between Master bus and hardware outputs for \n" "greater control in monitoring without affecting the mix." @@ -10548,7 +10598,7 @@ msgstr "" "Использовать шину мониторинга между мастер-шиной и выходами \n" "звукового интерфейса для полного контроля без вмешательства в микс." -#: startup.cc:514 +#: startup.cc:504 #, fuzzy msgid "" "You can change this preference at any time via the Preferences dialog.\n" @@ -10562,52 +10612,52 @@ msgstr "" "Если вы не понимаете смысл этого параметра, просто используйте " "предлагаемое по умолчанию." -#: startup.cc:525 +#: startup.cc:515 #, fuzzy msgid "Monitor Section" msgstr "Контроль" -#: startup.cc:565 +#: startup.cc:555 msgid "What would you like to do ?" msgstr "Что вы хотите сделать?" -#: startup.cc:689 +#: startup.cc:684 msgid "Open" msgstr "Открыть" -#: startup.cc:742 +#: startup.cc:737 msgid "Session name:" msgstr "Название сеанса:" -#: startup.cc:765 +#: startup.cc:760 msgid "Create session folder in:" msgstr "Создать папку сеанса в:" -#: startup.cc:779 +#: startup.cc:774 msgid "Select folder for session" msgstr "Выберите папку для сеанса" -#: startup.cc:811 +#: startup.cc:806 msgid "Use this template" msgstr "Использовать этот шаблон" -#: startup.cc:814 +#: startup.cc:809 msgid "no template" msgstr "Без шаблона" -#: startup.cc:842 +#: startup.cc:837 msgid "Use an existing session as a template:" msgstr "Использовать существующий сеанс как шаблон:" -#: startup.cc:854 +#: startup.cc:849 msgid "Select template" msgstr "Выберите шаблон" -#: startup.cc:880 +#: startup.cc:875 msgid "New Session" msgstr "Создать сеанс" -#: startup.cc:1037 +#: startup.cc:1032 msgid "Select session file" msgstr "Выберите файл сеанса" @@ -10663,423 +10713,429 @@ msgstr "... к физическим выходам" msgid "Advanced Session Options" msgstr "Дополнительные параметры сеанса" -#: step_entry.cc:60 +#: step_entry.cc:59 msgid "Step Entry: %1" msgstr "Пошаговый ввод: %1" -#: step_entry.cc:65 +#: step_entry.cc:64 msgid ">beat" msgstr ">доля" -#: step_entry.cc:66 +#: step_entry.cc:65 msgid ">bar" msgstr ">такт" -#: step_entry.cc:67 +#: step_entry.cc:66 msgid ">EP" msgstr ">ТР" -#: step_entry.cc:68 -#, fuzzy +#: step_entry.cc:67 msgid "sustain" -msgstr "Индикаторы" +msgstr "" -#: step_entry.cc:69 +#: step_entry.cc:68 msgid "rest" msgstr "пауза" -#: step_entry.cc:70 -#, fuzzy +#: step_entry.cc:69 msgid "g-rest" -msgstr "Огромная" +msgstr "" -#: step_entry.cc:71 +#: step_entry.cc:70 msgid "back" msgstr "назад" -#: step_entry.cc:82 step_entry.cc:85 +#: step_entry.cc:81 step_entry.cc:84 msgid "+" msgstr "+" -#: step_entry.cc:191 +#: step_entry.cc:190 msgid "Set note length to a whole note" msgstr "Поменять длительность ноты на целую" -#: step_entry.cc:192 +#: step_entry.cc:191 msgid "Set note length to a half note" msgstr "Поменять длительность ноты на 1/2" -#: step_entry.cc:193 +#: step_entry.cc:192 msgid "Set note length to a quarter note" msgstr "Поменять длительность ноты на 1/4" -#: step_entry.cc:194 +#: step_entry.cc:193 msgid "Set note length to a eighth note" msgstr "Поменять длительность ноты на 1/8" -#: step_entry.cc:195 +#: step_entry.cc:194 msgid "Set note length to a sixteenth note" msgstr "Поменять длительность ноты на 1/16" -#: step_entry.cc:196 +#: step_entry.cc:195 msgid "Set note length to a thirty-second note" msgstr "Поменять длительность ноты на 1/32" -#: step_entry.cc:197 +#: step_entry.cc:196 msgid "Set note length to a sixty-fourth note" msgstr "Поменять длительность ноты на 1/64" -#: step_entry.cc:276 +#: step_entry.cc:275 msgid "Set volume (velocity) to pianississimo" msgstr "Поменять громкость (силу нажатия) на пиано-пианиссимо" -#: step_entry.cc:277 +#: step_entry.cc:276 msgid "Set volume (velocity) to pianissimo" msgstr "Поменять громкость (силу нажатия) на пианиссимо" -#: step_entry.cc:278 +#: step_entry.cc:277 msgid "Set volume (velocity) to piano" msgstr "Поменять громкость (силу нажатия) на пиано" -#: step_entry.cc:279 +#: step_entry.cc:278 msgid "Set volume (velocity) to mezzo-piano" msgstr "Поменять громкость (силу нажатия) на меццо-пиано" -#: step_entry.cc:280 +#: step_entry.cc:279 msgid "Set volume (velocity) to mezzo-forte" msgstr "Поменять громкость (силу нажатия) на меццо-форте" -#: step_entry.cc:281 +#: step_entry.cc:280 msgid "Set volume (velocity) to forte" msgstr "Поменять громкость (силу нажатия) на форте" -#: step_entry.cc:282 +#: step_entry.cc:281 msgid "Set volume (velocity) to forteissimo" msgstr "Поменять громкость (силу нажатия) на фортиссимо" -#: step_entry.cc:283 +#: step_entry.cc:282 msgid "Set volume (velocity) to forteississimo" msgstr "Поменять громкость (силу нажатия) на форте-фортиссимо" -#: step_entry.cc:331 +#: step_entry.cc:330 msgid "Stack inserted notes to form a chord" msgstr "Режим ввода аккордов" -#: step_entry.cc:332 +#: step_entry.cc:331 msgid "Extend selected notes by note length" -msgstr "" +msgstr "Увеличить на это значение длительность выбранных нот" + +#: step_entry.cc:332 +msgid "Use undotted note lengths" +msgstr "Использовать неувеличенные длительности" #: step_entry.cc:333 -#, fuzzy -msgid "Use undotted note lengths" -msgstr "установка длины фейда затухания" +msgid "Use dotted (* 1.5) note lengths" +msgstr "Использовать длительность с точкой (* 1,5)" #: step_entry.cc:334 -#, fuzzy -msgid "Use dotted (* 1.5) note lengths" -msgstr "установка длины фейда затухания" +msgid "Use double-dotted (* 1.75) note lengths" +msgstr "Использовать длительность с двумя точками (* 1,75)" #: step_entry.cc:335 -msgid "Use double-dotted (* 1.75) note lengths" -msgstr "" +msgid "Use triple-dotted (* 1.875) note lengths" +msgstr "Использовать длительность с тремя точками (* 1,875)" #: step_entry.cc:336 -msgid "Use triple-dotted (* 1.875) note lengths" -msgstr "" +msgid "Insert a note-length's rest" +msgstr "Вставить паузу длиной в ноту" #: step_entry.cc:337 -#, fuzzy -msgid "Insert a note-length's rest" -msgstr "установка длины фейда затухания" +msgid "Insert a grid-unit's rest" +msgstr "Вставить паузу длиной в единицу сетки" #: step_entry.cc:338 -msgid "Insert a grid-unit's rest" -msgstr "" +msgid "Insert a rest until the next beat" +msgstr "Вставить паузу до следующей доли" #: step_entry.cc:339 -msgid "Insert a rest until the next beat" -msgstr "" +msgid "Insert a rest until the next bar" +msgstr "Вставить паузу до следующего такта" #: step_entry.cc:340 -msgid "Insert a rest until the next bar" -msgstr "" +msgid "Insert a bank change message" +msgstr "Вставить смену банка" #: step_entry.cc:341 -msgid "Insert a bank change message" -msgstr "" - -#: step_entry.cc:342 -#, fuzzy msgid "Insert a program change message" -msgstr "Смена программы при запуске" +msgstr "Вставить смену программы" -#: step_entry.cc:343 step_entry.cc:700 +#: step_entry.cc:342 step_entry.cc:699 msgid "Move Insert Position Back by Note Length" msgstr "Переместить позицию ввода назад на длительность ноты" -#: step_entry.cc:344 step_entry.cc:698 +#: step_entry.cc:343 step_entry.cc:697 msgid "Move Insert Position to Edit Point" msgstr "Переместить позицию ввода к точке редактирования" -#: step_entry.cc:401 +#: step_entry.cc:400 msgid "1/Note" msgstr "1/Нота" -#: step_entry.cc:415 +#: step_entry.cc:414 msgid "Octave" msgstr "Октава" -#: step_entry.cc:598 +#: step_entry.cc:597 msgid "Insert Note A" msgstr "Вставить ноту ля" -#: step_entry.cc:599 +#: step_entry.cc:598 msgid "Insert Note A-sharp" msgstr "Вставить ноту ля-диез" -#: step_entry.cc:600 +#: step_entry.cc:599 msgid "Insert Note B" msgstr "Вставить ноту си" -#: step_entry.cc:601 +#: step_entry.cc:600 msgid "Insert Note C" msgstr "Вставить ноту до" -#: step_entry.cc:602 +#: step_entry.cc:601 msgid "Insert Note C-sharp" msgstr "Вставить ноту до-диез" -#: step_entry.cc:603 +#: step_entry.cc:602 msgid "Insert Note D" msgstr "Вставить ноту ре" -#: step_entry.cc:604 +#: step_entry.cc:603 msgid "Insert Note D-sharp" msgstr "Вставить ноту ре-диез" -#: step_entry.cc:605 +#: step_entry.cc:604 msgid "Insert Note E" msgstr "Вставить ноту ми" -#: step_entry.cc:606 +#: step_entry.cc:605 msgid "Insert Note F" msgstr "Вставить ноту фа" -#: step_entry.cc:607 +#: step_entry.cc:606 msgid "Insert Note F-sharp" msgstr "Вставить ноту фа-диез" -#: step_entry.cc:608 +#: step_entry.cc:607 msgid "Insert Note G" msgstr "Вставить ноту соль" -#: step_entry.cc:609 +#: step_entry.cc:608 msgid "Insert Note G-sharp" msgstr "Вставить ноту соль-диез" -#: step_entry.cc:611 +#: step_entry.cc:610 msgid "Insert a Note-length Rest" -msgstr "" +msgstr "Вставить паузу длиной в ноту" -#: step_entry.cc:612 +#: step_entry.cc:611 msgid "Insert a Snap-length Rest" msgstr "" -#: step_entry.cc:614 step_entry.cc:615 +#: step_entry.cc:613 step_entry.cc:614 msgid "Move to next octave" msgstr "Перейти к следующей октаве" -#: step_entry.cc:617 +#: step_entry.cc:616 #, fuzzy msgid "Move to Next Note Length" msgstr "Установить длину фейда затухания" -#: step_entry.cc:618 +#: step_entry.cc:617 #, fuzzy msgid "Move to Previous Note Length" msgstr "К концу предыдущей области" -#: step_entry.cc:620 +#: step_entry.cc:619 msgid "Increase Note Length" msgstr "Увеличить длительность ноты" -#: step_entry.cc:621 +#: step_entry.cc:620 msgid "Decrease Note Length" msgstr "Уменьшить длительность ноты" -#: step_entry.cc:623 +#: step_entry.cc:622 msgid "Move to Next Note Velocity" msgstr "" -#: step_entry.cc:624 +#: step_entry.cc:623 msgid "Move to Previous Note Velocity" msgstr "" -#: step_entry.cc:626 +#: step_entry.cc:625 msgid "Increase Note Velocity" msgstr "Увеличить силу нажатия для ноты" -#: step_entry.cc:627 +#: step_entry.cc:626 msgid "Decrease Note Velocity" msgstr "Уменьшить силу нажатия для ноты" -#: step_entry.cc:629 +#: step_entry.cc:628 msgid "Switch to the 1st octave" msgstr "Переключиться на 1-ю октаву" -#: step_entry.cc:630 +#: step_entry.cc:629 msgid "Switch to the 2nd octave" msgstr "Переключиться на 2-ю октаву" -#: step_entry.cc:631 +#: step_entry.cc:630 msgid "Switch to the 3rd octave" msgstr "Переключиться на 3-ю октаву" -#: step_entry.cc:632 +#: step_entry.cc:631 msgid "Switch to the 4th octave" msgstr "Переключиться на 4-ю октаву" -#: step_entry.cc:633 +#: step_entry.cc:632 msgid "Switch to the 5th octave" msgstr "Переключиться на 5-ю октаву" -#: step_entry.cc:634 +#: step_entry.cc:633 msgid "Switch to the 6th octave" msgstr "Переключиться на 6-ю октаву" -#: step_entry.cc:635 +#: step_entry.cc:634 msgid "Switch to the 7th octave" msgstr "Переключиться на 7-ю октаву" -#: step_entry.cc:636 +#: step_entry.cc:635 msgid "Switch to the 8th octave" msgstr "Переключиться на 8-ю октаву" -#: step_entry.cc:637 +#: step_entry.cc:636 msgid "Switch to the 9th octave" msgstr "Переключиться на 9-ю октаву" -#: step_entry.cc:638 +#: step_entry.cc:637 msgid "Switch to the 10th octave" msgstr "Переключиться на 10-ю октаву" -#: step_entry.cc:639 +#: step_entry.cc:638 msgid "Switch to the 11th octave" msgstr "Переключиться на 11-ю октаву" -#: step_entry.cc:644 +#: step_entry.cc:643 msgid "Set Note Length to Whole" msgstr "Установить длину ноты равной целой ноте" -#: step_entry.cc:646 +#: step_entry.cc:645 msgid "Set Note Length to 1/2" msgstr "Установить длину ноты равной 1/2" -#: step_entry.cc:648 +#: step_entry.cc:647 msgid "Set Note Length to 1/3" msgstr "Установить длину ноты равной 1/3" -#: step_entry.cc:650 +#: step_entry.cc:649 msgid "Set Note Length to 1/4" msgstr "Установить длину ноты равной 1/4" -#: step_entry.cc:652 +#: step_entry.cc:651 msgid "Set Note Length to 1/8" msgstr "Установить длину ноты равной 1/8" -#: step_entry.cc:654 +#: step_entry.cc:653 msgid "Set Note Length to 1/16" msgstr "Установить длину ноты равной 1/16" -#: step_entry.cc:656 +#: step_entry.cc:655 msgid "Set Note Length to 1/32" msgstr "Установить длину ноты равной 1/32" -#: step_entry.cc:658 +#: step_entry.cc:657 msgid "Set Note Length to 1/64" msgstr "Установить длину ноты равной 1/64" -#: step_entry.cc:663 +#: step_entry.cc:662 msgid "Set Note Velocity to Pianississimo" msgstr "" -#: step_entry.cc:665 +#: step_entry.cc:664 msgid "Set Note Velocity to Pianissimo" msgstr "" -#: step_entry.cc:667 +#: step_entry.cc:666 msgid "Set Note Velocity to Piano" msgstr "" -#: step_entry.cc:669 +#: step_entry.cc:668 msgid "Set Note Velocity to Mezzo-Piano" msgstr "" -#: step_entry.cc:671 +#: step_entry.cc:670 msgid "Set Note Velocity to Mezzo-Forte" msgstr "" -#: step_entry.cc:673 +#: step_entry.cc:672 msgid "Set Note Velocity to Forte" msgstr "" -#: step_entry.cc:675 step_entry.cc:677 +#: step_entry.cc:674 step_entry.cc:676 msgid "Set Note Velocity to Fortississimo" msgstr "" -#: step_entry.cc:679 +#: step_entry.cc:678 msgid "Toggle Triple Notes" msgstr "" -#: step_entry.cc:684 +#: step_entry.cc:683 msgid "No Dotted Notes" msgstr "" -#: step_entry.cc:686 +#: step_entry.cc:685 msgid "Toggled Dotted Notes" msgstr "" -#: step_entry.cc:688 +#: step_entry.cc:687 msgid "Toggled Double-Dotted Notes" msgstr "" -#: step_entry.cc:690 +#: step_entry.cc:689 msgid "Toggled Triple-Dotted Notes" msgstr "" -#: step_entry.cc:693 +#: step_entry.cc:692 msgid "Toggle Chord Entry" msgstr "Переключить ввод аккордов" -#: step_entry.cc:695 +#: step_entry.cc:694 msgid "Sustain Selected Notes by Note Length" msgstr "" -#: strip_silence_dialog.cc:50 +#: stereo_panner_editor.cc:35 +msgid "Stereo Panner" +msgstr "Стереопанорама" + +#: stereo_panner_editor.cc:49 +msgid "Width" +msgstr "Ширина" + +#: strip_silence_dialog.cc:48 msgid "Strip Silence" msgstr "Вырезать тишину" -#: strip_silence_dialog.cc:81 +#: strip_silence_dialog.cc:79 msgid "Minimum length" msgstr "Минимальная длина" -#: strip_silence_dialog.cc:89 +#: strip_silence_dialog.cc:87 msgid "Fade length" msgstr "Длина фейда" #: tempo_dialog.cc:43 tempo_dialog.cc:58 msgid "bar:" -msgstr "В такте:" +msgstr "в такте:" #: tempo_dialog.cc:44 tempo_dialog.cc:59 msgid "beat:" -msgstr "В доле:" +msgstr "в доле:" #: tempo_dialog.cc:45 tempo_dialog.cc:60 #, fuzzy msgid "Pulse note" msgstr "удаление ноты" +#: tempo_dialog.cc:55 +msgid "Edit Tempo" +msgstr "Изменить темп" + #: tempo_dialog.cc:76 tempo_dialog.cc:77 tempo_dialog.cc:282 #: tempo_dialog.cc:283 msgid "whole" @@ -11131,13 +11187,17 @@ msgstr "Долей в минуту:" #: tempo_dialog.cc:152 msgid "Tempo begins at" -msgstr "Темп меняется с доли" +msgstr "Темп начинается" #: tempo_dialog.cc:240 #, fuzzy msgid "incomprehensible pulse note type (%1)" msgstr "некорректное определение ноты (%1)" +#: tempo_dialog.cc:266 +msgid "Edit Meter" +msgstr "Изменить размер" + #: tempo_dialog.cc:314 msgid "Note value:" msgstr "Значение ноты: " @@ -11148,38 +11208,42 @@ msgstr "Долей на такт:" #: tempo_dialog.cc:330 msgid "Meter begins at bar:" -msgstr "Счётчик начинается в такте:" +msgstr "Размер начинается в такте:" #: tempo_dialog.cc:441 #, fuzzy msgid "incomprehensible meter note type (%1)" msgstr "некорректное определение ноты (%1)" -#: theme_manager.cc:57 +#: theme_manager.cc:56 msgid "Dark Theme" msgstr "Тёмная тема" -#: theme_manager.cc:58 +#: theme_manager.cc:57 msgid "Light Theme" msgstr "Светлая тема" -#: theme_manager.cc:59 +#: theme_manager.cc:58 msgid "Restore Defaults" msgstr "Восстановить исходные значения" -#: theme_manager.cc:60 +#: theme_manager.cc:59 msgid "Draw \"flat\" buttons" msgstr "Рисовать кнопки плоскими" +#: theme_manager.cc:60 +msgid "Draw waveforms with color gradient" +msgstr "Рисовать форму волны с градиентом" + #: theme_manager.cc:66 msgid "Object" msgstr "Объект" -#: theme_manager.cc:210 +#: theme_manager.cc:212 msgid "Unable to find UI style file %1 in search path %2. %3 will look strange" msgstr "" -#: time_axis_view.cc:126 +#: time_axis_view.cc:121 msgid "gTortnam" msgstr "" @@ -11187,66 +11251,66 @@ msgstr "" msgid "new duration %1 frames is out of bounds for %2" msgstr "" -#: time_fx_dialog.cc:71 +#: time_fx_dialog.cc:62 msgid "Quick but Ugly" msgstr "Быстро и грубо" -#: time_fx_dialog.cc:72 +#: time_fx_dialog.cc:63 msgid "Skip Anti-aliasing" msgstr "Без фильтрации" -#: time_fx_dialog.cc:73 +#: time_fx_dialog.cc:64 msgid "Contents:" msgstr "Содержит:" -#: time_fx_dialog.cc:74 +#: time_fx_dialog.cc:65 msgid "Minimize time distortion" msgstr "" -#: time_fx_dialog.cc:75 +#: time_fx_dialog.cc:66 msgid "Preserve Formants" msgstr "Сохранить форманты" -#: time_fx_dialog.cc:81 +#: time_fx_dialog.cc:72 msgid "TimeFXDialog" msgstr "TimeStretchDialog" -#: time_fx_dialog.cc:84 +#: time_fx_dialog.cc:75 #, fuzzy msgid "Pitch Shift Audio" msgstr "Смена высоты тона" -#: time_fx_dialog.cc:86 +#: time_fx_dialog.cc:77 #, fuzzy msgid "Time Stretch Audio" msgstr "Растягивание во времени" -#: time_fx_dialog.cc:114 transpose_dialog.cc:41 +#: time_fx_dialog.cc:105 transpose_dialog.cc:41 msgid "Octaves:" msgstr "Октавы:" -#: time_fx_dialog.cc:119 transpose_dialog.cc:46 +#: time_fx_dialog.cc:110 transpose_dialog.cc:46 msgid "Semitones:" msgstr "Полутона:" -#: time_fx_dialog.cc:124 +#: time_fx_dialog.cc:115 msgid "Cents:" msgstr "Сотые:" -#: time_fx_dialog.cc:132 +#: time_fx_dialog.cc:123 #, fuzzy msgid "Time|Shift" msgstr "Изменить" -#: time_fx_dialog.cc:156 time_fx_dialog.cc:159 +#: time_fx_dialog.cc:147 time_fx_dialog.cc:150 msgid "TimeFXButton" msgstr "TimeFXButton" -#: time_fx_dialog.cc:164 +#: time_fx_dialog.cc:155 msgid "Stretch/Shrink" msgstr "Растянуть/Сжать" -#: time_fx_dialog.cc:174 +#: time_fx_dialog.cc:165 msgid "Progress" msgstr "Прогресс" @@ -11263,67 +11327,92 @@ msgid "programming error: request for non-existent audio range (%1)!" msgstr "ошибка в программе: request for non-existent audio range (%1)!" #: transpose_dialog.cc:30 -#, fuzzy msgid "Transpose MIDI" -msgstr "Транспонировать" +msgstr "Транспонировать MIDI" #: transpose_dialog.cc:55 msgid "Transpose" msgstr "Транспонировать" -#: ui_config.cc:84 ui_config.cc:115 +#: ui_config.cc:82 ui_config.cc:113 msgid "Loading default ui configuration file %1" -msgstr "Загружается основной файл конфигурации интерфейса \"%1\"" +msgstr "Loading default ui configuration file %1" -#: ui_config.cc:87 ui_config.cc:118 +#: ui_config.cc:85 ui_config.cc:116 msgid "cannot read default ui configuration file \"%1\"" msgstr "Невозможно прочитать основной файл конфигурации интерфейса \"%1\"" -#: ui_config.cc:92 ui_config.cc:123 +#: ui_config.cc:90 ui_config.cc:121 msgid "default ui configuration file \"%1\" not loaded successfully." msgstr "Основной файл конфигурации интерфейса \"%1\" не был успешно загружен" -#: ui_config.cc:136 +#: ui_config.cc:134 msgid "Loading user ui configuration file %1" -msgstr "Загружается пользовательский файл конфигурации интерфейса \"%1\"" +msgstr "Loading user ui configuration file %1" -#: ui_config.cc:139 +#: ui_config.cc:137 msgid "cannot read ui configuration file \"%1\"" -msgstr "Невозможно прочитать файл конфигурации интерфейса \"%1\"" +msgstr "cannot read ui configuration file \"%1\"" -#: ui_config.cc:144 +#: ui_config.cc:142 msgid "user ui configuration file \"%1\" not loaded successfully." -msgstr "" -"Пользовательский файл конфигурации интерфейса \"%1\" не был успешно загружен" +msgstr "user ui configuration file \"%1\" not loaded successfully." -#: ui_config.cc:152 +#: ui_config.cc:150 msgid "could not find any ui configuration file, canvas will look broken." -msgstr "" +msgstr "could not find any ui configuration file, canvas will look broken." -#: ui_config.cc:181 +#: ui_config.cc:169 msgid "Config file %1 not saved" -msgstr "Конфигурационный файл %1 не сохранён" +msgstr "Config file %1 not saved" #: utils.cc:108 utils.cc:151 msgid "bad XPM header %1" -msgstr "ошибка в XPM заголовке %1" +msgstr "bad XPM header %1" #: utils.cc:290 msgid "missing RGBA style for \"%1\"" -msgstr "отсутствует стиль RGBA для \"%1\"" +msgstr "missing RGBA style for \"%1\"" #: utils.cc:504 msgid "cannot find XPM file for %1" -msgstr "Не удалось найти файл XPM для %1" +msgstr "cannot find XPM file for %1" #: utils.cc:530 -#, fuzzy msgid "cannot find icon image for %1 using %2" -msgstr "Не удалось найти файл значка для %1" +msgstr "cannot find icon image for %1 using %2" -#: verbose_cursor.cc:44 +#: verbose_cursor.cc:45 msgid "VerboseCanvasCursor" -msgstr "" +msgstr "VerboseCanvasCursor" + +#~ msgid "Toolbars when Maximised" +#~ msgstr "Видимость панелей в развёрнутом окне" + +#~ msgid "editor" +#~ msgstr "редактор" + +#~ msgid "Realtime Priority" +#~ msgstr "Приоритет реального времени" + +#~ msgid "Advanced options" +#~ msgstr "Расширенные параметры" + +#~ msgid "MIDI Thru" +#~ msgstr "MIDI Thru" + +#~ msgid "signal" +#~ msgstr "сигнал" + +#, fuzzy +#~ msgid "Could not create user configuration directory" +#~ msgstr "Ardour: не удалось прочитать файл конфигурации интерфейса \"%1\"" + +#~ msgid "close" +#~ msgstr "Закрыть" + +#~ msgid "Secondary clock delta to edit cursor" +#~ msgstr "Дополнительный счётчик показывается разницу с курсором редактора" #~ msgid "Nudge Entire Track Backward" #~ msgstr "Толкнуть всю дорожку назад" @@ -11926,9 +12015,6 @@ msgstr "" #~ msgid "ardour: cleanup" #~ msgstr "ardour: очистка" -#~ msgid "Preset Exists" -#~ msgstr "Профиль существует" - #~ msgid "" #~ "A preset with this name already exists for this plugin.\n" #~ "\n" @@ -12159,9 +12245,6 @@ msgstr "" #~ msgid "y" #~ msgstr "y" -#~ msgid "width" -#~ msgstr "Ширина" - #~ msgid "the width" #~ msgstr "Ширина" @@ -12483,9 +12566,6 @@ msgstr "" #~ msgid "Set Selected Tracks to Linear Waveforms" #~ msgstr "Линейная форма сигнала для выбранных дорожек" -#~ msgid "Set Selected Tracks to Logarithmic Waveforms" -#~ msgstr "Логарифмическая форма сигнала для выбранных дорожек" - #~ msgid "80 per frame" #~ msgstr "80 на выборку" diff --git a/gtk2_ardour/processor_box.cc b/gtk2_ardour/processor_box.cc index 68ca80ff05..2cb561172e 100644 --- a/gtk2_ardour/processor_box.cc +++ b/gtk2_ardour/processor_box.cc @@ -1236,7 +1236,7 @@ ProcessorBox::choose_send () /* XXX need processor lock on route */ try { - Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock()); + Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock()); send->output()->ensure_io (outs, false, this); } catch (AudioEngine::PortRegistrationFailure& err) { error << string_compose (_("Cannot set up new send: %1"), err.what()) << endmsg; diff --git a/gtk2_ardour/route_params_ui.cc b/gtk2_ardour/route_params_ui.cc index ca673954d4..5f06555f28 100644 --- a/gtk2_ardour/route_params_ui.cc +++ b/gtk2_ardour/route_params_ui.cc @@ -20,7 +20,7 @@ #include #include -#include +#include #include #include diff --git a/gtk2_ardour/startup.cc b/gtk2_ardour/startup.cc index dbdaa2a5f0..7f7dbe8f32 100644 --- a/gtk2_ardour/startup.cc +++ b/gtk2_ardour/startup.cc @@ -95,7 +95,6 @@ Ardour will play NO role in monitoring")) use_session_as_template_button.set_group (session_template_group); set_keep_above (true); - set_resizable (false); set_position (WIN_POS_CENTER); set_border_width (12); diff --git a/gtk2_ardour/strip_silence_dialog.cc b/gtk2_ardour/strip_silence_dialog.cc index 32e7bc6054..2fb4b5923f 100644 --- a/gtk2_ardour/strip_silence_dialog.cc +++ b/gtk2_ardour/strip_silence_dialog.cc @@ -187,7 +187,7 @@ void StripSilenceDialog::update_silence_rects () { /* Lock so that we don't contend with the detection thread for access to the silence regions */ - Glib::Mutex::Lock lm (_lock); + Glib::Threads::Mutex::Lock lm (_lock); double const y = _threshold.get_value(); for (list::iterator v = views.begin(); v != views.end(); ++v) { diff --git a/gtk2_ardour/strip_silence_dialog.h b/gtk2_ardour/strip_silence_dialog.h index 18313941c1..5ba88812d7 100644 --- a/gtk2_ardour/strip_silence_dialog.h +++ b/gtk2_ardour/strip_silence_dialog.h @@ -18,7 +18,7 @@ */ #include -#include +#include #include "ardour/types.h" #include "ardour_dialog.h" @@ -84,8 +84,8 @@ private: pthread_t _thread; ///< thread to compute silence in the background static void * _detection_thread_work (void *); void * detection_thread_work (); - Glib::Mutex _lock; ///< lock held while the thread is doing work - Glib::Cond _run_cond; ///< condition to wake the thread + Glib::Threads::Mutex _lock; ///< lock held while the thread is doing work + Glib::Threads::Cond _run_cond; ///< condition to wake the thread bool _thread_should_finish; ///< true if the thread should terminate PBD::Signal0 Completed; ///< emitted when a silence detection has completed PBD::ScopedConnection _completed_connection; diff --git a/gtk2_ardour/tempo_dialog.cc b/gtk2_ardour/tempo_dialog.cc index 3557727394..b601734bee 100644 --- a/gtk2_ardour/tempo_dialog.cc +++ b/gtk2_ardour/tempo_dialog.cc @@ -52,7 +52,7 @@ TempoDialog::TempoDialog (TempoMap& map, framepos_t frame, const string&) } TempoDialog::TempoDialog (TempoSection& section, const string&) - : ArdourDialog ("Edit Tempo") + : ArdourDialog (_("Edit Tempo")) , bpm_adjustment (60.0, 1.0, 999.9, 0.1, 1.0) , bpm_spinner (bpm_adjustment) , when_bar_label (_("bar:"), ALIGN_LEFT, ALIGN_CENTER) @@ -252,7 +252,7 @@ TempoDialog::pulse_change () MeterDialog::MeterDialog (TempoMap& map, framepos_t frame, const string&) - : ArdourDialog ("New Meter") + : ArdourDialog (_("New Meter")) { Timecode::BBT_Time when; frame = map.round_to_bar(frame,0); @@ -263,7 +263,7 @@ MeterDialog::MeterDialog (TempoMap& map, framepos_t frame, const string&) } MeterDialog::MeterDialog (MeterSection& section, const string&) - : ArdourDialog ("Edit Meter") + : ArdourDialog (_("Edit Meter")) { init (section.start(), section.divisions_per_bar(), section.note_divisor(), section.movable()); } diff --git a/gtk2_ardour/utils.cc b/gtk2_ardour/utils.cc index 905ecd78f9..62144ffd69 100644 --- a/gtk2_ardour/utils.cc +++ b/gtk2_ardour/utils.cc @@ -344,11 +344,16 @@ key_press_focus_accelerator_handler (Gtk::Window& window, GdkEventKey* ev) } #ifdef GTKOSX - /* should this be universally true? */ + /* at one time this appeared to be necessary. As of July 2012, it does not + appear to be. if it ever is necessar, figure out if it should apply + to all platforms. + */ +#if 0 if (Keyboard::some_magic_widget_has_focus ()) { - allow_activating = false; + allow_activating = false; } #endif +#endif DEBUG_TRACE (DEBUG::Accelerators, string_compose ("Win = %1 focus = %7 Key event: code = %2 state = %3 special handling ? %4 magic widget focus ? %5 allow_activation ? %6\n", @@ -456,7 +461,9 @@ key_press_focus_accelerator_handler (Gtk::Window& window, GdkEventKey* ev) DEBUG_TRACE (DEBUG::Accelerators, "\tactivate, then propagate\n"); if (allow_activating) { + DEBUG_TRACE (DEBUG::Accelerators, "\tsending to window\n"); if (gtk_window_activate_key (win, ev)) { + DEBUG_TRACE (DEBUG::Accelerators, "\t\thandled\n"); return true; } } else { diff --git a/libs/ardour/amp.cc b/libs/ardour/amp.cc index 27b29d87e4..d68f73ef3e 100644 --- a/libs/ardour/amp.cc +++ b/libs/ardour/amp.cc @@ -383,7 +383,7 @@ Amp::set_gain (gain_t val, void *src) return; } - _gain_control->set_double(val, false); + _gain_control->set_double (val); _session.set_dirty(); } @@ -449,7 +449,7 @@ Amp::GainControl::internal_to_user (double v) const void Amp::setup_gain_automation (framepos_t start_frame, framepos_t end_frame, framecnt_t nframes) { - Glib::Mutex::Lock am (control_lock(), Glib::TRY_LOCK); + Glib::Threads::Mutex::Lock am (control_lock(), Glib::Threads::TRY_LOCK); if (am.locked() && _session.transport_rolling() && _gain_control->automation_playback()) { assert (_gain_automation_buffer); diff --git a/libs/ardour/analyser.cc b/libs/ardour/analyser.cc index 730ea4169a..bf98ecc20a 100644 --- a/libs/ardour/analyser.cc +++ b/libs/ardour/analyser.cc @@ -27,8 +27,8 @@ using namespace ARDOUR; using namespace PBD; Analyser* Analyser::the_analyser = 0; -Glib::StaticMutex Analyser::analysis_queue_lock = GLIBMM_STATIC_MUTEX_INIT; -Glib::Cond* Analyser::SourcesToAnalyse = 0; +Glib::Threads::Mutex Analyser::analysis_queue_lock; +Glib::Threads::Cond Analyser::SourcesToAnalyse; list > Analyser::analysis_queue; Analyser::Analyser () @@ -49,8 +49,7 @@ analyser_work () void Analyser::init () { - SourcesToAnalyse = new Glib::Cond(); - Glib::Thread::create (sigc::ptr_fun (analyser_work), false); + Glib::Threads::Thread::create (sigc::ptr_fun (analyser_work)); } void @@ -64,9 +63,9 @@ Analyser::queue_source_for_analysis (boost::shared_ptr src, bool force) return; } - Glib::Mutex::Lock lm (analysis_queue_lock); + Glib::Threads::Mutex::Lock lm (analysis_queue_lock); analysis_queue.push_back (boost::weak_ptr(src)); - SourcesToAnalyse->broadcast (); + SourcesToAnalyse.broadcast (); } void @@ -79,7 +78,7 @@ Analyser::work () wait: if (analysis_queue.empty()) { - SourcesToAnalyse->wait (analysis_queue_lock); + SourcesToAnalyse.wait (analysis_queue_lock); } if (analysis_queue.empty()) { diff --git a/libs/ardour/ardour/analyser.h b/libs/ardour/ardour/analyser.h index 15e4220ad6..aae16e443f 100644 --- a/libs/ardour/ardour/analyser.h +++ b/libs/ardour/ardour/analyser.h @@ -1,7 +1,7 @@ #ifndef __ardour_analyser_h__ #define __ardour_analyser_h__ -#include +#include #include namespace ARDOUR { @@ -22,8 +22,8 @@ class Analyser { private: static Analyser* the_analyser; - static Glib::StaticMutex analysis_queue_lock; - static Glib::Cond* SourcesToAnalyse; + static Glib::Threads::Mutex analysis_queue_lock; + static Glib::Threads::Cond SourcesToAnalyse; static std::list > analysis_queue; static void analyse_audio_file_source (boost::shared_ptr); diff --git a/libs/ardour/ardour/audioengine.h b/libs/ardour/ardour/audioengine.h index 73e40e8ab4..1c0d0f1a55 100644 --- a/libs/ardour/ardour/audioengine.h +++ b/libs/ardour/ardour/audioengine.h @@ -31,7 +31,7 @@ #include #include -#include +#include #include "pbd/rcu.h" #include "pbd/signals.h" @@ -85,7 +85,7 @@ public: int start (); bool running() const { return _running; } - Glib::Mutex& process_lock() { return _process_lock; } + Glib::Threads::Mutex& process_lock() { return _process_lock; } framecnt_t frame_rate () const; pframes_t frames_per_cycle () const; @@ -265,8 +265,8 @@ private: jack_client_t* volatile _jack; /* could be reset to null by SIGPIPE or another thread */ std::string jack_client_name; - Glib::Mutex _process_lock; - Glib::Cond session_removed; + Glib::Threads::Mutex _process_lock; + Glib::Threads::Cond session_removed; bool session_remove_pending; frameoffset_t session_removal_countdown; gain_t session_removal_gain; @@ -286,7 +286,7 @@ private: bool _pre_freewheel_mmc_enabled; int _usecs_per_cycle; bool port_remove_in_progress; - Glib::Thread* m_meter_thread; + Glib::Threads::Thread* m_meter_thread; ProcessThread* _main_thread; SerializedRCUManager ports; diff --git a/libs/ardour/ardour/audioregion.h b/libs/ardour/ardour/audioregion.h index e38c98ea05..4213dc1a6c 100644 --- a/libs/ardour/ardour/audioregion.h +++ b/libs/ardour/ardour/audioregion.h @@ -46,6 +46,10 @@ namespace Properties { extern PBD::PropertyDescriptor fade_in_active; extern PBD::PropertyDescriptor fade_out_active; extern PBD::PropertyDescriptor scale_amplitude; + extern PBD::PropertyDescriptor fade_out_is_xfade; + extern PBD::PropertyDescriptor fade_out_is_short; + extern PBD::PropertyDescriptor fade_in_is_xfade; + extern PBD::PropertyDescriptor fade_in_is_short; extern PBD::PropertyDescriptor > fade_in; extern PBD::PropertyDescriptor > inverse_fade_in; extern PBD::PropertyDescriptor > fade_out; diff --git a/libs/ardour/ardour/audiosource.h b/libs/ardour/ardour/audiosource.h index c6ec2a56ad..cbdcd296af 100644 --- a/libs/ardour/ardour/audiosource.h +++ b/libs/ardour/ardour/audiosource.h @@ -25,7 +25,7 @@ #include -#include +#include #include #include "ardour/source.h" @@ -118,7 +118,7 @@ class AudioSource : virtual public Source, static std::vector > _mixdown_buffers; static std::vector > _gain_buffers; - static Glib::StaticMutex _level_buffer_lock; + static Glib::Threads::Mutex _level_buffer_lock; static void ensure_buffers_for_level (uint32_t, framecnt_t); static void ensure_buffers_for_level_locked (uint32_t, framecnt_t); @@ -157,7 +157,7 @@ class AudioSource : virtual public Source, * PeaksReady means that _peaks_built cannot be changed * during the handling of the signal. */ - mutable Glib::Mutex _peaks_ready_lock; + mutable Glib::Threads::Mutex _peaks_ready_lock; PBD::FdFileDescriptor* _peakfile_descriptor; int _peakfile_fd; diff --git a/libs/ardour/ardour/auditioner.h b/libs/ardour/ardour/auditioner.h index 3650f0c92c..bdd04fcc66 100644 --- a/libs/ardour/ardour/auditioner.h +++ b/libs/ardour/ardour/auditioner.h @@ -22,7 +22,7 @@ #include -#include +#include #include "ardour/ardour.h" #include "ardour/audio_track.h" @@ -62,7 +62,7 @@ class Auditioner : public AudioTrack boost::shared_ptr the_region; framepos_t current_frame; mutable gint _auditioning; - Glib::Mutex lock; + Glib::Threads::Mutex lock; framecnt_t length; bool via_monitor; diff --git a/libs/ardour/ardour/auto_bundle.h b/libs/ardour/ardour/auto_bundle.h index b41a5d344f..d97080c089 100644 --- a/libs/ardour/ardour/auto_bundle.h +++ b/libs/ardour/ardour/auto_bundle.h @@ -21,7 +21,7 @@ #define __ardour_auto_bundle_h__ #include -#include +#include #include "ardour/bundle.h" namespace ARDOUR { diff --git a/libs/ardour/ardour/automatable.h b/libs/ardour/ardour/automatable.h index dc86c0cddd..6e0f7a97b5 100644 --- a/libs/ardour/ardour/automatable.h +++ b/libs/ardour/ardour/automatable.h @@ -45,7 +45,7 @@ public: Automatable(Session&); Automatable (const Automatable& other); - virtual ~Automatable() {} + virtual ~Automatable(); boost::shared_ptr control_factory(const Evoral::Parameter& id); @@ -59,7 +59,7 @@ public: virtual void add_control(boost::shared_ptr); void clear_controls (); - virtual void automation_snapshot (framepos_t now, bool force); + virtual void transport_located (framepos_t now); virtual void transport_stopped (framepos_t now); virtual std::string describe_parameter(Evoral::Parameter param); diff --git a/libs/ardour/ardour/automation_control.h b/libs/ardour/ardour/automation_control.h index 2c15a1b1b0..10194b3f9b 100644 --- a/libs/ardour/ardour/automation_control.h +++ b/libs/ardour/ardour/automation_control.h @@ -22,6 +22,8 @@ #define __ardour_automation_control_h__ #include +#include + #include "pbd/controllable.h" #include "evoral/Control.hpp" #include "ardour/automation_list.h" @@ -34,7 +36,7 @@ class Automatable; /** A PBD::Controllable with associated automation data (AutomationList) */ -class AutomationControl : public PBD::Controllable, public Evoral::Control +class AutomationControl : public PBD::Controllable, public Evoral::Control, public boost::enable_shared_from_this { public: AutomationControl(ARDOUR::Session&, @@ -42,37 +44,34 @@ public: boost::shared_ptr l=boost::shared_ptr(), const std::string& name=""); + ~AutomationControl (); + boost::shared_ptr alist() const { return boost::dynamic_pointer_cast(_list); } - void set_list(boost::shared_ptr); + void set_list (boost::shared_ptr); inline bool automation_playback() const { - return ((ARDOUR::AutomationList*)_list.get())->automation_playback(); + return alist()->automation_playback(); } inline bool automation_write() const { - return ((ARDOUR::AutomationList*)_list.get())->automation_write(); + return alist()->automation_write(); } inline AutoState automation_state() const { - return ((ARDOUR::AutomationList*)_list.get())->automation_state(); + return alist()->automation_state(); } - inline void set_automation_state(AutoState as) { - return ((ARDOUR::AutomationList*)_list.get())->set_automation_state(as); + inline AutoStyle automation_style() const { + return alist()->automation_style(); } - inline void start_touch(double when) { - set_touching (true); - return ((ARDOUR::AutomationList*)_list.get())->start_touch(when); - } - - inline void stop_touch(bool mark, double when) { - set_touching (false); - return ((ARDOUR::AutomationList*)_list.get())->stop_touch(mark, when); - } + void set_automation_state(AutoState as); + void set_automation_style(AutoStyle as); + void start_touch (double when); + void stop_touch (bool mark, double when); void set_value (double); double get_value () const; diff --git a/libs/ardour/ardour/automation_list.h b/libs/ardour/ardour/automation_list.h index 01c9d0641a..e7377d6b02 100644 --- a/libs/ardour/ardour/automation_list.h +++ b/libs/ardour/ardour/automation_list.h @@ -24,7 +24,7 @@ #include #include -#include +#include #include "pbd/undo.h" #include "pbd/xml++.h" diff --git a/libs/ardour/ardour/automation_watch.h b/libs/ardour/ardour/automation_watch.h new file mode 100644 index 0000000000..6fd5a0eb65 --- /dev/null +++ b/libs/ardour/ardour/automation_watch.h @@ -0,0 +1,61 @@ +/* + Copyright (C) 2012 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 + +#include "pbd/signals.h" + +#include "ardour/session_handle.h" + +namespace ARDOUR { + +class AutomationControl; + +class AutomationWatch : public sigc::trackable, public ARDOUR::SessionHandlePtr, public PBD::ScopedConnectionList { + public: + static AutomationWatch& instance(); + + void add_automation_watch (boost::shared_ptr); + void remove_automation_watch (boost::shared_ptr); + void set_session (ARDOUR::Session*); + + gint timer (); + + private: + typedef std::list > AutomationWatches; + + AutomationWatch (); + ~AutomationWatch(); + + static AutomationWatch* _instance; + Glib::Threads::Thread* _thread; + bool _run_thread; + AutomationWatches automation_watches; + Glib::Threads::Mutex automation_watch_lock; + PBD::ScopedConnection transport_connection; + + void transport_state_change (); + void remove_weak_automation_watch (boost::weak_ptr); + void thread (); +}; + +} diff --git a/libs/ardour/ardour/buffer_manager.h b/libs/ardour/ardour/buffer_manager.h index e3ac981e63..2a8e7be6da 100644 --- a/libs/ardour/ardour/buffer_manager.h +++ b/libs/ardour/ardour/buffer_manager.h @@ -7,7 +7,7 @@ #include "ardour/chan_count.h" #include -#include +#include namespace ARDOUR { @@ -24,7 +24,7 @@ public: static void ensure_buffers (ChanCount howmany = ChanCount::ZERO); private: - static Glib::StaticMutex rb_mutex; + static Glib::Threads::Mutex rb_mutex; typedef PBD::RingBufferNPT ThreadBufferFIFO; typedef std::list ThreadBufferList; diff --git a/libs/ardour/ardour/bundle.h b/libs/ardour/ardour/bundle.h index e84349c647..02845481b6 100644 --- a/libs/ardour/ardour/bundle.h +++ b/libs/ardour/ardour/bundle.h @@ -22,7 +22,7 @@ #include #include -#include +#include #include #include "pbd/signals.h" @@ -134,7 +134,7 @@ class Bundle : public PBD::ScopedConnectionList /// mutex for _channel_ports and _channel_names /// XXX: is this necessary? - mutable Glib::Mutex _channel_mutex; + mutable Glib::Threads::Mutex _channel_mutex; std::vector _channel; private: diff --git a/libs/ardour/ardour/butler.h b/libs/ardour/ardour/butler.h index 061c94d910..cdd48c3e3a 100644 --- a/libs/ardour/ardour/butler.h +++ b/libs/ardour/ardour/butler.h @@ -20,7 +20,7 @@ #ifndef __ardour_butler_h__ #define __ardour_butler_h__ -#include +#include #include "pbd/ringbuffer.h" #include "pbd/pool.h" @@ -67,8 +67,8 @@ class Butler : public SessionHandleRef }; pthread_t thread; - Glib::Mutex request_lock; - Glib::Cond paused; + Glib::Threads::Mutex request_lock; + Glib::Threads::Cond paused; bool should_run; mutable gint should_do_transport_work; int request_pipe[2]; diff --git a/libs/ardour/ardour/control_protocol_manager.h b/libs/ardour/ardour/control_protocol_manager.h index 20358025f1..80c9668763 100644 --- a/libs/ardour/ardour/control_protocol_manager.h +++ b/libs/ardour/ardour/control_protocol_manager.h @@ -24,7 +24,7 @@ #include -#include +#include #include "pbd/stateful.h" #include "ardour/session_handle.h" @@ -81,7 +81,7 @@ class ControlProtocolManager : public PBD::Stateful, public ARDOUR::SessionHandl ControlProtocolManager (); static ControlProtocolManager* _instance; - Glib::Mutex protocols_lock; + Glib::Threads::Mutex protocols_lock; std::list control_protocols; void session_going_away (); diff --git a/libs/ardour/ardour/debug.h b/libs/ardour/ardour/debug.h index a3ad422d9f..08a6df5aba 100644 --- a/libs/ardour/ardour/debug.h +++ b/libs/ardour/ardour/debug.h @@ -62,6 +62,7 @@ namespace PBD { extern uint64_t SoundGrid; extern uint64_t SGSurface; extern uint64_t OrderKeys; + extern uint64_t Automation; } } diff --git a/libs/ardour/ardour/diskstream.h b/libs/ardour/ardour/diskstream.h index bbc3a85dbe..5d3693052d 100644 --- a/libs/ardour/ardour/diskstream.h +++ b/libs/ardour/ardour/diskstream.h @@ -250,7 +250,7 @@ class Diskstream : public SessionObject, public PublicDiskstream static framecnt_t disk_io_chunk_frames; std::vector capture_info; - mutable Glib::Mutex capture_info_lock; + mutable Glib::Threads::Mutex capture_info_lock; uint32_t i_am_the_modifier; @@ -301,7 +301,7 @@ class Diskstream : public SessionObject, public PublicDiskstream bool in_set_state; - Glib::Mutex state_lock; + Glib::Threads::Mutex state_lock; PBD::ScopedConnectionList playlist_connections; diff --git a/libs/ardour/ardour/file_source.h b/libs/ardour/ardour/file_source.h index 291b3a3d76..5898d04f0a 100644 --- a/libs/ardour/ardour/file_source.h +++ b/libs/ardour/ardour/file_source.h @@ -52,7 +52,8 @@ public: int move_to_trash (const std::string& trash_dir_name); void mark_take (const std::string& id); - void mark_immutable (); + void mark_immutable (); + void mark_immutable_except_write(); void mark_nonremovable (); const std::string& take_id () const { return _take_id; } diff --git a/libs/ardour/ardour/graph.h b/libs/ardour/ardour/graph.h index e5c03ad134..cac09d34af 100644 --- a/libs/ardour/ardour/graph.h +++ b/libs/ardour/ardour/graph.h @@ -122,8 +122,8 @@ private: bool _graph_empty; // chain swapping - Glib::Mutex _swap_mutex; - Glib::Cond _cleanup_cond; + Glib::Threads::Mutex _swap_mutex; + Glib::Threads::Cond _cleanup_cond; volatile int _current_chain; volatile int _pending_chain; volatile int _setup_chain; diff --git a/libs/ardour/ardour/internal_return.h b/libs/ardour/ardour/internal_return.h index 291b51896c..c7fe04cc42 100644 --- a/libs/ardour/ardour/internal_return.h +++ b/libs/ardour/ardour/internal_return.h @@ -48,7 +48,7 @@ class InternalReturn : public Return /** sends that we are receiving data from */ std::list _sends; /** mutex to protect _sends */ - Glib::Mutex _sends_mutex; + Glib::Threads::Mutex _sends_mutex; }; } // namespace ARDOUR diff --git a/libs/ardour/ardour/io.h b/libs/ardour/ardour/io.h index 1ba27a7449..69297fff04 100644 --- a/libs/ardour/ardour/io.h +++ b/libs/ardour/ardour/io.h @@ -25,7 +25,7 @@ #include #include -#include +#include #include "pbd/fastlog.h" #include "pbd/undo.h" @@ -74,8 +74,8 @@ class IO : public SessionObject, public Latent Output }; - IO (Session&, const std::string& name, Direction, DataType default_type = DataType::AUDIO); - IO (Session&, const XMLNode&, DataType default_type = DataType::AUDIO); + IO (Session&, const std::string& name, Direction, DataType default_type = DataType::AUDIO, bool sendish = false); + IO (Session&, const XMLNode&, DataType default_type = DataType::AUDIO, bool sendish = false); virtual ~IO(); @@ -200,13 +200,14 @@ class IO : public SessionObject, public Latent int set_ports (const std::string& str); private: - mutable Glib::Mutex io_lock; + mutable Glib::Threads::Mutex io_lock; protected: PortSet _ports; Direction _direction; DataType _default_type; bool _active; + bool _sendish; private: int connecting_became_legal (); diff --git a/libs/ardour/ardour/io_processor.h b/libs/ardour/ardour/io_processor.h index 574cef9993..7adfab2225 100644 --- a/libs/ardour/ardour/io_processor.h +++ b/libs/ardour/ardour/io_processor.h @@ -23,7 +23,7 @@ #include #include -#include +#include #include "pbd/undo.h" @@ -44,10 +44,10 @@ class IOProcessor : public Processor { public: IOProcessor (Session&, bool with_input, bool with_output, - const std::string& proc_name, const std::string io_name="", - ARDOUR::DataType default_type = DataType::AUDIO); - IOProcessor (Session&, boost::shared_ptr input, boost::shared_ptr output, - const std::string& proc_name, ARDOUR::DataType default_type = DataType::AUDIO); + const std::string& proc_name, const std::string io_name="", + ARDOUR::DataType default_type = DataType::AUDIO, bool sendish=false); + IOProcessor (Session&, boost::shared_ptr input, boost::shared_ptr output, + const std::string& proc_name, ARDOUR::DataType default_type = DataType::AUDIO); virtual ~IOProcessor (); bool set_name (const std::string& str); diff --git a/libs/ardour/ardour/location.h b/libs/ardour/ardour/location.h index 069230438e..414f332b5e 100644 --- a/libs/ardour/ardour/location.h +++ b/libs/ardour/ardour/location.h @@ -27,7 +27,7 @@ #include -#include +#include #include "pbd/undo.h" #include "pbd/stateful.h" @@ -181,12 +181,12 @@ class Locations : public SessionHandleRef, public PBD::StatefulDestructible PBD::Signal1 StateChanged; template void apply (T& obj, void (T::*method)(LocationList&)) { - Glib::Mutex::Lock lm (lock); + Glib::Threads::Mutex::Lock lm (lock); (obj.*method)(locations); } template void apply (T1& obj, void (T1::*method)(LocationList&, T2& arg), T2& arg) { - Glib::Mutex::Lock lm (lock); + Glib::Threads::Mutex::Lock lm (lock); (obj.*method)(locations, arg); } @@ -194,7 +194,7 @@ class Locations : public SessionHandleRef, public PBD::StatefulDestructible LocationList locations; Location *current_location; - mutable Glib::Mutex lock; + mutable Glib::Threads::Mutex lock; int set_current_unlocked (Location *); void location_changed (Location*); diff --git a/libs/ardour/ardour/logcurve.h b/libs/ardour/ardour/logcurve.h index a5f0ce4734..4c91ad9a79 100644 --- a/libs/ardour/ardour/logcurve.h +++ b/libs/ardour/ardour/logcurve.h @@ -21,7 +21,7 @@ #define __ardour_logcurve_h__ #include "pbd/fastlog.h" -#include +#include namespace ARDOUR { @@ -93,7 +93,7 @@ class LogCurve { } void set_length (uint32_t len) { l = len; } - mutable Glib::Mutex lock; + mutable Glib::Threads::Mutex lock; protected: float a; diff --git a/libs/ardour/ardour/midi_diskstream.h b/libs/ardour/ardour/midi_diskstream.h index 99513734da..0823a5f8ac 100644 --- a/libs/ardour/ardour/midi_diskstream.h +++ b/libs/ardour/ardour/midi_diskstream.h @@ -199,7 +199,7 @@ class MidiDiskstream : public Diskstream the GUI to read (so that it can update itself). */ MidiBuffer _gui_feed_buffer; - mutable Glib::Mutex _gui_feed_buffer_mutex; + mutable Glib::Threads::Mutex _gui_feed_buffer_mutex; }; }; /* namespace ARDOUR */ diff --git a/libs/ardour/ardour/midi_model.h b/libs/ardour/ardour/midi_model.h index d0a05e131d..38bd3ab982 100644 --- a/libs/ardour/ardour/midi_model.h +++ b/libs/ardour/ardour/midi_model.h @@ -25,7 +25,7 @@ #include #include #include -#include +#include #include "pbd/command.h" #include "ardour/types.h" #include "ardour/midi_buffer.h" @@ -267,14 +267,14 @@ protected: private: struct WriteLockImpl : public AutomatableSequence::WriteLockImpl { - WriteLockImpl(Glib::Mutex::Lock* source_lock, Glib::RWLock& s, Glib::Mutex& c) + WriteLockImpl(Glib::Threads::Mutex::Lock* slock, Glib::Threads::RWLock& s, Glib::Threads::Mutex& c) : AutomatableSequence::WriteLockImpl(s, c) - , source_lock(source_lock) + , source_lock (slock) {} ~WriteLockImpl() { delete source_lock; } - Glib::Mutex::Lock* source_lock; + Glib::Threads::Mutex::Lock* source_lock; }; public: diff --git a/libs/ardour/ardour/midi_source.h b/libs/ardour/ardour/midi_source.h index 1d4ba56ba3..1a7f3b07c5 100644 --- a/libs/ardour/ardour/midi_source.h +++ b/libs/ardour/ardour/midi_source.h @@ -22,7 +22,7 @@ #include #include -#include +#include #include #include "pbd/stateful.h" #include "pbd/xml++.h" diff --git a/libs/ardour/ardour/playlist.h b/libs/ardour/ardour/playlist.h index ade781a4a7..f3888b0817 100644 --- a/libs/ardour/ardour/playlist.h +++ b/libs/ardour/ardour/playlist.h @@ -233,16 +233,16 @@ public: friend class Session; protected: - class RegionReadLock : public Glib::RWLock::ReaderLock { + class RegionReadLock : public Glib::Threads::RWLock::ReaderLock { public: - RegionReadLock (Playlist *pl) : Glib::RWLock::ReaderLock (pl->region_lock) {} + RegionReadLock (Playlist *pl) : Glib::Threads::RWLock::ReaderLock (pl->region_lock) {} ~RegionReadLock() {} }; - class RegionWriteLock : public Glib::RWLock::WriterLock { + class RegionWriteLock : public Glib::Threads::RWLock::WriterLock { public: RegionWriteLock (Playlist *pl, bool do_block_notify = true) - : Glib::RWLock::WriterLock (pl->region_lock) + : Glib::Threads::RWLock::WriterLock (pl->region_lock) , playlist (pl) , block_notify (do_block_notify) { if (block_notify) { @@ -251,7 +251,7 @@ public: } ~RegionWriteLock() { - Glib::RWLock::WriterLock::release (); + Glib::Threads::RWLock::WriterLock::release (); if (block_notify) { playlist->release_notifications (); } @@ -383,7 +383,7 @@ public: private: friend class RegionReadLock; friend class RegionWriteLock; - mutable Glib::RWLock region_lock; + mutable Glib::Threads::RWLock region_lock; private: void setup_layering_indices (RegionList const &); diff --git a/libs/ardour/ardour/process_thread.h b/libs/ardour/ardour/process_thread.h index 6dd91aa305..871a2584d5 100644 --- a/libs/ardour/ardour/process_thread.h +++ b/libs/ardour/ardour/process_thread.h @@ -1,7 +1,7 @@ #ifndef __libardour_process_thread__ #define __libardour_process_thread__ -#include +#include #include "ardour/chan_count.h" #include "ardour/types.h" @@ -36,7 +36,7 @@ protected: void session_going_away (); private: - static Glib::Private* _private_thread_buffers; + static Glib::Threads::Private _private_thread_buffers; }; } // namespace diff --git a/libs/ardour/ardour/rc_configuration_vars.h b/libs/ardour/ardour/rc_configuration_vars.h index 37599b0ac6..09b0c55a74 100644 --- a/libs/ardour/ardour/rc_configuration_vars.h +++ b/libs/ardour/ardour/rc_configuration_vars.h @@ -152,7 +152,7 @@ CONFIG_VARIABLE (int32_t, history_depth, "history-depth", 20) CONFIG_VARIABLE (bool, use_overlap_equivalency, "use-overlap-equivalency", false) CONFIG_VARIABLE (bool, periodic_safety_backups, "periodic-safety-backups", true) CONFIG_VARIABLE (uint32_t, periodic_safety_backup_interval, "periodic-safety-backup-interval", 120) -CONFIG_VARIABLE (float, automation_interval, "automation-interval", 50) +CONFIG_VARIABLE (float, automation_interval, "automation-interval", 500) CONFIG_VARIABLE (bool, sync_all_route_ordering, "sync-all-route-ordering", true) CONFIG_VARIABLE (bool, only_copy_imported_files, "only-copy-imported-files", false) CONFIG_VARIABLE (bool, keep_tearoffs, "keep-tearoffs", false) diff --git a/libs/ardour/ardour/region_factory.h b/libs/ardour/ardour/region_factory.h index 471f172440..ed0c962d87 100644 --- a/libs/ardour/ardour/region_factory.h +++ b/libs/ardour/ardour/region_factory.h @@ -22,7 +22,7 @@ #include #include -#include +#include #include "pbd/id.h" #include "pbd/property_list.h" @@ -124,11 +124,11 @@ public: static void region_changed (PBD::PropertyChange const &, boost::weak_ptr); - static Glib::StaticMutex region_map_lock; + static Glib::Threads::Mutex region_map_lock; static RegionMap region_map; - static Glib::StaticMutex region_name_maps_mutex; + static Glib::Threads::Mutex region_name_maps_mutex; /** map of partial region names and suffix numbers */ static std::map region_name_number_map; /** map of complete region names with their region ID */ diff --git a/libs/ardour/ardour/route.h b/libs/ardour/ardour/route.h index f6c737d766..b2e3d1236e 100644 --- a/libs/ardour/ardour/route.h +++ b/libs/ardour/ardour/route.h @@ -32,7 +32,7 @@ #include #include -#include +#include #include "pbd/fastlog.h" #include "pbd/xml++.h" #include "pbd/undo.h" @@ -131,6 +131,7 @@ class Route : public SessionObject, public Automatable, public RouteGroupMember, virtual void nonrealtime_handle_transport_stopped (bool abort, bool did_locate, bool flush_processors); virtual void realtime_handle_transport_stopped () {} virtual void realtime_locate () {} + virtual void non_realtime_locate (framepos_t); virtual void set_pending_declick (int); /* end of vfunc-based API */ @@ -190,7 +191,7 @@ class Route : public SessionObject, public Automatable, public RouteGroupMember, void flush_processors (); void foreach_processor (boost::function)> method) { - Glib::RWLock::ReaderLock lm (_processor_lock); + Glib::Threads::RWLock::ReaderLock lm (_processor_lock); for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) { if (boost::dynamic_pointer_cast (*i)) { break; @@ -200,7 +201,7 @@ class Route : public SessionObject, public Automatable, public RouteGroupMember, } boost::shared_ptr nth_processor (uint32_t n) { - Glib::RWLock::ReaderLock lm (_processor_lock); + Glib::Threads::RWLock::ReaderLock lm (_processor_lock); ProcessorList::iterator i; for (i = _processors.begin(); i != _processors.end() && n; ++i, --n) {} if (i == _processors.end()) { @@ -409,7 +410,6 @@ class Route : public SessionObject, public Automatable, public RouteGroupMember, boost::shared_ptr the_instrument() const; InstrumentInfo& instrument_info() { return _instrument_info; } - void automation_snapshot (framepos_t now, bool force=false); void protect_automation (); enum { @@ -423,7 +423,7 @@ class Route : public SessionObject, public Automatable, public RouteGroupMember, void set_remote_control_id (uint32_t id, bool notify_class_listeners = true); uint32_t remote_control_id () const; - void set_remote_control_id_from_order_key (RouteSortOrderKey); + void set_remote_control_id_from_order_key (RouteSortOrderKey, uint32_t order_key); /* for things concerned about *this* route's RID */ @@ -468,7 +468,7 @@ class Route : public SessionObject, public Automatable, public RouteGroupMember, framecnt_t _roll_delay; ProcessorList _processors; - mutable Glib::RWLock _processor_lock; + mutable Glib::Threads::RWLock _processor_lock; boost::shared_ptr _main_outs; boost::shared_ptr _monitor_send; boost::shared_ptr _intreturn; @@ -531,8 +531,6 @@ class Route : public SessionObject, public Automatable, public RouteGroupMember, int set_state_2X (const XMLNode&, int); void set_processor_state_2X (XMLNodeList const &, int); - static uint32_t order_key_cnt; - typedef std::map OrderKeys; OrderKeys order_keys; uint32_t _remote_control_id; diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h index bc14805074..5f20df029c 100644 --- a/libs/ardour/ardour/session.h +++ b/libs/ardour/ardour/session.h @@ -34,7 +34,7 @@ #include #include -#include +#include #include "pbd/error.h" #include "pbd/event_loop.h" @@ -234,8 +234,8 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi bool operator() (boost::shared_ptr, boost::shared_ptr b); }; + void notify_remote_id_change (); void sync_order_keys (RouteSortOrderKey); - void sync_remote_id_from_order_keys (RouteSortOrderKey); template void foreach_route (T *obj, void (T::*func)(Route&)); template void foreach_route (T *obj, void (T::*func)(boost::shared_ptr)); @@ -1258,7 +1258,7 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi /* REGION MANAGEMENT */ - mutable Glib::Mutex region_lock; + mutable Glib::Threads::Mutex region_lock; int load_regions (const XMLNode& node); int load_compounds (const XMLNode& node); @@ -1269,7 +1269,7 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi /* SOURCES */ - mutable Glib::Mutex source_lock; + mutable Glib::Threads::Mutex source_lock; public: typedef std::map > SourceMap; @@ -1354,7 +1354,7 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi could not report free space. */ bool _total_free_4k_blocks_uncertain; - Glib::Mutex space_lock; + Glib::Threads::Mutex space_lock; bool no_questions_about_missing_files; @@ -1397,7 +1397,7 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi Sample* click_emphasis_data; framecnt_t click_length; framecnt_t click_emphasis_length; - mutable Glib::RWLock click_lock; + mutable Glib::Threads::RWLock click_lock; static const Sample default_click[]; static const framecnt_t default_click_length; @@ -1450,7 +1450,7 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi int find_all_sources_across_snapshots (std::set& result, bool exclude_this_snapshot); typedef std::set > Controllables; - Glib::Mutex controllables_lock; + Glib::Threads::Mutex controllables_lock; Controllables controllables; boost::shared_ptr _solo_cut_control; diff --git a/libs/ardour/ardour/session_playlist.h b/libs/ardour/ardour/session_playlist.h index 7f5d1e89ce..fa1acc5828 100644 --- a/libs/ardour/ardour/session_playlist.h +++ b/libs/ardour/ardour/session_playlist.h @@ -29,7 +29,7 @@ namespace ARDOUR { template void SessionPlaylists::foreach (T *obj, void (T::*func)(boost::shared_ptr)) { - Glib::Mutex::Lock lm (lock); + Glib::Threads::Mutex::Lock lm (lock); for (List::iterator i = playlists.begin(); i != playlists.end(); i++) { if (!(*i)->hidden()) { (obj->*func) (*i); diff --git a/libs/ardour/ardour/session_playlists.h b/libs/ardour/ardour/session_playlists.h index 5f69ba8001..83dc8ee58c 100644 --- a/libs/ardour/ardour/session_playlists.h +++ b/libs/ardour/ardour/session_playlists.h @@ -23,7 +23,7 @@ #include #include #include -#include +#include #include #include @@ -78,7 +78,7 @@ private: int load_unused (Session &, const XMLNode&); boost::shared_ptr XMLPlaylistFactory (Session &, const XMLNode&); - mutable Glib::Mutex lock; + mutable Glib::Threads::Mutex lock; typedef std::set > List; List playlists; List unused_playlists; diff --git a/libs/ardour/ardour/session_route.h b/libs/ardour/ardour/session_route.h index cfaa13cdc8..19d8614d1b 100644 --- a/libs/ardour/ardour/session_route.h +++ b/libs/ardour/ardour/session_route.h @@ -22,7 +22,7 @@ #include -#include +#include #include "ardour/session.h" #include "ardour/route.h" diff --git a/libs/ardour/ardour/slave.h b/libs/ardour/ardour/slave.h index a487824e51..1602b8bc8e 100644 --- a/libs/ardour/ardour/slave.h +++ b/libs/ardour/ardour/slave.h @@ -22,7 +22,7 @@ #include -#include +#include #include @@ -262,7 +262,7 @@ class MTC_Slave : public Slave { size_t speed_accumulator_cnt; bool have_first_speed_accumulator; double average_speed; - Glib::Mutex reset_lock; + Glib::Threads::Mutex reset_lock; uint32_t reset_pending; bool reset_position; diff --git a/libs/ardour/ardour/source.h b/libs/ardour/ardour/source.h index e65b4cb093..a3b5fd817a 100644 --- a/libs/ardour/ardour/source.h +++ b/libs/ardour/ardour/source.h @@ -23,7 +23,7 @@ #include #include -#include +#include #include #include "pbd/statefuldestructible.h" @@ -99,7 +99,7 @@ class Source : public SessionObject void set_allow_remove_if_empty (bool yn); - Glib::Mutex& mutex() { return _lock; } + Glib::Threads::Mutex& mutex() { return _lock; } Flag flags() const { return _flags; } virtual void inc_use_count (); @@ -114,8 +114,8 @@ class Source : public SessionObject time_t _timestamp; framepos_t _timeline_position; bool _analysed; - mutable Glib::Mutex _lock; - mutable Glib::Mutex _analysis_lock; + mutable Glib::Threads::Mutex _lock; + mutable Glib::Threads::Mutex _analysis_lock; gint _use_count; /* atomic */ uint32_t _level; /* how deeply nested is this source w.r.t a disk file */ diff --git a/libs/ardour/ardour/source_factory.h b/libs/ardour/ardour/source_factory.h index 5ddf1f8735..387a40aff3 100644 --- a/libs/ardour/ardour/source_factory.h +++ b/libs/ardour/ardour/source_factory.h @@ -24,6 +24,8 @@ #include #include +#include + #include "ardour/source.h" class XMLNode; @@ -59,8 +61,8 @@ class SourceFactory { (DataType type, Session& s, boost::shared_ptr p, const PBD::ID& orig, const std::string& name, uint32_t chn, frameoffset_t start, framecnt_t len, bool copy, bool defer_peaks); - static Glib::Cond* PeaksToBuild; - static Glib::StaticMutex peak_building_lock; + static Glib::Threads::Cond PeaksToBuild; + static Glib::Threads::Mutex peak_building_lock; static std::list< boost::weak_ptr > files_with_peaks; static int setup_peakfile (boost::shared_ptr, bool async); diff --git a/libs/ardour/ardour/tempo.h b/libs/ardour/ardour/tempo.h index 15032b8741..8e4f1bc420 100644 --- a/libs/ardour/ardour/tempo.h +++ b/libs/ardour/ardour/tempo.h @@ -24,7 +24,7 @@ #include #include #include -#include +#include #include "pbd/undo.h" #include "pbd/stateful.h" @@ -218,7 +218,7 @@ class TempoMap : public PBD::StatefulDestructible typedef std::vector BBTPointList; template void apply_with_metrics (T& obj, void (T::*method)(const Metrics&)) { - Glib::RWLock::ReaderLock lm (lock); + Glib::Threads::RWLock::ReaderLock lm (lock); (obj.*method)(metrics); } @@ -314,7 +314,7 @@ class TempoMap : public PBD::StatefulDestructible Metrics metrics; framecnt_t _frame_rate; - mutable Glib::RWLock lock; + mutable Glib::Threads::RWLock lock; BBTPointList _map; void recompute_map (bool reassign_tempo_bbt, framepos_t end = -1); diff --git a/libs/ardour/ardour/thread_buffers.h b/libs/ardour/ardour/thread_buffers.h index be8cb42282..9011e98e43 100644 --- a/libs/ardour/ardour/thread_buffers.h +++ b/libs/ardour/ardour/thread_buffers.h @@ -1,7 +1,7 @@ #ifndef __libardour_thread_buffers__ #define __libardour_thread_buffers__ -#include +#include #include "ardour/chan_count.h" #include "ardour/types.h" diff --git a/libs/ardour/ardour/user_bundle.h b/libs/ardour/ardour/user_bundle.h index c124e2e722..5ecfe521f5 100644 --- a/libs/ardour/ardour/user_bundle.h +++ b/libs/ardour/ardour/user_bundle.h @@ -21,7 +21,7 @@ #define __ardour_user_bundle_h__ #include -#include +#include #include "pbd/stateful.h" #include "ardour/bundle.h" diff --git a/libs/ardour/ardour/worker.h b/libs/ardour/ardour/worker.h index 984e375c80..fe278b9618 100644 --- a/libs/ardour/ardour/worker.h +++ b/libs/ardour/ardour/worker.h @@ -22,7 +22,7 @@ #include -#include +#include #include "pbd/ringbuffer.h" #include "pbd/semaphore.h" @@ -76,13 +76,13 @@ public: private: void run(); - Workee* _workee; - Glib::Thread* _thread; - RingBuffer* _requests; - RingBuffer* _responses; - uint8_t* _response; - PBD::Semaphore _sem; - bool _exit; + Workee* _workee; + Glib::Threads::Thread* _thread; + RingBuffer* _requests; + RingBuffer* _responses; + uint8_t* _response; + PBD::Semaphore _sem; + bool _exit; }; } // namespace ARDOUR diff --git a/libs/ardour/audio_diskstream.cc b/libs/ardour/audio_diskstream.cc index 8e6b5c27f1..3345a00b42 100644 --- a/libs/ardour/audio_diskstream.cc +++ b/libs/ardour/audio_diskstream.cc @@ -151,7 +151,7 @@ void AudioDiskstream::non_realtime_input_change () { { - Glib::Mutex::Lock lm (state_lock); + Glib::Threads::Mutex::Lock lm (state_lock); if (input_change_pending.type == IOChange::NoChange) { return; @@ -430,7 +430,7 @@ AudioDiskstream::process (framepos_t transport_frame, pframes_t nframes, framecn return 0; } - Glib::Mutex::Lock sm (state_lock, Glib::TRY_LOCK); + Glib::Threads::Mutex::Lock sm (state_lock, Glib::Threads::TRY_LOCK); if (!sm.locked()) { return 1; @@ -812,7 +812,7 @@ AudioDiskstream::seek (framepos_t frame, bool complete_refill) ChannelList::iterator chan; boost::shared_ptr c = channels.reader(); - Glib::Mutex::Lock lm (state_lock); + Glib::Threads::Mutex::Lock lm (state_lock); for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) { (*chan)->playback_buf->reset (); @@ -1379,7 +1379,7 @@ AudioDiskstream::transport_stopped_wallclock (struct tm& when, time_t twhen, boo } /* XXX is there anything we can do if err != 0 ? */ - Glib::Mutex::Lock lm (capture_info_lock); + Glib::Threads::Mutex::Lock lm (capture_info_lock); if (capture_info.empty()) { return; diff --git a/libs/ardour/audio_playlist_source.cc b/libs/ardour/audio_playlist_source.cc index ea09d20056..915aee9595 100644 --- a/libs/ardour/audio_playlist_source.cc +++ b/libs/ardour/audio_playlist_source.cc @@ -151,7 +151,7 @@ AudioPlaylistSource::read_unlocked (Sample* dst, framepos_t start, framecnt_t cn with any changes to the list of buffers caused by creating new nested playlists/sources */ - Glib::Mutex::Lock lm (_level_buffer_lock); + Glib::Threads::Mutex::Lock lm (_level_buffer_lock); sbuf = _mixdown_buffers[_level-1]; gbuf = _gain_buffers[_level-1]; } diff --git a/libs/ardour/audio_track.cc b/libs/ardour/audio_track.cc index 6161147f44..2801a4e997 100644 --- a/libs/ardour/audio_track.cc +++ b/libs/ardour/audio_track.cc @@ -310,7 +310,7 @@ AudioTrack::set_state_part_two () int AudioTrack::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, int declick, bool& need_butler) { - Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK); + Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK); if (!lm.locked()) { return 0; @@ -321,8 +321,6 @@ AudioTrack::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_fram framepos_t transport_frame; boost::shared_ptr diskstream = audio_diskstream(); - automation_snapshot (start_frame, false); - if (n_outputs().n_total() == 0 && _processors.empty()) { return 0; } @@ -485,7 +483,7 @@ AudioTrack::export_stuff (BufferSet& buffers, framepos_t start, framecnt_t nfram boost::scoped_array mix_buffer (new Sample[nframes]); boost::shared_ptr diskstream = audio_diskstream(); - Glib::RWLock::ReaderLock rlock (_processor_lock); + Glib::Threads::RWLock::ReaderLock rlock (_processor_lock); boost::shared_ptr apl = boost::dynamic_pointer_cast(diskstream->playlist()); @@ -559,7 +557,7 @@ AudioTrack::bounceable (boost::shared_ptr endpoint, bool include_endp return true; } - Glib::RWLock::ReaderLock lm (_processor_lock); + Glib::Threads::RWLock::ReaderLock lm (_processor_lock); uint32_t naudio = n_inputs().n_audio(); for (ProcessorList::const_iterator r = _processors.begin(); r != _processors.end(); ++r) { @@ -668,7 +666,7 @@ AudioTrack::freeze_me (InterThreadInfo& itt) _freeze_record.processor_info.clear (); { - Glib::RWLock::ReaderLock lm (_processor_lock); + Glib::Threads::RWLock::ReaderLock lm (_processor_lock); for (ProcessorList::iterator r = _processors.begin(); r != _processors.end(); ++r) { @@ -731,7 +729,7 @@ AudioTrack::unfreeze () audio_diskstream()->use_playlist (_freeze_record.playlist); { - Glib::RWLock::ReaderLock lm (_processor_lock); // should this be a write lock? jlc + Glib::Threads::RWLock::ReaderLock lm (_processor_lock); // should this be a write lock? jlc for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) { for (vector::iterator ii = _freeze_record.processor_info.begin(); ii != _freeze_record.processor_info.end(); ++ii) { if ((*ii)->id == (*i)->id()) { diff --git a/libs/ardour/audio_unit.cc b/libs/ardour/audio_unit.cc index 431fb99a48..89aa99bac8 100644 --- a/libs/ardour/audio_unit.cc +++ b/libs/ardour/audio_unit.cc @@ -31,7 +31,7 @@ #include "pbd/pathscanner.h" #include "pbd/locale_guard.h" -#include +#include #include #include @@ -784,6 +784,10 @@ AUPlugin::set_parameter (uint32_t which, float val) return; } + if (get_parameter(which) == val) { + return; + } + const AUParameterDescriptor& d (descriptors[which]); DEBUG_TRACE (DEBUG::AudioUnits, string_compose ("set parameter %1 in scope %2 element %3 to %4\n", d.id, d.scope, d.element, val)); unit->SetParameter (d.id, d.scope, d.element, val); diff --git a/libs/ardour/audioengine.cc b/libs/ardour/audioengine.cc index 004ba33a6e..450bf2a296 100644 --- a/libs/ardour/audioengine.cc +++ b/libs/ardour/audioengine.cc @@ -94,7 +94,7 @@ AudioEngine::AudioEngine (string client_name, string session_uuid) AudioEngine::~AudioEngine () { { - Glib::Mutex::Lock tm (_process_lock); + Glib::Threads::Mutex::Lock tm (_process_lock); session_removed.signal (); if (_running) { @@ -453,7 +453,7 @@ int AudioEngine::process_callback (pframes_t nframes) { GET_PRIVATE_JACK_POINTER_RET(_jack,0); - Glib::Mutex::Lock tm (_process_lock, Glib::TRY_LOCK); + Glib::Threads::Mutex::Lock tm (_process_lock, Glib::Threads::TRY_LOCK); PT_TIMING_REF; PT_TIMING_CHECK (1); @@ -714,7 +714,7 @@ AudioEngine::jack_bufsize_callback (pframes_t nframes) } { - Glib::Mutex::Lock lm (_process_lock); + Glib::Threads::Mutex::Lock lm (_process_lock); boost::shared_ptr p = ports.reader(); @@ -745,8 +745,7 @@ AudioEngine::start_metering_thread () { if (m_meter_thread == 0) { g_atomic_int_set (&m_meter_exit, 0); - m_meter_thread = Glib::Thread::create (boost::bind (&AudioEngine::meter_thread, this), - 500000, true, true, Glib::THREAD_PRIORITY_NORMAL); + m_meter_thread = Glib::Threads::Thread::create (boost::bind (&AudioEngine::meter_thread, this)); } } @@ -767,7 +766,7 @@ AudioEngine::meter_thread () void AudioEngine::set_session (Session *s) { - Glib::Mutex::Lock pl (_process_lock); + Glib::Threads::Mutex::Lock pl (_process_lock); SessionHandlePtr::set_session (s); @@ -805,7 +804,7 @@ AudioEngine::set_session (Session *s) void AudioEngine::remove_session () { - Glib::Mutex::Lock lm (_process_lock); + Glib::Threads::Mutex::Lock lm (_process_lock); if (_running) { @@ -1391,7 +1390,7 @@ AudioEngine::disconnect_from_jack () } { - Glib::Mutex::Lock lm (_process_lock); + Glib::Threads::Mutex::Lock lm (_process_lock); jack_client_close (_priv_jack); _jack = 0; } diff --git a/libs/ardour/audiofilesource.cc b/libs/ardour/audiofilesource.cc index e101f5b25b..2486d45ca1 100644 --- a/libs/ardour/audiofilesource.cc +++ b/libs/ardour/audiofilesource.cc @@ -42,7 +42,7 @@ #include #include -#include +#include #include "ardour/audiofilesource.h" #include "ardour/debug.h" @@ -86,7 +86,7 @@ struct SizedSampleBuffer { } }; -Glib::StaticPrivate thread_interleave_buffer = GLIBMM_STATIC_PRIVATE_INIT; +Glib::Threads::Private thread_interleave_buffer; /** Constructor used for existing external-to-session files. */ AudioFileSource::AudioFileSource (Session& s, const string& path, Source::Flag flags) diff --git a/libs/ardour/audioregion.cc b/libs/ardour/audioregion.cc index 4c7979dbfc..577f12c78e 100644 --- a/libs/ardour/audioregion.cc +++ b/libs/ardour/audioregion.cc @@ -26,7 +26,7 @@ #include -#include +#include #include "pbd/basename.h" #include "pbd/xml++.h" @@ -39,6 +39,7 @@ #include "ardour/audioregion.h" #include "ardour/session.h" #include "ardour/dB.h" +#include "ardour/debug.h" #include "ardour/playlist.h" #include "ardour/audiofilesource.h" #include "ardour/region_factory.h" @@ -712,6 +713,8 @@ AudioRegion::read_at (Sample *buf, Sample *mixdown_buffer, float *gain_buffer, framecnt_t const N = to_read - fade_in_limit - fade_out_limit; if (N > 0) { if (opaque ()) { + DEBUG_TRACE (DEBUG::AudioPlayback, string_compose ("Region %1 memcpy into buf @ %2 + %3, from mixdown buffer @ %4 + %5, len = %6 cnt was %7\n", + name(), buf, fade_in_limit, mixdown_buffer, fade_in_limit, N, cnt)); memcpy (buf + fade_in_limit, mixdown_buffer + fade_in_limit, N * sizeof (Sample)); } else { mix_buffers_no_gain (buf + fade_in_limit, mixdown_buffer + fade_in_limit, N); diff --git a/libs/ardour/audiosource.cc b/libs/ardour/audiosource.cc index e33a3d30de..4deb053cd8 100644 --- a/libs/ardour/audiosource.cc +++ b/libs/ardour/audiosource.cc @@ -46,7 +46,7 @@ using namespace std; using namespace ARDOUR; using namespace PBD; -Glib::StaticMutex AudioSource::_level_buffer_lock = GLIBMM_STATIC_MUTEX_INIT; +Glib::Threads::Mutex AudioSource::_level_buffer_lock; vector > AudioSource::_mixdown_buffers; vector > AudioSource::_gain_buffers; size_t AudioSource::_working_buffers_size = 0; @@ -160,7 +160,7 @@ bool AudioSource::peaks_ready (boost::function doThisWhenReady, ScopedConnection** connect_here_if_not, EventLoop* event_loop) const { bool ret; - Glib::Mutex::Lock lm (_peaks_ready_lock); + Glib::Threads::Mutex::Lock lm (_peaks_ready_lock); if (!(ret = _peaks_built)) { *connect_here_if_not = new ScopedConnection; @@ -281,14 +281,14 @@ AudioSource::read (Sample *dst, framepos_t start, framecnt_t cnt, int /*channel* { assert (cnt >= 0); - Glib::Mutex::Lock lm (_lock); + Glib::Threads::Mutex::Lock lm (_lock); return read_unlocked (dst, start, cnt); } framecnt_t AudioSource::write (Sample *dst, framecnt_t cnt) { - Glib::Mutex::Lock lm (_lock); + Glib::Threads::Mutex::Lock lm (_lock); /* any write makes the fill not removable */ _flags = Flag (_flags & ~Removable); return write_unlocked (dst, cnt); @@ -308,7 +308,7 @@ int AudioSource::read_peaks_with_fpp (PeakData *peaks, framecnt_t npeaks, framepos_t start, framecnt_t cnt, double samples_per_visual_peak, framecnt_t samples_per_file_peak) const { - Glib::Mutex::Lock lm (_lock); + Glib::Threads::Mutex::Lock lm (_lock); double scale; double expected_peaks; PeakData::PeakDatum xmax; @@ -646,7 +646,7 @@ AudioSource::build_peaks_from_scratch () { /* hold lock while building peaks */ - Glib::Mutex::Lock lp (_lock); + Glib::Threads::Mutex::Lock lp (_lock); if (prepare_for_peakfile_writes ()) { goto out; @@ -717,7 +717,7 @@ AudioSource::done_with_peakfile_writes (bool done) } if (done) { - Glib::Mutex::Lock lm (_peaks_ready_lock); + Glib::Threads::Mutex::Lock lm (_peaks_ready_lock); _peaks_built = true; PeaksReady (); /* EMIT SIGNAL */ } @@ -777,7 +777,7 @@ AudioSource::compute_and_write_peaks (Sample* buf, framecnt_t first_frame, frame _peak_byte_max = max (_peak_byte_max, (off_t) (byte + sizeof(PeakData))); { - Glib::Mutex::Lock lm (_peaks_ready_lock); + Glib::Threads::Mutex::Lock lm (_peaks_ready_lock); PeakRangeReady (peak_leftover_frame, peak_leftover_cnt); /* EMIT SIGNAL */ if (intermediate_peaks_ready) { PeaksReady (); /* EMIT SIGNAL */ @@ -890,7 +890,7 @@ AudioSource::compute_and_write_peaks (Sample* buf, framecnt_t first_frame, frame _peak_byte_max = max (_peak_byte_max, (off_t) (first_peak_byte + sizeof(PeakData)*peaks_computed)); if (frames_done) { - Glib::Mutex::Lock lm (_peaks_ready_lock); + Glib::Threads::Mutex::Lock lm (_peaks_ready_lock); PeakRangeReady (first_frame, frames_done); /* EMIT SIGNAL */ if (intermediate_peaks_ready) { PeaksReady (); /* EMIT SIGNAL */ @@ -948,7 +948,7 @@ AudioSource::available_peaks (double zoom_factor) const void AudioSource::mark_streaming_write_completed () { - Glib::Mutex::Lock lm (_peaks_ready_lock); + Glib::Threads::Mutex::Lock lm (_peaks_ready_lock); if (_peaks_built) { PeaksReady (); /* EMIT SIGNAL */ @@ -958,7 +958,7 @@ AudioSource::mark_streaming_write_completed () void AudioSource::allocate_working_buffers (framecnt_t framerate) { - Glib::Mutex::Lock lm (_level_buffer_lock); + Glib::Threads::Mutex::Lock lm (_level_buffer_lock); /* Note: we don't need any buffers allocated until @@ -975,7 +975,7 @@ AudioSource::allocate_working_buffers (framecnt_t framerate) void AudioSource::ensure_buffers_for_level (uint32_t level, framecnt_t frame_rate) { - Glib::Mutex::Lock lm (_level_buffer_lock); + Glib::Threads::Mutex::Lock lm (_level_buffer_lock); ensure_buffers_for_level_locked (level, frame_rate); } diff --git a/libs/ardour/auditioner.cc b/libs/ardour/auditioner.cc index 6c143568c4..ad4d8b5d16 100644 --- a/libs/ardour/auditioner.cc +++ b/libs/ardour/auditioner.cc @@ -17,7 +17,7 @@ */ -#include +#include #include "pbd/error.h" @@ -136,7 +136,7 @@ Auditioner::audition_region (boost::shared_ptr region) return; } - Glib::Mutex::Lock lm (lock); + Glib::Threads::Mutex::Lock lm (lock); /* copy it */ @@ -154,7 +154,7 @@ Auditioner::audition_region (boost::shared_ptr region) ProcessorStreams ps; { - Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ()); + Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ()); if (configure_processors (&ps)) { error << string_compose (_("Cannot setup auditioner processing flow for %1 channels"), diff --git a/libs/ardour/auto_bundle.cc b/libs/ardour/auto_bundle.cc index bedb270dc5..366d32b979 100644 --- a/libs/ardour/auto_bundle.cc +++ b/libs/ardour/auto_bundle.cc @@ -16,7 +16,7 @@ ARDOUR::AutoBundle::AutoBundle (std::string const & n, bool i) ARDOUR::ChanCount ARDOUR::AutoBundle::nchannels () const { - Glib::Mutex::Lock lm (_ports_mutex); + Glib::Threads::Mutex::Lock lm (_ports_mutex); return ChanCount (type(), _ports.size ()); } @@ -25,14 +25,14 @@ ARDOUR::AutoBundle::channel_ports (uint32_t c) const { assert (c < nchannels().get (type())); - Glib::Mutex::Lock lm (_ports_mutex); + Glib::Threads::Mutex::Lock lm (_ports_mutex); return _ports[c]; } void ARDOUR::AutoBundle::set_channels (uint32_t n) { - Glib::Mutex::Lock lm (_ports_mutex); + Glib::Threads::Mutex::Lock lm (_ports_mutex); _ports.resize (n); } @@ -41,7 +41,7 @@ ARDOUR::AutoBundle::set_port (uint32_t c, std::string const & p) { assert (c < nchannels ().get (type())); - Glib::Mutex::Lock lm (_ports_mutex); + Glib::Threads::Mutex::Lock lm (_ports_mutex); _ports[c].resize (1); _ports[c][0] = p; } diff --git a/libs/ardour/automatable.cc b/libs/ardour/automatable.cc index d0a605bcd9..0f6fbdbe17 100644 --- a/libs/ardour/automatable.cc +++ b/libs/ardour/automatable.cc @@ -47,22 +47,32 @@ const string Automatable::xml_node_name = X_("Automation"); Automatable::Automatable(Session& session) : _a_session(session) - , _last_automation_snapshot(0) { } Automatable::Automatable (const Automatable& other) : ControlSet (other) , _a_session (other._a_session) - , _last_automation_snapshot (0) { - Glib::Mutex::Lock lm (other._control_lock); + Glib::Threads::Mutex::Lock lm (other._control_lock); for (Controls::const_iterator i = other._controls.begin(); i != other._controls.end(); ++i) { boost::shared_ptr ac (control_factory (i->first)); add_control (ac); } } + +Automatable::~Automatable () +{ + { + Glib::Threads::Mutex::Lock lm (_control_lock); + + for (Controls::const_iterator li = _controls.begin(); li != _controls.end(); ++li) { + boost::dynamic_pointer_cast(li->second)->drop_references (); + } + } +} + int Automatable::old_set_automation_state (const XMLNode& node) { @@ -74,8 +84,6 @@ Automatable::old_set_automation_state (const XMLNode& node) warning << _("Automation node has no path property") << endmsg; } - _last_automation_snapshot = 0; - return 0; } @@ -98,12 +106,10 @@ Automatable::load_automation (const string& path) return 1; } - Glib::Mutex::Lock lm (control_lock()); + Glib::Threads::Mutex::Lock lm (control_lock()); set tosave; controls().clear (); - _last_automation_snapshot = 0; - while (in) { double when; double value; @@ -180,7 +186,7 @@ Automatable::can_automate (Evoral::Parameter what) int Automatable::set_automation_xml_state (const XMLNode& node, Evoral::Parameter legacy_param) { - Glib::Mutex::Lock lm (control_lock()); + Glib::Threads::Mutex::Lock lm (control_lock()); /* Don't clear controls, since some may be special derived Controllable classes */ @@ -228,15 +234,13 @@ Automatable::set_automation_xml_state (const XMLNode& node, Evoral::Parameter le } } - _last_automation_snapshot = 0; - return 0; } XMLNode& Automatable::get_automation_xml_state () { - Glib::Mutex::Lock lm (control_lock()); + Glib::Threads::Mutex::Lock lm (control_lock()); XMLNode* node = new XMLNode (Automatable::xml_node_name); if (controls().empty()) { @@ -256,13 +260,12 @@ Automatable::get_automation_xml_state () void Automatable::set_parameter_automation_state (Evoral::Parameter param, AutoState s) { - Glib::Mutex::Lock lm (control_lock()); + Glib::Threads::Mutex::Lock lm (control_lock()); - boost::shared_ptr c = control (param, true); - boost::shared_ptr l = boost::dynamic_pointer_cast(c->list()); + boost::shared_ptr c = automation_control (param, true); - if (s != l->automation_state()) { - l->set_automation_state (s); + if (c && (s != c->automation_state())) { + c->set_automation_state (s); _a_session.set_dirty (); } } @@ -272,11 +275,10 @@ Automatable::get_parameter_automation_state (Evoral::Parameter param) { AutoState result = Off; - boost::shared_ptr c = control(param); - boost::shared_ptr l = boost::dynamic_pointer_cast(c->list()); - + boost::shared_ptr c = automation_control(param); + if (c) { - result = l->automation_state(); + result = c->automation_state(); } return result; @@ -285,13 +287,12 @@ Automatable::get_parameter_automation_state (Evoral::Parameter param) void Automatable::set_parameter_automation_style (Evoral::Parameter param, AutoStyle s) { - Glib::Mutex::Lock lm (control_lock()); + Glib::Threads::Mutex::Lock lm (control_lock()); - boost::shared_ptr c = control(param, true); - boost::shared_ptr l = boost::dynamic_pointer_cast(c->list()); + boost::shared_ptr c = automation_control(param, true); - if (s != l->automation_style()) { - l->set_automation_style (s); + if (c && (s != c->automation_style())) { + c->set_automation_style (s); _a_session.set_dirty (); } } @@ -299,7 +300,7 @@ Automatable::set_parameter_automation_style (Evoral::Parameter param, AutoStyle AutoStyle Automatable::get_parameter_automation_style (Evoral::Parameter param) { - Glib::Mutex::Lock lm (control_lock()); + Glib::Threads::Mutex::Lock lm (control_lock()); boost::shared_ptr c = control(param); boost::shared_ptr l = boost::dynamic_pointer_cast(c->list()); @@ -336,19 +337,20 @@ Automatable::protect_automation () } void -Automatable::automation_snapshot (framepos_t now, bool force) +Automatable::transport_located (framepos_t now) { - if (force || _last_automation_snapshot > now || (now - _last_automation_snapshot) > _automation_interval) { + for (Controls::iterator li = controls().begin(); li != controls().end(); ++li) { - for (Controls::iterator i = controls().begin(); i != controls().end(); ++i) { - boost::shared_ptr c - = boost::dynamic_pointer_cast(i->second); - if (_a_session.transport_rolling() && c->automation_write()) { - c->list()->rt_add (now, i->second->user_double()); + boost::shared_ptr c + = boost::dynamic_pointer_cast(li->second); + if (c) { + boost::shared_ptr l + = boost::dynamic_pointer_cast(c->list()); + + if (l) { + l->start_write_pass (now); } } - - _last_automation_snapshot = now; } } diff --git a/libs/ardour/automation_control.cc b/libs/ardour/automation_control.cc index 05463dcdd0..83b7db34be 100644 --- a/libs/ardour/automation_control.cc +++ b/libs/ardour/automation_control.cc @@ -21,6 +21,7 @@ #include #include "ardour/automation_control.h" +#include "ardour/automation_watch.h" #include "ardour/event_type_map.h" #include "ardour/session.h" @@ -39,6 +40,10 @@ AutomationControl::AutomationControl( { } +AutomationControl::~AutomationControl () +{ +} + /** Get the current effective `user' value based on automation state */ double AutomationControl::get_value() const @@ -52,29 +57,77 @@ AutomationControl::get_value() const * @param value `user' value */ void -AutomationControl::set_value(double value) +AutomationControl::set_value (double value) { - bool to_list = _list && _session.transport_stopped() - && ((AutomationList*)_list.get())->automation_write(); + bool to_list = _list && ((AutomationList*)_list.get())->automation_write(); if (to_list && parameter().toggled()) { // store the previous value just before this so any // interpolation works right + _list->add (get_double(), _session.transport_frame()-1); } - Control::set_double (value, to_list, _session.transport_frame()); + Control::set_double (value, _session.transport_frame(), to_list); Changed(); /* EMIT SIGNAL */ } - void -AutomationControl::set_list(boost::shared_ptr list) +AutomationControl::set_list (boost::shared_ptr list) { - Control::set_list(list); + Control::set_list (list); Changed(); /* EMIT SIGNAL */ } +void +AutomationControl::set_automation_state (AutoState as) +{ + if (as != alist()->automation_state()) { + + cerr << name() << " setting automation state to " << enum_2_string (as) << endl; + + alist()->set_automation_state (as); + + if (as == Write) { + AutomationWatch::instance().add_automation_watch (shared_from_this()); + } else if (as == Touch) { + if (!touching()) { + AutomationWatch::instance().remove_automation_watch (shared_from_this()); + } else { + /* this seems unlikely, but the combination of + * a control surface and the mouse could make + * it possible to put the control into Touch + * mode *while* touching it. + */ + AutomationWatch::instance().add_automation_watch (shared_from_this()); + } + } else { + AutomationWatch::instance().remove_automation_watch (shared_from_this()); + } + } +} + +void +AutomationControl::set_automation_style (AutoStyle as) +{ + alist()->set_automation_style (as); +} + +void +AutomationControl::start_touch(double when) +{ + set_touching (true); + AutomationWatch::instance().add_automation_watch (shared_from_this()); + alist()->start_touch(when); +} + +void +AutomationControl::stop_touch(bool mark, double when) +{ + set_touching (false); + AutomationWatch::instance().remove_automation_watch (shared_from_this()); + alist()->stop_touch (mark, when); +} diff --git a/libs/ardour/automation_list.cc b/libs/ardour/automation_list.cc index 26ca7b097a..39e7bacc46 100644 --- a/libs/ardour/automation_list.cc +++ b/libs/ardour/automation_list.cc @@ -180,11 +180,6 @@ AutomationList::set_automation_state (AutoState s) { if (s != _state) { _state = s; - - if (_state == Write) { - Glib::Mutex::Lock lm (ControlList::_lock); - nascent.push_back (new NascentInfo ()); - } automation_state_changed (s); /* EMIT SIGNAL */ } } @@ -202,8 +197,7 @@ void AutomationList::start_touch (double when) { if (_state == Touch) { - Glib::Mutex::Lock lm (ControlList::_lock); - nascent.push_back (new NascentInfo (when)); + start_write_pass (when); } g_atomic_int_set (&_touching, 1); @@ -223,22 +217,11 @@ AutomationList::stop_touch (bool mark, double when) if (_state == Touch) { - assert (!nascent.empty ()); - - Glib::Mutex::Lock lm (ControlList::_lock); - if (mark) { - - nascent.back()->end_time = when; - - } else { - - /* nascent info created in start touch but never used. just get rid of it. - */ - - NascentInfo* ninfo = nascent.back (); - nascent.erase (nascent.begin()); - delete ninfo; + + /* XXX need to mark the last added point with the + * current time + */ } } } diff --git a/libs/ardour/automation_watch.cc b/libs/ardour/automation_watch.cc new file mode 100644 index 0000000000..d3138ee336 --- /dev/null +++ b/libs/ardour/automation_watch.cc @@ -0,0 +1,186 @@ +/* + Copyright (C) 2012 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 "pbd/compose.h" + +#include "ardour/automation_control.h" +#include "ardour/automation_watch.h" +#include "ardour/debug.h" +#include "ardour/session.h" + +using namespace ARDOUR; +using namespace PBD; +using std::cerr; +using std::endl; + +AutomationWatch* AutomationWatch::_instance = 0; + +AutomationWatch& +AutomationWatch::instance () +{ + if (_instance == 0) { + _instance = new AutomationWatch; + } + return *_instance; +} + +AutomationWatch::AutomationWatch () + : _thread (0) + , _run_thread (false) +{ + +} + +AutomationWatch::~AutomationWatch () +{ + if (_thread) { + _run_thread = false; + _thread->join (); + _thread = 0; + } + + Glib::Threads::Mutex::Lock lm (automation_watch_lock); + automation_watches.clear (); +} + +void +AutomationWatch::add_automation_watch (boost::shared_ptr ac) +{ + Glib::Threads::Mutex::Lock lm (automation_watch_lock); + DEBUG_TRACE (DEBUG::Automation, string_compose ("now watching control %1 for automation\n", ac->name())); + automation_watches.push_back (ac); + + /* if an automation control is added here while the transport is + * rolling, make sure that it knows that there is a write pass going + * on, rather than waiting for the transport to start. + */ + + if (_session && _session->transport_rolling() && ac->alist()->automation_write()) { + DEBUG_TRACE (DEBUG::Automation, string_compose ("\ttransport is rolling @ %1, so enter write pass\n", _session->transport_speed())); + ac->list()->set_in_write_pass (true); + } + + /* we can't store shared_ptr in connections because it + * creates reference cycles. we don't need to make the weak_ptr<> + * explicit here, but it helps to remind us what is going on. + */ + + boost::weak_ptr wac (ac); + ac->DropReferences.connect_same_thread (*this, boost::bind (&AutomationWatch::remove_weak_automation_watch, this, wac)); +} + +void +AutomationWatch::remove_weak_automation_watch (boost::weak_ptr wac) +{ + boost::shared_ptr ac = wac.lock(); + + if (!ac) { + return; + } + + remove_automation_watch (ac); +} + +void +AutomationWatch::remove_automation_watch (boost::shared_ptr ac) +{ + Glib::Threads::Mutex::Lock lm (automation_watch_lock); + DEBUG_TRACE (DEBUG::Automation, string_compose ("remove control %1 from automation watch\n", ac->name())); + automation_watches.remove (ac); + ac->list()->set_in_write_pass (false); +} + +gint +AutomationWatch::timer () +{ + if (!_session || !_session->transport_rolling()) { + return TRUE; + } + + { + Glib::Threads::Mutex::Lock lm (automation_watch_lock); + + framepos_t time = _session->audible_frame (); + + for (AutomationWatches::iterator aw = automation_watches.begin(); aw != automation_watches.end(); ++aw) { + if ((*aw)->alist()->automation_write()) { + (*aw)->list()->add (time, (*aw)->user_double()); + } + } + } + + return TRUE; +} + +void +AutomationWatch::thread () +{ + while (_run_thread) { + usleep (100000); // Config->get_automation_interval() * 10); + timer (); + } +} + +void +AutomationWatch::set_session (Session* s) +{ + transport_connection.disconnect (); + + if (_thread) { + _run_thread = false; + _thread->join (); + _thread = 0; + } + + SessionHandlePtr::set_session (s); + + if (_session) { + _run_thread = true; + _thread = Glib::Threads::Thread::create (boost::bind (&AutomationWatch::thread, this)); + + _session->TransportStateChange.connect_same_thread (transport_connection, boost::bind (&AutomationWatch::transport_state_change, this)); + } +} + +void +AutomationWatch::transport_state_change () +{ + if (!_session) { + return; + } + + bool rolling = _session->transport_rolling(); + + { + Glib::Threads::Mutex::Lock lm (automation_watch_lock); + + for (AutomationWatches::iterator aw = automation_watches.begin(); aw != automation_watches.end(); ++aw) { + DEBUG_TRACE (DEBUG::Automation, string_compose ("%1: transport state changed, speed %2, in write pass ? %3 writing ? %4\n", + (*aw)->name(), _session->transport_speed(), rolling, + (*aw)->alist()->automation_write())); + if (rolling && (*aw)->alist()->automation_write()) { + (*aw)->list()->set_in_write_pass (true); + } else { + (*aw)->list()->set_in_write_pass (false); + } + } + } +} diff --git a/libs/ardour/buffer_manager.cc b/libs/ardour/buffer_manager.cc index e66c4a8dee..c8819e41cb 100644 --- a/libs/ardour/buffer_manager.cc +++ b/libs/ardour/buffer_manager.cc @@ -29,7 +29,10 @@ using namespace PBD; RingBufferNPT* BufferManager::thread_buffers = 0; std::list* BufferManager::thread_buffers_list = 0; -Glib::StaticMutex BufferManager::rb_mutex = GLIBMM_STATIC_MUTEX_INIT; +Glib::Threads::Mutex BufferManager::rb_mutex; + +using std::cerr; +using std::endl; void BufferManager::init (uint32_t size) @@ -45,16 +48,18 @@ BufferManager::init (uint32_t size) thread_buffers->write (&ts, 1); thread_buffers_list->push_back (ts); } + // cerr << "Initialized thread buffers, readable count now " << thread_buffers->read_space() << endl; } ThreadBuffers* BufferManager::get_thread_buffers () { - Glib::Mutex::Lock em (rb_mutex); + Glib::Threads::Mutex::Lock em (rb_mutex); ThreadBuffers* tbp; if (thread_buffers->read (&tbp, 1) == 1) { + // cerr << "Got thread buffers, readable count now " << thread_buffers->read_space() << endl; return tbp; } @@ -64,8 +69,9 @@ BufferManager::get_thread_buffers () void BufferManager::put_thread_buffers (ThreadBuffers* tbp) { - Glib::Mutex::Lock em (rb_mutex); + Glib::Threads::Mutex::Lock em (rb_mutex); thread_buffers->write (&tbp, 1); + // cerr << "Put back thread buffers, readable count now " << thread_buffers->read_space() << endl; } void diff --git a/libs/ardour/bundle.cc b/libs/ardour/bundle.cc index 5040882b7a..f38fe0c42f 100644 --- a/libs/ardour/bundle.cc +++ b/libs/ardour/bundle.cc @@ -67,7 +67,7 @@ Bundle::Bundle (boost::shared_ptr other) ChanCount Bundle::nchannels () const { - Glib::Mutex::Lock lm (_channel_mutex); + Glib::Threads::Mutex::Lock lm (_channel_mutex); ChanCount c; for (vector::const_iterator i = _channel.begin(); i != _channel.end(); ++i) { @@ -82,7 +82,7 @@ Bundle::channel_ports (uint32_t c) const { assert (c < nchannels().n_total()); - Glib::Mutex::Lock lm (_channel_mutex); + Glib::Threads::Mutex::Lock lm (_channel_mutex); return _channel[c].ports; } @@ -97,7 +97,7 @@ Bundle::add_port_to_channel (uint32_t ch, string portname) assert (portname.find_first_of (':') != string::npos); { - Glib::Mutex::Lock lm (_channel_mutex); + Glib::Threads::Mutex::Lock lm (_channel_mutex); _channel[ch].ports.push_back (portname); } @@ -116,7 +116,7 @@ Bundle::remove_port_from_channel (uint32_t ch, string portname) bool changed = false; { - Glib::Mutex::Lock lm (_channel_mutex); + Glib::Threads::Mutex::Lock lm (_channel_mutex); PortList& pl = _channel[ch].ports; PortList::iterator i = find (pl.begin(), pl.end(), portname); @@ -142,7 +142,7 @@ Bundle::set_port (uint32_t ch, string portname) assert (portname.find_first_of (':') != string::npos); { - Glib::Mutex::Lock lm (_channel_mutex); + Glib::Threads::Mutex::Lock lm (_channel_mutex); _channel[ch].ports.clear (); _channel[ch].ports.push_back (portname); } @@ -155,7 +155,7 @@ void Bundle::add_channel (std::string const & n, DataType t) { { - Glib::Mutex::Lock lm (_channel_mutex); + Glib::Threads::Mutex::Lock lm (_channel_mutex); _channel.push_back (Channel (n, t)); } @@ -167,7 +167,7 @@ void Bundle::add_channel (std::string const & n, DataType t, PortList p) { { - Glib::Mutex::Lock lm (_channel_mutex); + Glib::Threads::Mutex::Lock lm (_channel_mutex); _channel.push_back (Channel (n, t, p)); } @@ -179,7 +179,7 @@ void Bundle::add_channel (std::string const & n, DataType t, std::string const & p) { { - Glib::Mutex::Lock lm (_channel_mutex); + Glib::Threads::Mutex::Lock lm (_channel_mutex); _channel.push_back (Channel (n, t, p)); } @@ -191,7 +191,7 @@ Bundle::port_attached_to_channel (uint32_t ch, std::string portname) { assert (ch < nchannels().n_total()); - Glib::Mutex::Lock lm (_channel_mutex); + Glib::Threads::Mutex::Lock lm (_channel_mutex); return (std::find (_channel[ch].ports.begin (), _channel[ch].ports.end (), portname) != _channel[ch].ports.end ()); } @@ -203,7 +203,7 @@ Bundle::remove_channel (uint32_t ch) { assert (ch < nchannels().n_total()); - Glib::Mutex::Lock lm (_channel_mutex); + Glib::Threads::Mutex::Lock lm (_channel_mutex); _channel.erase (_channel.begin () + ch); } @@ -211,7 +211,7 @@ Bundle::remove_channel (uint32_t ch) void Bundle::remove_channels () { - Glib::Mutex::Lock lm (_channel_mutex); + Glib::Threads::Mutex::Lock lm (_channel_mutex); _channel.clear (); } @@ -222,7 +222,7 @@ Bundle::remove_channels () bool Bundle::offers_port (std::string p) const { - Glib::Mutex::Lock lm (_channel_mutex); + Glib::Threads::Mutex::Lock lm (_channel_mutex); for (std::vector::const_iterator i = _channel.begin(); i != _channel.end(); ++i) { for (PortList::const_iterator j = i->ports.begin(); j != i->ports.end(); ++j) { @@ -241,7 +241,7 @@ Bundle::offers_port (std::string p) const bool Bundle::offers_port_alone (std::string p) const { - Glib::Mutex::Lock lm (_channel_mutex); + Glib::Threads::Mutex::Lock lm (_channel_mutex); for (std::vector::const_iterator i = _channel.begin(); i != _channel.end(); ++i) { if (i->ports.size() == 1 && i->ports[0] == p) { @@ -261,7 +261,7 @@ Bundle::channel_name (uint32_t ch) const { assert (ch < nchannels().n_total()); - Glib::Mutex::Lock lm (_channel_mutex); + Glib::Threads::Mutex::Lock lm (_channel_mutex); return _channel[ch].name; } @@ -275,7 +275,7 @@ Bundle::set_channel_name (uint32_t ch, std::string const & n) assert (ch < nchannels().n_total()); { - Glib::Mutex::Lock lm (_channel_mutex); + Glib::Threads::Mutex::Lock lm (_channel_mutex); _channel[ch].name = n; } @@ -351,7 +351,7 @@ void Bundle::remove_ports_from_channels () { { - Glib::Mutex::Lock lm (_channel_mutex); + Glib::Threads::Mutex::Lock lm (_channel_mutex); for (uint32_t c = 0; c < _channel.size(); ++c) { _channel[c].ports.clear (); } @@ -370,7 +370,7 @@ Bundle::remove_ports_from_channel (uint32_t ch) assert (ch < nchannels().n_total()); { - Glib::Mutex::Lock lm (_channel_mutex); + Glib::Threads::Mutex::Lock lm (_channel_mutex); _channel[ch].ports.clear (); } @@ -517,7 +517,7 @@ Bundle::channel_type (uint32_t c) const { assert (c < nchannels().n_total()); - Glib::Mutex::Lock lm (_channel_mutex); + Glib::Threads::Mutex::Lock lm (_channel_mutex); return _channel[c].type; } @@ -564,7 +564,7 @@ Bundle::type_channel_to_overall (DataType t, uint32_t c) const return c; } - Glib::Mutex::Lock lm (_channel_mutex); + Glib::Threads::Mutex::Lock lm (_channel_mutex); vector::const_iterator i = _channel.begin (); @@ -598,7 +598,7 @@ Bundle::overall_channel_to_type (DataType t, uint32_t c) const return c; } - Glib::Mutex::Lock lm (_channel_mutex); + Glib::Threads::Mutex::Lock lm (_channel_mutex); uint32_t s = 0; diff --git a/libs/ardour/butler.cc b/libs/ardour/butler.cc index 3e9c7b0d96..db1b316368 100644 --- a/libs/ardour/butler.cc +++ b/libs/ardour/butler.cc @@ -311,7 +311,7 @@ restart: { - Glib::Mutex::Lock lm (request_lock); + Glib::Threads::Mutex::Lock lm (request_lock); if (should_run && (disk_work_outstanding || transport_work_requested())) { // for (DiskstreamList::iterator i = dsl->begin(); i != dsl->end(); ++i) { @@ -349,7 +349,7 @@ Butler::summon () void Butler::stop () { - Glib::Mutex::Lock lm (request_lock); + Glib::Threads::Mutex::Lock lm (request_lock); char c = Request::Pause; (void) ::write (request_pipe[1], &c, 1); paused.wait(request_lock); @@ -358,7 +358,7 @@ Butler::stop () void Butler::wait_until_finished () { - Glib::Mutex::Lock lm (request_lock); + Glib::Threads::Mutex::Lock lm (request_lock); char c = Request::Pause; (void) ::write (request_pipe[1], &c, 1); paused.wait(request_lock); diff --git a/libs/ardour/control_protocol_manager.cc b/libs/ardour/control_protocol_manager.cc index 509f883aed..8611447a93 100644 --- a/libs/ardour/control_protocol_manager.cc +++ b/libs/ardour/control_protocol_manager.cc @@ -46,7 +46,7 @@ ControlProtocolManager::ControlProtocolManager () ControlProtocolManager::~ControlProtocolManager() { - Glib::Mutex::Lock lm (protocols_lock); + Glib::Threads::Mutex::Lock lm (protocols_lock); for (list::iterator i = control_protocols.begin(); i != control_protocols.end(); ++i) { delete (*i); @@ -68,7 +68,7 @@ ControlProtocolManager::set_session (Session* s) SessionHandlePtr::set_session (s); if (_session) { - Glib::Mutex::Lock lm (protocols_lock); + Glib::Threads::Mutex::Lock lm (protocols_lock); for (list::iterator i = control_protocol_info.begin(); i != control_protocol_info.end(); ++i) { if ((*i)->requested || (*i)->mandatory) { @@ -97,7 +97,7 @@ ControlProtocolManager::session_going_away() SessionHandlePtr::session_going_away (); { - Glib::Mutex::Lock lm (protocols_lock); + Glib::Threads::Mutex::Lock lm (protocols_lock); for (list::iterator p = control_protocols.begin(); p != control_protocols.end(); ++p) { delete *p; @@ -160,7 +160,7 @@ ControlProtocolManager::teardown (ControlProtocolInfo& cpi) cpi.descriptor->destroy (cpi.descriptor, cpi.protocol); { - Glib::Mutex::Lock lm (protocols_lock); + Glib::Threads::Mutex::Lock lm (protocols_lock); list::iterator p = find (control_protocols.begin(), control_protocols.end(), cpi.protocol); if (p != control_protocols.end()) { control_protocols.erase (p); @@ -183,7 +183,7 @@ ControlProtocolManager::load_mandatory_protocols () return; } - Glib::Mutex::Lock lm (protocols_lock); + Glib::Threads::Mutex::Lock lm (protocols_lock); for (list::iterator i = control_protocol_info.begin(); i != control_protocol_info.end(); ++i) { if ((*i)->mandatory && ((*i)->protocol == 0)) { @@ -319,7 +319,7 @@ ControlProtocolManager::set_state (const XMLNode& node, int /*version*/) XMLNodeConstIterator citer; XMLProperty* prop; - Glib::Mutex::Lock lm (protocols_lock); + Glib::Threads::Mutex::Lock lm (protocols_lock); clist = node.children(); @@ -357,7 +357,7 @@ XMLNode& ControlProtocolManager::get_state () { XMLNode* root = new XMLNode (state_node_name); - Glib::Mutex::Lock lm (protocols_lock); + Glib::Threads::Mutex::Lock lm (protocols_lock); for (list::iterator i = control_protocol_info.begin(); i != control_protocol_info.end(); ++i) { @@ -426,7 +426,7 @@ ControlProtocolManager::instance () void ControlProtocolManager::midi_connectivity_established () { - Glib::Mutex::Lock lm (protocols_lock); + Glib::Threads::Mutex::Lock lm (protocols_lock); for (list::iterator p = control_protocols.begin(); p != control_protocols.end(); ++p) { (*p)->midi_connectivity_established (); diff --git a/libs/ardour/debug.cc b/libs/ardour/debug.cc index 5d4f42f9c5..67f6f4f1a6 100644 --- a/libs/ardour/debug.cc +++ b/libs/ardour/debug.cc @@ -59,5 +59,6 @@ uint64_t PBD::DEBUG::TempoMap = PBD::new_debug_bit ("tempomap"); uint64_t PBD::DEBUG::SoundGrid = PBD::new_debug_bit ("soundgrid"); uint64_t PBD::DEBUG::SGSurface = PBD::new_debug_bit ("sgsurface"); uint64_t PBD::DEBUG::OrderKeys = PBD::new_debug_bit ("orderkeys"); +uint64_t PBD::DEBUG::Automation = PBD::new_debug_bit ("automation"); diff --git a/libs/ardour/delivery.cc b/libs/ardour/delivery.cc index b58e7b4471..126b599299 100644 --- a/libs/ardour/delivery.cc +++ b/libs/ardour/delivery.cc @@ -71,7 +71,7 @@ Delivery::Delivery (Session& s, boost::shared_ptr io, boost::shared_ptr pannable, boost::shared_ptr mm, const string& name, Role r) - : IOProcessor(s, false, (role_requires_output_ports (r) ? true : false), name) + : IOProcessor(s, false, (role_requires_output_ports (r) ? true : false), name, "", DataType::AUDIO, (r == Send)) , _role (r) , _output_buffers (new BufferSet()) , _current_gain (1.0) diff --git a/libs/ardour/diskstream.cc b/libs/ardour/diskstream.cc index 7a0b0a81b1..553e29244f 100644 --- a/libs/ardour/diskstream.cc +++ b/libs/ardour/diskstream.cc @@ -31,7 +31,7 @@ #include #include -#include +#include #include "pbd/error.h" #include "pbd/basename.h" @@ -171,7 +171,7 @@ Diskstream::set_track (Track* t) void Diskstream::handle_input_change (IOChange change, void * /*src*/) { - Glib::Mutex::Lock lm (state_lock); + Glib::Threads::Mutex::Lock lm (state_lock); if (change.type & (IOChange::ConfigurationChanged|IOChange::ConnectionsChanged)) { @@ -193,7 +193,7 @@ Diskstream::non_realtime_set_speed () { if (_buffer_reallocation_required) { - Glib::Mutex::Lock lm (state_lock); + Glib::Threads::Mutex::Lock lm (state_lock); allocate_temporary_buffers (); _buffer_reallocation_required = false; @@ -315,7 +315,7 @@ Diskstream::set_loop (Location *location) ARDOUR::framepos_t Diskstream::get_capture_start_frame (uint32_t n) const { - Glib::Mutex::Lock lm (capture_info_lock); + Glib::Threads::Mutex::Lock lm (capture_info_lock); if (capture_info.size() > n) { /* this is a completed capture */ @@ -329,7 +329,7 @@ Diskstream::get_capture_start_frame (uint32_t n) const ARDOUR::framecnt_t Diskstream::get_captured_frames (uint32_t n) const { - Glib::Mutex::Lock lm (capture_info_lock); + Glib::Threads::Mutex::Lock lm (capture_info_lock); if (capture_info.size() > n) { /* this is a completed capture */ @@ -356,7 +356,7 @@ Diskstream::use_playlist (boost::shared_ptr playlist) bool prior_playlist = false; { - Glib::Mutex::Lock lm (state_lock); + Glib::Threads::Mutex::Lock lm (state_lock); if (playlist == _playlist) { return 0; diff --git a/libs/ardour/enums.cc b/libs/ardour/enums.cc index 042b10adb5..961041c2da 100644 --- a/libs/ardour/enums.cc +++ b/libs/ardour/enums.cc @@ -20,6 +20,8 @@ #include "pbd/enumwriter.h" #include "midi++/types.h" +#include "evoral/Range.hpp" // shouldn't Evoral have its own enum registration? + #include "ardour/delivery.h" #include "ardour/diskstream.h" #include "ardour/export_channel.h" @@ -122,6 +124,7 @@ setup_enum_writer () Session::PostTransportWork _Session_PostTransportWork; Session::SlaveState _Session_SlaveState; MTC_Status _MIDI_MTC_Status; + Evoral::OverlapType _OverlapType; #define REGISTER(e) enum_writer.register_distinct (typeid(e).name(), i, s); i.clear(); s.clear() #define REGISTER_BITS(e) enum_writer.register_bits (typeid(e).name(), i, s); i.clear(); s.clear() @@ -578,6 +581,13 @@ setup_enum_writer () REGISTER_ENUM(AudioTime); REGISTER_ENUM(MusicTime); REGISTER(_PositionLockStyle); + + REGISTER_ENUM (Evoral::OverlapNone); + REGISTER_ENUM (Evoral::OverlapInternal); + REGISTER_ENUM (Evoral::OverlapStart); + REGISTER_ENUM (Evoral::OverlapEnd); + REGISTER_ENUM (Evoral::OverlapExternal); + REGISTER(_OverlapType); } } /* namespace ARDOUR */ @@ -853,3 +863,17 @@ std::ostream& operator<<(std::ostream& o, const PositionLockStyle& var) std::string s = enum_2_string (var); return o << s; } + +std::istream& operator>>(std::istream& o, Evoral::OverlapType& var) +{ + std::string s; + o >> s; + var = (Evoral::OverlapType) string_2_enum (s, var); + return o; +} + +std::ostream& operator<<(std::ostream& o, const Evoral::OverlapType& var) +{ + std::string s = enum_2_string (var); + return o << s; +} diff --git a/libs/ardour/export_profile_manager.cc b/libs/ardour/export_profile_manager.cc index 6c4f829bb8..af7f6a73f8 100644 --- a/libs/ardour/export_profile_manager.cc +++ b/libs/ardour/export_profile_manager.cc @@ -20,6 +20,7 @@ #include #include +#include #include #include @@ -613,7 +614,7 @@ ExportProfileManager::get_new_format (ExportFormatSpecPtr original) format.reset (new ExportFormatSpecification (*original)); } else { format = handler->add_format(); - format->set_name ("empty format"); + format->set_name (_("empty format")); } std::string path = save_format_to_disk (format); diff --git a/libs/ardour/file_source.cc b/libs/ardour/file_source.cc index 2f7ad2caa8..cd39faa08e 100644 --- a/libs/ardour/file_source.cc +++ b/libs/ardour/file_source.cc @@ -36,7 +36,7 @@ #include #include -#include +#include #include "ardour/data_type.h" #include "ardour/file_source.h" @@ -519,7 +519,7 @@ out: int FileSource::set_source_name (const string& newname, bool destructive) { - Glib::Mutex::Lock lm (_lock); + Glib::Threads::Mutex::Lock lm (_lock); string oldpath = _path; string newpath = _session.change_source_path_by_name (oldpath, _name, newname, destructive); @@ -554,6 +554,15 @@ FileSource::mark_immutable () } } +void +FileSource::mark_immutable_except_write () +{ + /* destructive sources stay writable, and their other flags don't change. */ + if (!(_flags & Destructive)) { + _flags = Flag (_flags & ~(Removable|RemovableIfEmpty|RemoveAtDestroy|CanRename)); + } +} + void FileSource::mark_nonremovable () { diff --git a/libs/ardour/globals.cc b/libs/ardour/globals.cc index 43db5cef53..3c1086871b 100644 --- a/libs/ardour/globals.cc +++ b/libs/ardour/globals.cc @@ -45,6 +45,10 @@ #include #endif +#ifdef check +#undef check /* stupid Apple and their un-namespaced, generic Carbon macros */ +#endif + #include #include diff --git a/libs/ardour/graph.cc b/libs/ardour/graph.cc index 300271c21a..d2fbdbf552 100644 --- a/libs/ardour/graph.cc +++ b/libs/ardour/graph.cc @@ -101,7 +101,7 @@ Graph::reset_thread_list () return; } - Glib::Mutex::Lock lm (_session.engine().process_lock()); + Glib::Threads::Mutex::Lock lm (_session.engine().process_lock()); pthread_t a_thread; if (!_thread_list.empty()) { @@ -162,7 +162,7 @@ Graph::drop_threads () void Graph::clear_other_chain () { - Glib::Mutex::Lock ls (_swap_mutex); + Glib::Threads::Mutex::Lock ls (_swap_mutex); while (1) { if (_setup_chain != _pending_chain) { @@ -275,7 +275,7 @@ Graph::restart_cycle() void Graph::rechain (boost::shared_ptr routelist, GraphEdges const & edges) { - Glib::Mutex::Lock ls (_swap_mutex); + Glib::Threads::Mutex::Lock ls (_swap_mutex); int chain = _setup_chain; DEBUG_TRACE (DEBUG::Graph, string_compose ("============== setup %1\n", chain)); diff --git a/libs/ardour/import.cc b/libs/ardour/import.cc index b47b99571b..433160fc20 100644 --- a/libs/ardour/import.cc +++ b/libs/ardour/import.cc @@ -582,7 +582,15 @@ Session::import_files (ImportStatus& status) boost::shared_ptr fs = boost::dynamic_pointer_cast(*x); if (fs) { - fs->mark_immutable (); + /* Only audio files should be marked as + immutable - we may need to rewrite MIDI + files at any time. + */ + if (boost::dynamic_pointer_cast (fs)) { + fs->mark_immutable (); + } else { + fs->mark_immutable_except_write (); + } fs->mark_nonremovable (); } diff --git a/libs/ardour/internal_return.cc b/libs/ardour/internal_return.cc index ad2ed81194..af6b6110b6 100644 --- a/libs/ardour/internal_return.cc +++ b/libs/ardour/internal_return.cc @@ -16,7 +16,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#include +#include #include "ardour/internal_return.h" #include "ardour/internal_send.h" @@ -37,7 +37,7 @@ InternalReturn::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*e return; } - Glib::Mutex::Lock lm (_sends_mutex, Glib::TRY_LOCK); + Glib::Threads::Mutex::Lock lm (_sends_mutex, Glib::Threads::TRY_LOCK); if (lm.locked ()) { for (list::iterator i = _sends.begin(); i != _sends.end(); ++i) { @@ -53,14 +53,14 @@ InternalReturn::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*e void InternalReturn::add_send (InternalSend* send) { - Glib::Mutex::Lock lm (_sends_mutex); + Glib::Threads::Mutex::Lock lm (_sends_mutex); _sends.push_back (send); } void InternalReturn::remove_send (InternalSend* send) { - Glib::Mutex::Lock lm (_sends_mutex); + Glib::Threads::Mutex::Lock lm (_sends_mutex); _sends.remove (send); } diff --git a/libs/ardour/io.cc b/libs/ardour/io.cc index da79301a31..d39ba7b4f9 100644 --- a/libs/ardour/io.cc +++ b/libs/ardour/io.cc @@ -25,7 +25,7 @@ #include #include -#include +#include #include "pbd/xml++.h" #include "pbd/replace_all.h" @@ -44,7 +44,7 @@ #include "i18n.h" -#define BLOCK_PROCESS_CALLBACK() Glib::Mutex::Lock em (AudioEngine::instance()->process_lock()) +#define BLOCK_PROCESS_CALLBACK() Glib::Threads::Mutex::Lock em (AudioEngine::instance()->process_lock()) using namespace std; using namespace ARDOUR; @@ -58,10 +58,11 @@ PBD::Signal1 IO::PortCountChanged; /** @param default_type The type of port that will be created by ensure_io * and friends if no type is explicitly requested (to avoid breakage). */ -IO::IO (Session& s, const string& name, Direction dir, DataType default_type) +IO::IO (Session& s, const string& name, Direction dir, DataType default_type, bool sendish) : SessionObject (s, name) , _direction (dir) , _default_type (default_type) + , _sendish (sendish) { _active = true; Port::PostDisconnect.connect_same_thread (*this, boost::bind (&IO::disconnect_check, this, _1, _2)); @@ -69,10 +70,11 @@ IO::IO (Session& s, const string& name, Direction dir, DataType default_type) setup_bundle (); } -IO::IO (Session& s, const XMLNode& node, DataType dt) +IO::IO (Session& s, const XMLNode& node, DataType dt, bool sendish) : SessionObject(s, "unnamed io") , _direction (Input) , _default_type (dt) + , _sendish (sendish) { _active = true; pending_state_node = 0; @@ -84,7 +86,7 @@ IO::IO (Session& s, const XMLNode& node, DataType dt) IO::~IO () { - Glib::Mutex::Lock lm (io_lock); + Glib::Threads::Mutex::Lock lm (io_lock); BLOCK_PROCESS_CALLBACK (); @@ -102,7 +104,7 @@ IO::disconnect_check (boost::shared_ptr a, boost::shared_ptr b) we assume that its safely locked by our own ::disconnect(). */ - Glib::Mutex::Lock tm (io_lock, Glib::TRY_LOCK); + Glib::Threads::Mutex::Lock tm (io_lock, Glib::Threads::TRY_LOCK); if (tm.locked()) { /* we took the lock, so we cannot be here from inside @@ -192,7 +194,7 @@ IO::disconnect (boost::shared_ptr our_port, string other_port, void* src) } { - Glib::Mutex::Lock lm (io_lock); + Glib::Threads::Mutex::Lock lm (io_lock); /* check that our_port is really one of ours */ @@ -225,7 +227,7 @@ IO::connect (boost::shared_ptr our_port, string other_port, void* src) } { - Glib::Mutex::Lock lm (io_lock); + Glib::Threads::Mutex::Lock lm (io_lock); /* check that our_port is really one of ours */ @@ -262,7 +264,7 @@ IO::remove_port (boost::shared_ptr port, void* src) BLOCK_PROCESS_CALLBACK (); { - Glib::Mutex::Lock lm (io_lock); + Glib::Threads::Mutex::Lock lm (io_lock); if (_ports.remove(port)) { change.type = IOChange::Type (change.type | IOChange::ConfigurationChanged); @@ -330,7 +332,7 @@ IO::add_port (string destination, void* src, DataType type) { - Glib::Mutex::Lock lm (io_lock); + Glib::Threads::Mutex::Lock lm (io_lock); /* Create a new port */ @@ -375,7 +377,7 @@ int IO::disconnect (void* src) { { - Glib::Mutex::Lock lm (io_lock); + Glib::Threads::Mutex::Lock lm (io_lock); for (PortSet::iterator i = _ports.begin(); i != _ports.end(); ++i) { i->disconnect_all (); @@ -477,7 +479,7 @@ IO::ensure_ports (ChanCount count, bool clear, void* src) change.before = _ports.count (); { - Glib::Mutex::Lock im (io_lock); + Glib::Threads::Mutex::Lock im (io_lock); if (ensure_ports_locked (count, clear, changed)) { return -1; } @@ -519,7 +521,7 @@ IO::state (bool /*full_state*/) vector::iterator ci; int n; LocaleGuard lg (X_("POSIX")); - Glib::Mutex::Lock lm (io_lock); + Glib::Threads::Mutex::Lock lm (io_lock); node->add_property("name", _name); id().print (buf, sizeof (buf)); @@ -881,7 +883,7 @@ IO::create_ports (const XMLNode& node, int version) get_port_counts (node, version, n, c); { - Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ()); + Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ()); if (ensure_ports (n, true, this)) { error << string_compose(_("%1: cannot create I/O ports"), _name) << endmsg; @@ -1097,7 +1099,7 @@ IO::set_ports (const string& str) } { - Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ()); + Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ()); // FIXME: audio-only if (ensure_ports (ChanCount(DataType::AUDIO, nports), true, this)) { @@ -1244,7 +1246,7 @@ IO::connect_ports_to_bundle (boost::shared_ptr c, void* src) BLOCK_PROCESS_CALLBACK (); { - Glib::Mutex::Lock lm2 (io_lock); + Glib::Threads::Mutex::Lock lm2 (io_lock); c->connect (_bundle, _session.engine()); @@ -1276,7 +1278,7 @@ IO::disconnect_ports_from_bundle (boost::shared_ptr c, void* src) BLOCK_PROCESS_CALLBACK (); { - Glib::Mutex::Lock lm2 (io_lock); + Glib::Threads::Mutex::Lock lm2 (io_lock); c->disconnect (_bundle, _session.engine()); @@ -1312,7 +1314,7 @@ IO::disable_connecting () int IO::enable_connecting () { - Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock()); + Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock()); connecting_legal = true; boost::optional r = ConnectingLegal (); return r.get_value_or (0); @@ -1347,10 +1349,18 @@ IO::build_legal_port_name (DataType type) use the (new) translated name. */ - if (_direction == Input) { - suffix += X_("_in"); + if (_sendish) { + if (_direction == Input) { + suffix += X_("_return"); + } else { + suffix += X_("_send"); + } } else { - suffix += X_("_out"); + if (_direction == Input) { + suffix += X_("_in"); + } else { + suffix += X_("_out"); + } } // allow up to 4 digits for the output port number, plus the slash, suffix and extra space @@ -1710,6 +1720,6 @@ IO::physically_connected () const bool IO::has_port (boost::shared_ptr p) const { - Glib::Mutex::Lock lm (io_lock); + Glib::Threads::Mutex::Lock lm (io_lock); return _ports.contains (p); } diff --git a/libs/ardour/io_processor.cc b/libs/ardour/io_processor.cc index fd47e1c06c..d23afce612 100644 --- a/libs/ardour/io_processor.cc +++ b/libs/ardour/io_processor.cc @@ -43,7 +43,7 @@ namespace ARDOUR { class Session; } /* create an IOProcessor that proxies to a new IO object */ IOProcessor::IOProcessor (Session& s, bool with_input, bool with_output, - const string& proc_name, const string io_name, DataType dtype) + const string& proc_name, const string io_name, DataType dtype, bool sendish) : Processor(s, proc_name) { /* these are true in this constructor whether we actually create the associated @@ -54,11 +54,11 @@ IOProcessor::IOProcessor (Session& s, bool with_input, bool with_output, _own_output = true; if (with_input) { - _input.reset (new IO(s, io_name.empty() ? proc_name : io_name, IO::Input, dtype)); + _input.reset (new IO(s, io_name.empty() ? proc_name : io_name, IO::Input, dtype, sendish)); } if (with_output) { - _output.reset (new IO(s, io_name.empty() ? proc_name : io_name, IO::Output, dtype)); + _output.reset (new IO(s, io_name.empty() ? proc_name : io_name, IO::Output, dtype, sendish)); } } diff --git a/libs/ardour/ladspa_plugin.cc b/libs/ardour/ladspa_plugin.cc index 1b3a5ea2e3..be3fefdaac 100644 --- a/libs/ardour/ladspa_plugin.cc +++ b/libs/ardour/ladspa_plugin.cc @@ -279,6 +279,11 @@ void LadspaPlugin::set_parameter (uint32_t which, float val) { if (which < _descriptor->PortCount) { + + if (get_parameter (which) == val) { + return; + } + _shadow_data[which] = (LADSPA_Data) val; #if 0 diff --git a/libs/ardour/location.cc b/libs/ardour/location.cc index e909957e0d..96a289e06f 100644 --- a/libs/ardour/location.cc +++ b/libs/ardour/location.cc @@ -573,7 +573,7 @@ Locations::set_current (Location *loc, bool want_lock) int ret; if (want_lock) { - Glib::Mutex::Lock lm (lock); + Glib::Threads::Mutex::Lock lm (lock); ret = set_current_unlocked (loc); } else { ret = set_current_unlocked (loc); @@ -635,7 +635,7 @@ void Locations::clear () { { - Glib::Mutex::Lock lm (lock); + Glib::Threads::Mutex::Lock lm (lock); for (LocationList::iterator i = locations.begin(); i != locations.end(); ) { @@ -660,7 +660,7 @@ void Locations::clear_markers () { { - Glib::Mutex::Lock lm (lock); + Glib::Threads::Mutex::Lock lm (lock); LocationList::iterator tmp; for (LocationList::iterator i = locations.begin(); i != locations.end(); ) { @@ -682,7 +682,7 @@ void Locations::clear_ranges () { { - Glib::Mutex::Lock lm (lock); + Glib::Threads::Mutex::Lock lm (lock); LocationList::iterator tmp; for (LocationList::iterator i = locations.begin(); i != locations.end(); ) { @@ -711,7 +711,7 @@ Locations::add (Location *loc, bool make_current) assert (loc); { - Glib::Mutex::Lock lm (lock); + Glib::Threads::Mutex::Lock lm (lock); locations.push_back (loc); if (make_current) { @@ -743,7 +743,7 @@ Locations::remove (Location *loc) } { - Glib::Mutex::Lock lm (lock); + Glib::Threads::Mutex::Lock lm (lock); for (i = locations.begin(); i != locations.end(); ++i) { if ((*i) == loc) { @@ -781,7 +781,7 @@ Locations::get_state () { XMLNode *node = new XMLNode ("Locations"); LocationList::iterator iter; - Glib::Mutex::Lock lm (lock); + Glib::Threads::Mutex::Lock lm (lock); for (iter = locations.begin(); iter != locations.end(); ++iter) { node->add_child_nocopy ((*iter)->get_state ()); @@ -812,7 +812,7 @@ Locations::set_state (const XMLNode& node, int version) } { - Glib::Mutex::Lock lm (lock); + Glib::Threads::Mutex::Lock lm (lock); XMLNodeConstIterator niter; for (niter = nlist.begin(); niter != nlist.end(); ++niter) { @@ -910,7 +910,7 @@ Locations::first_location_before (framepos_t frame, bool include_special_ranges) LocationList locs; { - Glib::Mutex::Lock lm (lock); + Glib::Threads::Mutex::Lock lm (lock); locs = locations; } @@ -937,7 +937,7 @@ Locations::first_location_after (framepos_t frame, bool include_special_ranges) LocationList locs; { - Glib::Mutex::Lock lm (lock); + Glib::Threads::Mutex::Lock lm (lock); locs = locations; } @@ -973,7 +973,7 @@ Locations::marks_either_side (framepos_t const frame, framepos_t& before, framep LocationList locs; { - Glib::Mutex::Lock lm (lock); + Glib::Threads::Mutex::Lock lm (lock); locs = locations; } @@ -1067,7 +1067,7 @@ uint32_t Locations::num_range_markers () const { uint32_t cnt = 0; - Glib::Mutex::Lock lm (lock); + Glib::Threads::Mutex::Lock lm (lock); for (LocationList::const_iterator i = locations.begin(); i != locations.end(); ++i) { if ((*i)->is_range_marker()) { ++cnt; @@ -1090,7 +1090,7 @@ Locations::get_location_by_id(PBD::ID id) void Locations::find_all_between (framepos_t start, framepos_t end, LocationList& ll, Location::Flags flags) { - Glib::Mutex::Lock lm (lock); + Glib::Threads::Mutex::Lock lm (lock); for (LocationList::const_iterator i = locations.begin(); i != locations.end(); ++i) { if ((flags == 0 || (*i)->matches (flags)) && diff --git a/libs/ardour/lv2_plugin.cc b/libs/ardour/lv2_plugin.cc index f8a41c5ecd..62bd9f50ad 100644 --- a/libs/ardour/lv2_plugin.cc +++ b/libs/ardour/lv2_plugin.cc @@ -558,7 +558,14 @@ LV2Plugin::set_parameter(uint32_t which, float val) "%1 set parameter %2 to %3\n", name(), which, val)); if (which < lilv_plugin_get_num_ports(_impl->plugin)) { + + if (get_parameter (which) == val) { + return; + } + _shadow_data[which] = val; + + } else { warning << string_compose( _("Illegal parameter number used with plugin \"%1\". " diff --git a/libs/ardour/midi_diskstream.cc b/libs/ardour/midi_diskstream.cc index 5e2a6e23b9..64f02b0ad9 100644 --- a/libs/ardour/midi_diskstream.cc +++ b/libs/ardour/midi_diskstream.cc @@ -31,7 +31,7 @@ #include "pbd/error.h" #include "pbd/basename.h" -#include +#include #include "pbd/xml++.h" #include "pbd/memento_command.h" #include "pbd/enumwriter.h" @@ -131,7 +131,7 @@ MidiDiskstream::init () MidiDiskstream::~MidiDiskstream () { - Glib::Mutex::Lock lm (state_lock); + Glib::Threads::Mutex::Lock lm (state_lock); } @@ -149,7 +149,7 @@ void MidiDiskstream::non_realtime_input_change () { { - Glib::Mutex::Lock lm (state_lock); + Glib::Threads::Mutex::Lock lm (state_lock); if (input_change_pending.type == IOChange::NoChange) { return; @@ -326,7 +326,7 @@ MidiDiskstream::process (framepos_t transport_frame, pframes_t nframes, framecnt return 1; } - Glib::Mutex::Lock sm (state_lock, Glib::TRY_LOCK); + Glib::Threads::Mutex::Lock sm (state_lock, Glib::Threads::TRY_LOCK); if (!sm.locked()) { return 1; @@ -376,7 +376,7 @@ MidiDiskstream::process (framepos_t transport_frame, pframes_t nframes, framecnt } if (buf.size() != 0) { - Glib::Mutex::Lock lm (_gui_feed_buffer_mutex, Glib::TRY_LOCK); + Glib::Threads::Mutex::Lock lm (_gui_feed_buffer_mutex, Glib::Threads::TRY_LOCK); if (lm.locked ()) { /* Copy this data into our GUI feed buffer and tell the GUI @@ -503,7 +503,7 @@ MidiDiskstream::overwrite_existing_buffers () int MidiDiskstream::seek (framepos_t frame, bool complete_refill) { - Glib::Mutex::Lock lm (state_lock); + Glib::Threads::Mutex::Lock lm (state_lock); int ret = -1; if (g_atomic_int_get (&_frames_read_from_ringbuffer) == 0) { @@ -789,7 +789,7 @@ MidiDiskstream::transport_stopped_wallclock (struct tm& /*when*/, time_t /*twhen } /* XXX is there anything we can do if err != 0 ? */ - Glib::Mutex::Lock lm (capture_info_lock); + Glib::Threads::Mutex::Lock lm (capture_info_lock); if (capture_info.empty()) { goto no_capture_stuff_to_do; @@ -1330,7 +1330,7 @@ MidiDiskstream::get_gui_feed_buffer () const { boost::shared_ptr b (new MidiBuffer (AudioEngine::instance()->raw_buffer_size (DataType::MIDI))); - Glib::Mutex::Lock lm (_gui_feed_buffer_mutex); + Glib::Threads::Mutex::Lock lm (_gui_feed_buffer_mutex); b->copy (_gui_feed_buffer); return b; } diff --git a/libs/ardour/midi_model.cc b/libs/ardour/midi_model.cc index a914a0d887..e86b229c71 100644 --- a/libs/ardour/midi_model.cc +++ b/libs/ardour/midi_model.cc @@ -1555,7 +1555,7 @@ MidiModel::edit_lock() boost::shared_ptr ms = _midi_source.lock (); assert (ms); - Glib::Mutex::Lock* source_lock = new Glib::Mutex::Lock (ms->mutex()); + Glib::Threads::Mutex::Lock* source_lock = new Glib::Threads::Mutex::Lock (ms->mutex()); ms->invalidate(); // Release cached iterator's read lock on model return WriteLock(new WriteLockImpl(source_lock, _lock, _control_lock)); } @@ -1807,7 +1807,7 @@ MidiModel::set_midi_source (boost::shared_ptr s) void MidiModel::source_interpolation_changed (Evoral::Parameter p, Evoral::ControlList::InterpolationStyle s) { - Glib::Mutex::Lock lm (_control_lock); + Glib::Threads::Mutex::Lock lm (_control_lock); control(p)->list()->set_interpolation (s); } @@ -1826,7 +1826,7 @@ MidiModel::control_list_interpolation_changed (Evoral::Parameter p, Evoral::Cont void MidiModel::source_automation_state_changed (Evoral::Parameter p, AutoState s) { - Glib::Mutex::Lock lm (_control_lock); + Glib::Threads::Mutex::Lock lm (_control_lock); boost::shared_ptr al = boost::dynamic_pointer_cast (control(p)->list ()); al->set_automation_state (s); } diff --git a/libs/ardour/midi_region.cc b/libs/ardour/midi_region.cc index 518413e2de..8509e55f97 100644 --- a/libs/ardour/midi_region.cc +++ b/libs/ardour/midi_region.cc @@ -24,7 +24,7 @@ #include -#include +#include #include "pbd/xml++.h" #include "pbd/basename.h" @@ -407,7 +407,7 @@ MidiRegion::model_automation_state_changed (Evoral::Parameter const & p) for a given set of filtered_parameters, so now that we've changed that list we must invalidate the iterator. */ - Glib::Mutex::Lock lm (midi_source(0)->mutex()); + Glib::Threads::Mutex::Lock lm (midi_source(0)->mutex()); midi_source(0)->invalidate (); } diff --git a/libs/ardour/midi_source.cc b/libs/ardour/midi_source.cc index 6c6821d773..92795db4ae 100644 --- a/libs/ardour/midi_source.cc +++ b/libs/ardour/midi_source.cc @@ -195,7 +195,7 @@ MidiSource::midi_read (Evoral::EventSink& dst, framepos_t source_sta MidiStateTracker* tracker, std::set const & filtered) const { - Glib::Mutex::Lock lm (_lock); + Glib::Threads::Mutex::Lock lm (_lock); BeatsFramesConverter converter(_session.tempo_map(), source_start); @@ -260,7 +260,7 @@ MidiSource::midi_read (Evoral::EventSink& dst, framepos_t source_sta framecnt_t MidiSource::midi_write (MidiRingBuffer& source, framepos_t source_start, framecnt_t duration) { - Glib::Mutex::Lock lm (_lock); + Glib::Threads::Mutex::Lock lm (_lock); const framecnt_t ret = write_unlocked (source, source_start, duration); @@ -300,8 +300,6 @@ MidiSource::mark_write_starting_now () set_timeline_position (_session.transport_frame ()); _last_write_end = _session.transport_frame (); - cerr << name() << " last write set to " << _last_write_end << endl; - } void @@ -388,7 +386,7 @@ MidiSource::session_saved() */ if (_model && _model->edited()) { - + // if the model is edited, write its contents into // the current source file (overwiting previous contents. diff --git a/libs/ardour/midi_stretch.cc b/libs/ardour/midi_stretch.cc index aa03def614..1794d5ff93 100644 --- a/libs/ardour/midi_stretch.cc +++ b/libs/ardour/midi_stretch.cc @@ -85,7 +85,7 @@ MidiStretch::run (boost::shared_ptr r, Progress*) boost::shared_ptr new_src = boost::dynamic_pointer_cast(nsrcs[0]); assert(new_src); - Glib::Mutex::Lock sl (new_src->mutex ()); + Glib::Threads::Mutex::Lock sl (new_src->mutex ()); new_src->load_model(false, true); boost::shared_ptr new_model = new_src->model(); diff --git a/libs/ardour/midi_track.cc b/libs/ardour/midi_track.cc index 1d352d622b..0f73292c67 100644 --- a/libs/ardour/midi_track.cc +++ b/libs/ardour/midi_track.cc @@ -276,15 +276,13 @@ MidiTrack::set_state_part_two () int MidiTrack::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, int declick, bool& need_butler) { - Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK); + Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK); if (!lm.locked()) { return 0; } boost::shared_ptr diskstream = midi_diskstream(); - automation_snapshot (start_frame); - if (n_outputs().n_total() == 0 && _processors.empty()) { return 0; } @@ -403,7 +401,7 @@ MidiTrack::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_fr void MidiTrack::realtime_locate () { - Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK); + Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK); if (!lm.locked ()) { return; @@ -419,7 +417,7 @@ MidiTrack::realtime_locate () void MidiTrack::realtime_handle_transport_stopped () { - Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK); + Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK); if (!lm.locked ()) { return; diff --git a/libs/ardour/mtc_slave.cc b/libs/ardour/mtc_slave.cc index 6c95730f24..1176c59f25 100644 --- a/libs/ardour/mtc_slave.cc +++ b/libs/ardour/mtc_slave.cc @@ -482,7 +482,7 @@ MTC_Slave::resolution () const void MTC_Slave::queue_reset (bool reset_pos) { - Glib::Mutex::Lock lm (reset_lock); + Glib::Threads::Mutex::Lock lm (reset_lock); reset_pending++; if (reset_pos) { reset_position = true; @@ -492,7 +492,7 @@ MTC_Slave::queue_reset (bool reset_pos) void MTC_Slave::maybe_reset () { - Glib::Mutex::Lock lm (reset_lock); + Glib::Threads::Mutex::Lock lm (reset_lock); if (reset_pending) { reset (reset_position); diff --git a/libs/ardour/plugin_insert.cc b/libs/ardour/plugin_insert.cc index 6e7cfe373f..23cebf4276 100644 --- a/libs/ardour/plugin_insert.cc +++ b/libs/ardour/plugin_insert.cc @@ -267,7 +267,7 @@ PluginInsert::parameter_changed (uint32_t which, float val) boost::shared_ptr ac = automation_control (Evoral::Parameter (PluginAutomation, 0, which)); if (ac) { - ac->set_double (val); + ac->set_value (val); Plugins::iterator i = _plugins.begin(); @@ -552,7 +552,7 @@ PluginInsert::automation_run (BufferSet& bufs, pframes_t nframes) framepos_t end = now + nframes; framecnt_t offset = 0; - Glib::Mutex::Lock lm (control_lock(), Glib::TRY_LOCK); + Glib::Threads::Mutex::Lock lm (control_lock(), Glib::Threads::TRY_LOCK); if (!lm.locked()) { connect_and_run (bufs, nframes, offset, false); diff --git a/libs/ardour/po/ru.po b/libs/ardour/po/ru.po index 7779d2e587..90143e3fdb 100644 --- a/libs/ardour/po/ru.po +++ b/libs/ardour/po/ru.po @@ -1,79 +1,82 @@ # Copyright (C) 2004 Paul Davis # This file is distributed under the same license as the libardour package. # Igor Blinov pitstop@nm.ru, 2004. +# Александр Прокудин , 2012. # msgid "" msgstr "" -"Project-Id-Version: libardour 0.716.1\n" +"Project-Id-Version: libardour 3\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-11-21 16:11-0500\n" -"PO-Revision-Date: 2004-03-31 00:55+0300\n" -"Last-Translator: Igor Blinov pitstop@nm.ru\n" -"Language-Team: Russian\n" +"POT-Creation-Date: 2012-07-15 14:26+0400\n" +"PO-Revision-Date: 2012-07-15 15:36+0400\n" +"Last-Translator: Александр Прокудин \n" +"Language-Team: русский <>\n" "Language: \n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=koi8-r\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" -#: amp.cc:53 automatable.cc:160 +#: amp.cc:57 automatable.cc:161 msgid "Fader" -msgstr "" +msgstr "Фейдер" -#: audio_diskstream.cc:249 +#: audio_diskstream.cc:244 msgid "AudioDiskstream: Playlist \"%1\" isn't an audio playlist" msgstr "" -#: audio_diskstream.cc:302 +#: audio_diskstream.cc:296 msgid "AudioDiskstream %1: there is no existing playlist to make a copy of!" msgstr "" -#: audio_diskstream.cc:788 audio_diskstream.cc:798 +#: audio_diskstream.cc:781 audio_diskstream.cc:791 msgid "" "AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3" msgstr "" -#: audio_diskstream.cc:954 +#: audio_diskstream.cc:947 msgid "AudioDiskstream %1: cannot read %2 from playlist at frame %3" msgstr "" -#: audio_diskstream.cc:1323 audio_diskstream.cc:1340 +#: audio_diskstream.cc:1316 audio_diskstream.cc:1333 msgid "AudioDiskstream %1: cannot write to disk" msgstr "" -#: audio_diskstream.cc:1383 +#: audio_diskstream.cc:1376 msgid "AudioDiskstream \"%1\": cannot flush captured data to disk!" msgstr "" -#: audio_diskstream.cc:1477 +#: audio_diskstream.cc:1470 msgid "%1: could not create region for complete audio file" msgstr "" -#: audio_diskstream.cc:1510 +#: audio_diskstream.cc:1504 msgid "AudioDiskstream: could not create region for captured audio!" msgstr "" -#: audio_diskstream.cc:1624 -#, fuzzy +#: audio_diskstream.cc:1612 msgid "programmer error: %1" -msgstr " : " +msgstr "" -#: audio_diskstream.cc:1839 +#: audio_diskstream.cc:1827 msgid "AudioDiskstream: channel %1 out of range" msgstr "" -#: audio_diskstream.cc:1853 midi_diskstream.cc:1324 +#: audio_diskstream.cc:1841 midi_diskstream.cc:1174 msgid "%1:%2 new capture file not initialized correctly" msgstr "" -#: audio_diskstream.cc:2134 +#: audio_diskstream.cc:2122 msgid "%1: cannot restore pending capture source file %2" msgstr "" -#: audio_diskstream.cc:2156 +#: audio_diskstream.cc:2144 msgid "%1: incorrect number of pending sources listed - ignoring them all" msgstr "" -#: audio_diskstream.cc:2180 +#: audio_diskstream.cc:2168 msgid "%1: cannot create whole-file region from pending capture sources" msgstr "" @@ -81,94 +84,103 @@ msgstr "" msgid "Could not open %1. Audio Library not saved" msgstr "" -#: audio_playlist.cc:369 +#: audio_playlist.cc:692 msgid "" -"programming error: non-audio Region passed to remove_overlap in audio " -"playlist" +"Legacy crossfade involved an incoming region not present in playlist \"%1\" " +"- crossfade discarded" msgstr "" -#: audio_playlist.cc:500 +#: audio_playlist.cc:708 msgid "" -"programming error: non-audio Region tested for overlap in audio playlist" +"Legacy crossfade involved an outgoing region not present in playlist \"%1\" " +"- crossfade discarded" msgstr "" -#: audio_playlist_importer.cc:69 +#: audio_playlist_importer.cc:68 msgid "Audio Playlists" msgstr "" -#: audio_playlist_importer.cc:162 -#, fuzzy +#: audio_playlist_importer.cc:161 msgid "region" -msgstr " " +msgstr "область" -#: audio_playlist_importer.cc:164 -#, fuzzy +#: audio_playlist_importer.cc:163 msgid "regions" -msgstr " " +msgstr "" -#: audio_playlist_importer.cc:175 audio_track_importer.cc:244 +#: audio_playlist_importer.cc:174 audio_track_importer.cc:245 msgid "A playlist with this name already exists, please rename it." msgstr "" -#: audio_playlist_importer.cc:260 +#: audio_playlist_importer.cc:183 +msgid "badly-formed XML in imported playlist" +msgstr "" + +#: audio_playlist_importer.cc:265 msgid "Audio Playlists (unused)" msgstr "" -#: audio_playlist_source.cc:176 audiosource.cc:918 file_source.cc:536 -#: midi_playlist_source.cc:149 midi_playlist_source.cc:157 -#: midi_playlist_source.cc:164 midi_source.cc:360 plugin_insert.cc:642 -#: session.cc:2266 session.cc:2299 session.cc:3385 session_handle.cc:87 -#: sndfilesource.cc:123 -#, fuzzy +#: audio_playlist_source.cc:171 audiosource.cc:913 file_source.cc:527 +#: midi_playlist_source.cc:144 midi_playlist_source.cc:152 +#: midi_playlist_source.cc:159 midi_source.cc:366 plugin_insert.cc:644 +#: session.cc:2412 session.cc:2445 session.cc:3556 session_handle.cc:87 +#: sndfilesource.cc:121 msgid "programming error: %1" -msgstr " : " +msgstr "programming error: %1" -#: audio_region_importer.cc:74 -#, fuzzy +#: audio_region_importer.cc:75 msgid "Audio Regions" -msgstr " " +msgstr "Звуковые области" -#: audio_region_importer.cc:144 +#: audio_region_importer.cc:145 msgid "Length: " -msgstr "" +msgstr "Длительность:" -#: audio_region_importer.cc:146 +#: audio_region_importer.cc:147 msgid "" "\n" "Position: " msgstr "" +"\n" +"Позиция: " -#: audio_region_importer.cc:148 +#: audio_region_importer.cc:149 msgid "" "\n" "Channels: " msgstr "" +"\n" +"Каналов: " -#: audio_track.cc:177 +#: audio_track.cc:167 msgid "Unknown bundle \"%1\" listed for input of %2" msgstr "" -#: audio_track.cc:179 +#: audio_track.cc:169 msgid "in 1" msgstr "" -#: audio_track.cc:180 +#: audio_track.cc:170 msgid "No input bundles available as a replacement" msgstr "" -#: audio_track.cc:184 +#: audio_track.cc:174 msgid "Bundle %1 was not available - \"in 1\" used instead" msgstr "" -#: audio_track.cc:193 +#: audio_track.cc:183 msgid "improper input channel list in XML node (%1)" msgstr "" #: audio_track_importer.cc:69 msgid "Audio Tracks" +msgstr "Звуковые дорожки" + +#: audio_track_importer.cc:254 audio_track_importer.cc:260 +msgid "badly-formed XML in imported track" msgstr "" -#: audio_track_importer.cc:273 +#: audio_track_importer.cc:288 msgid "Error Importing Audio track %1" msgstr "" @@ -180,62 +192,61 @@ msgstr "" msgid "VAMP Plugin \"%1\" could not be loaded" msgstr "" -#: audioengine.cc:190 +#: audioengine.cc:184 msgid "" "This version of JACK is old - you should upgrade to a newer version that " "supports jack_port_type_get_buffer_size()" msgstr "" -#: audioengine.cc:194 +#: audioengine.cc:188 msgid "Connect session to engine" msgstr "" -#: audioengine.cc:772 +#: audioengine.cc:839 msgid "" "a port with the name \"%1\" already exists: check for duplicated track/bus " "names" msgstr "" -#: audioengine.cc:774 session.cc:1534 +#: audioengine.cc:841 msgid "" "No more JACK ports are available. You will need to stop %1 and restart JACK " -"with ports if you need this many tracks." +"with more ports if you need this many tracks." msgstr "" -#: audioengine.cc:777 -#, fuzzy +#: audioengine.cc:844 msgid "AudioEngine: cannot register port \"%1\": %2" -msgstr "LADSPA: \"%1\" (%2)" +msgstr "AudioEngine: cannot register port \"%1\": %2" -#: audioengine.cc:807 +#: audioengine.cc:874 msgid "unable to create port: %1" msgstr "" -#: audioengine.cc:857 +#: audioengine.cc:928 msgid "connect called before engine was started" msgstr "" -#: audioengine.cc:883 +#: audioengine.cc:954 msgid "AudioEngine: cannot connect %1 (%2) to %3 (%4)" msgstr "" -#: audioengine.cc:898 audioengine.cc:929 +#: audioengine.cc:969 audioengine.cc:1000 msgid "disconnect called before engine was started" msgstr "" -#: audioengine.cc:977 +#: audioengine.cc:1048 msgid "get_port_by_name() called before engine was started" msgstr "" -#: audioengine.cc:1008 +#: audioengine.cc:1100 msgid "get_ports called before engine was started" msgstr "" -#: audioengine.cc:1332 +#: audioengine.cc:1422 msgid "failed to connect to JACK" msgstr "" -#: audioregion.cc:1460 +#: audioregion.cc:1707 msgid "" "You have requested an operation that requires audio analysis.\n" "\n" @@ -250,205 +261,182 @@ msgid "" "this and future transient-detection operations.\n" msgstr "" -#: audiosource.cc:203 +#: audiosource.cc:199 msgid "cannot rename peakfile for %1 from %2 to %3 (%4)" -msgstr "" +msgstr "cannot rename peakfile for %1 from %2 to %3 (%4)" -#: audiosource.cc:230 -#, fuzzy +#: audiosource.cc:226 msgid "AudioSource: cannot stat peakfile \"%1\"" -msgstr "Ardour: \"%1\"" +msgstr "AudioSource: cannot stat peakfile \"%1\"" -#: audiosource.cc:370 +#: audiosource.cc:366 msgid "cannot read sample data for unscaled peak computation" -msgstr "" +msgstr "cannot read sample data for unscaled peak computation" -#: audiosource.cc:391 -#, fuzzy +#: audiosource.cc:387 msgid "AudioSource: cannot open peakpath (a) \"%1\" (%2)" -msgstr "LADSPA: \"%1\" (%2)" +msgstr "AudioSource: cannot open peakpath (a) \"%1\" (%2)" -#: audiosource.cc:468 -#, fuzzy +#: audiosource.cc:463 msgid "AudioSource: cannot open peakpath (b) \"%1\" (%2)" -msgstr "LADSPA: \"%1\" (%2)" +msgstr "AudioSource: cannot open peakpath (b) \"%1\" (%2)" -#: audiosource.cc:592 +#: audiosource.cc:587 msgid "" "AudioSource[%1]: peak read - cannot read %2 samples at offset %3 of %4 (%5)" msgstr "" +"AudioSource[%1]: peak read - cannot read %2 samples at offset %3 of %4 (%5)" -#: audiosource.cc:672 +#: audiosource.cc:667 msgid "%1: could not write read raw data for peak computation (%2)" -msgstr "" +msgstr "%1: could not write read raw data for peak computation (%2)" -#: audiosource.cc:711 -#, fuzzy +#: audiosource.cc:706 msgid "AudioSource: cannot open peakpath (c) \"%1\" (%2)" -msgstr "LADSPA: \"%1\" (%2)" +msgstr "AudioSource: cannot open peakpath (c) \"%1\" (%2)" -#: audiosource.cc:778 audiosource.cc:891 +#: audiosource.cc:773 audiosource.cc:886 msgid "%1: could not write peak file data (%2)" -msgstr "" +msgstr "%1: could not write peak file data (%2)" -#: audiosource.cc:929 +#: audiosource.cc:924 msgid "could not truncate peakfile %1 to %2 (error: %3)" -msgstr "" +msgstr "could not truncate peakfile %1 to %2 (error: %3)" -#: auditioner.cc:89 +#: auditioner.cc:87 msgid "no outputs available for auditioner - manual connection required" msgstr "" -#: auditioner.cc:160 +#: auditioner.cc:135 msgid "Auditioning of non-audio regions not yet supported" msgstr "" -#: auditioner.cc:185 +#: auditioner.cc:160 msgid "Cannot setup auditioner processing flow for %1 channels" msgstr "" -#: automatable.cc:79 +#: automatable.cc:84 msgid "Automation node has no path property" msgstr "" -#: automatable.cc:101 +#: automatable.cc:104 msgid "cannot open %2 to load automation data (%3)" msgstr "" -#: automatable.cc:131 -#, fuzzy +#: automatable.cc:132 msgid "cannot load automation data from %2" -msgstr "LADSPA: \"%1\" (%2)" +msgstr "cannot load automation data from %2" -#: automation_list.cc:371 +#: automation_list.cc:353 msgid "automation list: cannot load coordinates from XML, all points ignored" -msgstr "" +msgstr "automation list: cannot load coordinates from XML, all points ignored" -#: automation_list.cc:416 +#: automation_list.cc:399 msgid "" "automation list: no x-coordinate stored for control point (point ignored)" msgstr "" +"automation list: no x-coordinate stored for control point (point ignored)" -#: automation_list.cc:422 +#: automation_list.cc:405 msgid "" "automation list: no y-coordinate stored for control point (point ignored)" msgstr "" +"automation list: no y-coordinate stored for control point (point ignored)" -#: automation_list.cc:436 +#: automation_list.cc:421 msgid "" "AutomationList: passed XML node called %1, not \"AutomationList\" - ignored" msgstr "" -#: butler.cc:94 +#: butler.cc:91 msgid "Cannot create transport request signal pipe (%1)" msgstr "" -#: butler.cc:100 butler.cc:106 +#: butler.cc:97 butler.cc:103 msgid "UI: cannot set O_NONBLOCK on butler request pipe (%1)" msgstr "" -#: butler.cc:112 +#: butler.cc:109 msgid "Session: could not create butler thread" msgstr "" -#: butler.cc:159 +#: butler.cc:156 msgid "poll on butler request pipe failed (%1)" msgstr "" -#: butler.cc:166 +#: butler.cc:163 msgid "Error on butler thread request pipe: fd=%1 err=%2" msgstr "" -#: butler.cc:207 +#: butler.cc:201 msgid "Error reading from butler request pipe" msgstr "" -#: butler.cc:254 +#: butler.cc:248 msgid "Butler read ahead failure on dstream %1" msgstr "" -#: butler.cc:291 +#: butler.cc:285 msgid "Butler write-behind failure on dstream %1" msgstr "" -#: control_protocol_manager.cc:123 +#: control_protocol_manager.cc:131 msgid "control protocol name \"%1\" has no descriptor" msgstr "" -#: control_protocol_manager.cc:128 +#: control_protocol_manager.cc:136 msgid "control protocol name \"%1\" could not be initialized" msgstr "" -#: control_protocol_manager.cc:181 +#: control_protocol_manager.cc:191 msgid "Instantiating mandatory control protocol %1" msgstr "" -#: control_protocol_manager.cc:202 -msgid "looking for control protocols in %1" +#: control_protocol_manager.cc:212 +msgid "looking for control protocols in %1\n" msgstr "" -#: control_protocol_manager.cc:218 +#: control_protocol_manager.cc:237 msgid "Control protocol %1 not usable" msgstr "" -#: control_protocol_manager.cc:235 +#: control_protocol_manager.cc:254 msgid "Control surface protocol discovered: \"%1\"" msgstr "" -#: control_protocol_manager.cc:253 -#, fuzzy +#: control_protocol_manager.cc:272 msgid "ControlProtocolManager: cannot load module \"%1\" (%2)" -msgstr "LADSPA: \"%1\" (%2)" +msgstr "ControlProtocolManager: cannot load module \"%1\" (%2)" -#: control_protocol_manager.cc:261 +#: control_protocol_manager.cc:280 msgid "ControlProtocolManager: module \"%1\" has no descriptor function." msgstr "" -#: control_protocol_manager.cc:378 +#: control_protocol_manager.cc:399 msgid "control protocol XML node has no name property. Ignored." msgstr "" -#: control_protocol_manager.cc:385 +#: control_protocol_manager.cc:406 msgid "control protocol \"%1\" is not known. Ignored" msgstr "" -#: crossfade.cc:137 -msgid "Crossfade: no \"in\" region in state" -msgstr "" - -#: crossfade.cc:153 -msgid "Crossfade: no \"in\" region %1 found in playlist %2 nor in region map" -msgstr "" - -#: crossfade.cc:163 -msgid "Crossfade: no \"out\" region in state" -msgstr "" - -#: crossfade.cc:176 -msgid "Crossfade: no \"out\" region %1 found in playlist %2 nor in region map" -msgstr "" - -#: crossfade.cc:789 -msgid "old-style crossfade information - no position information" -msgstr "" - -#: cycle_timer.cc:36 +#: cycle_timer.cc:38 msgid "CycleTimer::get_mhz(): can't open /proc/cpuinfo" msgstr "" -#: cycle_timer.cc:48 +#: cycle_timer.cc:50 msgid "CycleTimer::get_mhz(): cannot locate cpu MHz in /proc/cpuinfo" msgstr "" -#: cycle_timer.cc:71 +#: cycle_timer.cc:73 msgid "cannot locate cpu MHz in /proc/cpuinfo" msgstr "" -#: data_type.cc:27 io.cc:1267 +#: data_type.cc:27 io.cc:1337 msgid "audio" msgstr "" -#: data_type.cc:28 session.cc:1479 session.cc:1482 +#: data_type.cc:28 session.cc:1605 session.cc:1608 msgid "MIDI" msgstr "" @@ -456,15 +444,15 @@ msgstr "" msgid "unknown" msgstr "" -#: delivery.cc:115 +#: delivery.cc:114 msgid "main outs" msgstr "" -#: delivery.cc:118 +#: delivery.cc:117 send.cc:61 msgid "listen" msgstr "" -#: diskstream.cc:314 +#: diskstream.cc:303 msgid "Location \"%1\" not valid for track loop (start >= end)" msgstr "" @@ -476,89 +464,89 @@ msgstr "" msgid "Export failed: %1" msgstr "" -#: export_filename.cc:210 +#: export_filename.cc:209 msgid "No Time" -msgstr "" +msgstr "Без времени" -#: export_filename.cc:219 +#: export_filename.cc:218 msgid "Invalid time format" msgstr "" -#: export_filename.cc:228 +#: export_filename.cc:227 msgid "No Date" -msgstr "" +msgstr "Без даты" -#: export_filename.cc:243 +#: export_filename.cc:242 msgid "Invalid date format" msgstr "" -#: export_format_manager.cc:56 +#: export_format_manager.cc:57 msgid "CD" msgstr "" -#: export_format_manager.cc:65 +#: export_format_manager.cc:66 msgid "DVD-A" -msgstr "" +msgstr "DVD-A" -#: export_format_manager.cc:79 +#: export_format_manager.cc:80 msgid "iPod" msgstr "" -#: export_format_manager.cc:90 +#: export_format_manager.cc:91 msgid "Something else" -msgstr "" - -#: export_format_manager.cc:109 -msgid "Any" -msgstr "" +msgstr "Что-то ещё" #: export_format_manager.cc:110 -msgid "Lossless (linear PCM)" -msgstr "" +msgid "Any" +msgstr "Любое" #: export_format_manager.cc:111 -msgid "Lossy compression" -msgstr "" +msgid "Lossless (linear PCM)" +msgstr "Без потерь (линейный PCM)" #: export_format_manager.cc:112 +msgid "Lossy compression" +msgstr "Сжатие с потерями" + +#: export_format_manager.cc:113 msgid "Lossless compression" -msgstr "" +msgstr "Сжатие без потерь" -#: export_format_manager.cc:206 export_format_specification.cc:551 +#: export_format_manager.cc:207 export_format_specification.cc:572 msgid "Session rate" +msgstr "Частота сеанса" + +#: export_format_specification.cc:533 +msgid "normalize" msgstr "" -#: export_format_specification.cc:514 -msgid "normalize, " +#: export_format_specification.cc:537 +msgid "trim" msgstr "" -#: export_format_specification.cc:518 -msgid "trim, " +#: export_format_specification.cc:539 +msgid "trim start" msgstr "" -#: export_format_specification.cc:520 -msgid "trim start, " -msgstr "" - -#: export_format_specification.cc:522 -msgid "trim end, " +#: export_format_specification.cc:541 +msgid "trim end" msgstr "" #: export_formats.cc:49 msgid "Shaped Noise" -msgstr "" +msgstr "По очертаниям" #: export_formats.cc:50 msgid "Triangular" -msgstr "" +msgstr "Треугольное" #: export_formats.cc:51 msgid "Rectangular" -msgstr "" +msgstr "Прямоугольное" #: export_formats.cc:52 msgid "None" -msgstr "" +msgstr "Нет" #: export_formats.cc:159 msgid "8bit" @@ -589,343 +577,405 @@ msgid "8bit unsigned" msgstr "" #: export_formats.cc:173 -#, fuzzy msgid "Vorbis sample format" -msgstr "" +msgstr "" #: export_formats.cc:175 -#, fuzzy msgid "No sample format" -msgstr "" +msgstr "" -#: export_handler.cc:290 +#: export_handler.cc:313 msgid "Editor: cannot open \"%1\" as export file for CD marker file" msgstr "" -#: export_profile_manager.cc:71 +#: export_handler.cc:395 export_handler.cc:398 +msgid "an error occured while writing a TOC/CUE file: %1" +msgstr "" + +#: export_handler.cc:620 export_handler.cc:678 +msgid "Cannot convert %1 to Latin-1 text" +msgstr "" + +#: export_profile_manager.cc:75 msgid "Searching for export formats in %1" msgstr "" -#: export_profile_manager.cc:322 +#: export_profile_manager.cc:81 +msgid "Unable to create export format directory %1: %2" +msgstr "" + +#: export_profile_manager.cc:238 +msgid "Unable to remove export preset %1: %2" +msgstr "Невозможно удалить профиль экспорта %1: %2" + +#: export_profile_manager.cc:328 msgid "Selection" -msgstr "" +msgstr "Выделение" -#: export_profile_manager.cc:440 +#: export_profile_manager.cc:446 msgid "Session" -msgstr "" +msgstr "Сеанс" -#: export_profile_manager.cc:760 +#: export_profile_manager.cc:567 +msgid "Unable to rename export format %1 to %2: %3" +msgstr "Невозможно переименовать профиль экспорта %1 в %2: %3" + +#: export_profile_manager.cc:599 +msgid "Unable to remove export profile %1: %2" +msgstr "Невозможно удалить профиль экспорта %1: %2" + +#: export_profile_manager.cc:616 +msgid "empty format" +msgstr "неопределённый формат" + +#: export_profile_manager.cc:785 msgid "No timespan has been selected!" -msgstr "" +msgstr "отрезок времени не указан!" -#: export_profile_manager.cc:764 +#: export_profile_manager.cc:789 msgid "No channels have been selected!" -msgstr "" +msgstr "нет выбранных каналов!" -#: export_profile_manager.cc:768 +#: export_profile_manager.cc:793 msgid "Some channels are empty" -msgstr "" +msgstr "некоторые каналы пусты" -#: export_profile_manager.cc:801 +#: export_profile_manager.cc:826 msgid "No format selected!" -msgstr "" +msgstr "формат не выбран!" -#: export_profile_manager.cc:803 +#: export_profile_manager.cc:828 msgid "All channels are empty!" -msgstr "" +msgstr "все каналы пусты!" -#: export_profile_manager.cc:805 +#: export_profile_manager.cc:830 msgid "One or more of the selected formats is not compatible with this system!" msgstr "" -#: export_profile_manager.cc:808 +#: export_profile_manager.cc:833 msgid "" "%1 supports only %2 channels, but you have %3 channels in your channel " "configuration" msgstr "" -#: file_source.cc:201 session_state.cc:2915 +#: file_source.cc:196 session_state.cc:2873 msgid "" "there are already 1000 files with names like %1; versioning discontinued" msgstr "" -#: file_source.cc:210 +#: file_source.cc:205 msgid "cannot rename file source from %1 to %2 (%3)" msgstr "" -#: file_source.cc:253 file_source.cc:385 +#: file_source.cc:248 file_source.cc:376 msgid "FileSource: search path not set" msgstr "" -#: file_source.cc:320 file_source.cc:455 +#: file_source.cc:311 file_source.cc:446 msgid "Filesource: cannot find required file (%1): while searching %2" msgstr "" -#: file_source.cc:447 +#: file_source.cc:438 msgid "" "FileSource: \"%1\" is ambigous when searching %2\n" "\t" msgstr "" -#: file_source.cc:501 +#: file_source.cc:492 msgid "Filesource: cannot find required file (%1): %2" msgstr "" -#: file_source.cc:508 +#: file_source.cc:499 msgid "Filesource: cannot check for existing file (%1): %2" msgstr "" -#: file_source.cc:542 +#: file_source.cc:533 msgid "" "Programming error! %1 tried to rename a file over another file! It's safe to " "continue working, but please report this to the developers." msgstr "" -#: file_source.cc:547 +#: file_source.cc:538 msgid "cannot rename file %1 to %2 (%3)" msgstr "" -#: filter.cc:65 +#: filesystem_paths.cc:73 +msgid "Cannot create Configuration directory %1 - cannot run" +msgstr "" + +#: filesystem_paths.cc:78 +msgid "" +"Configuration directory %1 already exists and is not a directory/folder - " +"cannot run" +msgstr "" + +#: filesystem_paths.cc:91 +msgid "ARDOUR_DLL_PATH not set in environment - exiting\n" +msgstr "" + +#: filesystem_paths.cc:107 +msgid "ARDOUR_CONFIG_PATH not set in environment - exiting\n" +msgstr "" + +#: filesystem_paths.cc:127 +msgid "ARDOUR_DATA_PATH not set in environment - exiting\n" +msgstr "" + +#: filter.cc:66 msgid "filter: error creating name for new file based on %1" msgstr "" -#: filter.cc:77 +#: filter.cc:78 msgid "filter: error creating new file %1 (%2)" msgstr "" -#: find_session.cc:31 +#: find_session.cc:32 msgid "Could not resolve path: %1 (%2)" msgstr "" -#: find_session.cc:43 +#: find_session.cc:44 msgid "cannot check session path %1 (%2)" msgstr "" -#: find_session.cc:69 +#: find_session.cc:70 msgid "cannot check statefile %1 (%2)" msgstr "" -#: find_session.cc:105 +#: find_session.cc:106 msgid "%1 is not a snapshot file" msgstr "" -#: find_session.cc:122 +#: find_session.cc:123 msgid "cannot determine current working directory (%1)" msgstr "" -#: find_session.cc:139 +#: find_session.cc:140 msgid "unknown file type for session %1" msgstr "" -#: globals.cc:227 +#: globals.cc:198 msgid "Could not set system open files limit to \"unlimited\"" msgstr "" -#: globals.cc:229 +#: globals.cc:200 msgid "Could not set system open files limit to %1" msgstr "" -#: globals.cc:233 +#: globals.cc:204 msgid "Removed open file count limit. Excellent!" msgstr "" -#: globals.cc:235 +#: globals.cc:206 msgid "%1 will be limited to %2 open files" msgstr "" -#: globals.cc:239 +#: globals.cc:210 msgid "Could not get system open files limit (%1)" msgstr "" -#: globals.cc:288 -#, fuzzy +#: globals.cc:261 msgid "Loading configuration" -msgstr "Ardour: \"%1\"" +msgstr "" -#: import.cc:206 +#: import.cc:207 msgid "Could not find a source for %1 even though we are updating this file!" msgstr "" -#: import.cc:237 +#: import.cc:238 msgid "Unable to create file %1 during import" msgstr "" -#: import.cc:263 +#: import.cc:264 msgid "Resampling %1 from %2kHz to %3kHz" -msgstr "" +msgstr "Ресэмплинг %1 из %2КГц в %3КГц" -#: import.cc:269 +#: import.cc:270 msgid "Copying %1" msgstr "" -#: import.cc:446 +#: import.cc:447 msgid "Track %1 of %2 contained no usable MIDI data" msgstr "" -#: import.cc:453 +#: import.cc:454 msgid "MIDI file %1 was not readable (no reason available" msgstr "" -#: import.cc:499 +#: import.cc:500 msgid "Import: cannot open input sound file \"%1\"" msgstr "" -#: import.cc:510 +#: import.cc:511 msgid "Import: error opening MIDI file" msgstr "" -#: import.cc:549 +#: import.cc:550 msgid "Loading MIDI file %1" msgstr "" -#: io.cc:184 +#: import.cc:607 +msgid "Failed to remove some files after failed/cancelled import operation" +msgstr "" + +#: instrument_info.cc:40 instrument_info.cc:61 +msgid "Unknown" +msgstr "" + +#: instrument_info.cc:200 +msgid "preset %1 (bank %2)" +msgstr "" + +#: internal_send.cc:278 internal_send.cc:279 +msgid "%1 - cannot find any track/bus with the ID %2 to connect to" +msgstr "" + +#: io.cc:206 msgid "IO: cannot disconnect port %1 from %2" msgstr "" -#: io.cc:310 io.cc:395 +#: io.cc:341 io.cc:426 msgid "IO: cannot register input port %1" msgstr "" -#: io.cc:315 io.cc:400 +#: io.cc:346 io.cc:431 msgid "IO: cannot register output port %1" msgstr "" -#: io.cc:558 io.cc:614 +#: io.cc:589 io.cc:645 msgid "incorrect XML node \"%1\" passed to IO object" msgstr "" -#: io.cc:673 +#: io.cc:704 msgid "in" msgstr "" -#: io.cc:673 -#, fuzzy +#: io.cc:704 msgid "out" -msgstr "" +msgstr "" -#: io.cc:674 +#: io.cc:705 msgid "input" msgstr "" -#: io.cc:674 +#: io.cc:705 msgid "output" msgstr "" -#: io.cc:684 +#: io.cc:715 msgid "Unknown bundle \"%1\" listed for %2 of %3" msgstr "" -#: io.cc:750 +#: io.cc:781 msgid "Bundle %1 was not available - \"%2\" used instead" msgstr "" -#: io.cc:753 +#: io.cc:784 msgid "No %1 bundles available as a replacement" msgstr "" -#: io.cc:856 +#: io.cc:887 msgid "%1: cannot create I/O ports" msgstr "" -#: io.cc:946 io.cc:1050 +#: io.cc:1015 io.cc:1119 msgid "IO: badly formed string in XML node for inputs \"%1\"" msgstr "" -#: io.cc:951 io.cc:1055 +#: io.cc:1020 io.cc:1124 msgid "bad input string in XML node \"%1\"" msgstr "" -#: io.cc:989 +#: io.cc:1058 msgid "IO: badly formed string in XML node for outputs \"%1\"" msgstr "" -#: io.cc:994 +#: io.cc:1063 msgid "IO: bad output string in XML node \"%1\"" msgstr "" -#: io.cc:1269 +#: io.cc:1339 msgid "midi" msgstr "" -#: io.cc:1324 +#: io.cc:1394 #, c-format msgid "%s %u" msgstr "" -#: io.cc:1371 +#: io.cc:1441 #, c-format msgid "%s in" msgstr "" -#: io.cc:1373 +#: io.cc:1443 #, c-format msgid "%s out" msgstr "" -#: io.cc:1448 session.cc:447 session.cc:476 +#: io.cc:1518 session.cc:455 session.cc:484 msgid "mono" msgstr "" -#: io.cc:1450 session.cc:460 session.cc:490 +#: io.cc:1520 session.cc:468 session.cc:498 msgid "L" msgstr "" -#: io.cc:1450 session.cc:462 session.cc:492 +#: io.cc:1520 session.cc:470 session.cc:500 msgid "R" msgstr "" -#: io.cc:1452 io.cc:1458 +#: io.cc:1522 io.cc:1528 #, c-format msgid "%d" msgstr "" -#: ladspa_plugin.cc:89 +#: ladspa_plugin.cc:87 msgid "LADSPA: module has no descriptor function." msgstr "" -#: ladspa_plugin.cc:94 +#: ladspa_plugin.cc:92 msgid "LADSPA: plugin has gone away since discovery!" msgstr "" -#: ladspa_plugin.cc:101 +#: ladspa_plugin.cc:99 msgid "LADSPA: \"%1\" cannot be used, since it cannot do inplace processing" msgstr "" -#: ladspa_plugin.cc:293 +#: ladspa_plugin.cc:296 msgid "" "illegal parameter number used with plugin \"%1\". This mayindicate a change " "in the plugin design, and presets may beinvalid" msgstr "" -#: ladspa_plugin.cc:370 ladspa_plugin.cc:415 +#: ladspa_plugin.cc:373 ladspa_plugin.cc:418 msgid "Bad node sent to LadspaPlugin::set_state" msgstr "" -#: ladspa_plugin.cc:383 ladspa_plugin.cc:428 +#: ladspa_plugin.cc:386 ladspa_plugin.cc:431 msgid "LADSPA: no ladspa port number" msgstr "" -#: ladspa_plugin.cc:389 ladspa_plugin.cc:434 +#: ladspa_plugin.cc:392 ladspa_plugin.cc:437 msgid "LADSPA: no ladspa port data" msgstr "" -#: ladspa_plugin.cc:704 +#: ladspa_plugin.cc:707 msgid "LADSPA: cannot load module from \"%1\"" msgstr "" -#: ladspa_plugin.cc:814 +#: ladspa_plugin.cc:817 msgid "Could not locate HOME. Preset not removed." msgstr "" -#: ladspa_plugin.cc:851 ladspa_plugin.cc:857 +#: ladspa_plugin.cc:854 ladspa_plugin.cc:860 msgid "Could not create %1. Preset not saved. (%2)" msgstr "" -#: ladspa_plugin.cc:864 +#: ladspa_plugin.cc:867 msgid "Error saving presets file %1." msgstr "" -#: ladspa_plugin.cc:902 +#: ladspa_plugin.cc:905 msgid "Could not locate HOME. Preset not saved." msgstr "" @@ -965,7 +1015,7 @@ msgstr "" msgid "incorrect XML mode passed to Locations::set_state" msgstr "" -#: location.cc:810 session.cc:2244 session.cc:4141 session_state.cc:1120 +#: location.cc:810 session.cc:4280 session_state.cc:1106 msgid "session" msgstr "" @@ -992,6 +1042,8 @@ msgid "" "\n" "end: " msgstr "" +"\n" +"конец: " #: location_importer.cc:146 msgid "" @@ -1011,52 +1063,52 @@ msgid "" "You may rename the imported location:" msgstr "" -#: midi_diskstream.cc:166 +#: midi_diskstream.cc:162 msgid "" "%1: I/O configuration change %4 requested to use %2, but channel setup is %3" msgstr "" -#: midi_diskstream.cc:219 +#: midi_diskstream.cc:215 msgid "MidiDiskstream: Playlist \"%1\" isn't an midi playlist" msgstr "" -#: midi_diskstream.cc:273 +#: midi_diskstream.cc:268 msgid "MidiDiskstream %1: there is no existing playlist to make a copy of!" msgstr "" -#: midi_diskstream.cc:766 +#: midi_diskstream.cc:612 msgid "MidiDiskstream %1: cannot read %2 from playlist at frame %3" msgstr "" -#: midi_diskstream.cc:907 +#: midi_diskstream.cc:753 msgid "MidiDiskstream %1: cannot write to disk" msgstr "" -#: midi_diskstream.cc:940 +#: midi_diskstream.cc:786 msgid "MidiDiskstream \"%1\": cannot flush captured data to disk!" msgstr "" -#: midi_diskstream.cc:1029 +#: midi_diskstream.cc:875 msgid "%1: could not create region for complete midi file" msgstr "" -#: midi_diskstream.cc:1066 +#: midi_diskstream.cc:912 msgid "MidiDiskstream: could not create region for captured midi!" msgstr "" -#: midi_diskstream.cc:1287 +#: midi_diskstream.cc:1137 msgid "MidiDiskstream: XML property channel-mask out of range" msgstr "" -#: midi_model.cc:620 +#: midi_model.cc:619 msgid "No NoteID found for note property change - ignored" msgstr "" -#: midi_model.cc:862 +#: midi_model.cc:861 msgid "No SysExID found for sys-ex property change - ignored" msgstr "" -#: midi_model.cc:1928 +#: midi_model.cc:1939 msgid "transpose" msgstr "" @@ -1076,29 +1128,21 @@ msgstr "" msgid "Missing state property on AutomationState" msgstr "" -#: midi_ui.cc:48 -msgid "midiui" +#: monitor_processor.cc:53 +msgid "monitor dim" msgstr "" -#: monitor_processor.cc:53 -#, fuzzy -msgid "monitor dim" -msgstr "" - #: monitor_processor.cc:54 -#, fuzzy msgid "monitor cut" -msgstr "" +msgstr "" #: monitor_processor.cc:55 -#, fuzzy msgid "monitor mono" -msgstr "" +msgstr "" #: monitor_processor.cc:58 -#, fuzzy msgid "monitor dim level" -msgstr "" +msgstr "" #: monitor_processor.cc:62 msgid "monitor solo boost level" @@ -1120,77 +1164,63 @@ msgstr "" msgid "solo control" msgstr "" -#: mtc_slave.cc:165 +#: mtc_slave.cc:162 msgid "" "Unknown rate/drop value %1 in incoming MTC stream, session values used " "instead" msgstr "" -#: mtc_slave.cc:371 +#: mtc_slave.cc:368 msgid "MTC Slave: atomic read of current time failed, sleeping!" msgstr "" -#: named_selection.cc:88 -msgid "Chunk %1 uses an unknown playlist \"%2\"" -msgstr "" - -#: named_selection.cc:91 -msgid "Chunk %1 contains misformed playlist information" -msgstr "" - #: operations.cc:24 msgid "capture" msgstr "" #: operations.cc:25 msgid "paste" -msgstr "" +msgstr "вставить" #: operations.cc:26 -#, fuzzy msgid "duplicate region" -msgstr " " +msgstr "дублирование области" #: operations.cc:27 msgid "insert file" msgstr "" #: operations.cc:28 -#, fuzzy msgid "insert region" -msgstr " " +msgstr "вставка области" #: operations.cc:29 msgid "drag region brush" msgstr "" #: operations.cc:30 -#, fuzzy msgid "region drag" -msgstr " " +msgstr "перемещение области" #: operations.cc:31 msgid "selection grab" msgstr "" #: operations.cc:32 -#, fuzzy msgid "region fill" -msgstr " " +msgstr "заполнение области" #: operations.cc:33 msgid "fill selection" msgstr "" #: operations.cc:34 -#, fuzzy msgid "create region" -msgstr " " +msgstr "создание области" #: operations.cc:35 -#, fuzzy msgid "region copy" -msgstr " " +msgstr "копирование области" #: operations.cc:36 msgid "fixed time region copy" @@ -1200,88 +1230,87 @@ msgstr "" msgid "Pannable given XML data for %1 - ignored" msgstr "" -#: panner_manager.cc:75 +#: panner_manager.cc:76 msgid "looking for panners in %1" msgstr "" -#: panner_manager.cc:98 +#: panner_manager.cc:99 msgid "Panner discovered: \"%1\" in %2" msgstr "" -#: panner_manager.cc:115 -#, fuzzy +#: panner_manager.cc:116 msgid "PannerManager: cannot load module \"%1\" (%2)" -msgstr "LADSPA: \"%1\" (%2)" +msgstr "PannerManager: cannot load module \"%1\" (%2)" -#: panner_manager.cc:122 +#: panner_manager.cc:123 msgid "PannerManager: module \"%1\" has no descriptor function." msgstr "" -#: panner_manager.cc:185 +#: panner_manager.cc:186 msgid "no panner discovered for in/out = %1/%2" msgstr "" -#: panner_shell.cc:184 +#: panner_shell.cc:179 msgid "Unknown panner plugin \"%1\" found in pan state - ignored" msgstr "" -#: panner_shell.cc:190 +#: panner_shell.cc:185 msgid "panner plugin node has no type information!" msgstr "" -#: playlist.cc:2245 +#: playlist.cc:2069 msgid "region state node has no ID, ignored" msgstr "" -#: playlist.cc:2263 +#: playlist.cc:2087 msgid "Playlist: cannot create region from XML" msgstr "" -#: playlist_source.cc:102 +#: playlist_source.cc:99 msgid "No playlist ID in PlaylistSource XML!" msgstr "" -#: playlist_source.cc:121 +#: playlist_source.cc:118 msgid "Could not construct playlist for PlaylistSource from session data!" msgstr "" -#: plugin_insert.cc:597 +#: plugin_insert.cc:599 msgid "programming error: " -msgstr " : " +msgstr "ошибка программы: " -#: plugin_insert.cc:904 +#: plugin_insert.cc:908 msgid "XML node describing plugin is missing the `type' field" msgstr "" -#: plugin_insert.cc:919 +#: plugin_insert.cc:923 msgid "unknown plugin type %1 in plugin insert state" msgstr "" -#: plugin_insert.cc:947 +#: plugin_insert.cc:951 msgid "Plugin has no unique ID field" msgstr "" -#: plugin_insert.cc:956 +#: plugin_insert.cc:960 msgid "" "Found a reference to a plugin (\"%1\") that is unknown.\n" "Perhaps it was removed or moved since it was last used." msgstr "" -#: plugin_insert.cc:1072 +#: plugin_insert.cc:1076 msgid "PluginInsert: Auto: no ladspa port number" msgstr "" -#: plugin_insert.cc:1079 +#: plugin_insert.cc:1083 msgid "PluginInsert: Auto: port id out of range" msgstr "" -#: plugin_insert.cc:1115 +#: plugin_insert.cc:1119 msgid "PluginInsert: automatable control %1 not found - ignored" msgstr "" #: plugin_manager.cc:161 msgid "Discovering Plugins" -msgstr "" +msgstr "Обнаружение модулей" #: plugin_manager.cc:334 msgid "Could not parse rdf file: %1" @@ -1289,7 +1318,7 @@ msgstr "" #: plugin_manager.cc:373 msgid "LADSPA: cannot load module \"%1\" (%2)" -msgstr "LADSPA: \"%1\" (%2)" +msgstr "LADSPA: не удалось загрузить модуль \"%1\" (%2)" #: plugin_manager.cc:380 msgid "LADSPA: module \"%1\" has no descriptor function." @@ -1301,29 +1330,29 @@ msgid "" "ardour at this time" msgstr "" -#: plugin_manager.cc:704 +#: plugin_manager.cc:703 msgid "" "linuxVST plugin %1 does not support processReplacing, and so cannot be used " "in ardour at this time" msgstr "" -#: plugin_manager.cc:866 +#: plugin_manager.cc:864 msgid "unknown plugin status type \"%1\" - all entries ignored" msgstr "" -#: plugin_manager.cc:883 +#: plugin_manager.cc:881 msgid "unknown plugin type \"%1\" - ignored" msgstr "" -#: port.cc:337 +#: port.cc:367 msgid "get_connected_latency_range() called while disconnected from JACK" msgstr "" -#: port.cc:420 +#: port.cc:450 msgid "could not reregister %1" msgstr "" -#: port_insert.cc:45 +#: port_insert.cc:43 msgid "insert %1" msgstr "" @@ -1335,893 +1364,901 @@ msgstr "" msgid "non-port insert XML used for port plugin insert" msgstr "" -#: processor.cc:210 +#: processor.cc:207 msgid "No %1 property flag in element %2" msgstr "" -#: processor.cc:219 +#: processor.cc:216 msgid "No child node with active property" msgstr "" -#: rc_configuration.cc:96 -#, fuzzy +#: rc_configuration.cc:93 msgid "Loading system configuration file %1" -msgstr "Ardour: \"%1\"" +msgstr "Loading system configuration file %1" -#: rc_configuration.cc:100 -#, fuzzy +#: rc_configuration.cc:97 msgid "%1: cannot read system configuration file \"%2\"" -msgstr "Ardour: \"%1\"" +msgstr "%1: cannot read system configuration file \"%2\"" -#: rc_configuration.cc:105 -#, fuzzy +#: rc_configuration.cc:102 msgid "%1: system configuration file \"%2\" not loaded successfully." -msgstr "Ardour: \"%1\"." +msgstr "%1: system configuration file \"%2\" not loaded successfully." -#: rc_configuration.cc:109 +#: rc_configuration.cc:106 msgid "" "your system %1 configuration file is empty. This probably means that there " "as 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:127 -#, fuzzy +#: rc_configuration.cc:121 msgid "Loading user configuration file %1" -msgstr "Ardour: \"%1\"" +msgstr "Loading user configuration file %1" -#: rc_configuration.cc:131 -#, fuzzy +#: rc_configuration.cc:125 msgid "%1: cannot read configuration file \"%2\"" -msgstr "Ardour: \"%1\"" +msgstr "%1: cannot read configuration file \"%2\"" -#: rc_configuration.cc:136 -#, fuzzy +#: rc_configuration.cc:130 msgid "%1: user configuration file \"%2\" not loaded successfully." -msgstr "Ardour: \"%1\"." +msgstr "%1: user configuration file \"%2\" not loaded successfully." -#: rc_configuration.cc:140 +#: rc_configuration.cc:134 msgid "your %1 configuration file is empty. This is not normal." -msgstr "" +msgstr "your %1 configuration file is empty. This is not normal." -#: rc_configuration.cc:170 -#, fuzzy +#: rc_configuration.cc:151 msgid "Config file %1 not saved" -msgstr " Σ" +msgstr "Config file %1 not saved" -#: recent_sessions.cc:60 +#: recent_sessions.cc:54 msgid "cannot open recent session file %1 (%2)" msgstr "" -#: region_factory.cc:69 region_factory.cc:106 region_factory.cc:143 -#: region_factory.cc:181 +#: region_factory.cc:67 region_factory.cc:109 region_factory.cc:150 +#: region_factory.cc:192 msgid "" "programming error: RegionFactory::create() called with unknown Region type" msgstr "" -#: region_factory.cc:499 +#: region_factory.cc:554 msgid "%1 compound-%2 (%3)" msgstr "" -#: region_factory.cc:501 +#: region_factory.cc:556 msgid "%1 compound-%2.1 (%3)" msgstr "" -#: region_factory.cc:571 +#: region_factory.cc:618 msgid "cannot create new name for region \"%1\"" msgstr "" #: resampled_source.cc:98 msgid "Import: %1" -msgstr ": %1" +msgstr "Импорт: %1" #: resampled_source.cc:128 msgid "Import: src_new() failed : %1" msgstr "" -#: return.cc:43 return.cc:170 +#: return.cc:41 msgid "return %1" msgstr "" -#: route.cc:110 route_graph.cc:173 route_graph.cc:184 session.cc:1794 -#: session.cc:3319 -msgid "signal" +#: route.cc:208 +msgid "Remote Control ID's start at one, not zero" msgstr "" -#: route.cc:1016 route.cc:2394 +#: route.cc:1149 route.cc:2591 msgid "unknown Processor type \"%1\"; ignored" msgstr "" -#: route.cc:1028 +#: route.cc:1161 msgid "processor could not be created. Ignored." msgstr "" -#: route.cc:1860 route.cc:2065 +#: route.cc:2030 route.cc:2248 msgid "Bad node sent to Route::set_state() [%1]" msgstr "" -#: route.cc:1920 +#: route.cc:2090 msgid "Pannable state found for route (%1) without a panner!" msgstr "" -#: route.cc:1981 route.cc:1985 route.cc:2173 route.cc:2177 +#: route.cc:2151 route.cc:2155 route.cc:2358 route.cc:2362 msgid "badly formed order key string in state file! [%1] ... ignored." msgstr "" -#: route_group.cc:470 +#: route_group.cc:476 msgid "You cannot subgroup MIDI tracks at this time" msgstr "" -#: rb_effect.cc:232 rb_effect.cc:273 +#: rb_effect.cc:233 rb_effect.cc:274 msgid "tempoize: error reading data from %1 at %2 (wanted %3, got %4)" msgstr "" -#: rb_effect.cc:302 rb_effect.cc:324 +#: rb_effect.cc:303 rb_effect.cc:325 msgid "error writing tempo-adjusted data to %1" msgstr "" -#: rb_effect.cc:331 +#: rb_effect.cc:332 msgid "timefx code failure. please notify ardour-developers." msgstr "" -#: send.cc:42 send.cc:250 +#: send.cc:59 +msgid "aux %1" +msgstr "" + +#: send.cc:63 msgid "send %1" msgstr "" +#: send.cc:65 +msgid "programming error: send created using role %1" +msgstr "programming error: send created using role %1" + #: session.cc:338 msgid "Set block size and sample rate" msgstr "" #: session.cc:343 -#, fuzzy msgid "Using configuration" -msgstr "Ardour: \"%1\"" +msgstr "" -#: session.cc:387 +#: session.cc:395 msgid "could not setup Click I/O" msgstr "" -#: session.cc:414 +#: session.cc:422 msgid "cannot setup Click I/O" msgstr "" -#: session.cc:417 +#: session.cc:425 msgid "Compute I/O Latencies" msgstr "" -#: session.cc:423 +#: session.cc:431 msgid "Set up standard connections" msgstr "" -#: session.cc:444 +#: session.cc:452 #, c-format msgid "out %" msgstr "" -#: session.cc:458 +#: session.cc:466 #, c-format msgid "out %+%" msgstr "" -#: session.cc:473 +#: session.cc:481 #, c-format msgid "in %" msgstr "" -#: session.cc:487 +#: session.cc:495 #, c-format msgid "in %+%" msgstr "" -#: session.cc:523 +#: session.cc:531 msgid "Setup signal flow and plugins" msgstr "" -#: session.cc:560 -msgid "cannot connect master output %1 to %2" -msgstr "" - -#: session.cc:588 -msgid "cannot connect control input %1 to %2" -msgstr "" - -#: session.cc:608 -msgid "The preferred I/O for the monitor bus (%1) cannot be found" -msgstr "" - -#: session.cc:632 -msgid "cannot connect control output %1 to %2" -msgstr "" - -#: session.cc:653 +#: session.cc:575 msgid "Connect to engine" msgstr "" -#: session.cc:682 +#: session.cc:606 +msgid "cannot connect master output %1 to %2" +msgstr "" + +#: session.cc:665 +msgid "monitor" +msgstr "" + +#: session.cc:710 +msgid "cannot connect control input %1 to %2" +msgstr "" + +#: session.cc:730 +msgid "The preferred I/O for the monitor bus (%1) cannot be found" +msgstr "" + +#: session.cc:761 +msgid "cannot connect control output %1 to %2" +msgstr "" + +#: session.cc:825 msgid "cannot create Auditioner: no auditioning of regions possible" msgstr "" -#: session.cc:884 +#: session.cc:1004 msgid "Session: you can't use that location for auto punch (start <= end)" msgstr "" -#: session.cc:920 +#: session.cc:1044 msgid "Session: you can't use a mark for auto loop" msgstr "" -#: session.cc:1235 +#: session.cc:1359 msgid "feedback loop setup between %1 and %2" msgstr "" -#: session.cc:1528 +#: session.cc:1657 msgid "Session: could not create new midi track." msgstr "" -#: session.cc:1706 session.cc:1709 +#: session.cc:1663 +msgid "" +"No more JACK ports are available. You will need to stop %1 and restart JACK " +"with ports if you need this many tracks." +msgstr "" + +#: session.cc:1840 session.cc:1843 msgid "Audio" msgstr "" -#: session.cc:1733 session.cc:1741 session.cc:1847 session.cc:1855 +#: session.cc:1867 session.cc:1875 session.cc:1952 session.cc:1960 msgid "cannot configure %1 in/%2 out configuration for new audio track" msgstr "" -#: session.cc:1763 +#: session.cc:1898 msgid "Session: could not create new audio track." msgstr "" -#: session.cc:1798 -#, fuzzy -msgid "editor" -msgstr "" - -#: session.cc:1825 session.cc:1828 +#: session.cc:1930 session.cc:1933 msgid "Bus" msgstr "" -#: session.cc:1875 +#: session.cc:1981 msgid "Session: could not create new audio route." msgstr "" -#: session.cc:1926 +#: session.cc:2034 msgid "Session: UINT_MAX routes? impossible!" msgstr "" -#: session.cc:1947 +#: session.cc:2055 msgid "Session: cannot create track/bus from template description" msgstr "" -#: session.cc:1973 +#: session.cc:2081 msgid "Session: could not create new route from template" msgstr "" -#: session.cc:3009 +#: session.cc:3178 msgid "FATAL ERROR! Could not find a suitable version of %1 for a rename" msgstr "" -#: session.cc:3132 session.cc:3191 +#: session.cc:3298 session.cc:3356 msgid "There are already %1 recordings for %2, which I consider too many." msgstr "" -#: session.cc:3555 +#: session.cc:3746 msgid "send ID %1 appears to be in use already" msgstr "" -#: session.cc:3567 +#: session.cc:3758 +msgid "aux send ID %1 appears to be in use already" +msgstr "" + +#: session.cc:3770 msgid "return ID %1 appears to be in use already" msgstr "" -#: session.cc:3579 +#: session.cc:3782 msgid "insert ID %1 appears to be in use already" msgstr "" -#: session.cc:3746 +#: session.cc:3909 msgid "Cannot write a range where end <= start (e.g. %1 <= %2)" msgstr "" -#: session.cc:3781 +#: session.cc:3938 msgid "too many bounced versions of playlist \"%1\"" msgstr "" -#: session.cc:3791 +#: session.cc:3948 msgid "cannot create new audio file \"%1\" for %2" msgstr "" -#: session_click.cc:156 +#: session_click.cc:161 msgid "cannot open click soundfile %1 (%2)" msgstr "" -#: session_click.cc:169 +#: session_click.cc:174 msgid "cannot read data from click soundfile" msgstr "" -#: session_command.cc:90 +#: session_command.cc:87 msgid "Tried to reconstitute a MementoCommand with no contents, failing. id=" msgstr "" -#: session_command.cc:164 +#: session_command.cc:148 msgid "" "could not reconstitute MementoCommand from XMLNode. object type = %1 id = %2" msgstr "" -#: session_command.cc:193 +#: session_command.cc:177 msgid "" "could not reconstitute StatefulDiffCommand from XMLNode. object type = %1 id " "= %2" msgstr "" -#: session_directory.cc:62 +#: session_directory.cc:57 msgid "Cannot create Session directory at path %1 Error: %2" msgstr "" -#: session_directory.cc:81 +#: session_directory.cc:74 msgid "Session subdirectory does not exist at path %1" msgstr "" -#: session_events.cc:188 +#: session_events.cc:184 msgid "Session: cannot have two events of type %1 at the same frame (%2)." msgstr "" -#: session_export.cc:119 +#: session_export.cc:126 msgid "%1: cannot seek to %2 for export" msgstr "" -#: session_midi.cc:400 +#: session_export.cc:188 +msgid "Export ended unexpectedly: %1" +msgstr "" + +#: session_midi.cc:397 msgid "Session: could not send full MIDI time code" msgstr "" -#: session_midi.cc:477 +#: session_midi.cc:474 msgid "Session: cannot send quarter-frame MTC message (%1)" msgstr "" -#: session_playlists.cc:371 session_playlists.cc:390 +#: session_playlists.cc:368 session_playlists.cc:387 msgid "Session: cannot create Playlist from XML description." msgstr "" -#: session_process.cc:123 +#: session_process.cc:133 msgid "Session: error in no roll for %1" msgstr "" -#: session_process.cc:1119 +#: session_process.cc:1158 msgid "Programming error: illegal event type in process_event (%1)" msgstr "" -#: session_state.cc:150 +#: session_state.cc:139 msgid "Could not use path %1 (%s)" msgstr "" -#: session_state.cc:274 +#: session_state.cc:266 msgid "solo cut control (dB)" msgstr "" -#: session_state.cc:364 +#: session_state.cc:359 msgid "Reset Remote Controls" -msgstr "" +msgstr "Сброс удалённого управления" -#: session_state.cc:389 +#: session_state.cc:383 msgid "Session loading complete" msgstr "" -#: session_state.cc:456 +#: session_state.cc:450 msgid "Session: cannot create session peakfile folder \"%1\" (%2)" msgstr "" -#: session_state.cc:463 +#: session_state.cc:457 msgid "Session: cannot create session sounds dir \"%1\" (%2)" msgstr "" -#: session_state.cc:470 +#: session_state.cc:464 msgid "Session: cannot create session midi dir \"%1\" (%2)" msgstr "" -#: session_state.cc:477 +#: session_state.cc:471 msgid "Session: cannot create session dead sounds folder \"%1\" (%2)" msgstr "" -#: session_state.cc:484 +#: session_state.cc:478 msgid "Session: cannot create session export folder \"%1\" (%2)" msgstr "" -#: session_state.cc:491 +#: session_state.cc:485 msgid "Session: cannot create session analysis folder \"%1\" (%2)" msgstr "" -#: session_state.cc:498 -#, fuzzy +#: session_state.cc:492 msgid "Session: cannot create session plugins folder \"%1\" (%2)" -msgstr "LADSPA: \"%1\" (%2)" +msgstr "Session: cannot create session plugins folder \"%1\" (%2)" -#: session_state.cc:510 -#, fuzzy +#: session_state.cc:499 +msgid "Session: cannot create session externals folder \"%1\" (%2)" +msgstr "Session: cannot create session externals folder \"%1\" (%2)" + +#: session_state.cc:513 msgid "Session: cannot create session folder \"%1\" (%2)" -msgstr "LADSPA: \"%1\" (%2)" +msgstr "Session: cannot create session folder \"%1\" (%2)" -#: session_state.cc:538 -msgid "Could not open %1 for writing mix template" +#: session_state.cc:546 +msgid "Could not open %1 for writing session template" msgstr "" -#: session_state.cc:544 -msgid "Could not open mix template %1 for reading" +#: session_state.cc:552 +msgid "Could not open session template %1 for reading" msgstr "" -#: session_state.cc:568 +#: session_state.cc:571 msgid "master" -msgstr "" +msgstr "master" -#: session_state.cc:585 -msgid "monitor" -msgstr "" - -#: session_state.cc:649 -msgid "Could remove pending capture state at path \"%1\" (%2)" +#: session_state.cc:634 +msgid "Could not remove pending capture state at path \"%1\" (%2)" msgstr "" -#: session_state.cc:678 +#: session_state.cc:658 msgid "could not rename snapshot %1 to %2 (%3)" msgstr "" -#: session_state.cc:773 +#: session_state.cc:686 +msgid "Could not remove state file at path \"%1\" (%2)" +msgstr "" + +#: session_state.cc:757 msgid "" "the %1 audio engine is not connected and state saving would lose all I/O " "connections. Session not saved" msgstr "" -#: session_state.cc:819 +#: session_state.cc:806 msgid "state could not be saved to %1" msgstr "" -#: session_state.cc:826 +#: session_state.cc:808 session_state.cc:819 +msgid "Could not remove temporary state file at path \"%1\" (%2)" +msgstr "" + +#: session_state.cc:816 msgid "could not rename temporary session file %1 to %2" msgstr "" -#: session_state.cc:893 +#: session_state.cc:884 msgid "%1: session state information file \"%2\" doesn't exist!" msgstr "" -#: session_state.cc:905 +#: session_state.cc:896 msgid "Could not understand ardour file %1" msgstr "" -#: session_state.cc:914 -#, fuzzy +#: session_state.cc:905 msgid "Session file %1 is not a session" -msgstr " Σ" +msgstr "Файл сеанса %1 не является сеансом" -#: session_state.cc:945 +#: session_state.cc:939 msgid "" "Copying old session file %1 to %2\n" "Use %2 with %3 versions before 2.0 from now on" msgstr "" -#: session_state.cc:955 -msgid "Unable to make backup of state file %1 (%2)" -msgstr "" - -#: session_state.cc:1212 +#: session_state.cc:1190 msgid "programming error: Session: incorrect XML node sent to set_state()" msgstr "" -#: session_state.cc:1265 +#: session_state.cc:1239 msgid "Session: XML state has no options section" msgstr "" -#: session_state.cc:1270 +#: session_state.cc:1244 msgid "Session: XML state has no metadata section" msgstr "" -#: session_state.cc:1281 +#: session_state.cc:1255 msgid "Session: XML state has no sources section" msgstr "" -#: session_state.cc:1288 +#: session_state.cc:1262 msgid "Session: XML state has no Tempo Map section" msgstr "" -#: session_state.cc:1295 +#: session_state.cc:1269 msgid "Session: XML state has no locations section" msgstr "" -#: session_state.cc:1321 +#: session_state.cc:1295 msgid "Session: XML state has no Regions section" msgstr "" -#: session_state.cc:1328 +#: session_state.cc:1302 msgid "Session: XML state has no playlists section" msgstr "" -#: session_state.cc:1354 +#: session_state.cc:1322 msgid "Session: XML state has no bundles section" msgstr "" -#: session_state.cc:1366 +#: session_state.cc:1334 msgid "Session: XML state has no diskstreams section" msgstr "" -#: session_state.cc:1374 +#: session_state.cc:1342 msgid "Session: XML state has no routes section" msgstr "" -#: session_state.cc:1386 +#: session_state.cc:1354 msgid "Session: XML state has no route groups section" msgstr "" -#: session_state.cc:1395 +#: session_state.cc:1363 msgid "Session: XML state has no edit groups section" msgstr "" -#: session_state.cc:1402 +#: session_state.cc:1370 msgid "Session: XML state has no mix groups section" msgstr "" -#: session_state.cc:1410 +#: session_state.cc:1378 msgid "Session: XML state has no click section" msgstr "" -#: session_state.cc:1450 +#: session_state.cc:1426 msgid "Session: cannot create Route from XML description." msgstr "" -#: session_state.cc:1454 +#: session_state.cc:1430 msgid "Loaded track/bus %1" msgstr "" -#: session_state.cc:1552 +#: session_state.cc:1528 msgid "Could not find diskstream for route" msgstr "" -#: session_state.cc:1606 +#: session_state.cc:1582 msgid "Session: cannot create Region from XML description." msgstr "" -#: session_state.cc:1610 +#: session_state.cc:1586 msgid "Can not load state for region '%1'" msgstr "" -#: session_state.cc:1646 +#: session_state.cc:1622 msgid "Regions in compound description not found (ID's %1 and %2): ignored" msgstr "" -#: session_state.cc:1674 +#: session_state.cc:1650 msgid "Nested source has no ID info in session state file! (ignored)" msgstr "" -#: session_state.cc:1686 +#: session_state.cc:1662 msgid "Cannot reconstruct nested source for region %1" msgstr "" -#: session_state.cc:1748 +#: session_state.cc:1724 msgid "Session: XMLNode describing a AudioRegion is incomplete (no source)" msgstr "" -#: session_state.cc:1756 session_state.cc:1777 session_state.cc:1797 +#: session_state.cc:1732 session_state.cc:1753 session_state.cc:1773 msgid "" "Session: XMLNode describing a AudioRegion references an unknown source id =%1" msgstr "" -#: session_state.cc:1762 session_state.cc:1783 session_state.cc:1803 +#: session_state.cc:1738 session_state.cc:1759 session_state.cc:1779 msgid "" "Session: XMLNode describing a AudioRegion references a non-audio source id =" "%1" msgstr "" -#: session_state.cc:1826 +#: session_state.cc:1802 msgid "" "Session: XMLNode describing an AudioRegion is missing some master sources; " "ignored" msgstr "" -#: session_state.cc:1860 +#: session_state.cc:1836 msgid "Session: XMLNode describing a MidiRegion is incomplete (no source)" msgstr "" -#: session_state.cc:1868 +#: session_state.cc:1844 msgid "" "Session: XMLNode describing a MidiRegion references an unknown source id =%1" msgstr "" -#: session_state.cc:1874 +#: session_state.cc:1850 msgid "" "Session: XMLNode describing a MidiRegion references a non-midi source id =%1" msgstr "" -#: session_state.cc:1942 +#: session_state.cc:1918 msgid "" "cannot create new file from region name \"%1\" with ident = \"%2\": too many " "existing files with similar names" msgstr "" -#: session_state.cc:1965 +#: session_state.cc:1941 msgid "Session: cannot create Source from XML description." msgstr "" -#: session_state.cc:1999 +#: session_state.cc:1975 msgid "A sound file is missing. It will be replaced by silence." msgstr "" -#: session_state.cc:2022 +#: session_state.cc:1998 msgid "Found a sound file that cannot be used by %1. Talk to the progammers." msgstr "" -#: session_state.cc:2044 -msgid "Could not create mix templates directory \"%1\" (%2)" -msgstr "" +#: session_state.cc:2015 +msgid "Could not create templates directory \"%1\" (%2)" +msgstr "Could not create templates directory \"%1\" (%2)" -#: session_state.cc:2056 +#: session_state.cc:2028 msgid "Template \"%1\" already exists - new version not created" msgstr "" -#: session_state.cc:2062 +#: session_state.cc:2034 +msgid "Could not create directory for Session template\"%1\" (%2)" +msgstr "Could not create directory for Session template\"%1\" (%2)" + +#: session_state.cc:2044 msgid "template not saved" msgstr "" -#: session_state.cc:2079 -msgid "Template \"%1\" already exists - template not renamed" +#: session_state.cc:2054 +msgid "Could not create directory for Session template plugin state\"%1\" (%2)" msgstr "" -#: session_state.cc:2240 -msgid "Session: cannot create Named Selection from XML description." -msgstr "" - -#: session_state.cc:2291 +#: session_state.cc:2249 msgid "Unknown node \"%1\" found in Bundles list from state file" msgstr "" -#: session_state.cc:2833 session_state.cc:2839 -#, fuzzy +#: session_state.cc:2791 session_state.cc:2797 msgid "Cannot expand path %1 (%2)" -msgstr "LADSPA: \"%1\" (%2)" +msgstr "Cannot expand path %1 (%2)" -#: session_state.cc:2892 -#, fuzzy +#: session_state.cc:2850 msgid "Session: cannot create dead file folder \"%1\" (%2)" -msgstr "LADSPA: \"%1\" (%2)" +msgstr "Session: cannot create dead file folder \"%1\" (%2)" -#: session_state.cc:2931 +#: session_state.cc:2889 msgid "cannot rename unused file source from %1 to %2 (%3)" msgstr "" -#: session_state.cc:2949 +#: session_state.cc:2907 msgid "cannot remove peakfile %1 for %2 (%3)" msgstr "" -#: session_state.cc:3256 +#: session_state.cc:3209 msgid "could not backup old history file, current history not saved" msgstr "" -#: session_state.cc:3269 +#: session_state.cc:3222 msgid "history could not be saved to %1" msgstr "" -#: session_state.cc:3278 +#: session_state.cc:3225 +msgid "Could not remove history file at path \"%1\" (%2)" +msgstr "" + +#: session_state.cc:3229 msgid "could not restore history file from backup %1 (%2)" msgstr "" -#: session_state.cc:3303 +#: session_state.cc:3254 msgid "%1: no history file \"%2\" for this session." msgstr "" -#: session_state.cc:3309 +#: session_state.cc:3260 msgid "Could not understand session history file \"%1\"" msgstr "" -#: session_state.cc:3351 +#: session_state.cc:3302 msgid "Failed to downcast MidiSource for NoteDiffCommand" msgstr "" -#: session_state.cc:3362 +#: session_state.cc:3313 msgid "Failed to downcast MidiSource for SysExDiffCommand" msgstr "" -#: session_state.cc:3373 +#: session_state.cc:3324 msgid "Failed to downcast MidiSource for PatchChangeDiffCommand" msgstr "" -#: session_state.cc:3381 +#: session_state.cc:3332 msgid "Couldn't figure out how to make a Command out of a %1 XMLNode." msgstr "" -#: session_state.cc:3603 +#: session_state.cc:3585 msgid "Session: unknown diskstream type in XML" msgstr "" -#: session_state.cc:3608 +#: session_state.cc:3590 msgid "Session: could not load diskstream via XML state" msgstr "" -#: session_state_utils.cc:48 -msgid "Unable to create a backup copy of file %1 (%2)" -msgstr "" - -#: session_time.cc:463 +#: session_time.cc:460 msgid "Unknown JACK 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:711 +#: session_transport.cc:710 msgid "" "Seamless looping cannot be supported while %1 is using JACK transport.\n" "Recommend changing the configured options" msgstr "" -#: session_transport.cc:1028 +#: session_transport.cc:1069 msgid "" "Global varispeed cannot be supported while %1 is connected to JACK transport " "control" msgstr "" -#: session_utils.cc:29 -msgid "Unable to create session directory at path %1 : %2" -msgstr "" - -#: smf_source.cc:254 +#: smf_source.cc:252 msgid "Unable to read event prefix, corrupt MIDI ring buffer" msgstr "" -#: smf_source.cc:265 +#: smf_source.cc:263 msgid "Read time/size but not buffer, corrupt MIDI ring buffer" -msgstr "" +msgstr "Прямоугольное" -#: smf_source.cc:412 +#: smf_source.cc:410 msgid "cannot open MIDI file %1 for write" msgstr "" -#: sndfile_helpers.cc:35 +#: sndfile_helpers.cc:32 msgid "WAV" -msgstr "" +msgstr "WAV" + +#: sndfile_helpers.cc:33 +msgid "AIFF" +msgstr "AIFF" + +#: sndfile_helpers.cc:34 +msgid "CAF" +msgstr "CAF" + +#: sndfile_helpers.cc:35 +msgid "W64 (64 bit WAV)" +msgstr "W64 (64-разрядный WAV)" #: sndfile_helpers.cc:36 -msgid "AIFF" -msgstr "" +msgid "FLAC" +msgstr "FLAC" #: sndfile_helpers.cc:37 -msgid "CAF" -msgstr "" +msgid "Ogg/Vorbis" +msgstr "Ogg/Vorbis" #: sndfile_helpers.cc:38 -msgid "W64 (64 bit WAV)" -msgstr "" - -#: sndfile_helpers.cc:39 -msgid "FLAC" -msgstr "" - -#: sndfile_helpers.cc:40 -msgid "Ogg/Vorbis" -msgstr "" - -#: sndfile_helpers.cc:41 msgid "raw (no header)" -msgstr "" +msgstr "raw (без заголовка)" + +#: sndfile_helpers.cc:43 +msgid ".wav" +msgstr ".wav" + +#: sndfile_helpers.cc:44 +msgid ".aiff" +msgstr ".aiff" + +#: sndfile_helpers.cc:45 +msgid ".caf" +msgstr ".caf" #: sndfile_helpers.cc:46 -msgid ".wav" -msgstr "" +msgid ".w64" +msgstr ".w64" #: sndfile_helpers.cc:47 -msgid ".aiff" -msgstr "" +msgid ".flac" +msgstr ".flac" #: sndfile_helpers.cc:48 -msgid ".caf" -msgstr "" +msgid ".ogg" +msgstr ".ogg" #: sndfile_helpers.cc:49 -msgid ".w64" -msgstr "" - -#: sndfile_helpers.cc:50 -msgid ".flac" -msgstr "" - -#: sndfile_helpers.cc:51 -msgid ".ogg" -msgstr "" - -#: sndfile_helpers.cc:52 msgid ".raw" -msgstr "" +msgstr ".raw" -#: sndfile_helpers.cc:67 +#: sndfile_helpers.cc:64 msgid "Signed 16 bit PCM" msgstr "" -#: sndfile_helpers.cc:68 +#: sndfile_helpers.cc:65 msgid "Signed 24 bit PCM" msgstr "" -#: sndfile_helpers.cc:69 +#: sndfile_helpers.cc:66 msgid "Signed 32 bit PCM" msgstr "" -#: sndfile_helpers.cc:70 +#: sndfile_helpers.cc:67 msgid "Signed 8 bit PCM" msgstr "" -#: sndfile_helpers.cc:71 -#, fuzzy +#: sndfile_helpers.cc:68 msgid "32 bit float" -msgstr "32 " +msgstr "" -#: sndfile_helpers.cc:84 +#: sndfile_helpers.cc:81 msgid "Little-endian (Intel)" msgstr "" -#: sndfile_helpers.cc:85 +#: sndfile_helpers.cc:82 msgid "Big-endian (PowerPC)" msgstr "" -#: sndfilesource.cc:197 +#: sndfilesource.cc:201 msgid "SndFileSource: cannot open file \"%1\" for %2 (%3)" msgstr "" -#: sndfilesource.cc:205 +#: sndfilesource.cc:209 msgid "" "SndFileSource: file only contains %1 channels; %2 is invalid as a channel " "number" msgstr "" -#: sndfilesource.cc:241 sndfilesource.cc:559 sndfilesource.cc:583 +#: sndfilesource.cc:248 sndfilesource.cc:564 sndfilesource.cc:588 msgid "" "cannot set broadcast info for audio file %1 (%2); dropping broadcast info " "for this file" msgstr "" -#: sndfilesource.cc:288 +#: sndfilesource.cc:295 msgid "could not allocate file %1 for reading." msgstr "" -#: sndfilesource.cc:323 +#: sndfilesource.cc:330 msgid "SndFileSource: could not seek to frame %1 within %2 (%3)" msgstr "" -#: sndfilesource.cc:333 -msgid "SndFileSource: @ %1 could not read %2 within %3 (%4) (len = %5)" +#: sndfilesource.cc:340 +msgid "" +"SndFileSource: @ %1 could not read %2 within %3 (%4) (len = %5, ret was %6)" msgstr "" -#: sndfilesource.cc:377 sndfilesource.cc:408 +#: sndfilesource.cc:384 sndfilesource.cc:413 msgid "attempt to write a non-writable audio file source (%1)" msgstr "" -#: sndfilesource.cc:382 utils.cc:532 utils.cc:556 utils.cc:570 utils.cc:589 -#, fuzzy +#: sndfilesource.cc:389 utils.cc:522 utils.cc:546 utils.cc:560 utils.cc:579 msgid "programming error: %1 %2" -msgstr " : " +msgstr "programming error: %1 %2" -#: sndfilesource.cc:511 +#: sndfilesource.cc:516 msgid "attempt to flush a non-writable audio file source (%1)" msgstr "" -#: sndfilesource.cc:516 +#: sndfilesource.cc:521 msgid "attempt to flush an un-opened audio file source (%1)" msgstr "" -#: sndfilesource.cc:522 +#: sndfilesource.cc:527 msgid "could not allocate file %1 to write header" msgstr "" -#: sndfilesource.cc:536 +#: sndfilesource.cc:541 msgid "" "attempt to store broadcast info in a non-writable audio file source (%1)" msgstr "" -#: sndfilesource.cc:541 +#: sndfilesource.cc:546 msgid "attempt to set BWF info for an un-opened audio file source (%1)" msgstr "" -#: sndfilesource.cc:602 +#: sndfilesource.cc:607 msgid "%1: cannot seek to %2 (libsndfile error: %3" msgstr "" -#: sndfilesource.cc:715 +#: sndfilesource.cc:720 msgid "SndFileSource: \"%1\" bad read retval: %2 of %5 (%3: %4)" msgstr "" -#: sndfilesource.cc:728 sndfilesource.cc:778 sndfilesource.cc:785 +#: sndfilesource.cc:733 sndfilesource.cc:783 sndfilesource.cc:790 msgid "SndFileSource: \"%1\" bad write (%2)" msgstr "" -#: sndfilesource.cc:808 +#: sndfilesource.cc:813 msgid "" "Filesource: start time is already set for existing file (%1): Cannot change " "start time." @@ -2243,220 +2280,238 @@ msgstr "" msgid "Cannot compile tape track regexp for use (%1)" msgstr "" -#: tempo.cc:73 +#: tempo.cc:85 msgid "TempoSection XML node has no \"start\" property" msgstr "" -#: tempo.cc:81 +#: tempo.cc:93 msgid "TempoSection XML node has an illegal \"start\" value" msgstr "" -#: tempo.cc:88 +#: tempo.cc:100 msgid "TempoSection XML node has no \"beats-per-minute\" property" msgstr "" -#: tempo.cc:93 +#: tempo.cc:105 msgid "TempoSection XML node has an illegal \"beats_per_minute\" value" msgstr "" -#: tempo.cc:102 +#: tempo.cc:114 msgid "TempoSection XML node has an illegal \"note-type\" value" msgstr "" -#: tempo.cc:108 +#: tempo.cc:120 msgid "TempoSection XML node has no \"movable\" property" msgstr "" -#: tempo.cc:149 +#: tempo.cc:130 +msgid "TempoSection XML node has an illegal \"bar-offset\" value" +msgstr "" + +#: tempo.cc:207 msgid "MeterSection XML node has no \"start\" property" msgstr "" -#: tempo.cc:157 +#: tempo.cc:215 msgid "MeterSection XML node has an illegal \"start\" value" msgstr "" -#: tempo.cc:164 -msgid "MeterSection XML node has no \"beats-per-bar\" property" +#: tempo.cc:225 +msgid "" +"MeterSection XML node has no \"beats-per-bar\" or \"divisions-per-bar\" " +"property" msgstr "" -#: tempo.cc:169 -msgid "MeterSection XML node has an illegal \"beats-per-bar\" value" +#: tempo.cc:231 +msgid "" +"MeterSection XML node has an illegal \"beats-per-bar\" or \"divisions-per-bar" +"\" value" msgstr "" -#: tempo.cc:174 +#: tempo.cc:236 msgid "MeterSection XML node has no \"note-type\" property" msgstr "" -#: tempo.cc:179 +#: tempo.cc:241 msgid "MeterSection XML node has an illegal \"note-type\" value" msgstr "" -#: tempo.cc:184 +#: tempo.cc:246 msgid "MeterSection XML node has no \"movable\" property" msgstr "" -#: tempo.cc:591 +#: tempo.cc:393 +msgid "" +"Meter changes can only be positioned on the first beat of a bar. Moving from " +"%1 to %2" +msgstr "" + +#: tempo.cc:655 msgid "no tempo sections defined in tempo map - cannot change tempo @ %1" msgstr "" -#: tempo.cc:615 tempo.cc:631 +#: tempo.cc:685 tempo.cc:701 msgid "programming error: no tempo section in tempo map!" msgstr "" -#: tempo.cc:674 tempo.cc:733 +#: tempo.cc:815 tempo.cc:1785 msgid "programming error: unhandled MetricSection type" msgstr "" -#: tempo.cc:1591 tempo.cc:1603 +#: tempo.cc:1119 +msgid "tempo map asked for BBT time at frame %1\n" +msgstr "" + +#: tempo.cc:1162 +msgid "tempo map asked for frame time at bar < 1 (%1)\n" +msgstr "" + +#: tempo.cc:1622 tempo.cc:1636 msgid "Tempo map: could not set new state, restoring old one." msgstr "" -#: tempo_map_importer.cc:53 +#: tempo_map_importer.cc:52 msgid "Tempo map" msgstr "" -#: tempo_map_importer.cc:61 +#: tempo_map_importer.cc:60 msgid "Tempo Map" msgstr "" -#: tempo_map_importer.cc:81 +#: tempo_map_importer.cc:80 msgid "Tempo marks: " msgstr "" -#: tempo_map_importer.cc:81 +#: tempo_map_importer.cc:80 msgid "" "\n" "Meter marks: " msgstr "" -#: tempo_map_importer.cc:90 +#: tempo_map_importer.cc:89 msgid "" "This will replace the current tempo map!\n" "Are you shure you want to do this?" msgstr "" -#: user_bundle.cc:32 +#: user_bundle.cc:28 msgid "Node for Bundle has no \"name\" property" msgstr "" -#: user_bundle.cc:44 user_bundle.cc:65 +#: user_bundle.cc:40 user_bundle.cc:61 #, c-format msgid "Unknown node \"%s\" in Bundle" msgstr "" -#: user_bundle.cc:49 +#: user_bundle.cc:45 msgid "Node for Channel has no \"name\" property" msgstr "" -#: user_bundle.cc:55 +#: user_bundle.cc:51 msgid "Node for Channel has no \"type\" property" msgstr "" -#: user_bundle.cc:70 +#: user_bundle.cc:66 msgid "Node for Port has no \"name\" property" +msgstr "Node for Port has no \"name\" property" + +#: utils.cc:390 utils.cc:414 +msgid "Splice" msgstr "" -#: utils.cc:347 -#, fuzzy -msgid "programming error: realpath(%1) failed, errcode %2" -msgstr " : " - -#: utils.cc:400 utils.cc:424 -#, fuzzy -msgid "Splice" -msgstr "" - -#: utils.cc:402 utils.cc:417 +#: utils.cc:392 utils.cc:407 msgid "Slide" msgstr "" -#: utils.cc:404 utils.cc:420 +#: utils.cc:394 utils.cc:410 msgid "Lock" msgstr "" -#: utils.cc:407 -#, fuzzy +#: utils.cc:397 msgid "programming error: unknown edit mode string \"%1\"" -msgstr " : " +msgstr "programming error: unknown edit mode string \"%1\"" -#: utils.cc:431 utils.cc:460 +#: utils.cc:421 utils.cc:450 msgid "MIDI Timecode" msgstr "" -#: utils.cc:431 utils.cc:458 +#: utils.cc:421 utils.cc:448 msgid "MTC" -msgstr "" +msgstr "MTC" -#: utils.cc:435 utils.cc:464 +#: utils.cc:425 utils.cc:454 msgid "MIDI Clock" msgstr "" -#: utils.cc:439 utils.cc:454 utils.cc:467 +#: utils.cc:429 utils.cc:444 utils.cc:457 msgid "JACK" -msgstr "" +msgstr "JACK" -#: utils.cc:443 +#: utils.cc:433 msgid "programming error: unknown sync source string \"%1\"" -msgstr "" +msgstr "programming error: unknown sync source string \"%1\"" -#: utils.cc:643 +#: utils.cc:614 msgid "programming error: unknown native header format: %1" -msgstr "" +msgstr "programming error: unknown native header format: %1" -#: utils.cc:658 -#, fuzzy +#: utils.cc:629 msgid "cannot open directory %1 (%2)" -msgstr "LADSPA: \"%1\" (%2)" +msgstr "cannot open directory %1 (%2)" + +#, fuzzy +#~ msgid "editor" +#~ msgstr "монитор" + +#, fuzzy +#~ msgid "programming error: realpath(%1) failed, errcode %2" +#~ msgstr "ошибка программы: " #, fuzzy #~ msgid "programming error:" -#~ msgstr " : " +#~ msgstr "ошибка программы: " #~ msgid "cannot activate JACK client" -#~ msgstr " JACK " +#~ msgstr "не удалось активировать клиента JACK сервера" #, fuzzy #~ msgid "removed event" -#~ msgstr " " +#~ msgstr "удалить область" #, fuzzy #~ msgid "removed range" -#~ msgstr " " +#~ msgstr "удалить область" #~ msgid "add" -#~ msgstr "" +#~ msgstr "добавить" #~ msgid "remove" -#~ msgstr "" +#~ msgstr "удалить" #~ msgid "remove region" -#~ msgstr " " +#~ msgstr "удалить область" #~ msgid "separate" -#~ msgstr "" +#~ msgstr "разделить" #~ msgid "split" -#~ msgstr "" +#~ msgstr "склеить" #~ msgid "pre" -#~ msgstr "" +#~ msgstr "пре" #~ msgid "post" -#~ msgstr "" +#~ msgstr "пост" #, fuzzy #~ msgid "Master Out" -#~ msgstr "" - -#, fuzzy -#~ msgid "start" -#~ msgstr "" +#~ msgstr "мастер" #~ msgid "16 bit" -#~ msgstr "16 " +#~ msgstr "16 бит" #~ msgid "24 bit" -#~ msgstr "24 " +#~ msgstr "24 бита" #~ msgid "8 bit" -#~ msgstr "8 " +#~ msgstr "8 бит" diff --git a/libs/ardour/port_insert.cc b/libs/ardour/port_insert.cc index aa2d1392f5..b726b14aa5 100644 --- a/libs/ardour/port_insert.cc +++ b/libs/ardour/port_insert.cc @@ -44,7 +44,7 @@ PortInsert::name_and_id_new_insert (Session& s, uint32_t& bitslot) } PortInsert::PortInsert (Session& s, boost::shared_ptr pannable, boost::shared_ptr mm) - : IOProcessor (s, true, true, name_and_id_new_insert (s, _bitslot), "") + : IOProcessor (s, true, true, name_and_id_new_insert (s, _bitslot), "", DataType::AUDIO, true) , _out (new Delivery (s, _output, pannable, mm, _name, Delivery::Insert)) { _mtdm = 0; diff --git a/libs/ardour/process_thread.cc b/libs/ardour/process_thread.cc index 5d3b54cb13..e10ccf160c 100644 --- a/libs/ardour/process_thread.cc +++ b/libs/ardour/process_thread.cc @@ -29,20 +29,17 @@ using namespace ARDOUR; using namespace Glib; using namespace std; -Private* ProcessThread::_private_thread_buffers = 0; - static void release_thread_buffer (void* arg) { BufferManager::put_thread_buffers ((ThreadBuffers*) arg); } +Glib::Threads::Private ProcessThread::_private_thread_buffers (release_thread_buffer); + void ProcessThread::init () { - if (_private_thread_buffers == 0) { - _private_thread_buffers = new Private (release_thread_buffer); - } } ProcessThread::ProcessThread () @@ -59,22 +56,22 @@ ProcessThread::get_buffers () ThreadBuffers* tb = BufferManager::get_thread_buffers (); assert (tb); - _private_thread_buffers->set (tb); + _private_thread_buffers.set (tb); } void ProcessThread::drop_buffers () { - ThreadBuffers* tb = _private_thread_buffers->get(); + ThreadBuffers* tb = _private_thread_buffers.get(); assert (tb); BufferManager::put_thread_buffers (tb); - _private_thread_buffers->set (0); + _private_thread_buffers.set (0); } BufferSet& ProcessThread::get_silent_buffers (ChanCount count) { - ThreadBuffers* tb = _private_thread_buffers->get(); + ThreadBuffers* tb = _private_thread_buffers.get(); assert (tb); BufferSet* sb = tb->silent_buffers; @@ -95,7 +92,7 @@ ProcessThread::get_silent_buffers (ChanCount count) BufferSet& ProcessThread::get_scratch_buffers (ChanCount count) { - ThreadBuffers* tb = _private_thread_buffers->get(); + ThreadBuffers* tb = _private_thread_buffers.get(); assert (tb); BufferSet* sb = tb->scratch_buffers; @@ -114,7 +111,7 @@ ProcessThread::get_scratch_buffers (ChanCount count) BufferSet& ProcessThread::get_mix_buffers (ChanCount count) { - ThreadBuffers* tb = _private_thread_buffers->get(); + ThreadBuffers* tb = _private_thread_buffers.get(); assert (tb); BufferSet* mb = tb->mix_buffers; @@ -128,7 +125,7 @@ ProcessThread::get_mix_buffers (ChanCount count) gain_t* ProcessThread::gain_automation_buffer() { - ThreadBuffers* tb = _private_thread_buffers->get(); + ThreadBuffers* tb = _private_thread_buffers.get(); assert (tb); gain_t *g = tb->gain_automation_buffer; @@ -139,7 +136,7 @@ ProcessThread::gain_automation_buffer() gain_t* ProcessThread::send_gain_automation_buffer() { - ThreadBuffers* tb = _private_thread_buffers->get(); + ThreadBuffers* tb = _private_thread_buffers.get(); assert (tb); gain_t* g = tb->send_gain_automation_buffer; @@ -150,7 +147,7 @@ ProcessThread::send_gain_automation_buffer() pan_t** ProcessThread::pan_automation_buffer() { - ThreadBuffers* tb = _private_thread_buffers->get(); + ThreadBuffers* tb = _private_thread_buffers.get(); assert (tb); pan_t** p = tb->pan_automation_buffer; diff --git a/libs/ardour/region.cc b/libs/ardour/region.cc index 2166741dda..c74ce4e419 100644 --- a/libs/ardour/region.cc +++ b/libs/ardour/region.cc @@ -23,7 +23,7 @@ #include #include -#include +#include #include "pbd/xml++.h" #include "ardour/debug.h" diff --git a/libs/ardour/region_factory.cc b/libs/ardour/region_factory.cc index ddc0451523..3e81524750 100644 --- a/libs/ardour/region_factory.cc +++ b/libs/ardour/region_factory.cc @@ -36,10 +36,10 @@ using namespace PBD; using namespace std; PBD::Signal1 > RegionFactory::CheckNewRegion; -Glib::StaticMutex RegionFactory::region_map_lock; +Glib::Threads::Mutex RegionFactory::region_map_lock; RegionFactory::RegionMap RegionFactory::region_map; PBD::ScopedConnectionList* RegionFactory::region_list_connections = 0; -Glib::StaticMutex RegionFactory::region_name_maps_mutex; +Glib::Threads::Mutex RegionFactory::region_name_maps_mutex; std::map RegionFactory::region_name_number_map; std::map RegionFactory::region_name_map; RegionFactory::CompoundAssociations RegionFactory::_compound_associations; @@ -310,7 +310,7 @@ RegionFactory::map_add (boost::shared_ptr r) p.second = r; { - Glib::Mutex::Lock lm (region_map_lock); + Glib::Threads::Mutex::Lock lm (region_map_lock); region_map.insert (p); } @@ -332,7 +332,7 @@ RegionFactory::map_remove (boost::weak_ptr w) return; } - Glib::Mutex::Lock lm (region_map_lock); + Glib::Threads::Mutex::Lock lm (region_map_lock); RegionMap::iterator i = region_map.find (r->id()); if (i != region_map.end()) { @@ -383,7 +383,7 @@ RegionFactory::clear_map () } { - Glib::Mutex::Lock lm (region_map_lock); + Glib::Threads::Mutex::Lock lm (region_map_lock); region_map.clear (); _compound_associations.clear (); region_name_map.clear (); @@ -397,7 +397,7 @@ RegionFactory::delete_all_regions () /* copy region list */ { - Glib::Mutex::Lock lm (region_map_lock); + Glib::Threads::Mutex::Lock lm (region_map_lock); copy = region_map; } @@ -417,7 +417,7 @@ RegionFactory::delete_all_regions () uint32_t RegionFactory::nregions () { - Glib::Mutex::Lock lm (region_map_lock); + Glib::Threads::Mutex::Lock lm (region_map_lock); return region_map.size (); } @@ -427,7 +427,7 @@ RegionFactory::add_to_region_name_maps (boost::shared_ptr region) { update_region_name_number_map (region); - Glib::Mutex::Lock lm (region_name_maps_mutex); + Glib::Threads::Mutex::Lock lm (region_name_maps_mutex); region_name_map[region->name()] = region->id (); } @@ -437,7 +437,7 @@ RegionFactory::rename_in_region_name_maps (boost::shared_ptr region) { update_region_name_number_map (region); - Glib::Mutex::Lock lm (region_name_maps_mutex); + Glib::Threads::Mutex::Lock lm (region_name_maps_mutex); map::iterator i = region_name_map.begin(); while (i != region_name_map.end() && i->second != region->id ()) { @@ -476,7 +476,7 @@ RegionFactory::update_region_name_number_map (boost::shared_ptr region) which is just fine */ - Glib::Mutex::Lock lm (region_name_maps_mutex); + Glib::Threads::Mutex::Lock lm (region_name_maps_mutex); region_name_number_map[base] = atoi (number.c_str ()); } } @@ -526,7 +526,7 @@ RegionFactory::region_name (string& result, string base, bool newlevel) } { - Glib::Mutex::Lock lm (region_name_maps_mutex); + Glib::Threads::Mutex::Lock lm (region_name_maps_mutex); map::iterator x; @@ -622,7 +622,7 @@ RegionFactory::new_region_name (string old) void RegionFactory::get_regions_using_source (boost::shared_ptr s, std::set >& r) { - Glib::Mutex::Lock lm (region_map_lock); + Glib::Threads::Mutex::Lock lm (region_map_lock); for (RegionMap::iterator i = region_map.begin(); i != region_map.end(); ++i) { if (i->second->uses_source (s)) { @@ -634,7 +634,7 @@ RegionFactory::get_regions_using_source (boost::shared_ptr s, std::set src) { - Glib::Mutex::Lock lm (region_map_lock); + Glib::Threads::Mutex::Lock lm (region_map_lock); RegionMap::iterator i = region_map.begin(); while (i != region_map.end()) { @@ -654,6 +654,6 @@ RegionFactory::remove_regions_using_source (boost::shared_ptr src) void RegionFactory::add_compound_association (boost::shared_ptr orig, boost::shared_ptr copy) { - Glib::Mutex::Lock lm (region_map_lock); + Glib::Threads::Mutex::Lock lm (region_map_lock); _compound_associations[copy] = orig; } diff --git a/libs/ardour/return.cc b/libs/ardour/return.cc index 43a2e1bfd1..519f3ca494 100644 --- a/libs/ardour/return.cc +++ b/libs/ardour/return.cc @@ -151,7 +151,7 @@ Return::configure_io (ChanCount in, ChanCount out) // Ensure there are enough buffers (since we add some) if (_session.get_scratch_buffers(in).count() < out) { - Glib::Mutex::Lock em (_session.engine().process_lock()); + Glib::Threads::Mutex::Lock em (_session.engine().process_lock()); IO::PortCountChanged(out); } diff --git a/libs/ardour/route.cc b/libs/ardour/route.cc index f7fdb2f11b..e772b3d23a 100644 --- a/libs/ardour/route.cc +++ b/libs/ardour/route.cc @@ -66,7 +66,6 @@ using namespace std; using namespace ARDOUR; using namespace PBD; -uint32_t Route::order_key_cnt = 0; PBD::Signal1 Route::SyncOrderKeys; PBD::Signal0 Route::RemoteControlIDChange; @@ -169,7 +168,7 @@ Route::init () { /* run a configure so that the invisible processors get set up */ - Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ()); + Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ()); configure_processors (0); } @@ -189,7 +188,7 @@ Route::~Route () be half-destroyed by now */ - Glib::RWLock::WriterLock lm (_processor_lock); + Glib::Threads::RWLock::WriterLock lm (_processor_lock); for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) { (*i)->drop_references (); } @@ -295,19 +294,12 @@ Route::sync_order_keys (RouteSortOrderKey base) for (OrderKeys::iterator k = order_keys.begin(); k != order_keys.end(); ++k) { - if (is_master() || is_monitor()) { - /* don't sync the sort keys for master/monitor, - * since they are not part of the normal ordering. - */ - continue; - } - if (k->first != base) { DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("%1 set key for %2 to %3 from %4\n", name(), enum_2_string (k->first), i->second, - base)); + enum_2_string (base))); k->second = i->second; } @@ -315,66 +307,17 @@ Route::sync_order_keys (RouteSortOrderKey base) } void -Route::set_remote_control_id_from_order_key (RouteSortOrderKey key) +Route::set_remote_control_id_from_order_key (RouteSortOrderKey key, uint32_t rid) { if (is_master() || is_monitor() || is_hidden()) { /* hard-coded remote IDs, or no remote ID */ return; } - uint32_t n = order_keys[key]; - - /* we have a nasty glitch in an otherwise fairly clean system here. - - in theory, a route's remote control ID is determined by the order - key matching the current remote model (for UserOrdered, the user - controls everything). its one greater, because order keys are zero - based and remote control IDs start at one. - - but ... an order key for the master bus may place it before or even - within normal routes, yet its remote control ID (like the monitor - bus) is hardcoded to MasterBusRemoteControlID. this means that all - routes ordered after it (in whatever controls the EditorSort or - MixerSort ordering) will end up with a remote control ID that is one - too large. - - we therefore check on the master bus ordering, and adjust - later-sorted routes remote control ID to avoid this "off by one" - error, which keeps remote control ID's contiguous and "right". - - ideally, this would be done in a UI layer, where this logic - is really understood and has meaning, rather than in libardour where - its fundamentally meaningless. - */ - - switch (Config->get_remote_model()) { - case UserOrdered: - break; - case EditorOrdered: - if (key == EditorSort) { - boost::shared_ptr master = _session.master_out(); - if (master && n > 0 && n > master->order_key (EditorSort)) { - --n; - } - _remote_control_id = n + 1; - DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("%1: from order key %2, set edit-based RID to %3\n", - name(), n, _remote_control_id)); - RemoteControlIDChanged (); /* EMIT SIGNAL * (per-route) */ - } - break; - - case MixerOrdered: - if (key == MixerSort) { - boost::shared_ptr master = _session.master_out(); - if (master && n > 0 && n > master->order_key (MixerSort)) { - --n; - } - _remote_control_id = n + 1; - DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("%1: from order key %2, set mix-based RID to %3\n", - name(), n, _remote_control_id)); - RemoteControlIDChanged (); /* EMIT SIGNAL (per-route) */ - } - break; + if (_remote_control_id != rid) { + DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("%1: set edit-based RID to %2\n", name(), rid)); + _remote_control_id = rid; + RemoteControlIDChanged (); /* EMIT SIGNAL (per-route) */ } /* don't emit the class-level RID signal RemoteControlIDChange here, @@ -398,8 +341,8 @@ Route::set_order_key (RouteSortOrderKey key, uint32_t n) order_keys[key] = n; - DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("%1 order key %2 set to %3 (chk=%4)\n", - name(), enum_2_string (key), n, order_key (key))); + DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("%1 order key %2 set to %3\n", + name(), enum_2_string (key), order_key (key))); _session.set_dirty (); } @@ -951,7 +894,7 @@ dump_processors(const string& name, const list >& p boost::shared_ptr Route::before_processor_for_placement (Placement p) { - Glib::RWLock::ReaderLock lm (_processor_lock); + Glib::Threads::RWLock::ReaderLock lm (_processor_lock); ProcessorList::iterator loc; @@ -976,7 +919,7 @@ Route::before_processor_for_index (int index) return boost::shared_ptr (); } - Glib::RWLock::ReaderLock lm (_processor_lock); + Glib::Threads::RWLock::ReaderLock lm (_processor_lock); ProcessorList::iterator i = _processors.begin (); int j = 0; @@ -1029,7 +972,7 @@ Route::add_processor (boost::shared_ptr processor, boost::shared_ptr< } { - Glib::RWLock::WriterLock lm (_processor_lock); + Glib::Threads::RWLock::WriterLock lm (_processor_lock); ProcessorState pstate (this); boost::shared_ptr pi; @@ -1069,7 +1012,7 @@ Route::add_processor (boost::shared_ptr processor, boost::shared_ptr< // configure redirect ports properly, etc. { - Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ()); + Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ()); if (configure_processors_unlocked (err)) { pstate.restore (); @@ -1198,7 +1141,7 @@ Route::add_processors (const ProcessorList& others, boost::shared_ptr } { - Glib::RWLock::WriterLock lm (_processor_lock); + Glib::Threads::RWLock::WriterLock lm (_processor_lock); ProcessorState pstate (this); for (ProcessorList::const_iterator i = others.begin(); i != others.end(); ++i) { @@ -1220,7 +1163,7 @@ Route::add_processors (const ProcessorList& others, boost::shared_ptr } { - Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ()); + Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ()); if (configure_processors_unlocked (err)) { pstate.restore (); configure_processors_unlocked (0); // it worked before we tried to add it ... @@ -1271,7 +1214,7 @@ Route::placement_range(Placement p, ProcessorList::iterator& start, ProcessorLis void Route::disable_processors (Placement p) { - Glib::RWLock::ReaderLock lm (_processor_lock); + Glib::Threads::RWLock::ReaderLock lm (_processor_lock); ProcessorList::iterator start, end; placement_range(p, start, end); @@ -1288,7 +1231,7 @@ Route::disable_processors (Placement p) void Route::disable_processors () { - Glib::RWLock::ReaderLock lm (_processor_lock); + Glib::Threads::RWLock::ReaderLock lm (_processor_lock); for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) { (*i)->deactivate (); @@ -1303,7 +1246,7 @@ Route::disable_processors () void Route::disable_plugins (Placement p) { - Glib::RWLock::ReaderLock lm (_processor_lock); + Glib::Threads::RWLock::ReaderLock lm (_processor_lock); ProcessorList::iterator start, end; placement_range(p, start, end); @@ -1322,7 +1265,7 @@ Route::disable_plugins (Placement p) void Route::disable_plugins () { - Glib::RWLock::ReaderLock lm (_processor_lock); + Glib::Threads::RWLock::ReaderLock lm (_processor_lock); for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) { if (boost::dynamic_pointer_cast (*i)) { @@ -1337,7 +1280,7 @@ Route::disable_plugins () void Route::ab_plugins (bool forward) { - Glib::RWLock::ReaderLock lm (_processor_lock); + Glib::Threads::RWLock::ReaderLock lm (_processor_lock); if (forward) { @@ -1396,7 +1339,7 @@ Route::clear_processors (Placement p) } { - Glib::RWLock::WriterLock lm (_processor_lock); + Glib::Threads::RWLock::WriterLock lm (_processor_lock); ProcessorList new_list; ProcessorStreams err; bool seen_amp = false; @@ -1442,7 +1385,7 @@ Route::clear_processors (Placement p) _processors = new_list; { - Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ()); + Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ()); configure_processors_unlocked (&err); // this can't fail } } @@ -1480,7 +1423,7 @@ Route::remove_processor (boost::shared_ptr processor, ProcessorStream processor_max_streams.reset(); { - Glib::RWLock::WriterLock lm (_processor_lock); + Glib::Threads::RWLock::WriterLock lm (_processor_lock); ProcessorState pstate (this); ProcessorList::iterator i; @@ -1521,7 +1464,7 @@ Route::remove_processor (boost::shared_ptr processor, ProcessorStream } if (need_process_lock) { - Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ()); + Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ()); if (configure_processors_unlocked (err)) { pstate.restore (); @@ -1572,7 +1515,7 @@ Route::remove_processors (const ProcessorList& to_be_deleted, ProcessorStreams* processor_max_streams.reset(); { - Glib::RWLock::WriterLock lm (_processor_lock); + Glib::Threads::RWLock::WriterLock lm (_processor_lock); ProcessorState pstate (this); ProcessorList::iterator i; @@ -1619,7 +1562,7 @@ Route::remove_processors (const ProcessorList& to_be_deleted, ProcessorStreams* _output->set_user_latency (0); { - Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ()); + Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ()); if (configure_processors_unlocked (err)) { pstate.restore (); @@ -1670,7 +1613,7 @@ Route::configure_processors (ProcessorStreams* err) assert (!AudioEngine::instance()->process_lock().trylock()); if (!_in_configure_processors) { - Glib::RWLock::WriterLock lm (_processor_lock); + Glib::Threads::RWLock::WriterLock lm (_processor_lock); return configure_processors_unlocked (err); } @@ -1686,7 +1629,7 @@ Route::input_streams () const list > Route::try_configure_processors (ChanCount in, ProcessorStreams* err) { - Glib::RWLock::ReaderLock lm (_processor_lock); + Glib::Threads::RWLock::ReaderLock lm (_processor_lock); return try_configure_processors_unlocked (in, err); } @@ -1791,7 +1734,7 @@ Route::configure_processors_unlocked (ProcessorStreams* err) void Route::all_visible_processors_active (bool state) { - Glib::RWLock::ReaderLock lm (_processor_lock); + Glib::Threads::RWLock::ReaderLock lm (_processor_lock); if (_processors.empty()) { return; @@ -1822,7 +1765,7 @@ Route::reorder_processors (const ProcessorList& new_order, ProcessorStreams* err */ { - Glib::RWLock::WriterLock lm (_processor_lock); + Glib::Threads::RWLock::WriterLock lm (_processor_lock); ProcessorState pstate (this); ProcessorList::iterator oiter; @@ -1884,7 +1827,7 @@ Route::reorder_processors (const ProcessorList& new_order, ProcessorStreams* err maybe_note_meter_position (); { - Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ()); + Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ()); if (configure_processors_unlocked (err)) { pstate.restore (); @@ -2191,7 +2134,7 @@ Route::set_state (const XMLNode& node, int version) if ((prop = node.property (X_("processor-after-last-custom-meter"))) != 0) { PBD::ID id (prop->value ()); - Glib::RWLock::ReaderLock lm (_processor_lock); + Glib::Threads::RWLock::ReaderLock lm (_processor_lock); ProcessorList::const_iterator i = _processors.begin (); while (i != _processors.end() && (*i)->id() != id) { ++i; @@ -2625,11 +2568,11 @@ Route::set_processor_state (const XMLNode& node) } { - Glib::RWLock::WriterLock lm (_processor_lock); + Glib::Threads::RWLock::WriterLock lm (_processor_lock); _processors = new_order; if (must_configure) { - Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ()); + Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ()); configure_processors_unlocked (0); } @@ -2663,7 +2606,7 @@ Route::curve_reallocate () void Route::silence (framecnt_t nframes) { - Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK); + Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK); if (!lm.locked()) { return; } @@ -2709,7 +2652,7 @@ Route::add_internal_return () void Route::add_send_to_internal_return (InternalSend* send) { - Glib::RWLock::ReaderLock rm (_processor_lock); + Glib::Threads::RWLock::ReaderLock rm (_processor_lock); for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) { boost::shared_ptr d = boost::dynamic_pointer_cast(*x); @@ -2723,7 +2666,7 @@ Route::add_send_to_internal_return (InternalSend* send) void Route::remove_send_from_internal_return (InternalSend* send) { - Glib::RWLock::ReaderLock rm (_processor_lock); + Glib::Threads::RWLock::ReaderLock rm (_processor_lock); for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) { boost::shared_ptr d = boost::dynamic_pointer_cast(*x); @@ -2763,7 +2706,7 @@ Route::add_aux_send (boost::shared_ptr route, boost::shared_ptr route, boost::shared_ptr listener; { - Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ()); + Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ()); listener.reset (new InternalSend (_session, _pannable, _mute_master, route, Delivery::Aux)); } @@ -2801,7 +2744,7 @@ Route::remove_aux_or_listen (boost::shared_ptr route) ProcessorList::iterator tmp; { - Glib::RWLock::ReaderLock rl(_processor_lock); + Glib::Threads::RWLock::ReaderLock rl(_processor_lock); /* have to do this early because otherwise processor reconfig * will put _monitor_send back in the list @@ -2937,11 +2880,7 @@ Route::nonrealtime_handle_transport_stopped (bool /*abort_ignored*/, bool did_lo framepos_t now = _session.transport_frame(); { - Glib::RWLock::ReaderLock lm (_processor_lock); - - if (!did_locate) { - automation_snapshot (now, true); - } + Glib::Threads::RWLock::ReaderLock lm (_processor_lock); Automatable::transport_stopped (now); @@ -3028,7 +2967,7 @@ Route::pans_required () const int Route::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, bool session_state_changing) { - Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK); + Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK); if (!lm.locked()) { return 0; } @@ -3065,13 +3004,11 @@ Route::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, int Route::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, int declick, bool& /* need_butler */) { - Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK); + Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK); if (!lm.locked()) { return 0; } - automation_snapshot (_session.transport_frame(), false); - if (n_outputs().n_total() == 0) { return 0; } @@ -3108,7 +3045,7 @@ Route::flush_processors () this is called from the RT audio thread. */ - Glib::RWLock::ReaderLock lm (_processor_lock); + Glib::Threads::RWLock::ReaderLock lm (_processor_lock); for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) { (*i)->flush (); @@ -3127,7 +3064,7 @@ Route::set_meter_point (MeterPoint p, bool force) bool meter_was_visible_to_user = _meter->display_to_user (); { - Glib::RWLock::WriterLock lm (_processor_lock); + Glib::Threads::RWLock::WriterLock lm (_processor_lock); maybe_note_meter_position (); @@ -3194,11 +3131,11 @@ void Route::listen_position_changed () { { - Glib::RWLock::WriterLock lm (_processor_lock); + Glib::Threads::RWLock::WriterLock lm (_processor_lock); ProcessorState pstate (this); { - Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ()); + Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ()); if (configure_processors_unlocked (0)) { pstate.restore (); @@ -3221,7 +3158,7 @@ Route::add_export_point() _capturing_processor->activate (); { - Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ()); + Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ()); configure_processors (0); } @@ -3283,18 +3220,6 @@ Route::set_latency_compensation (framecnt_t longest_session_latency) } } -void -Route::automation_snapshot (framepos_t now, bool force) -{ - if (_pannable) { - _pannable->automation_snapshot (now, force); - } - - for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) { - (*i)->automation_snapshot (now, force); - } -} - Route::SoloControllable::SoloControllable (std::string name, boost::shared_ptr r) : AutomationControl (r->session(), Evoral::Parameter (SoloAutomation), boost::shared_ptr(), name) @@ -3447,7 +3372,7 @@ Route::shift (framepos_t pos, framecnt_t frames) /* redirect automation */ { - Glib::RWLock::ReaderLock lm (_processor_lock); + Glib::Threads::RWLock::ReaderLock lm (_processor_lock); for (ProcessorList::iterator i = _processors.begin (); i != _processors.end (); ++i) { set parameters = (*i)->what_can_be_automated(); @@ -3547,7 +3472,7 @@ Route::set_name_in_state (XMLNode& node, string const & name) boost::shared_ptr Route::internal_send_for (boost::shared_ptr target) const { - Glib::RWLock::ReaderLock lm (_processor_lock); + Glib::Threads::RWLock::ReaderLock lm (_processor_lock); for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) { boost::shared_ptr send; @@ -3631,7 +3556,7 @@ Route::set_active (bool yn, void* src) void Route::meter () { - Glib::RWLock::ReaderLock rm (_processor_lock, Glib::TRY_LOCK); + Glib::Threads::RWLock::ReaderLock rm (_processor_lock, Glib::Threads::TRY_LOCK); assert (_meter); @@ -3686,7 +3611,7 @@ Route::get_control (const Evoral::Parameter& param) /* maybe one of our processors does or ... */ - Glib::RWLock::ReaderLock rm (_processor_lock, Glib::TRY_LOCK); + Glib::Threads::RWLock::ReaderLock rm (_processor_lock, Glib::Threads::TRY_LOCK); for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) { if ((c = boost::dynamic_pointer_cast((*i)->control (param))) != 0) { break; @@ -3708,7 +3633,7 @@ Route::get_control (const Evoral::Parameter& param) boost::shared_ptr Route::nth_plugin (uint32_t n) { - Glib::RWLock::ReaderLock lm (_processor_lock); + Glib::Threads::RWLock::ReaderLock lm (_processor_lock); ProcessorList::iterator i; for (i = _processors.begin(); i != _processors.end(); ++i) { @@ -3725,7 +3650,7 @@ Route::nth_plugin (uint32_t n) boost::shared_ptr Route::nth_send (uint32_t n) { - Glib::RWLock::ReaderLock lm (_processor_lock); + Glib::Threads::RWLock::ReaderLock lm (_processor_lock); ProcessorList::iterator i; for (i = _processors.begin(); i != _processors.end(); ++i) { @@ -3742,7 +3667,7 @@ Route::nth_send (uint32_t n) bool Route::has_io_processor_named (const string& name) { - Glib::RWLock::ReaderLock lm (_processor_lock); + Glib::Threads::RWLock::ReaderLock lm (_processor_lock); ProcessorList::iterator i; for (i = _processors.begin(); i != _processors.end(); ++i) { @@ -3766,7 +3691,7 @@ Route::mute_points () const void Route::set_processor_positions () { - Glib::RWLock::ReaderLock lm (_processor_lock); + Glib::Threads::RWLock::ReaderLock lm (_processor_lock); bool had_amp = false; for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) { @@ -3798,7 +3723,7 @@ Route::unknown_processors () const { list p; - Glib::RWLock::ReaderLock lm (_processor_lock); + Glib::Threads::RWLock::ReaderLock lm (_processor_lock); for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) { if (boost::dynamic_pointer_cast (*i)) { p.push_back ((*i)->name ()); @@ -3923,7 +3848,7 @@ void Route::setup_invisible_processors () { #ifndef NDEBUG - Glib::RWLock::WriterLock lm (_processor_lock, Glib::TRY_LOCK); + Glib::Threads::RWLock::WriterLock lm (_processor_lock, Glib::Threads::TRY_LOCK); assert (!lm.locked ()); #endif @@ -4079,8 +4004,8 @@ Route::setup_invisible_processors () void Route::unpan () { - Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ()); - Glib::RWLock::ReaderLock lp (_processor_lock); + Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ()); + Glib::Threads::RWLock::ReaderLock lp (_processor_lock); _pannable.reset (); @@ -4124,7 +4049,7 @@ Route::maybe_note_meter_position () boost::shared_ptr Route::processor_by_id (PBD::ID id) const { - Glib::RWLock::ReaderLock lm (_processor_lock); + Glib::Threads::RWLock::ReaderLock lm (_processor_lock); for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) { if ((*i)->id() == id) { return *i; @@ -4172,7 +4097,7 @@ Route::has_external_redirects () const boost::shared_ptr Route::the_instrument () const { - Glib::RWLock::WriterLock lm (_processor_lock); + Glib::Threads::RWLock::WriterLock lm (_processor_lock); for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) { if (boost::dynamic_pointer_cast(*i)) { if ((*i)->input_streams().n_midi() > 0 && @@ -4183,3 +4108,19 @@ Route::the_instrument () const } return boost::shared_ptr(); } + +void +Route::non_realtime_locate (framepos_t pos) +{ + if (_pannable) { + _pannable->transport_located (pos); + } + + { + Glib::Threads::RWLock::WriterLock lm (_processor_lock); + + for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) { + (*i)->transport_located (pos); + } + } +} diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc index 47f39d96b7..3d7535d5e5 100644 --- a/libs/ardour/session.cc +++ b/libs/ardour/session.cc @@ -30,7 +30,7 @@ #include #include -#include +#include #include #include @@ -560,7 +560,7 @@ Session::when_engine_running () ControlProtocolManager::instance().midi_connectivity_established (); if (_is_new && !no_auto_connect()) { - Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock()); + Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock()); auto_connect_master_bus (); } @@ -626,7 +626,7 @@ Session::remove_monitor_section () * pieces of audio as we work on each route. */ - Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ()); + Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ()); /* Connect tracks to monitor section. Note that in an existing session, the internal sends will already exist, but we want the @@ -672,7 +672,7 @@ Session::add_monitor_section () // boost_debug_shared_ptr_mark_interesting (r.get(), "Route"); #endif { - Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ()); + Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ()); r->input()->ensure_io (_master_out->output()->n_ports(), false, this); r->output()->ensure_io (_master_out->output()->n_ports(), false, this); } @@ -773,7 +773,7 @@ Session::add_monitor_section () * pieces of audio as we work on each route. */ - Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ()); + Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ()); /* Connect tracks to monitor section. Note that in an existing session, the internal sends will already exist, but we want the @@ -1625,7 +1625,7 @@ Session::new_midi_track (const ChanCount& input, const ChanCount& output, boost: // boost_debug_shared_ptr_mark_interesting (track.get(), "Track"); #endif { - Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ()); + Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ()); if (track->input()->ensure_io (input, false, this)) { error << "cannot configure " << input << " out configuration for new midi track" << endmsg; goto failed; @@ -1725,7 +1725,7 @@ Session::auto_connect_route (boost::shared_ptr route, ChanCount& existing return; } - Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock (), Glib::NOT_LOCK); + Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK); if (with_lock) { lm.acquire (); @@ -1860,7 +1860,7 @@ Session::new_audio_track (int input_channels, int output_channels, TrackMode mod // boost_debug_shared_ptr_mark_interesting (track.get(), "Track"); #endif { - Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ()); + Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ()); if (track->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) { error << string_compose ( @@ -1946,7 +1946,7 @@ Session::new_audio_route (int input_channels, int output_channels, RouteGroup* r // boost_debug_shared_ptr_mark_interesting (bus.get(), "Route"); #endif { - Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ()); + Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ()); if (bus->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) { error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"), @@ -2062,7 +2062,7 @@ Session::new_route_from_template (uint32_t how_many, const std::string& template loading this normally happens in a different way. */ - Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ()); + Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ()); IOChange change (IOChange::Type (IOChange::ConfigurationChanged | IOChange::ConnectionsChanged)); change.after = route->input()->n_ports(); @@ -2183,7 +2183,7 @@ Session::add_routes (RouteList& new_routes, bool input_auto_connect, bool output if (_monitor_out && IO::connecting_legal) { { - Glib::Mutex::Lock lm (_engine.process_lock()); + Glib::Threads::Mutex::Lock lm (_engine.process_lock()); for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) { if ((*x)->is_monitor()) { @@ -2206,22 +2206,6 @@ Session::add_routes (RouteList& new_routes, bool input_auto_connect, bool output } RouteAdded (new_routes); /* EMIT SIGNAL */ - - /* we added at least one new route, and everyone who needs to has now - * handled this event. This means that route order keys are correctly - * set and we can now ensure that remote control IDs are set. - */ - - switch (Config->get_remote_model()) { - case UserOrdered: - break; - case MixerOrdered: - sync_remote_id_from_order_keys (MixerSort); - break; - case EditorOrdered: - sync_remote_id_from_order_keys (EditorSort); - break; - } } void @@ -2870,7 +2854,7 @@ Session::find_whole_file_parent (boost::shared_ptr child) const RegionFactory::RegionMap::const_iterator i; boost::shared_ptr region; - Glib::Mutex::Lock lm (region_lock); + Glib::Threads::Mutex::Lock lm (region_lock); for (i = regions.begin(); i != regions.end(); ++i) { @@ -2916,7 +2900,7 @@ Session::destroy_sources (list > srcs) for (list >::iterator s = srcs.begin(); s != srcs.end(); ) { { - Glib::Mutex::Lock ls (source_lock); + Glib::Threads::Mutex::Lock ls (source_lock); /* remove from the main source list */ sources.erase ((*s)->id()); } @@ -2969,7 +2953,7 @@ Session::add_source (boost::shared_ptr source) entry.second = source; { - Glib::Mutex::Lock lm (source_lock); + Glib::Threads::Mutex::Lock lm (source_lock); result = sources.insert (entry); } @@ -3014,7 +2998,7 @@ Session::remove_source (boost::weak_ptr src) } { - Glib::Mutex::Lock lm (source_lock); + Glib::Threads::Mutex::Lock lm (source_lock); if ((i = sources.find (source->id())) != sources.end()) { sources.erase (i); @@ -3034,7 +3018,7 @@ Session::remove_source (boost::weak_ptr src) boost::shared_ptr Session::source_by_id (const PBD::ID& id) { - Glib::Mutex::Lock lm (source_lock); + Glib::Threads::Mutex::Lock lm (source_lock); SourceMap::iterator i; boost::shared_ptr source; @@ -3048,7 +3032,7 @@ Session::source_by_id (const PBD::ID& id) boost::shared_ptr Session::source_by_path_and_channel (const string& path, uint16_t chn) { - Glib::Mutex::Lock lm (source_lock); + Glib::Threads::Mutex::Lock lm (source_lock); for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) { boost::shared_ptr afs @@ -3065,7 +3049,7 @@ uint32_t Session::count_sources_by_origin (const string& path) { uint32_t cnt = 0; - Glib::Mutex::Lock lm (source_lock); + Glib::Threads::Mutex::Lock lm (source_lock); for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) { boost::shared_ptr fs @@ -3530,7 +3514,7 @@ Session::graph_reordered () boost::optional Session::available_capture_duration () { - Glib::Mutex::Lock lm (space_lock); + Glib::Threads::Mutex::Lock lm (space_lock); if (_total_free_4k_blocks_uncertain) { return boost::optional (); @@ -4578,7 +4562,7 @@ void Session::initialize_latencies () { { - Glib::Mutex::Lock lm (_engine.process_lock()); + Glib::Threads::Mutex::Lock lm (_engine.process_lock()); update_latency (false); update_latency (true); } @@ -4713,7 +4697,7 @@ Session::next_control_id () const } void -Session::sync_order_keys (RouteSortOrderKey sort_key_changed) +Session::notify_remote_id_change () { if (deletion_in_progress()) { return; @@ -4727,6 +4711,14 @@ Session::sync_order_keys (RouteSortOrderKey sort_key_changed) default: break; } +} + +void +Session::sync_order_keys (RouteSortOrderKey sort_key_changed) +{ + if (deletion_in_progress()) { + return; + } /* tell everyone that something has happened to the sort keys and let them sync up with the change(s) @@ -4738,46 +4730,7 @@ Session::sync_order_keys (RouteSortOrderKey sort_key_changed) Route::SyncOrderKeys (sort_key_changed); /* EMIT SIGNAL */ - /* ensure that remote control IDs are in sync with the relevant - order keys. - */ - - sync_remote_id_from_order_keys (sort_key_changed); -} - -void -Session::sync_remote_id_from_order_keys (RouteSortOrderKey sort_key_changed) -{ - /* update remote control IDs if that makes sense */ - - bool do_update = false; - - DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("sync RID to order key %1\n", enum_2_string (sort_key_changed))); - - switch (Config->get_remote_model()) { - case UserOrdered: - break; - case EditorOrdered: - if (sort_key_changed == EditorSort) { - do_update = true; - } - break; - case MixerOrdered: - if (sort_key_changed == MixerSort) { - do_update = true; - } - break; - } - - if (do_update) { - DEBUG_TRACE (DEBUG::OrderKeys, "\tactually update + signal\n"); - boost::shared_ptr r = routes.reader(); - for (RouteList::iterator i = r->begin(); i != r->end(); ++i) { - (*i)->set_remote_control_id_from_order_key (sort_key_changed); - } - - Route::RemoteControlIDChange (); /* EMIT SIGNAL - static */ - } + DEBUG_TRACE (DEBUG::OrderKeys, "\tsync done\n"); } bool diff --git a/libs/ardour/session_butler.cc b/libs/ardour/session_butler.cc index 88f61335e0..1d235b051a 100644 --- a/libs/ardour/session_butler.cc +++ b/libs/ardour/session_butler.cc @@ -25,7 +25,7 @@ #include #include -#include +#include #include "pbd/error.h" #include "pbd/pthread_utils.h" diff --git a/libs/ardour/session_click.cc b/libs/ardour/session_click.cc index abfbaecfcd..e6e8749aec 100644 --- a/libs/ardour/session_click.cc +++ b/libs/ardour/session_click.cc @@ -51,7 +51,7 @@ Session::click (framepos_t start, framecnt_t nframes) return; } - Glib::RWLock::WriterLock clickm (click_lock, Glib::TRY_LOCK); + Glib::Threads::RWLock::WriterLock clickm (click_lock, Glib::Threads::TRY_LOCK); /* how far have we moved since the last time the clicks got cleared */ @@ -225,7 +225,7 @@ Session::setup_click_sounds (int which) void Session::clear_clicks () { - Glib::RWLock::WriterLock lm (click_lock); + Glib::Threads::RWLock::WriterLock lm (click_lock); for (Clicks::iterator i = clicks.begin(); i != clicks.end(); ++i) { delete *i; diff --git a/libs/ardour/session_directory.cc b/libs/ardour/session_directory.cc index 5f3e984955..ec4fded685 100644 --- a/libs/ardour/session_directory.cc +++ b/libs/ardour/session_directory.cc @@ -16,6 +16,8 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +#include + #include #include diff --git a/libs/ardour/session_export.cc b/libs/ardour/session_export.cc index acb23aee8b..1c1b4f9a0f 100644 --- a/libs/ardour/session_export.cc +++ b/libs/ardour/session_export.cc @@ -19,7 +19,7 @@ #include "pbd/error.h" -#include +#include #include #include diff --git a/libs/ardour/session_playlists.cc b/libs/ardour/session_playlists.cc index b833aea1f2..ac3baf2008 100644 --- a/libs/ardour/session_playlists.cc +++ b/libs/ardour/session_playlists.cc @@ -69,7 +69,7 @@ SessionPlaylists::~SessionPlaylists () bool SessionPlaylists::add (boost::shared_ptr playlist) { - Glib::Mutex::Lock lm (lock); + Glib::Threads::Mutex::Lock lm (lock); bool const existing = find (playlists.begin(), playlists.end(), playlist) != playlists.end(); @@ -96,7 +96,7 @@ SessionPlaylists::remove_weak (boost::weak_ptr playlist) void SessionPlaylists::remove (boost::shared_ptr playlist) { - Glib::Mutex::Lock lm (lock); + Glib::Threads::Mutex::Lock lm (lock); List::iterator i; @@ -129,7 +129,7 @@ SessionPlaylists::track (bool inuse, boost::weak_ptr wpl) } { - Glib::Mutex::Lock lm (lock); + Glib::Threads::Mutex::Lock lm (lock); if (!inuse) { @@ -154,14 +154,14 @@ SessionPlaylists::track (bool inuse, boost::weak_ptr wpl) uint32_t SessionPlaylists::n_playlists () const { - Glib::Mutex::Lock lm (lock); + Glib::Threads::Mutex::Lock lm (lock); return playlists.size(); } boost::shared_ptr SessionPlaylists::by_name (string name) { - Glib::Mutex::Lock lm (lock); + Glib::Threads::Mutex::Lock lm (lock); for (List::iterator i = playlists.begin(); i != playlists.end(); ++i) { if ((*i)->name() == name) { @@ -181,7 +181,7 @@ SessionPlaylists::by_name (string name) boost::shared_ptr SessionPlaylists::by_id (const PBD::ID& id) { - Glib::Mutex::Lock lm (lock); + Glib::Threads::Mutex::Lock lm (lock); for (List::iterator i = playlists.begin(); i != playlists.end(); ++i) { if ((*i)->id() == id) { @@ -201,7 +201,7 @@ SessionPlaylists::by_id (const PBD::ID& id) void SessionPlaylists::unassigned (std::list > & list) { - Glib::Mutex::Lock lm (lock); + Glib::Threads::Mutex::Lock lm (lock); for (List::iterator i = playlists.begin(); i != playlists.end(); ++i) { if (!(*i)->get_orig_track_id().to_s().compare ("0")) { @@ -219,7 +219,7 @@ SessionPlaylists::unassigned (std::list > & list) void SessionPlaylists::get (vector >& s) const { - Glib::Mutex::Lock lm (lock); + Glib::Threads::Mutex::Lock lm (lock); for (List::iterator i = playlists.begin(); i != playlists.end(); ++i) { s.push_back (*i); @@ -233,7 +233,7 @@ SessionPlaylists::get (vector >& s) const void SessionPlaylists::destroy_region (boost::shared_ptr r) { - Glib::Mutex::Lock lm (lock); + Glib::Threads::Mutex::Lock lm (lock); for (List::iterator i = playlists.begin(); i != playlists.end(); ++i) { (*i)->destroy_region (r); @@ -270,7 +270,7 @@ SessionPlaylists::source_use_count (boost::shared_ptr src) const void SessionPlaylists::sync_all_regions_with_regions () { - Glib::Mutex::Lock lm (lock); + Glib::Threads::Mutex::Lock lm (lock); for (List::const_iterator p = playlists.begin(); p != playlists.end(); ++p) { (*p)->sync_all_regions_with_regions (); @@ -411,7 +411,7 @@ SessionPlaylists::XMLPlaylistFactory (Session& session, const XMLNode& node) boost::shared_ptr SessionPlaylists::find_crossfade (const PBD::ID& id) { - Glib::Mutex::Lock lm (lock); + Glib::Threads::Mutex::Lock lm (lock); boost::shared_ptr c; @@ -435,7 +435,7 @@ SessionPlaylists::find_crossfade (const PBD::ID& id) uint32_t SessionPlaylists::region_use_count (boost::shared_ptr region) const { - Glib::Mutex::Lock lm (lock); + Glib::Threads::Mutex::Lock lm (lock); uint32_t cnt = 0; for (List::iterator i = playlists.begin(); i != playlists.end(); ++i) { diff --git a/libs/ardour/session_process.cc b/libs/ardour/session_process.cc index 6cebc13b0d..019f491a4a 100644 --- a/libs/ardour/session_process.cc +++ b/libs/ardour/session_process.cc @@ -25,7 +25,7 @@ #include "pbd/error.h" #include "pbd/enumwriter.h" -#include +#include #include "ardour/audioengine.h" #include "ardour/auditioner.h" diff --git a/libs/ardour/session_state.cc b/libs/ardour/session_state.cc index a3460dddfb..3ef2e0d521 100644 --- a/libs/ardour/session_state.cc +++ b/libs/ardour/session_state.cc @@ -54,7 +54,7 @@ #include #include -#include +#include #include @@ -576,7 +576,7 @@ Session::create (const string& session_template, BusProfile* bus_profile) // boost_debug_shared_ptr_mark_interesting (r.get(), "Route"); #endif { - Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ()); + Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ()); r->input()->ensure_io (count, false, this); r->output()->ensure_io (count, false, this); } @@ -1043,7 +1043,7 @@ Session::state (bool full_state) child = node->add_child ("Sources"); if (full_state) { - Glib::Mutex::Lock sl (source_lock); + Glib::Threads::Mutex::Lock sl (source_lock); for (SourceMap::iterator siter = sources.begin(); siter != sources.end(); ++siter) { @@ -1070,7 +1070,7 @@ Session::state (bool full_state) child = node->add_child ("Regions"); if (full_state) { - Glib::Mutex::Lock rl (region_lock); + Glib::Threads::Mutex::Lock rl (region_lock); const RegionFactory::RegionMap& region_map (RegionFactory::all_regions()); for (RegionFactory::RegionMap::const_iterator i = region_map.begin(); i != region_map.end(); ++i) { boost::shared_ptr r = i->second; @@ -1879,7 +1879,7 @@ Session::get_sources_as_xml () { XMLNode* node = new XMLNode (X_("Sources")); - Glib::Mutex::Lock lm (source_lock); + Glib::Threads::Mutex::Lock lm (source_lock); for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) { node->add_child_nocopy (i->second->get_state()); @@ -2066,7 +2066,7 @@ Session::refresh_disk_space () { #if HAVE_SYS_VFS_H && HAVE_SYS_STATVFS_H - Glib::Mutex::Lock lm (space_lock); + Glib::Threads::Mutex::Lock lm (space_lock); /* get freespace on every FS that is part of the session path */ @@ -3003,7 +3003,7 @@ Session::add_controllable (boost::shared_ptr c) as part of the session. */ - Glib::Mutex::Lock lm (controllables_lock); + Glib::Threads::Mutex::Lock lm (controllables_lock); controllables.insert (c); } @@ -3016,7 +3016,7 @@ Session::remove_controllable (Controllable* c) return; } - Glib::Mutex::Lock lm (controllables_lock); + Glib::Threads::Mutex::Lock lm (controllables_lock); Controllables::iterator x = controllables.find (boost::shared_ptr(c, null_deleter())); @@ -3028,7 +3028,7 @@ Session::remove_controllable (Controllable* c) boost::shared_ptr Session::controllable_by_id (const PBD::ID& id) { - Glib::Mutex::Lock lm (controllables_lock); + Glib::Threads::Mutex::Lock lm (controllables_lock); for (Controllables::iterator i = controllables.begin(); i != controllables.end(); ++i) { if ((*i)->id() == id) { @@ -3387,7 +3387,7 @@ Session::config_changed (std::string p, bool ours) } else if (p == "edit-mode") { - Glib::Mutex::Lock lm (playlists->lock); + Glib::Threads::Mutex::Lock lm (playlists->lock); for (SessionPlaylists::List::iterator i = playlists->playlists.begin(); i != playlists->playlists.end(); ++i) { (*i)->set_edit_mode (Config->get_edit_mode ()); @@ -3507,16 +3507,9 @@ Session::config_changed (std::string p, bool ours) } else if (p == "history-depth") { set_history_depth (Config->get_history_depth()); } else if (p == "remote-model") { - switch (Config->get_remote_model()) { - case UserOrdered: - break; - case MixerOrdered: - sync_remote_id_from_order_keys (MixerSort); - break; - case EditorOrdered: - sync_remote_id_from_order_keys (EditorSort); - break; - } + /* XXX DO SOMETHING HERE TO TELL THE GUI THAT WE NEED + TO SET REMOTE ID'S + */ } else if (p == "sync-all-route-ordering") { /* sync to editor order unless mixer is used for remote IDs diff --git a/libs/ardour/session_transport.cc b/libs/ardour/session_transport.cc index a878b9fabc..4f0fb90c53 100644 --- a/libs/ardour/session_transport.cc +++ b/libs/ardour/session_transport.cc @@ -299,8 +299,8 @@ Session::butler_transport_work () if (tr) { tr->adjust_playback_buffering (); /* and refill those buffers ... */ - tr->non_realtime_locate (_transport_frame); } + (*i)->non_realtime_locate (_transport_frame); } } @@ -344,10 +344,8 @@ Session::butler_transport_work () if (!(ptw & PostTransportLocate)) { for (RouteList::iterator i = r->begin(); i != r->end(); ++i) { - boost::shared_ptr tr = boost::dynamic_pointer_cast (*i); - if (tr && !tr->hidden()) { - tr->non_realtime_locate (_transport_frame); - } + (*i)->non_realtime_locate (_transport_frame); + if (on_entry != g_atomic_int_get (&_butler->should_do_transport_work)) { /* new request, stop seeking, and start again */ g_atomic_int_dec_and_test (&_butler->should_do_transport_work); @@ -420,10 +418,7 @@ Session::non_realtime_locate () { boost::shared_ptr rl = routes.reader(); for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) { - boost::shared_ptr tr = boost::dynamic_pointer_cast (*i); - if (tr) { - tr->non_realtime_locate (_transport_frame); - } + (*i)->non_realtime_locate (_transport_frame); } /* XXX: it would be nice to generate the new clicks here (in the non-RT thread) @@ -601,10 +596,7 @@ Session::non_realtime_stop (bool abort, int on_entry, bool& finished) DEBUG_TRACE (DEBUG::Transport, X_("Butler PTW: locate\n")); for (RouteList::iterator i = r->begin(); i != r->end(); ++i) { DEBUG_TRACE (DEBUG::Transport, string_compose ("Butler PTW: locate on %1\n", (*i)->name())); - boost::shared_ptr tr = boost::dynamic_pointer_cast (*i); - if (tr && !tr->hidden()) { - tr->non_realtime_locate (_transport_frame); - } + (*i)->non_realtime_locate (_transport_frame); if (on_entry != g_atomic_int_get (&_butler->should_do_transport_work)) { finished = false; @@ -646,6 +638,7 @@ Session::non_realtime_stop (bool abort, int on_entry, bool& finished) } PositionChanged (_transport_frame); /* EMIT SIGNAL */ + DEBUG_TRACE (DEBUG::Transport, string_compose ("send TSC with speed = %1\n", _transport_speed)); TransportStateChange (); /* EMIT SIGNAL */ /* and start it up again if relevant */ @@ -774,6 +767,7 @@ Session::set_play_loop (bool yn) unset_play_loop (); } + DEBUG_TRACE (DEBUG::Transport, string_compose ("send TSC2 with speed = %1\n", _transport_speed)); TransportStateChange (); } void @@ -927,7 +921,7 @@ Session::locate (framepos_t target_frame, bool with_roll, bool with_flush, bool /* this is functionally what clear_clicks() does but with a tentative lock */ - Glib::RWLock::WriterLock clickm (click_lock, Glib::TRY_LOCK); + Glib::Threads::RWLock::WriterLock clickm (click_lock, Glib::Threads::TRY_LOCK); if (clickm.locked()) { @@ -1007,10 +1001,13 @@ Session::locate (framepos_t target_frame, bool with_roll, bool with_flush, bool void Session::set_transport_speed (double speed, bool abort, bool clear_state, bool as_default) { - DEBUG_TRACE (DEBUG::Transport, string_compose ("@ %5 Set transport speed to %1, abort = %2 clear_state = %3, current = %4 as_default %5\n", + DEBUG_TRACE (DEBUG::Transport, string_compose ("@ %5 Set transport speed to %1, abort = %2 clear_state = %3, current = %4 as_default %6\n", speed, abort, clear_state, _transport_speed, _transport_frame, as_default)); if (_transport_speed == speed) { + if (as_default && speed == 0.0) { // => reset default transport speed. hacky or what? + _default_transport_speed = 1.0; + } return; } @@ -1125,6 +1122,7 @@ Session::set_transport_speed (double speed, bool abort, bool clear_state, bool a _butler->schedule_transport_work (); } + DEBUG_TRACE (DEBUG::Transport, string_compose ("send TSC3 with speed = %1\n", _transport_speed)); TransportStateChange (); /* EMIT SIGNAL */ } } @@ -1236,7 +1234,6 @@ Session::start_transport () if (tr) { tr->realtime_set_speed (tr->speed(), true); } - (*i)->automation_snapshot (_transport_frame, true); } if (!_engine.freewheeling()) { @@ -1247,6 +1244,7 @@ Session::start_transport () } } + DEBUG_TRACE (DEBUG::Transport, string_compose ("send TSC4 with speed = %1\n", _transport_speed)); TransportStateChange (); /* EMIT SIGNAL */ } @@ -1495,6 +1493,7 @@ Session::set_play_range (list& range, bool leave_rolling) ev = new SessionEvent (SessionEvent::LocateRoll, SessionEvent::Add, SessionEvent::Immediate, range.front().start, 0.0f, false); merge_event (ev); + DEBUG_TRACE (DEBUG::Transport, string_compose ("send TSC5 with speed = %1\n", _transport_speed)); TransportStateChange (); } @@ -1537,6 +1536,7 @@ Session::engine_halted () non_realtime_stop (false, 0, ignored); transport_sub_state = 0; + DEBUG_TRACE (DEBUG::Transport, string_compose ("send TSC6 with speed = %1\n", _transport_speed)); TransportStateChange (); /* EMIT SIGNAL */ } diff --git a/libs/ardour/smf_source.cc b/libs/ardour/smf_source.cc index da6b3cad6f..47c653a698 100644 --- a/libs/ardour/smf_source.cc +++ b/libs/ardour/smf_source.cc @@ -281,7 +281,7 @@ SMFSource::write_unlocked (MidiRingBuffer& source, framepos_t positi append_event_unlocked_frames(ev, position); } - Evoral::SMF::flush(); + Evoral::SMF::flush (); free (buf); return duration; @@ -338,9 +338,9 @@ SMFSource::append_event_unlocked_frames (const Evoral::Event& ev, fr return; } - /* printf("SMFSource: %s - append_event_unlocked_frames ID = %d time = %u, size = %u, data = ", - name().c_str(), ev.id(), ev.time(), ev.size()); - for (size_t i=0; i < ev.size(); ++i) printf("%X ", ev.buffer()[i]); printf("\n");*/ + // printf("SMFSource: %s - append_event_unlocked_frames ID = %d time = %u, size = %u, data = ", + // name().c_str(), ev.id(), ev.time(), ev.size()); + // for (size_t i=0; i < ev.size(); ++i) printf("%X ", ev.buffer()[i]); printf("\n"); if (ev.time() < _last_ev_time_frames) { cerr << "SMFSource: Warning: Skipping event with non-monotonic time" << endl; @@ -427,10 +427,11 @@ SMFSource::mark_streaming_write_completed () void SMFSource::mark_midi_streaming_write_completed (Evoral::Sequence::StuckNoteOption stuck_notes_option, Evoral::MusicalTime when) { - Glib::Mutex::Lock lm (_lock); + Glib::Threads::Mutex::Lock lm (_lock); MidiSource::mark_midi_streaming_write_completed (stuck_notes_option, when); if (!writable()) { + warning << string_compose ("attempt to write to unwritable SMF file %1", _path) << endmsg; return; } @@ -458,9 +459,9 @@ SMFSource::load_model (bool lock, bool force_reload) return; } - boost::shared_ptr lm; + boost::shared_ptr lm; if (lock) - lm = boost::shared_ptr(new Glib::Mutex::Lock(_lock)); + lm = boost::shared_ptr(new Glib::Threads::Mutex::Lock(_lock)); if (_model && !force_reload) { return; diff --git a/libs/ardour/source.cc b/libs/ardour/source.cc index 3b2267b0bb..618dddc70b 100644 --- a/libs/ardour/source.cc +++ b/libs/ardour/source.cc @@ -29,7 +29,7 @@ #include #include -#include +#include #include #include #include "pbd/xml++.h" @@ -162,7 +162,7 @@ Source::set_state (const XMLNode& node, int version) bool Source::has_been_analysed() const { - Glib::Mutex::Lock lm (_analysis_lock); + Glib::Threads::Mutex::Lock lm (_analysis_lock); return _analysed; } @@ -170,7 +170,7 @@ void Source::set_been_analysed (bool yn) { { - Glib::Mutex::Lock lm (_analysis_lock); + Glib::Threads::Mutex::Lock lm (_analysis_lock); _analysed = yn; } @@ -299,7 +299,7 @@ Source::dec_use_count () } assert (oldval > 0); #else - g_atomic_int_exchange_and_add (&_use_count, -1); + g_atomic_int_add (&_use_count, -1); #endif } diff --git a/libs/ardour/source_factory.cc b/libs/ardour/source_factory.cc index b0803a9d34..da5980599d 100644 --- a/libs/ardour/source_factory.cc +++ b/libs/ardour/source_factory.cc @@ -50,8 +50,8 @@ using namespace std; using namespace PBD; PBD::Signal1 > SourceFactory::SourceCreated; -Glib::Cond* SourceFactory::PeaksToBuild; -Glib::StaticMutex SourceFactory::peak_building_lock = GLIBMM_STATIC_MUTEX_INIT; +Glib::Threads::Cond SourceFactory::PeaksToBuild; +Glib::Threads::Mutex SourceFactory::peak_building_lock; std::list > SourceFactory::files_with_peaks; static void @@ -65,7 +65,7 @@ peak_thread_work () wait: if (SourceFactory::files_with_peaks.empty()) { - SourceFactory::PeaksToBuild->wait (SourceFactory::peak_building_lock); + SourceFactory::PeaksToBuild.wait (SourceFactory::peak_building_lock); } if (SourceFactory::files_with_peaks.empty()) { @@ -87,10 +87,8 @@ peak_thread_work () void SourceFactory::init () { - PeaksToBuild = new Glib::Cond(); - for (int n = 0; n < 2; ++n) { - Glib::Thread::create (sigc::ptr_fun (::peak_thread_work), false); + Glib::Threads::Thread::create (sigc::ptr_fun (::peak_thread_work)); } } @@ -103,9 +101,9 @@ SourceFactory::setup_peakfile (boost::shared_ptr s, bool async) if (async) { - Glib::Mutex::Lock lm (peak_building_lock); + Glib::Threads::Mutex::Lock lm (peak_building_lock); files_with_peaks.push_back (boost::weak_ptr (as)); - PeaksToBuild->broadcast (); + PeaksToBuild.broadcast (); } else { diff --git a/libs/ardour/tempo.cc b/libs/ardour/tempo.cc index e64a116933..a5016073bb 100644 --- a/libs/ardour/tempo.cc +++ b/libs/ardour/tempo.cc @@ -23,7 +23,7 @@ #include -#include +#include #include "pbd/xml++.h" #include "evoral/types.hpp" #include "ardour/debug.h" @@ -311,7 +311,7 @@ TempoMap::remove_tempo (const TempoSection& tempo, bool complete_operation) bool removed = false; { - Glib::RWLock::WriterLock lm (lock); + Glib::Threads::RWLock::WriterLock lm (lock); Metrics::iterator i; for (i = metrics.begin(); i != metrics.end(); ++i) { @@ -342,7 +342,7 @@ TempoMap::remove_meter (const MeterSection& tempo, bool complete_operation) bool removed = false; { - Glib::RWLock::WriterLock lm (lock); + Glib::Threads::RWLock::WriterLock lm (lock); Metrics::iterator i; for (i = metrics.begin(); i != metrics.end(); ++i) { @@ -488,7 +488,7 @@ TempoMap::replace_tempo (const TempoSection& ts, const Tempo& tempo, const BBT_T add_tempo (tempo, where); } else { { - Glib::RWLock::WriterLock lm (lock); + Glib::Threads::RWLock::WriterLock lm (lock); /* cannot move the first tempo section */ *((Tempo*)&first) = tempo; recompute_map (false); @@ -502,7 +502,7 @@ void TempoMap::add_tempo (const Tempo& tempo, BBT_Time where) { { - Glib::RWLock::WriterLock lm (lock); + Glib::Threads::RWLock::WriterLock lm (lock); /* new tempos always start on a beat */ where.ticks = 0; @@ -558,7 +558,7 @@ TempoMap::replace_meter (const MeterSection& ms, const Meter& meter, const BBT_T add_meter (meter, where); } else { { - Glib::RWLock::WriterLock lm (lock); + Glib::Threads::RWLock::WriterLock lm (lock); /* cannot move the first meter section */ *((Meter*)&first) = meter; recompute_map (true); @@ -572,7 +572,7 @@ void TempoMap::add_meter (const Meter& meter, BBT_Time where) { { - Glib::RWLock::WriterLock lm (lock); + Glib::Threads::RWLock::WriterLock lm (lock); /* a new meter always starts a new bar on the first beat. so round the start time appropriately. remember that @@ -612,7 +612,7 @@ TempoMap::change_initial_tempo (double beats_per_minute, double note_type) for (Metrics::iterator i = metrics.begin(); i != metrics.end(); ++i) { if ((t = dynamic_cast (*i)) != 0) { { - Glib::RWLock::WriterLock lm (lock); + Glib::Threads::RWLock::WriterLock lm (lock); *((Tempo*) t) = newtempo; recompute_map (false); } @@ -662,7 +662,7 @@ TempoMap::change_existing_tempo_at (framepos_t where, double beats_per_minute, d /* reset */ { - Glib::RWLock::WriterLock lm (lock); + Glib::Threads::RWLock::WriterLock lm (lock); /* cannot move the first tempo section */ *((Tempo*)prev) = newtempo; recompute_map (false); @@ -706,7 +706,7 @@ TempoMap::first_tempo () const void TempoMap::require_map_to (framepos_t pos) { - Glib::RWLock::WriterLock lm (lock); + Glib::Threads::RWLock::WriterLock lm (lock); if (_map.empty() || _map.back().frame < pos) { extend_map (pos); @@ -716,7 +716,7 @@ TempoMap::require_map_to (framepos_t pos) void TempoMap::require_map_to (const BBT_Time& bbt) { - Glib::RWLock::WriterLock lm (lock); + Glib::Threads::RWLock::WriterLock lm (lock); /* since we have no idea where BBT is if its off the map, see the last * point in the map is past BBT, and if not add an arbitrary amount of @@ -1012,6 +1012,7 @@ TempoMap::_extend_map (TempoSection* tempo, MeterSection* meter, */ goto set_metrics; } + } } @@ -1038,7 +1039,7 @@ TempoMap::_extend_map (TempoSection* tempo, MeterSection* meter, TempoMetric TempoMap::metric_at (framepos_t frame) const { - Glib::RWLock::ReaderLock lm (lock); + Glib::Threads::RWLock::ReaderLock lm (lock); TempoMetric m (first_meter(), first_tempo()); const Meter* meter; const Tempo* tempo; @@ -1072,7 +1073,7 @@ TempoMap::metric_at (framepos_t frame) const TempoMetric TempoMap::metric_at (BBT_Time bbt) const { - Glib::RWLock::ReaderLock lm (lock); + Glib::Threads::RWLock::ReaderLock lm (lock); TempoMetric m (first_meter(), first_tempo()); const Meter* meter; const Tempo* tempo; @@ -1110,7 +1111,7 @@ TempoMap::bbt_time (framepos_t frame, BBT_Time& bbt) { require_map_to (frame); - Glib::RWLock::ReaderLock lm (lock); + Glib::Threads::RWLock::ReaderLock lm (lock); if (frame < 0) { bbt.bars = 1; @@ -1126,7 +1127,7 @@ TempoMap::bbt_time (framepos_t frame, BBT_Time& bbt) void TempoMap::bbt_time_rt (framepos_t frame, BBT_Time& bbt) { - Glib::RWLock::ReaderLock lm (lock, Glib::TRY_LOCK); + Glib::Threads::RWLock::ReaderLock lm (lock, Glib::Threads::TRY_LOCK); if (!lm.locked()) { throw std::logic_error ("TempoMap::bbt_time_rt() could not lock tempo map"); @@ -1169,7 +1170,7 @@ TempoMap::frame_time (const BBT_Time& bbt) require_map_to (bbt); - Glib::RWLock::ReaderLock lm (lock); + Glib::Threads::RWLock::ReaderLock lm (lock); BBTPointList::const_iterator s = bbt_before_or_at (BBT_Time (1, 1, 0)); BBTPointList::const_iterator e = bbt_before_or_at (BBT_Time (bbt.bars, bbt.beats, 0)); @@ -1188,7 +1189,7 @@ TempoMap::bbt_duration_at (framepos_t pos, const BBT_Time& bbt, int dir) BBT_Time when; bbt_time (pos, when); - Glib::RWLock::ReaderLock lm (lock); + Glib::Threads::RWLock::ReaderLock lm (lock); return bbt_duration_at_unlocked (when, bbt, dir); } @@ -1255,7 +1256,7 @@ TempoMap::round_to_beat_subdivision (framepos_t fr, int sub_num, int dir) { require_map_to (fr); - Glib::RWLock::ReaderLock lm (lock); + Glib::Threads::RWLock::ReaderLock lm (lock); BBTPointList::const_iterator i = bbt_before_or_at (fr); BBT_Time the_beat; uint32_t ticks_one_subdivisions_worth; @@ -1374,7 +1375,7 @@ TempoMap::round_to_type (framepos_t frame, int dir, BBTPointType type) { require_map_to (frame); - Glib::RWLock::ReaderLock lm (lock); + Glib::Threads::RWLock::ReaderLock lm (lock); BBTPointList::const_iterator fi; if (dir > 0) { @@ -1520,7 +1521,7 @@ TempoMap::get_grid (TempoMap::BBTPointList::const_iterator& begin, framepos_t lower, framepos_t upper) { { - Glib::RWLock::WriterLock lm (lock); + Glib::Threads::RWLock::WriterLock lm (lock); if (_map.empty() || (_map.back().frame < upper)) { recompute_map (false, upper); } @@ -1533,7 +1534,7 @@ TempoMap::get_grid (TempoMap::BBTPointList::const_iterator& begin, const TempoSection& TempoMap::tempo_section_at (framepos_t frame) const { - Glib::RWLock::ReaderLock lm (lock); + Glib::Threads::RWLock::ReaderLock lm (lock); Metrics::const_iterator i; TempoSection* prev = 0; @@ -1579,7 +1580,7 @@ TempoMap::get_state () XMLNode *root = new XMLNode ("TempoMap"); { - Glib::RWLock::ReaderLock lm (lock); + Glib::Threads::RWLock::ReaderLock lm (lock); for (i = metrics.begin(); i != metrics.end(); ++i) { root->add_child_nocopy ((*i)->get_state()); } @@ -1592,7 +1593,7 @@ int TempoMap::set_state (const XMLNode& node, int /*version*/) { { - Glib::RWLock::WriterLock lm (lock); + Glib::Threads::RWLock::WriterLock lm (lock); XMLNodeList nlist; XMLNodeConstIterator niter; @@ -1645,6 +1646,28 @@ TempoMap::set_state (const XMLNode& node, int /*version*/) metrics.sort (cmp); } + /* check for multiple tempo/meters at the same location, which + ardour2 somehow allowed. + */ + + Metrics::iterator prev = metrics.end(); + for (Metrics::iterator i = metrics.begin(); i != metrics.end(); ++i) { + if (prev != metrics.end()) { + if (dynamic_cast(*prev) && dynamic_cast(*i)) { + if ((*prev)->start() == (*i)->start()) { + error << string_compose (_("Multiple meter definitions found at %1"), (*prev)->start()) << endmsg; + return -1; + } + } else if (dynamic_cast(*prev) && dynamic_cast(*i)) { + if ((*prev)->start() == (*i)->start()) { + error << string_compose (_("Multiple tempo definitions found at %1"), (*prev)->start()) << endmsg; + return -1; + } + } + } + prev = i; + } + recompute_map (true, -1); } @@ -1656,7 +1679,7 @@ TempoMap::set_state (const XMLNode& node, int /*version*/) void TempoMap::dump (std::ostream& o) const { - Glib::RWLock::ReaderLock lm (lock, Glib::TRY_LOCK); + Glib::Threads::RWLock::ReaderLock lm (lock, Glib::Threads::TRY_LOCK); const MeterSection* m; const TempoSection* t; @@ -1675,7 +1698,7 @@ TempoMap::dump (std::ostream& o) const int TempoMap::n_tempos() const { - Glib::RWLock::ReaderLock lm (lock); + Glib::Threads::RWLock::ReaderLock lm (lock); int cnt = 0; for (Metrics::const_iterator i = metrics.begin(); i != metrics.end(); ++i) { @@ -1690,7 +1713,7 @@ TempoMap::n_tempos() const int TempoMap::n_meters() const { - Glib::RWLock::ReaderLock lm (lock); + Glib::Threads::RWLock::ReaderLock lm (lock); int cnt = 0; for (Metrics::const_iterator i = metrics.begin(); i != metrics.end(); ++i) { @@ -1706,7 +1729,7 @@ void TempoMap::insert_time (framepos_t where, framecnt_t amount) { { - Glib::RWLock::WriterLock lm (lock); + Glib::Threads::RWLock::WriterLock lm (lock); for (Metrics::iterator i = metrics.begin(); i != metrics.end(); ++i) { if ((*i)->frame() >= where && (*i)->movable ()) { (*i)->set_frame ((*i)->frame() + amount); @@ -1802,7 +1825,7 @@ TempoMap::insert_time (framepos_t where, framecnt_t amount) framepos_t TempoMap::framepos_plus_beats (framepos_t pos, Evoral::MusicalTime beats) const { - Glib::RWLock::ReaderLock lm (lock); + Glib::Threads::RWLock::ReaderLock lm (lock); Metrics::const_iterator next_tempo; const TempoSection* tempo = 0; @@ -1891,7 +1914,7 @@ TempoMap::framepos_plus_beats (framepos_t pos, Evoral::MusicalTime beats) const framepos_t TempoMap::framepos_minus_beats (framepos_t pos, Evoral::MusicalTime beats) const { - Glib::RWLock::ReaderLock lm (lock); + Glib::Threads::RWLock::ReaderLock lm (lock); Metrics::const_reverse_iterator prev_tempo; const TempoSection* tempo = 0; @@ -2000,7 +2023,7 @@ TempoMap::framepos_minus_beats (framepos_t pos, Evoral::MusicalTime beats) const framepos_t TempoMap::framepos_plus_bbt (framepos_t pos, BBT_Time op) const { - Glib::RWLock::ReaderLock lm (lock); + Glib::Threads::RWLock::ReaderLock lm (lock); Metrics::const_iterator i; const MeterSection* meter; const MeterSection* m; @@ -2138,7 +2161,7 @@ TempoMap::framepos_plus_bbt (framepos_t pos, BBT_Time op) const Evoral::MusicalTime TempoMap::framewalk_to_beats (framepos_t pos, framecnt_t distance) const { - Glib::RWLock::ReaderLock lm (lock); + Glib::Threads::RWLock::ReaderLock lm (lock); Metrics::const_iterator next_tempo; const TempoSection* tempo = 0; framepos_t effective_pos = max (pos, (framepos_t) 0); diff --git a/libs/ardour/test/testrunner.cc b/libs/ardour/test/testrunner.cc index fa4484fa25..2f932c62da 100644 --- a/libs/ardour/test/testrunner.cc +++ b/libs/ardour/test/testrunner.cc @@ -1,4 +1,5 @@ #include +#include #include #include diff --git a/libs/ardour/track.cc b/libs/ardour/track.cc index af6206b5e5..1e8d2936a0 100644 --- a/libs/ardour/track.cc +++ b/libs/ardour/track.cc @@ -259,7 +259,7 @@ void Track::deactivate_visible_processors () { _deactivated_processors.clear (); - Glib::RWLock::ReaderLock lm (_processor_lock); + Glib::Threads::RWLock::ReaderLock lm (_processor_lock); for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) { if ((*i)->active() && (*i)->display_to_user() && boost::dynamic_pointer_cast (*i) == 0) { @@ -369,7 +369,7 @@ Track::set_latency_compensation (framecnt_t longest_session_latency) int Track::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, bool session_state_changing) { - Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK); + Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK); if (!lm.locked()) { return 0; } @@ -452,7 +452,7 @@ Track::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, int Track::silent_roll (pframes_t nframes, framepos_t /*start_frame*/, framepos_t /*end_frame*/, bool& need_butler) { - Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK); + Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK); if (!lm.locked()) { return 0; } @@ -624,7 +624,14 @@ Track::non_realtime_input_change () void Track::non_realtime_locate (framepos_t p) { - _diskstream->non_realtime_locate (p); + Route::non_realtime_locate (p); + + if (!hidden()) { + /* don't waste i/o cycles and butler calls + for hidden (secret) tracks + */ + _diskstream->non_realtime_locate (p); + } } void @@ -905,7 +912,7 @@ Track::check_initial_delay (framecnt_t nframes, framepos_t& transport_frame) to reflect that we just wrote _roll_delay frames of silence. */ - Glib::RWLock::ReaderLock lm (_processor_lock); + Glib::Threads::RWLock::ReaderLock lm (_processor_lock); for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) { boost::shared_ptr iop = boost::dynamic_pointer_cast (*i); if (iop) { diff --git a/libs/ardour/user_bundle.cc b/libs/ardour/user_bundle.cc index de71a87d86..2655d6bc7d 100644 --- a/libs/ardour/user_bundle.cc +++ b/libs/ardour/user_bundle.cc @@ -90,7 +90,7 @@ ARDOUR::UserBundle::get_state () node->add_property ("name", name ()); { - Glib::Mutex::Lock lm (_channel_mutex); + Glib::Threads::Mutex::Lock lm (_channel_mutex); for (std::vector::iterator i = _channel.begin(); i != _channel.end(); ++i) { XMLNode* c = new XMLNode ("Channel"); diff --git a/libs/ardour/vst_plugin.cc b/libs/ardour/vst_plugin.cc index 7c31dcff10..2bbc65a34e 100644 --- a/libs/ardour/vst_plugin.cc +++ b/libs/ardour/vst_plugin.cc @@ -101,6 +101,10 @@ VSTPlugin::get_parameter (uint32_t which) const void VSTPlugin::set_parameter (uint32_t which, float val) { + if (get_parameter (which) == val) { + return; + } + _plugin->setParameter (_plugin, which, val); Plugin::set_parameter (which, val); } diff --git a/libs/ardour/worker.cc b/libs/ardour/worker.cc index c108f653c4..290689f13c 100644 --- a/libs/ardour/worker.cc +++ b/libs/ardour/worker.cc @@ -26,7 +26,7 @@ namespace ARDOUR { Worker::Worker(Workee* workee, uint32_t ring_size) : _workee(workee) - , _thread(Glib::Thread::create(sigc::mem_fun(*this, &Worker::run), true)) + , _thread (Glib::Threads::Thread::create(sigc::mem_fun(*this, &Worker::run))) , _requests(new RingBuffer(ring_size)) , _responses(new RingBuffer(ring_size)) , _response((uint8_t*)malloc(ring_size)) diff --git a/libs/ardour/wscript b/libs/ardour/wscript index 867a841d80..badd0581fb 100644 --- a/libs/ardour/wscript +++ b/libs/ardour/wscript @@ -55,6 +55,7 @@ libardour_sources = [ 'automation.cc', 'automation_control.cc', 'automation_list.cc', + 'automation_watch.cc', 'beats_frames_converter.cc', 'broadcast_info.cc', 'buffer.cc', diff --git a/libs/audiographer/audiographer/general/threader.h b/libs/audiographer/audiographer/general/threader.h index 0f4aaff973..d1e11c00e1 100644 --- a/libs/audiographer/audiographer/general/threader.h +++ b/libs/audiographer/audiographer/general/threader.h @@ -2,6 +2,7 @@ #define AUDIOGRAPHER_THREADER_H #include +#include #include #include @@ -86,11 +87,8 @@ class Threader : public Source, public Sink void wait() { while (g_atomic_int_get (&readers) != 0) { - Glib::TimeVal wait_time; - wait_time.assign_current_time(); - wait_time.add_milliseconds(wait_timeout); - - wait_cond.timed_wait(wait_mutex, wait_time); + gint64 end_time = g_get_monotonic_time () + (wait_timeout * G_TIME_SPAN_MILLISECOND); + wait_cond.wait_until(wait_mutex, end_time); } wait_mutex.unlock(); @@ -119,12 +117,12 @@ class Threader : public Source, public Sink OutputVec outputs; Glib::ThreadPool & thread_pool; - Glib::Mutex wait_mutex; - Glib::Cond wait_cond; + Glib::Threads::Mutex wait_mutex; + Glib::Threads::Cond wait_cond; gint readers; long wait_timeout; - Glib::Mutex exception_mutex; + Glib::Threads::Mutex exception_mutex; boost::shared_ptr exception; }; diff --git a/libs/audiographer/tests/test_runner.cc b/libs/audiographer/tests/test_runner.cc index 6fed393dc8..d378b5e4cb 100644 --- a/libs/audiographer/tests/test_runner.cc +++ b/libs/audiographer/tests/test_runner.cc @@ -1,6 +1,5 @@ #include #include - #include int main() diff --git a/libs/evoral/evoral/Control.hpp b/libs/evoral/evoral/Control.hpp index d09cb952f1..369c4df630 100644 --- a/libs/evoral/evoral/Control.hpp +++ b/libs/evoral/evoral/Control.hpp @@ -44,8 +44,8 @@ public: Control(const Parameter& parameter, boost::shared_ptr); virtual ~Control() {} - virtual void set_double(double val, bool to_list=false, double frame=0); - virtual double get_double(bool from_list=false, double frame=0) const; + virtual void set_double (double val, double frame=0, bool to_list=false); + virtual double get_double (bool from_list=false, double frame=0) const; /** Get the latest user-set value * (which may not equal get_value() when automation is playing back). diff --git a/libs/evoral/evoral/ControlList.hpp b/libs/evoral/evoral/ControlList.hpp index 1e546e04fa..ffddd9d6e5 100644 --- a/libs/evoral/evoral/ControlList.hpp +++ b/libs/evoral/evoral/ControlList.hpp @@ -23,7 +23,7 @@ #include #include #include -#include +#include #include "pbd/signals.h" #include "evoral/types.hpp" #include "evoral/Range.hpp" @@ -107,7 +107,7 @@ public: EventList::size_type size() const { return _events.size(); } double length() const { - Glib::Mutex::Lock lm (_lock); + Glib::Threads::Mutex::Lock lm (_lock); return _events.empty() ? 0.0 : _events.back()->when; } bool empty() const { return _events.empty(); } @@ -124,10 +124,8 @@ public: virtual bool clamp_value (double& /*when*/, double& /*value*/) const { return true; } - void rt_add (double when, double value); - void add (double when, double value); + virtual void add (double when, double value); void fast_simple_add (double when, double value); - void merge_nascent (double when); void erase_range (double start, double end); void erase (iterator); @@ -167,18 +165,18 @@ public: std::pair control_points_adjacent (double when); template void apply_to_points (T& obj, void (T::*method)(const ControlList&)) { - Glib::Mutex::Lock lm (_lock); + Glib::Threads::Mutex::Lock lm (_lock); (obj.*method)(*this); } double eval (double where) { - Glib::Mutex::Lock lm (_lock); + Glib::Threads::Mutex::Lock lm (_lock); return unlocked_eval (where); } double rt_safe_eval (double where, bool& ok) { - Glib::Mutex::Lock lm (_lock, Glib::TRY_LOCK); + Glib::Threads::Mutex::Lock lm (_lock, Glib::Threads::TRY_LOCK); if ((ok = lm.locked())) { return unlocked_eval (where); @@ -209,7 +207,7 @@ public: double default_value() const { return _parameter.normal(); } // FIXME: const violations for Curve - Glib::Mutex& lock() const { return _lock; } + Glib::Threads::Mutex& lock() const { return _lock; } LookupCache& lookup_cache() const { return _lookup_cache; } SearchCache& search_cache() const { return _search_cache; } @@ -245,7 +243,10 @@ public: virtual bool touching() const { return false; } virtual bool writing() const { return false; } virtual bool touch_enabled() const { return false; } + void start_write_pass (double time); void write_pass_finished (double when); + void set_in_write_pass (bool); + bool in_write_pass () const; /** Emitted when mark_dirty() is called on this object */ mutable PBD::Signal0 Dirty; @@ -257,6 +258,8 @@ public: bool operator!= (ControlList const &) const; + void invalidate_insert_iterator (); + protected: /** Called by unlocked_eval() to handle cases of 3 or more control points. */ @@ -277,7 +280,7 @@ protected: Parameter _parameter; InterpolationStyle _interpolation; EventList _events; - mutable Glib::Mutex _lock; + mutable Glib::Threads::Mutex _lock; int8_t _frozen; bool _changed_when_thawed; double _min_yval; @@ -287,21 +290,15 @@ protected: Curve* _curve; - struct NascentInfo { - EventList events; - double start_time; - double end_time; - double same_value_cnt; - - NascentInfo (double start = -1.0) - : start_time (start) - , end_time (-1.0) - , same_value_cnt (0) - {} - }; - - std::list nascent; static double _thinning_factor; + + private: + iterator most_recent_insert_iterator; + double insert_position; + bool new_write_pass; + bool did_write_during_pass; + bool _in_write_pass; + void unlocked_invalidate_insert_iterator (); }; } // namespace Evoral diff --git a/libs/evoral/evoral/ControlSet.hpp b/libs/evoral/evoral/ControlSet.hpp index 293d411755..431885112b 100644 --- a/libs/evoral/evoral/ControlSet.hpp +++ b/libs/evoral/evoral/ControlSet.hpp @@ -23,7 +23,7 @@ #include #include #include -#include +#include #include "pbd/signals.h" #include "evoral/types.hpp" #include "evoral/Parameter.hpp" @@ -38,7 +38,7 @@ class ControlSet : public boost::noncopyable { public: ControlSet(); ControlSet (const ControlSet&); - virtual ~ControlSet() {} + virtual ~ControlSet() {} virtual boost::shared_ptr control_factory(const Evoral::Parameter& id) = 0; @@ -65,13 +65,13 @@ public: void what_has_data(std::set&) const; - Glib::Mutex& control_lock() const { return _control_lock; } + Glib::Threads::Mutex& control_lock() const { return _control_lock; } protected: virtual void control_list_marked_dirty () {} virtual void control_list_interpolation_changed (Parameter, ControlList::InterpolationStyle) {} - mutable Glib::Mutex _control_lock; + mutable Glib::Threads::Mutex _control_lock; Controls _controls; PBD::ScopedConnectionList _list_connections; diff --git a/libs/evoral/evoral/Sequence.hpp b/libs/evoral/evoral/Sequence.hpp index ab3e3bd41b..cb851cf2f6 100644 --- a/libs/evoral/evoral/Sequence.hpp +++ b/libs/evoral/evoral/Sequence.hpp @@ -25,7 +25,7 @@ #include #include #include -#include +#include #include "evoral/types.hpp" #include "evoral/Note.hpp" #include "evoral/Parameter.hpp" @@ -67,16 +67,16 @@ public: protected: struct WriteLockImpl { - WriteLockImpl(Glib::RWLock& s, Glib::Mutex& c) - : sequence_lock(new Glib::RWLock::WriterLock(s)) - , control_lock(new Glib::Mutex::Lock(c)) + WriteLockImpl(Glib::Threads::RWLock& s, Glib::Threads::Mutex& c) + : sequence_lock(new Glib::Threads::RWLock::WriterLock(s)) + , control_lock(new Glib::Threads::Mutex::Lock(c)) { } ~WriteLockImpl() { delete sequence_lock; delete control_lock; } - Glib::RWLock::WriterLock* sequence_lock; - Glib::Mutex::Lock* control_lock; + Glib::Threads::RWLock::WriterLock* sequence_lock; + Glib::Threads::Mutex::Lock* control_lock; }; public: @@ -84,10 +84,10 @@ public: typedef typename boost::shared_ptr > NotePtr; typedef typename boost::shared_ptr > constNotePtr; - typedef boost::shared_ptr ReadLock; + typedef boost::shared_ptr ReadLock; typedef boost::shared_ptr WriteLock; - virtual ReadLock read_lock() const { return ReadLock(new Glib::RWLock::ReaderLock(_lock)); } + virtual ReadLock read_lock() const { return ReadLock(new Glib::Threads::RWLock::ReaderLock(_lock)); } virtual WriteLock write_lock() { return WriteLock(new WriteLockImpl(_lock, _control_lock)); } void clear(); @@ -287,7 +287,7 @@ protected: bool _edited; bool _overlapping_pitches_accepted; OverlapPitchResolution _overlap_pitch_resolution; - mutable Glib::RWLock _lock; + mutable Glib::Threads::RWLock _lock; bool _writing; virtual int resolve_overlaps_unlocked (const NotePtr, void* /* arg */ = 0) { diff --git a/libs/evoral/evoral/types.hpp b/libs/evoral/evoral/types.hpp index 35dec6de0b..7bdbdc7a2e 100644 --- a/libs/evoral/evoral/types.hpp +++ b/libs/evoral/evoral/types.hpp @@ -52,6 +52,7 @@ namespace PBD { namespace DEBUG { extern uint64_t Sequence; extern uint64_t Note; + extern uint64_t ControlList; } } diff --git a/libs/evoral/src/Control.cpp b/libs/evoral/src/Control.cpp index bf8b0abaa0..bb272ea8b3 100644 --- a/libs/evoral/src/Control.cpp +++ b/libs/evoral/src/Control.cpp @@ -46,7 +46,7 @@ Control::get_double (bool from_list, double frame) const void -Control::set_double (double value, bool to_list, double frame) +Control::set_double (double value, double frame, bool to_list) { _user_value = value; diff --git a/libs/evoral/src/ControlList.cpp b/libs/evoral/src/ControlList.cpp index 9b672612ed..c4495485de 100644 --- a/libs/evoral/src/ControlList.cpp +++ b/libs/evoral/src/ControlList.cpp @@ -23,7 +23,10 @@ #include "evoral/ControlList.hpp" #include "evoral/Curve.hpp" +#include "pbd/compose.h" + using namespace std; +using namespace PBD; namespace Evoral { @@ -63,6 +66,11 @@ ControlList::ControlList (const Parameter& id) _search_cache.left = -1; _search_cache.first = _events.end(); _sort_pending = false; + new_write_pass = true; + _in_write_pass = false; + did_write_during_pass = false; + insert_position = -1; + most_recent_insert_iterator = _events.end(); } ControlList::ControlList (const ControlList& other) @@ -78,6 +86,11 @@ ControlList::ControlList (const ControlList& other) _lookup_cache.range.first = _events.end(); _search_cache.first = _events.end(); _sort_pending = false; + new_write_pass = true; + _in_write_pass = false; + did_write_during_pass = false; + insert_position = -1; + most_recent_insert_iterator = _events.end(); copy_events (other); @@ -106,6 +119,12 @@ ControlList::ControlList (const ControlList& other, double start, double end) copy_events (*(section.get())); } + new_write_pass = false; + _in_write_pass = false; + did_write_during_pass = false; + insert_position = -1; + most_recent_insert_iterator = _events.end(); + mark_dirty (); } @@ -115,13 +134,6 @@ ControlList::~ControlList() delete (*x); } - for (list::iterator n = nascent.begin(); n != nascent.end(); ++n) { - for (EventList::iterator x = (*n)->events.begin(); x != (*n)->events.end(); ++x) { - delete *x; - } - delete (*n); - } - delete _curve; } @@ -156,11 +168,12 @@ void ControlList::copy_events (const ControlList& other) { { - Glib::Mutex::Lock lm (_lock); + Glib::Threads::Mutex::Lock lm (_lock); _events.clear (); for (const_iterator i = other.begin(); i != other.end(); ++i) { _events.push_back (new ControlEvent ((*i)->when, (*i)->value)); } + unlocked_invalidate_insert_iterator (); mark_dirty (); } maybe_signal_changed (); @@ -193,8 +206,9 @@ void ControlList::clear () { { - Glib::Mutex::Lock lm (_lock); + Glib::Threads::Mutex::Lock lm (_lock); _events.clear (); + unlocked_invalidate_insert_iterator (); mark_dirty (); } @@ -204,14 +218,14 @@ ControlList::clear () void ControlList::x_scale (double factor) { - Glib::Mutex::Lock lm (_lock); + Glib::Threads::Mutex::Lock lm (_lock); _x_scale (factor); } bool ControlList::extend_to (double when) { - Glib::Mutex::Lock lm (_lock); + Glib::Threads::Mutex::Lock lm (_lock); if (_events.empty() || _events.back()->when == when) { return false; } @@ -230,24 +244,19 @@ ControlList::_x_scale (double factor) mark_dirty (); } -void -ControlList::write_pass_finished (double when) -{ - merge_nascent (when); -} - - struct ControlEventTimeComparator { bool operator() (ControlEvent* a, ControlEvent* b) { return a->when < b->when; } }; +#if 0 + void ControlList::merge_nascent (double when) { { - Glib::Mutex::Lock lm (_lock); + Glib::Threads::Mutex::Lock lm (_lock); if (nascent.empty()) { return; @@ -432,96 +441,75 @@ ControlList::merge_nascent (double when) maybe_signal_changed (); } - -void -ControlList::rt_add (double when, double value) -{ - // this is for automation recording - - if (touch_enabled() && !touching()) { - return; - } - - // cerr << "RT: alist " << this << " add " << value << " @ " << when << endl; - - Glib::Mutex::Lock lm (_lock, Glib::TRY_LOCK); - - if (lm.locked()) { - assert (!nascent.empty()); - /* we don't worry about adding events out of time order as we will - sort them in merge_nascent. - */ - - NascentInfo* ni (nascent.back()); - EventList& el (ni->events); - - if (!el.empty() && (when >= el.back()->when) && (value == el.back()->value)) { - - /* same value, later timestamp, effective slope is - * zero, so just move the last point in nascent to our - * new time position. this avoids storing an unlimited - * number of points to represent a flat line. - */ - - ni->same_value_cnt++; - - if (ni->same_value_cnt > 1) { - el.back()->when = when; - return; - } - } else { - ni->same_value_cnt = 0; - } - - el.push_back (new ControlEvent (when, value)); - } -} +#endif void ControlList::thin () { - Glib::Mutex::Lock lm (_lock); + bool changed = false; - ControlEvent* prevprev = 0; - ControlEvent* cur = 0; - ControlEvent* prev = 0; - iterator pprev; - int counter = 0; - - for (iterator i = _events.begin(); i != _events.end(); ++i) { - - cur = *i; - counter++; - - if (counter > 2) { + { + Glib::Threads::Mutex::Lock lm (_lock); + + ControlEvent* prevprev = 0; + ControlEvent* cur = 0; + ControlEvent* prev = 0; + iterator pprev; + int counter = 0; + + DEBUG_TRACE (DEBUG::ControlList, string_compose ("@%1 thin from %2 events\n", this, _events.size())); + + for (iterator i = _events.begin(); i != _events.end(); ++i) { - double area = fabs ((prevprev->when * (prev->value - cur->value)) + - (prev->when * (cur->value - prevprev->value)) + - (cur->when * (prevprev->value - prev->value))); + cur = *i; + counter++; - if (area < _thinning_factor) { - iterator tmp = pprev; - - /* pprev will change to current - i is incremented to the next event - */ - - pprev = i; - _events.erase (tmp); - - continue; + if (counter > 2) { + + /* compute the area of the triangle formed by 3 points + */ + + double area = fabs ((prevprev->when * (prev->value - cur->value)) + + (prev->when * (cur->value - prevprev->value)) + + (cur->when * (prevprev->value - prev->value))); + + if (area < _thinning_factor) { + iterator tmp = pprev; + + /* pprev will change to current + i is incremented to the next event + as we loop. + */ + + pprev = i; + _events.erase (tmp); + changed = true; + continue; + } } + + prevprev = prev; + prev = cur; + pprev = i; } + + DEBUG_TRACE (DEBUG::ControlList, string_compose ("@%1 thin => %2 events\n", this, _events.size())); - prevprev = prev; - prev = cur; - pprev = i; + if (changed) { + unlocked_invalidate_insert_iterator (); + mark_dirty (); + } + } + + if (changed) { + maybe_signal_changed (); } } void ControlList::fast_simple_add (double when, double value) { + Glib::Threads::Mutex::Lock lm (_lock); /* to be used only for loading pre-sorted data from saved state */ _events.insert (_events.end(), new ControlEvent (when, value)); assert(_events.back()); @@ -529,6 +517,59 @@ ControlList::fast_simple_add (double when, double value) mark_dirty (); } +void +ControlList::invalidate_insert_iterator () +{ + Glib::Threads::Mutex::Lock lm (_lock); + unlocked_invalidate_insert_iterator (); +} + +void +ControlList::unlocked_invalidate_insert_iterator () +{ + most_recent_insert_iterator = _events.end(); +} + +void +ControlList::start_write_pass (double when) +{ + Glib::Threads::Mutex::Lock lm (_lock); + + new_write_pass = true; + did_write_during_pass = false; + insert_position = when; + + /* leave the insert iterator invalid, so that we will do the lookup + of where it should be in a "lazy" way - deferring it until + we actually add the first point (which may never happen). + */ + + unlocked_invalidate_insert_iterator (); +} + +void +ControlList::write_pass_finished (double when) +{ + if (did_write_during_pass) { + thin (); + did_write_during_pass = false; + } + new_write_pass = true; + _in_write_pass = false; +} + +void +ControlList::set_in_write_pass (bool yn) +{ + _in_write_pass = yn; +} + +bool +ControlList::in_write_pass () const +{ + return _in_write_pass; +} + void ControlList::add (double when, double value) { @@ -540,35 +581,260 @@ ControlList::add (double when, double value) return; } + DEBUG_TRACE (DEBUG::ControlList, string_compose ("@%1 add %2 at %3 w/erase = %4 at end ? %5\n", + this, value, when, _in_write_pass, (most_recent_insert_iterator == _events.end()))); + { - Glib::Mutex::Lock lm (_lock); + Glib::Threads::Mutex::Lock lm (_lock); ControlEvent cp (when, 0.0f); - bool insert = true; iterator insertion_point; if (_events.empty()) { + + /* as long as the point we're adding is not at zero, + * add an "anchor" point there. + */ + if (when > 1) { _events.insert (_events.end(), new ControlEvent (0, _default_value)); + DEBUG_TRACE (DEBUG::ControlList, string_compose ("@%1 added default value %2 at zero\n", this, _default_value)); } } - for (insertion_point = lower_bound (_events.begin(), _events.end(), &cp, time_comparator); insertion_point != _events.end(); ++insertion_point) { + if (_in_write_pass && new_write_pass) { - /* only one point allowed per time point */ + DEBUG_TRACE (DEBUG::ControlList, string_compose ("@%1 new write pass, insert pos = %2\n", this, insert_position)); + + /* The first addition of a new control event during a + * write pass. + * + * We need to add a new point at insert_position + * corresponding the value there. + */ - if ((*insertion_point)->when == when) { - (*insertion_point)->value = value; - insert = false; - break; + /* the insert_iterator is not set, figure out where + * it needs to be. + */ + + ControlEvent cp (insert_position, 0.0); + most_recent_insert_iterator = lower_bound (_events.begin(), _events.end(), &cp, time_comparator); + DEBUG_TRACE (DEBUG::ControlList, string_compose ("@%1 looked up insert iterator for new write pass\n", this)); + + double eval_value = unlocked_eval (insert_position); + + if (most_recent_insert_iterator == _events.end()) { + + DEBUG_TRACE (DEBUG::ControlList, string_compose ("@%1 insert iterator at end, adding eval-value there %2\n", this, eval_value)); + _events.push_back (new ControlEvent (insert_position, eval_value)); + /* leave insert iterator at the end */ + + } else if ((*most_recent_insert_iterator)->when == when) { + + DEBUG_TRACE (DEBUG::ControlList, string_compose ("@%1 insert iterator at existing point, setting eval-value there %2\n", this, eval_value)); + + /* most_recent_insert_iterator points to a control event + already at the insert position, so there is + nothing to do. + + ... except ... + + advance most_recent_insert_iterator so that the "real" + insert occurs in the right place, since it + points to the control event just inserted. + */ + + ++most_recent_insert_iterator; + } else { + + /* insert a new control event at the right spot + */ + + DEBUG_TRACE (DEBUG::ControlList, string_compose ("@%1 insert eval-value %2 just before iterator @ %3\n", + this, eval_value, (*most_recent_insert_iterator)->when)); + + most_recent_insert_iterator = _events.insert (most_recent_insert_iterator, new ControlEvent (insert_position, eval_value)); + + /* advance most_recent_insert_iterator so that the "real" + * insert occurs in the right place, since it + * points to the control event just inserted. + */ + + ++most_recent_insert_iterator; } - if ((*insertion_point)->when >= when) { - break; - } - } + /* don't do this again till the next write pass */ + + new_write_pass = false; + did_write_during_pass = true; - if (insert) { - _events.insert (insertion_point, new ControlEvent (when, value)); + } else if (most_recent_insert_iterator == _events.end() || when > (*most_recent_insert_iterator)->when) { + + /* this is NOT the first point to be added after the + start of a write pass, and we have a bit of work to + do figuring out where to add the new point, as well + as potentially erasing existing data between the + most recently added point and wherever this one + will end up. + */ + + DEBUG_TRACE (DEBUG::ControlList, string_compose ("@%1 need to discover insert iterator (@end ? %2)\n", + this, (most_recent_insert_iterator == _events.end()))); + + /* this means that we either *know* we want to insert + * at the end, or that we don't know where to insert. + * + * so ... lets perform some quick checks before we + * go doing binary search to figure out where to + * insert. + */ + + if (_events.back()->when == when) { + + /* we need to modify the final point, so + make most_recent_insert_iterator point to it. + */ + + DEBUG_TRACE (DEBUG::ControlList, string_compose ("@%1 modify final value\n", this)); + + most_recent_insert_iterator = _events.end(); + --most_recent_insert_iterator; + + } else if (_events.back()->when < when) { + + /* the new point is beyond the end of the + * current list + */ + + DEBUG_TRACE (DEBUG::ControlList, string_compose ("@%1 plan to append to list\n", this)); + + if (_in_write_pass) { + /* remove the final point, because + we're adding one beyond it. + */ + delete _events.back(); + _events.pop_back(); + } + + /* leaving this here will force an append */ + + most_recent_insert_iterator = _events.end(); + + } else { + + DEBUG_TRACE (DEBUG::ControlList, string_compose ("@%1 erase %2 from existing iterator (@end ? %3\n", + this, _in_write_pass, + (most_recent_insert_iterator == _events.end()))); + + if (_in_write_pass) { + while (most_recent_insert_iterator != _events.end()) { + if ((*most_recent_insert_iterator)->when < when) { + if (_in_write_pass) { + DEBUG_TRACE (DEBUG::ControlList, string_compose ("@%1 erase existing @ %2\n", this, (*most_recent_insert_iterator))); + delete *most_recent_insert_iterator; + most_recent_insert_iterator = _events.erase (most_recent_insert_iterator); + continue; + } + } else if ((*most_recent_insert_iterator)->when >= when) { + break; + } + ++most_recent_insert_iterator; + } + } else { + + /* not in a write pass: figure out the iterator we should insert in front of */ + + ControlEvent cp (when, 0.0f); + most_recent_insert_iterator = lower_bound (_events.begin(), _events.end(), &cp, time_comparator); + } + } + } + + /* OK, now we're really ready to add a new point + */ + + if (most_recent_insert_iterator == _events.end()) { + DEBUG_TRACE (DEBUG::ControlList, string_compose ("@%1 appending new point at end\n", this)); + + bool done = false; + + /* check if would just be adding to a straight line, + * and don't add another point if so + */ + + if (!_events.empty()) { // avoid O(N) _events.size() here + if (_events.back()->value == value) { + EventList::iterator b = _events.end(); + --b; // last point, which we know exists + if (b != _events.begin()) { // step back again, which may not be possible + --b; // next-to-last-point + if ((*b)->value == value) { + /* straight line - just move the last + * point to the new time + */ + _events.back()->when = when; + done = true; + } + } + } + } + + if (!done) { + _events.push_back (new ControlEvent (when, value)); + } + + if (!_in_write_pass) { + most_recent_insert_iterator = _events.end(); + --most_recent_insert_iterator; + } + + } else if ((*most_recent_insert_iterator)->when == when) { + DEBUG_TRACE (DEBUG::ControlList, string_compose ("@%1 reset existing point to new value %2\n", this, value)); + + /* only one point allowed per time point, so just + * reset the value here. + */ + + (*most_recent_insert_iterator)->value = value; + + } else { + DEBUG_TRACE (DEBUG::ControlList, string_compose ("@%1 insert new point at %2 at iterator at %3\n", this, when, (*most_recent_insert_iterator)->when)); + + bool done; + + /* check if would just be adding to a straight line, + * and don't add another point if so + */ + + if (most_recent_insert_iterator != _events.begin()) { + EventList::iterator b = most_recent_insert_iterator; + --b; // prior point, which we know exists + if ((*b)->value == value) { // same value as the point we plan to insert + if (b != _events.begin()) { // step back again, which may not be possible + EventList::iterator bb = b; + --bb; // next-to-prior-point + if ((*bb)->value == value) { + /* straight line - just move the prior + * point to the new time + */ + (*b)->when = when; + + if (!_in_write_pass) { + most_recent_insert_iterator = b; + } + + done = true; + } + } + } + } + + if (!done) { + EventList::iterator x = _events.insert (most_recent_insert_iterator, new ControlEvent (when, value)); + + if (!_in_write_pass) { + most_recent_insert_iterator = x; + } + } } mark_dirty (); @@ -581,7 +847,10 @@ void ControlList::erase (iterator i) { { - Glib::Mutex::Lock lm (_lock); + Glib::Threads::Mutex::Lock lm (_lock); + if (most_recent_insert_iterator == i) { + unlocked_invalidate_insert_iterator (); + } _events.erase (i); mark_dirty (); } @@ -592,8 +861,9 @@ void ControlList::erase (iterator start, iterator end) { { - Glib::Mutex::Lock lm (_lock); + Glib::Threads::Mutex::Lock lm (_lock); _events.erase (start, end); + unlocked_invalidate_insert_iterator (); mark_dirty (); } maybe_signal_changed (); @@ -604,7 +874,7 @@ void ControlList::erase (double when, double value) { { - Glib::Mutex::Lock lm (_lock); + Glib::Threads::Mutex::Lock lm (_lock); iterator i = begin (); while (i != end() && ((*i)->when != when || (*i)->value != value)) { @@ -613,6 +883,9 @@ ControlList::erase (double when, double value) if (i != end ()) { _events.erase (i); + if (most_recent_insert_iterator == i) { + unlocked_invalidate_insert_iterator (); + } } mark_dirty (); @@ -627,7 +900,7 @@ ControlList::erase_range (double start, double endt) bool erased = false; { - Glib::Mutex::Lock lm (_lock); + Glib::Threads::Mutex::Lock lm (_lock); erased = erase_range_internal (start, endt, _events); if (erased) { @@ -654,6 +927,7 @@ ControlList::erase_range_internal (double start, double endt, EventList & events e = upper_bound (events.begin(), events.end(), &cp, time_comparator); events.erase (s, e); if (s != e) { + unlocked_invalidate_insert_iterator (); erased = true; } } @@ -665,7 +939,7 @@ void ControlList::slide (iterator before, double distance) { { - Glib::Mutex::Lock lm (_lock); + Glib::Threads::Mutex::Lock lm (_lock); if (before == _events.end()) { return; @@ -686,7 +960,7 @@ void ControlList::shift (double pos, double frames) { { - Glib::Mutex::Lock lm (_lock); + Glib::Threads::Mutex::Lock lm (_lock); for (iterator i = _events.begin(); i != _events.end(); ++i) { if ((*i)->when >= pos) { @@ -709,7 +983,7 @@ ControlList::modify (iterator iter, double when, double val) */ { - Glib::Mutex::Lock lm (_lock); + Glib::Threads::Mutex::Lock lm (_lock); (*iter)->when = when; (*iter)->value = val; @@ -720,6 +994,7 @@ ControlList::modify (iterator iter, double when, double val) if (!_frozen) { _events.sort (event_time_less_than); + unlocked_invalidate_insert_iterator (); } else { _sort_pending = true; } @@ -733,7 +1008,7 @@ ControlList::modify (iterator iter, double when, double val) std::pair ControlList::control_points_adjacent (double xval) { - Glib::Mutex::Lock lm (_lock); + Glib::Threads::Mutex::Lock lm (_lock); iterator i; ControlEvent cp (xval, 0.0f); std::pair ret; @@ -779,10 +1054,11 @@ ControlList::thaw () } { - Glib::Mutex::Lock lm (_lock); + Glib::Threads::Mutex::Lock lm (_lock); if (_sort_pending) { _events.sort (event_time_less_than); + unlocked_invalidate_insert_iterator (); _sort_pending = false; } } @@ -805,7 +1081,7 @@ void ControlList::truncate_end (double last_coordinate) { { - Glib::Mutex::Lock lm (_lock); + Glib::Threads::Mutex::Lock lm (_lock); ControlEvent cp (last_coordinate, 0); ControlList::reverse_iterator i; double last_val; @@ -896,7 +1172,8 @@ ControlList::truncate_end (double last_coordinate) _events.back()->when = last_coordinate; _events.back()->value = last_val; } - + + unlocked_invalidate_insert_iterator (); mark_dirty(); } @@ -907,7 +1184,7 @@ void ControlList::truncate_start (double overall_length) { { - Glib::Mutex::Lock lm (_lock); + Glib::Threads::Mutex::Lock lm (_lock); iterator i; double first_legal_value; double first_legal_coordinate; @@ -996,6 +1273,7 @@ ControlList::truncate_start (double overall_length) _events.push_front (new ControlEvent (0, first_legal_value)); } + unlocked_invalidate_insert_iterator (); mark_dirty(); } @@ -1161,7 +1439,7 @@ bool ControlList::rt_safe_earliest_event (double start, double& x, double& y, bool inclusive) const { // FIXME: It would be nice if this was unnecessary.. - Glib::Mutex::Lock lm(_lock, Glib::TRY_LOCK); + Glib::Threads::Mutex::Lock lm(_lock, Glib::Threads::TRY_LOCK); if (!lm.locked()) { return false; } @@ -1360,7 +1638,7 @@ ControlList::cut_copy_clear (double start, double end, int op) ControlEvent cp (start, 0.0); { - Glib::Mutex::Lock lm (_lock); + Glib::Threads::Mutex::Lock lm (_lock); /* first, determine s & e, two iterators that define the range of points affected by this operation @@ -1437,6 +1715,7 @@ ControlList::cut_copy_clear (double start, double end, int op) } } + unlocked_invalidate_insert_iterator (); mark_dirty (); } @@ -1475,7 +1754,7 @@ ControlList::paste (ControlList& alist, double pos, float /*times*/) } { - Glib::Mutex::Lock lm (_lock); + Glib::Threads::Mutex::Lock lm (_lock); iterator where; iterator prev; double end = 0; @@ -1506,6 +1785,7 @@ ControlList::paste (ControlList& alist, double pos, float /*times*/) } } + unlocked_invalidate_insert_iterator (); mark_dirty (); } @@ -1522,7 +1802,7 @@ ControlList::move_ranges (const list< RangeMove >& movements) typedef list< RangeMove > RangeMoveList; { - Glib::Mutex::Lock lm (_lock); + Glib::Threads::Mutex::Lock lm (_lock); /* a copy of the events list before we started moving stuff around */ EventList old_events = _events; @@ -1562,6 +1842,7 @@ ControlList::move_ranges (const list< RangeMove >& movements) if (!_frozen) { _events.sort (event_time_less_than); + unlocked_invalidate_insert_iterator (); } else { _sort_pending = true; } diff --git a/libs/evoral/src/ControlSet.cpp b/libs/evoral/src/ControlSet.cpp index d4480c2897..393b819146 100644 --- a/libs/evoral/src/ControlSet.cpp +++ b/libs/evoral/src/ControlSet.cpp @@ -53,7 +53,7 @@ ControlSet::add_control(boost::shared_ptr ac) void ControlSet::what_has_data (set& s) const { - Glib::Mutex::Lock lm (_control_lock); + Glib::Threads::Mutex::Lock lm (_control_lock); for (Controls::const_iterator li = _controls.begin(); li != _controls.end(); ++li) { if (li->second->list() && !li->second->list()->empty()) { @@ -116,7 +116,7 @@ ControlSet::find_next_event (double now, double end, ControlEvent& next_event) c void ControlSet::clear_controls () { - Glib::Mutex::Lock lm (_control_lock); + Glib::Threads::Mutex::Lock lm (_control_lock); _control_connections.drop_connections (); _list_connections.drop_connections (); diff --git a/libs/evoral/src/Curve.cpp b/libs/evoral/src/Curve.cpp index 81faee70d3..3f2ee361d3 100644 --- a/libs/evoral/src/Curve.cpp +++ b/libs/evoral/src/Curve.cpp @@ -23,7 +23,7 @@ #include #include -#include +#include #include "evoral/Curve.hpp" #include "evoral/ControlList.hpp" @@ -170,7 +170,7 @@ Curve::solve () bool Curve::rt_safe_get_vector (double x0, double x1, float *vec, int32_t veclen) { - Glib::Mutex::Lock lm(_list.lock(), Glib::TRY_LOCK); + Glib::Threads::Mutex::Lock lm(_list.lock(), Glib::Threads::TRY_LOCK); if (!lm.locked()) { return false; @@ -183,7 +183,7 @@ Curve::rt_safe_get_vector (double x0, double x1, float *vec, int32_t veclen) void Curve::get_vector (double x0, double x1, float *vec, int32_t veclen) { - Glib::Mutex::Lock lm(_list.lock()); + Glib::Threads::Mutex::Lock lm(_list.lock()); _get_vector (x0, x1, vec, veclen); } diff --git a/libs/evoral/src/Event.cpp b/libs/evoral/src/Event.cpp index e315d811e0..39f31f50d8 100644 --- a/libs/evoral/src/Event.cpp +++ b/libs/evoral/src/Event.cpp @@ -38,7 +38,7 @@ init_event_id_counter(event_id_t n) event_id_t next_event_id () { - return g_atomic_int_exchange_and_add (&_event_id_counter, 1); + return g_atomic_int_add (&_event_id_counter, 1); } #ifdef EVORAL_EVENT_ALLOC diff --git a/libs/evoral/src/Sequence.cpp b/libs/evoral/src/Sequence.cpp index 317daeba9d..7a8a08cfdf 100644 --- a/libs/evoral/src/Sequence.cpp +++ b/libs/evoral/src/Sequence.cpp @@ -770,16 +770,6 @@ Sequence