diff options
209 files changed, 20955 insertions, 6719 deletions
diff --git a/DOCUMENTATION/TRANSLATORS b/DOCUMENTATION/TRANSLATORS index 5d54a48ecb..c09a40406b 100644 --- a/DOCUMENTATION/TRANSLATORS +++ b/DOCUMENTATION/TRANSLATORS @@ -6,6 +6,7 @@ Many thanks to these translators for making Ardour available in other languages: French: Alain Fréhel <alain.frehel@free.fr> + Christophe Combelles <ccomb@free.fr> German: Karsten Petersen <kapet@kapet.de> diff --git a/SConstruct b/SConstruct index a06fadbef7..27e04b2ee1 100644 --- a/SConstruct +++ b/SConstruct @@ -9,13 +9,14 @@ import errno import time import platform import string +import commands from sets import Set import SCons.Node.FS SConsignFile() EnsureSConsVersion(0, 96) -version = '2.0beta5.1' +version = '2.0beta8' subst_dict = { } @@ -40,7 +41,7 @@ opts.AddOptions( PathOption('PREFIX', 'Set the install "prefix"', '/usr/local'), BoolOption('SURFACES', 'Build support for control surfaces', 0), BoolOption('SYSLIBS', 'USE AT YOUR OWN RISK: CANCELS ALL SUPPORT FROM ARDOUR AUTHORS: Use existing system versions of various libraries instead of internal ones', 0), - BoolOption('VERSIONED', 'Add version information to ardour/gtk executable name inside the build directory', 0), + BoolOption('VERSIONED', 'Add revision information to ardour/gtk executable name inside the build directory', 0), BoolOption('VST', 'Compile with support for VST', 0) ) @@ -230,41 +231,71 @@ def i18n (buildenv, sources, installenv): moname = domain + '.mo' installenv.Alias('install', installenv.InstallAs (os.path.join (modir, moname), lang + '.mo')) + +def fetch_svn_revision (path): + cmd = "svn info " + cmd += path + cmd += " | awk '/^Revision:/ { print $2}'" + return commands.getoutput (cmd) + +def create_stored_revision (target = None, source = None, env = None): + if os.path.exists('.svn'): + rev = fetch_svn_revision ('.'); + try: + text = "#ifndef __ardour_svn_revision_h__\n" + text += "#define __ardour_svn_revision_h__\n" + text += "static const char* ardour_svn_revision = \"" + rev + "\";\n"; + text += "#endif\n" + print '============> writing svn revision info to svn_revision.h\n' + o = file ('svn_revision.h', 'w') + o.write (text) + o.close () + except IOError: + print "Could not open svn_revision.h for writing\n" + sys.exit (-1) + else: + print "You cannot use \"scons revision\" on without using a checked out" + print "copy of the Ardour source code repository" + sys.exit (-1) + # # A generic builder for version.cc files # # note: requires that DOMAIN, MAJOR, MINOR, MICRO are set in the construction environment # note: assumes one source files, the header that declares the version variables # + def version_builder (target, source, env): - text = "int " + env['DOMAIN'] + "_major_version = " + str (env['MAJOR']) + ";\n" - text += "int " + env['DOMAIN'] + "_minor_version = " + str (env['MINOR']) + ";\n" - text += "int " + env['DOMAIN'] + "_micro_version = " + str (env['MICRO']) + ";\n" - - try: - o = file (target[0].get_path(), 'w') - o.write (text) - o.close () - except IOError: - print "Could not open", target[0].get_path(), " for writing\n" - sys.exit (-1) - - text = "#ifndef __" + env['DOMAIN'] + "_version_h__\n" - text += "#define __" + env['DOMAIN'] + "_version_h__\n" - text += "extern int " + env['DOMAIN'] + "_major_version;\n" - text += "extern int " + env['DOMAIN'] + "_minor_version;\n" - text += "extern int " + env['DOMAIN'] + "_micro_version;\n" - text += "#endif /* __" + env['DOMAIN'] + "_version_h__ */\n" - - try: - o = file (target[1].get_path(), 'w') - o.write (text) - o.close (); - except IOError: - print "Could not open", target[1].get_path(), " for writing\n" - sys.exit (-1) - - return None + + text = "int " + env['DOMAIN'] + "_major_version = " + str (env['MAJOR']) + ";\n" + text += "int " + env['DOMAIN'] + "_minor_version = " + str (env['MINOR']) + ";\n" + text += "int " + env['DOMAIN'] + "_micro_version = " + str (env['MICRO']) + ";\n" + + try: + o = file (target[0].get_path(), 'w') + o.write (text) + o.close () + except IOError: + print "Could not open", target[0].get_path(), " for writing\n" + sys.exit (-1) + + text = "#ifndef __" + env['DOMAIN'] + "_version_h__\n" + text += "#define __" + env['DOMAIN'] + "_version_h__\n" + text += "extern const char* " + env['DOMAIN'] + "_revision;\n" + text += "extern int " + env['DOMAIN'] + "_major_version;\n" + text += "extern int " + env['DOMAIN'] + "_minor_version;\n" + text += "extern int " + env['DOMAIN'] + "_micro_version;\n" + text += "#endif /* __" + env['DOMAIN'] + "_version_h__ */\n" + + try: + o = file (target[1].get_path(), 'w') + o.write (text) + o.close () + except IOError: + print "Could not open", target[1].get_path(), " for writing\n" + sys.exit (-1) + + return None version_bld = Builder (action = version_builder) env.Append (BUILDERS = {'VersionBuild' : version_bld}) @@ -278,32 +309,18 @@ env.Append (BUILDERS = {'VersionBuild' : version_bld}) # def versioned_builder(target,source,env): - # build ID is composed of a representation of the date of the last CVS transaction - # for this (SConscript) file + w, r = os.popen2( "svn info | awk '/^Revision:/ { print $2}'") - try: - o = file (source[0].get_dir().get_path() + '/CVS/Entries', "r") - except IOError: - print "Could not CVS/Entries for reading" - return -1 - - last_date = "" - lines = o.readlines() - for line in lines: - if line[0:12] == '/SConscript/': - parts = line.split ("/") - last_date = parts[3] - break - o.close () - - if last_date == "": - print "No SConscript CVS update info found - versioned executable cannot be built" + last_revision = r.readline().strip() + w.close() + r.close() + if last_revision == "": + print "No SVN info found - versioned executable cannot be built" return -1 - tag = time.strftime ('%Y%M%d%H%m', time.strptime (last_date)) - print "The current build ID is " + tag + print "The current build ID is " + last_revision - tagged_executable = source[0].get_path() + '-' + tag + tagged_executable = source[0].get_path() + '-' + last_revision if os.path.exists (tagged_executable): print "Replacing existing executable with the same build tag." @@ -361,7 +378,7 @@ env.Append (BUILDERS = {'Tarball' : tarball_bld}) # if env['VST']: - sys.stdout.write ("Are you building Ardour for personal use (rather than distributiont to others)? [no]: ") + sys.stdout.write ("Are you building Ardour for personal use (rather than distribution to others)? [no]: ") answer = sys.stdin.readline () answer = answer.rstrip().strip() if answer != "yes" and answer != "y": @@ -462,7 +479,7 @@ libraries['flac'] = conf.Finish () libraries['boost'] = LibraryInfo () conf = Configure (libraries['boost']) -if conf.CheckHeader ('boost/shared_ptr.hpp', language='CXX') == 0: +if conf.CheckHeader ('boost/shared_ptr.hpp', language='CXX') == False: print "Boost header files do not appear to be installed." sys.exit (1) @@ -523,7 +540,7 @@ elif conf.CheckCHeader('/System/Library/Frameworks/CoreMIDI.framework/Headers/Co subst_dict['%MIDITYPE%'] = "coremidi" print "Using CoreMIDI" else: - print "It appears you don't have the required MIDI libraries installed." + print "It appears you don't have the required MIDI libraries installed. For Linux this means you are missing the development package for ALSA libraries." sys.exit (1) env = conf.Finish() @@ -549,7 +566,7 @@ if env['SYSLIBS']: # cannot use system one for the time being # - libraries['sndfile'] = LibraryInfo(LIBS='libsndfile', + libraries['sndfile-ardour'] = LibraryInfo(LIBS='libsndfile-ardour', LIBPATH='#libs/libsndfile', CPPPATH=['#libs/libsndfile', '#libs/libsndfile/src']) @@ -587,7 +604,8 @@ if env['SYSLIBS']: gtk_subdirs = [ # 'libs/flowcanvas', 'libs/gtkmm2ext', - 'gtk2_ardour' + 'gtk2_ardour', + 'libs/clearlooks' ] else: @@ -616,7 +634,7 @@ else: libraries['soundtouch'] = LibraryInfo(LIBS='soundtouch', LIBPATH='#libs/soundtouch', CPPPATH=['#libs', '#libs/soundtouch']) - libraries['sndfile'] = LibraryInfo(LIBS='libsndfile', + libraries['sndfile-ardour'] = LibraryInfo(LIBS='libsndfile-ardour', LIBPATH='#libs/libsndfile', CPPPATH=['#libs/libsndfile', '#libs/libsndfile/src']) # libraries['libglademm'] = LibraryInfo(LIBS='libglademm', @@ -656,8 +674,9 @@ else: 'libs/gtkmm2/gtk', 'libs/libgnomecanvasmm', # 'libs/flowcanvas', - 'libs/gtkmm2ext', - 'gtk2_ardour' + 'libs/gtkmm2ext', + 'gtk2_ardour', + 'libs/clearlooks' ] # @@ -722,10 +741,10 @@ if os.environ.has_key('HOME'): conf = Configure (env) -have_cxx = conf.TryAction (Action (env['CXX'] + ' --version')) +have_cxx = conf.TryAction (Action (str(env['CXX']) + ' --version')) if have_cxx[0] != 1: print "This system has no functional C++ compiler. You cannot build Ardour from source without one." - exit (1) + sys.exit (1) else: print "Congratulations, you have a functioning C++ compiler." @@ -950,6 +969,9 @@ env = conf.Finish() rcbuild = env.SubstInFile ('ardour.rc','ardour.rc.in', SUBST_DICT = subst_dict) +the_revision = env.Command ('frobnicatory_decoy', [], create_stored_revision) + +env.Alias('revision', the_revision) env.Alias('install', env.Install(os.path.join(config_prefix, 'ardour2'), 'ardour_system.rc')) env.Alias('install', env.Install(os.path.join(config_prefix, 'ardour2'), 'ardour.rc')) @@ -959,13 +981,8 @@ Default (rcbuild) Precious (env['DISTTREE']) -# -# note the special "cleanfirst" source name. this triggers removal -# of the existing disttree -# - env.Distribute (env['DISTTREE'], - [ 'SConstruct', + [ 'SConstruct', 'svn_revision.h', 'COPYING', 'PACKAGER_README', 'README', 'ardour.rc.in', 'ardour_system.rc', @@ -989,12 +1006,13 @@ env.Distribute (env['DISTTREE'], glob.glob ('DOCUMENTATION/README*') ) -srcdist = env.Tarball(env['TARBALL'], env['DISTTREE']) +srcdist = env.Tarball(env['TARBALL'], [ env['DISTTREE'], the_revision ]) env.Alias ('srctar', srcdist) # # don't leave the distree around # + env.AddPreAction (env['DISTTREE'], Action ('rm -rf ' + str (File (env['DISTTREE'])))) env.AddPostAction (srcdist, Action ('rm -rf ' + str (File (env['DISTTREE'])))) diff --git a/ardour.rc.in b/ardour.rc.in index 735b19c233..a8c8b74bfd 100644 --- a/ardour.rc.in +++ b/ardour.rc.in @@ -1,4 +1,4 @@ -<?xml version="1.0"?> +<?xml version="1.0" encoding="UTF-8"?> <Ardour> <MIDI-port tag="%MIDITAG%" device="ardour" type="%MIDITYPE%" mode="duplex"/> <MIDI-port tag="control" device="ardour" type="%MIDITYPE%" mode="duplex"/> @@ -31,6 +31,7 @@ <Option name="quieten-at-speed" value="1.000000"/> <Option name="use-vst" value="yes"/> <Option name="use-tranzport" value="yes"/> + <Option name="destructive-xfade-msecs" value="500"/> </Config> <extra> <Keyboard edit-button="3" edit-modifier="4" delete-button="3" delete-modifier="1" snap-modifier="32"/> diff --git a/ardour_system.rc b/ardour_system.rc index 05cdcab3fd..b7f6c22e9b 100644 --- a/ardour_system.rc +++ b/ardour_system.rc @@ -1,4 +1,4 @@ -<?xml version="1.0"?> +<?xml version="1.0" encoding="UTF-8"?> <Ardour> <Config> <Option name="minimum-disk-io-bytes" value="262144"/> diff --git a/gtk2_ardour/SConscript b/gtk2_ardour/SConscript index 7ef2b668c9..bf8e4f560e 100644 --- a/gtk2_ardour/SConscript +++ b/gtk2_ardour/SConscript @@ -19,6 +19,7 @@ gtkardour.Append(DOMAIN=domain, MAJOR=1,MINOR=0,MICRO=2) gtkardour.Append(CCFLAGS="-DPACKAGE=\\\"" + domain + "\\\"") gtkardour.Append(CXXFLAGS="-DPACKAGE=\\\"" + domain + "\\\"") gtkardour.Append(CXXFLAGS="-DLIBSIGC_DISABLE_DEPRECATED") +gtkardour.Append(CPPPATH="#/") # for top level svn_revision.h #gtkardour.Append(CXXFLAGS="-DFLOWCANVAS_AA") gtkardour.Append(PACKAGE=domain) gtkardour.Append(POTFILE=domain + '.pot') @@ -34,7 +35,7 @@ gtkardour.Merge ([ libraries['libgnomecanvas2'], libraries['libgnomecanvasmm'], libraries['sysmidi'], - libraries['sndfile'], + libraries['sndfile-ardour'], libraries['flac'], libraries['lrdf'], libraries['glibmm2'], @@ -261,8 +262,6 @@ versionflag = '-DVERSIONSTRING=\\\"' + env['VERSION'] + '\\\"' gtkardour.Append(CXXFLAGS=versionflag) -gtkardour.VersionBuild(['version.cc','version.h'], 'SConscript') - executable = 'ardour.bin' ardour = gtkardour.Program(target = executable, source = gtkardour_files + extra_sources) @@ -310,6 +309,7 @@ env.Alias('install', env.Install(os.path.join(install_prefix, 'share/ardour2'), env.Alias('install', env.Install(os.path.join(install_prefix, 'share/ardour2/pixmaps'), pixmap_files)) env.Alias('install', env.Install(os.path.join(install_prefix, 'share/ardour2/icons'), icon_files)) +env.Alias ('version', gtkardour.VersionBuild(['version.cc','version.h'], [])) #dist env.Alias ('tarball', env.Distribute (env['DISTTREE'], diff --git a/gtk2_ardour/about.cc b/gtk2_ardour/about.cc index d43273f786..959830725e 100644 --- a/gtk2_ardour/about.cc +++ b/gtk2_ardour/about.cc @@ -32,6 +32,7 @@ #include "utils.h" #include "version.h" +#include "svn_revision.h" #include "about.h" #include "rgb_macros.h" #include "ardour_ui.h" @@ -139,11 +140,16 @@ static const char* authors[] = { N_("Per Sigmond"), N_("Doug Mclain"), N_("Petter Sundlöf"), + N_("Thorsten Wilms"), + N_("Ben Loftis"), + N_("Stefan Kersten"), + N_("Christopher George"), + N_("Robert Jordens"), 0 }; static const char* translators[] = { - N_("French:\n\tAlain Fréhel <alain.frehel@free.fr>\n"), + N_("French:\n\tAlain Fréhel <alain.frehel@free.fr>\n\tChristophe Combelles <ccomb@free.fr>\n"), N_("German:\n\tKarsten Petersen <kapet@kapet.de>\n"), N_("Italian:\n\tFilippo Pappalardo <filippo@email.it>\n"), N_("Portuguese:\n\tRui Nuno Capela <rncbc@rncbc.org>\n"), @@ -184,16 +190,11 @@ About::About () "under certain conditions; see the file COPYING for details.\n")); set_name (X_("ardour")); set_website (X_("http://ardour.org/")); - set_website_label (X_("visit http://www.ardour.org/")); - set_version ((string_compose(_("%1\n(built with ardour/gtk %2.%3.%4 libardour: %5.%6.%7)"), + set_website_label (_("visit http://www.ardour.org/")); + set_version ((string_compose(_("%1\n(built from revision %2)"), VERSIONSTRING, - gtk_ardour_major_version, - gtk_ardour_minor_version, - gtk_ardour_micro_version, - libardour_major_version, - libardour_minor_version, - libardour_micro_version))); - + ardour_svn_revision))); + #ifdef WITH_PAYMENT_OPTIONS paypal_button.add (paypal_pixmap); diff --git a/gtk2_ardour/actions.cc b/gtk2_ardour/actions.cc index 885a23ffc7..2fe305cf84 100644 --- a/gtk2_ardour/actions.cc +++ b/gtk2_ardour/actions.cc @@ -86,15 +86,6 @@ ActionManager::init () } RefPtr<Action> -ActionManager::register_action (RefPtr<ActionGroup> group, const char * name, const char * label, slot<void> sl, guint key, Gdk::ModifierType mods) -{ - RefPtr<Action> act = register_action (group, name, label, sl); - AccelMap::add_entry (act->get_accel_path(), key, mods); - - return act; -} - -RefPtr<Action> ActionManager::register_action (RefPtr<ActionGroup> group, const char * name, const char * label, slot<void> sl) { RefPtr<Action> act; @@ -118,15 +109,6 @@ ActionManager::register_action (RefPtr<ActionGroup> group, const char * name, co RefPtr<Action> -ActionManager::register_radio_action (RefPtr<ActionGroup> group, RadioAction::Group& rgroup, const char * name, const char * label, slot<void> sl, guint key, Gdk::ModifierType mods) -{ - RefPtr<Action> act = register_radio_action (group, rgroup, name, label, sl); - AccelMap::add_entry (act->get_accel_path(), key, mods); - - return act; -} - -RefPtr<Action> ActionManager::register_radio_action (RefPtr<ActionGroup> group, RadioAction::Group& rgroup, const char * name, const char * label, slot<void> sl) { RefPtr<Action> act; @@ -138,15 +120,6 @@ ActionManager::register_radio_action (RefPtr<ActionGroup> group, RadioAction::Gr } RefPtr<Action> -ActionManager::register_toggle_action (RefPtr<ActionGroup> group, const char * name, const char * label, slot<void> sl, guint key, Gdk::ModifierType mods) -{ - RefPtr<Action> act = register_toggle_action (group,name, label, sl); - AccelMap::add_entry (act->get_accel_path(), key, mods); - - return act; -} - -RefPtr<Action> ActionManager::register_toggle_action (RefPtr<ActionGroup> group, const char * name, const char * label, slot<void> sl) { RefPtr<Action> act; diff --git a/gtk2_ardour/add_route_dialog.cc b/gtk2_ardour/add_route_dialog.cc index 4a2c3d2a2a..591fe64244 100644 --- a/gtk2_ardour/add_route_dialog.cc +++ b/gtk2_ardour/add_route_dialog.cc @@ -38,20 +38,20 @@ using namespace std; using namespace PBD; static const char* channel_setup_names[] = { - "Mono", - "Stereo", - "3 Channels", - "4 Channels", - "6 Channels", - "8 Channels", - "Manual Setup", + N_("Mono"), + N_("Stereo"), + N_("3 Channels"), + N_("4 Channels"), + N_("6 Channels"), + N_("8 Channels"), + N_("Manual Setup"), "MIDI", 0 }; static const char* track_mode_names[] = { - "Normal", - "Tape", + N_("Normal"), + N_("Tape"), 0 }; @@ -67,11 +67,11 @@ AddRouteDialog::AddRouteDialog () routes_spinner (routes_adjustment) { if (channel_combo_strings.empty()) { - channel_combo_strings = PBD::internationalize (channel_setup_names); + channel_combo_strings = I18N (channel_setup_names); } if (track_mode_strings.empty()) { - track_mode_strings = PBD::internationalize (track_mode_names); + track_mode_strings = I18N (track_mode_names); } set_name ("AddRouteDialog"); diff --git a/gtk2_ardour/ardev_common.sh b/gtk2_ardour/ardev_common.sh index 165db68369..d4109de8bb 100755 --- a/gtk2_ardour/ardev_common.sh +++ b/gtk2_ardour/ardev_common.sh @@ -3,11 +3,13 @@ cd `dirname "$0"`/.. #export G_DEBUG=fatal_criticals export ARDOUR_PATH=gtk2_ardour/icons:gtk2_ardour/pixmaps:gtk2_ardour +export GTK_PATH=libs/clearlooks + export LD_LIBRARY_PATH=libs/surfaces/control_protocol:libs/ardour:libs/midi++2:libs/pbd:libs/soundtouch:libs/gtkmm2ext:libs/sigc++2:libs/glibmm2:libs/gtkmm2/atk:libs/gtkmm2/pango:libs/gtkmm2/gdk:libs/gtkmm2/gtk:libs/libgnomecanvasmm:libs/libsndfile:libs/appleutility:$LD_LIBRARY_PATH # DYLD_LIBRARY_PATH is for darwin. export DYLD_LIBRARY_PATH=$LD_LIBRARY_PATH +# For the internal clearlooks engine +export GTK_PATH=$PWD/libs/clearlooks:~/.ardour2 -# LADSPA_PATH for OSX -export LADSPA_PATH=$LADSPA_PATH:/Library/Audio/Plug-Ins/LADSPA diff --git a/gtk2_ardour/ardour.bindings b/gtk2_ardour/ardour.bindings index 244e21436c..5a0eb469b7 100644 --- a/gtk2_ardour/ardour.bindings +++ b/gtk2_ardour/ardour.bindings @@ -37,10 +37,10 @@ (gtk_accel_path "<Actions>/Common/goto-editor" "<alt>e") (gtk_accel_path "<Actions>/Common/goto-mixer" "<alt>m") -(gtk-accel_path "<Actions>/Common/ToggleSoundFileBrowser" "<alt>f") -(gtk-accel_path "<Actions>/Common/ToggleLocations" "<alt>l") -(gtk-accel_path "<Actions>/Common/ToggleBigClock" "<alt>b") -(gtk-accel_path "<Actions>/Common/ToggleColorManager" "<alt>c") +(gtk_accel_path "<Actions>/Common/ToggleSoundFileBrowser" "<alt>f") +(gtk_accel_path "<Actions>/Common/ToggleLocations" "<alt>l") +(gtk_accel_path "<Actions>/Common/ToggleBigClock" "<alt>b") +(gtk_accel_path "<Actions>/Common/ToggleColorManager" "<alt>c") (gtk_accel_path "<Actions>/Editor/editor-copy" "<control>c") (gtk_accel_path "<Actions>/Common/Quit" "<control>q") diff --git a/gtk2_ardour/ardour.colors b/gtk2_ardour/ardour.colors index cc44208234..097c72f6d8 100644 --- a/gtk2_ardour/ardour.colors +++ b/gtk2_ardour/ardour.colors @@ -1,18 +1,18 @@ cWaveForm 0.0 0.0 0.0 0.80 cMutedWaveForm 0.35 0.35 0.35 1.0 -cSelectedFrameBase 0.0 0.57 0.66 0.5 -cFrameBase 0.0 0.76 0.75 0.5 +cSelectedFrameBase 0.71 0.57 0.66 1.0 +cFrameBase 0.75 0.75 0.76 1.0 cAudioTrackOutline 0.00 0.00 0.00 1.00 cAudioTrackBase 0.80 0.80 1.0 0.5 -cAudioBusBase 0.65 0.65 0.75 0.41 +cAudioBusBase 0.86 0.82 0.92 0.41 cMidiTrackOutline 0.00 0.00 0.00 1.00 cMidiTrackBase 1.0 0.85 0.85 0.5 cMidiBusBase 0.75 0.65 0.65 0.41 -cMeterBar 0.40 0.40 0.40 1.0 -cTempoBar 0.45 0.45 0.45 1.0 -cMarkerBar 0.50 0.50 0.50 1.0 -cRangeMarkerBar 0.55 0.55 0.55 1.0 -cTransportMarkerBar 0.60 0.60 0.60 1.0 +cMeterBar 0.40 0.40 0.45 1.0 +cTempoBar 0.45 0.45 0.50 1.0 +cMarkerBar 0.50 0.50 0.55 1.0 +cRangeMarkerBar 0.55 0.55 0.59 1.0 +cTransportMarkerBar 0.60 0.60 0.64 1.0 cTimeStretchFill 0.89 0.71 0.71 0.59 cTimeStretchOutline 0.39 0.39 0.39 0.59 cAutomationLine 0.27 0.74 0.35 1.0 @@ -68,8 +68,8 @@ cEnteredAutomationLine 0.87 0.39 0.39 1.00 cEnteredMarker 0.87 0.39 0.39 1.00 cMeterMarker 0.95 0.26 0.36 1.00 cTempoMarker 0.95 0.26 0.36 1.00 -cMeasureLineBeat 0.55 0.55 0.55 1.00 -cMeasureLineBar 0.45 0.45 0.45 1.00 +cMeasureLineBeat 0.40 0.40 0.40 0.50 +cMeasureLineBar 0.55 0.55 0.60 0.70 cGhostTrackBaseOutline 0.00 0.00 0.00 1.00 cGhostTrackBaseFill 0.27 0.00 0.49 0.50 cImageTrackBase 0.87 0.87 0.85 1.00 diff --git a/gtk2_ardour/ardour.menus b/gtk2_ardour/ardour.menus index 845acac400..97441e5023 100644 --- a/gtk2_ardour/ardour.menus +++ b/gtk2_ardour/ardour.menus @@ -131,9 +131,31 @@ <menuitem action='zoom-focus-playhead'/> <menuitem action='zoom-focus-edit'/> </menu> + <menu name='SnapMode' action='SnapMode'> + <menuitem action='snap-normal'/> + <menuitem action='snap-magnetic'/> + </menu> <menu name='SnapTo' action='SnapTo'> - <menuitem action='snap-to-beat'/> - <menuitem action='snap-to-bar'/> + <menuitem action='snap-to-frame'/> + <menuitem action='snap-to-cd-frame'/> + <menuitem action='snap-to-smpte-frame'/> + <menuitem action='snap-to-smpte-seconds'/> + <menuitem action='snap-to-smpte-minutes'/> + <menuitem action='snap-to-seconds'/> + <menuitem action='snap-to-minutes'/> + <menuitem action='snap-to-thirtyseconds'/> + <menuitem action='snap-to-asixteenthbeat'/> + <menuitem action='snap-to-eighths'/> + <menuitem action='snap-to-quarters'/> + <menuitem action='snap-to-thirds'/> + <menuitem action='snap-to-beat'/> + <menuitem action='snap-to-bar'/> + <menuitem action='snap-to-mark'/> + <menuitem action='snap-to-edit-cursor'/> + <menuitem action='snap-to-region-start'/> + <menuitem action='snap-to-region-end'/> + <menuitem action='snap-to-region-sync'/> + <menuitem action='snap-to-region-boundary'/> </menu> <menu name='MeterFalloff' action='MeterFalloff'> <menuitem action='MeterFalloffOff'/> @@ -194,7 +216,6 @@ <menuitem action='ToggleOptionsEditor'/> <menuitem action='ToggleSoundFileBrowser'/> <menuitem action='ToggleInspector'/> - <menuitem action='ToggleConnections'/> <menuitem action='ToggleLocations'/> <menuitem action='ToggleColorManager'/> <menuitem action='ToggleBigClock'/> @@ -214,7 +235,7 @@ <menuitem action='FileHeaderFormatCAF'/> </menu> </menu> - <menu action='SMPTE'> + <menu action='Timecode'> <menuitem action='Smpte23976'/> <menuitem action='Smpte24'/> <menuitem action='Smpte24976'/> diff --git a/gtk2_ardour/ardour.sh.in b/gtk2_ardour/ardour.sh.in index b748c96954..107321024b 100644 --- a/gtk2_ardour/ardour.sh.in +++ b/gtk2_ardour/ardour.sh.in @@ -1,5 +1,7 @@ #!/bin/sh +export GTK_PATH=%INSTALL_PREFIX%/lib/ardour2:$GTK_PATH + export LD_LIBRARY_PATH=%INSTALL_PREFIX%/lib/ardour2:$LD_LIBRARY_PATH # DYLD_LIBRARY_PATH is for Darwin export DYLD_LIBRARY_PATH=$LD_LIBRARY_PATH diff --git a/gtk2_ardour/ardour2_ui.rc b/gtk2_ardour/ardour2_ui.rc index abcfd4c262..d015340868 100644 --- a/gtk2_ardour/ardour2_ui.rc +++ b/gtk2_ardour/ardour2_ui.rc @@ -86,6 +86,8 @@ style "default_base" = "medium_text" GtkButton::button_relief = GTK_RELIEF_NONE GtkTreeView::vertical-padding = 0 GtkTreeView::horizontal-padding = 0 + GtkTreeView::even-row-color = { 0, 0, 0 } + GtkTreeView::odd-row-color = { 0, 0, 0 } fg[NORMAL] = { 0.80, 0.80, 0.80 } fg[ACTIVE] = { 0.80, 0.80, 0.80 } @@ -93,8 +95,8 @@ style "default_base" = "medium_text" fg[INSENSITIVE] = { 0.80, 0.80, 0.80 } fg[SELECTED] = { 0.80, 0.80, 0.80 } - bg[NORMAL] = { 0.40, 0.41, 0.41 } - bg[ACTIVE] = { 0.40, 0.41, 0.41 } + bg[NORMAL] = { 0.35, 0.35, 0.40 } + bg[ACTIVE] = { 0.35, 0.35, 0.40 } bg[PRELIGHT] = "#565690" bg[INSENSITIVE] = { 0.10, 0.10, 0.10 } bg[SELECTED] = { 0, 0.40, 0.60 } @@ -105,24 +107,25 @@ style "default_base" = "medium_text" text[INSENSITIVE] = { 0.80, 0.80, 0.80} text[SELECTED] = { 1.0, 1.0, 1.0 } - base[ACTIVE] = "#2f272f" - base[NORMAL] = "#1c1e21" + base[ACTIVE] = "#272a2f" + base[NORMAL] = "#1a1e20" base[PRELIGHT] = { 0.20, 0.20, 0.20 } base[INSENSITIVE] = "#4c5159" base[SELECTED] = { 0.25, 0.25, 0.25 } - - engine "clearlooks" { + + engine "clearlooks" + { menubarstyle = 0 # 0 = flat, 1 = sunken, 2 = flat gradient menuitemstyle = 0 # 0 = flat, 1 = 3d-ish (gradient), 2 = 3d-ish (button) listviewitemstyle = 0 # 0 = flat, 1 = 3d-ish (gradient) - progressbarstyle = 0 # 0 = candy bar, 1 = flat + progressbarstyle = 1 # 0 = candy bar, 1 = fancy candy bar, 2 = flat } } style "base_frame" { fg[NORMAL] = { 0.80, 0.80, 0.80 } - bg[NORMAL] = { 0.40, 0.40, 0.40 } + bg[NORMAL] = { 0.35, 0.35, 0.40 } } style "transport_base" = "medium_bold_text" @@ -136,8 +139,8 @@ style "transport_base" = "medium_bold_text" /* style "black_mackie_menu_bar" = "medium_bold_text" { - fg[NORMAL] = { 1.0, 1.0, 1.0 } - bg[NORMAL] = { 0, 0, 0 } + fg[NORMAL] = { 1.0, 1.0, 1.0 } + bg[NORMAL] = { 0, 0, 0 } } */ style "default_buttons_menus" @@ -145,11 +148,11 @@ style "default_buttons_menus" font_name = "sans 8" fg[ACTIVE] = { 1.0, 1.0, 1.0 } - bg[NORMAL] = { 0.35, 0.35, 0.35 } + bg[NORMAL] = { 0.30, 0.30, 0.35 } bg[ACTIVE] = "#565690" - bg[PRELIGHT] = { 0.20, 0.20, 0.20 } - bg[INSENSITIVE] = { 0.20, 0.20, 0.20 } - bg[SELECTED] = { 0.20, 0.20, 0.20 } + bg[PRELIGHT] = { 0.15, 0.15, 0.20 } + bg[INSENSITIVE] = { 0.15, 0.15, 0.20 } + bg[SELECTED] = { 0.15, 0.15, 0.20 } } style "very_small_button" = "default_buttons_menus" @@ -203,6 +206,15 @@ style "solo_button" = "small_button" fg[ACTIVE] = { 0, 0, 0 } } +style "safe_solo_button" = "small_button" +{ + bg[PRELIGHT] = { 0, 1.0, 0 } + bg[ACTIVE] = { 0.19, 0.97, 0.69 } + + fg[PRELIGHT] = { 0, 0, 0 } + fg[ACTIVE] = { 0, 0, 0 } +} + style "mixer_solo_button" = "solo_button" { font_name = "sans 7" @@ -211,6 +223,14 @@ style "mixer_solo_button" = "solo_button" } +style "mixer_safe_solo_button" = "safe_solo_button" +{ + font_name = "sans 7" + xthickness = 0 + ythickness = 0 + +} + style "mute_button" = "small_button" { @@ -248,8 +268,8 @@ style "mixer_red_active_button" = "very_small_button" fg[ACTIVE] = { 0, 1.0, 1.0 } bg[ACTIVE] = { 0.7, 0, 0 } - base[INSENSITIVE] = { 0.21, 0.21, 0.21 } - bg[INSENSITIVE] = { 0.21, 0.21, 0.21 } + base[INSENSITIVE] = { 0.16, 0.16, 0.21 } + bg[INSENSITIVE] = { 0.16, 0.16, 0.21 } } style "time_button" = "default_buttons_menus" @@ -277,10 +297,10 @@ style "shuttle_control" = "very_small_text" fg[SELECTED] = { 0.85, 0.92, 0.98 } fg[INSENSITIVE] = { 0.85, 0.92, 0.98 } - bg[NORMAL] = { 0.31, 0.31, 0.31 } - bg[PRELIGHT] = { 0.31, 0.31, 0.31 } - bg[INSENSITIVE] = { 0.31, 0.31, 0.31 } - bg[ACTIVE] = { 0.50, 1.0, 0.50 } + bg[NORMAL] = { 0.26, 0.26, 0.31 } + bg[PRELIGHT] = { 0.26, 0.26, 0.31 } + bg[INSENSITIVE] = { 0.26, 0.26, 0.31 } + bg[ACTIVE] = { 0.70, 0.70, 0.70 } bg[SELECTED] = { 1.0, 0.04, 0.04 } } @@ -305,20 +325,20 @@ style "options_window" = "default_base" style "option_entry" = "default_base" { - fg[NORMAL] = { 0.50, 1.0, 1.0 } - fg[ACTIVE] = { 0.50, 1.0, 1.0 } + fg[NORMAL] = { 1.0, 1.0, 1.0 } + fg[ACTIVE] = { 1.0, 1.0, 1.0 } fg[INSENSITIVE] = { 0.80, 0.80, 0.80 } - base[INSENSITIVE] = { 0.12, 0.12, 0.12 } + base[INSENSITIVE] = { 0.07, 0.07, 0.12 } - bg[NORMAL] = { 0.40, 0.40, 0.40 } - bg[ACTIVE] = { 0.40, 0.40, 0.40 } + bg[NORMAL] = { 0.35, 0.35, 0.40 } + bg[ACTIVE] = { 0.35, 0.35, 0.40 } } style "red_when_active" = "medium_text" { fg[NORMAL] = { 0.80, 0.80, 0.80 } - bg[NORMAL] = { 0.31, 0.31, 0.31 } + bg[NORMAL] = { 0.26, 0.26, 0.31 } fg[ACTIVE] = { 0.80, 0.80, 0.80 } bg[ACTIVE] = { 1.0, 0, 0} @@ -338,13 +358,13 @@ style "xrun_warn" bg[ACTIVE] = { 0.09, 1.0, 0.46 } } /* -style "menu_bar_base" +style "menu_bar_base" = "default_base" { - bg[NORMAL] = { 0, 0, 0 } - bg[ACTIVE] = { 0, 0, 0 } - bg[PRELIGHT] = { 0, 0, 0 } - bg[INSENSITIVE] = { 0, 0, 0 } - bg[SELECTED] = { 0, 0, 0 } + bg[NORMAL] = { 0.2, 0.2, 0.3 } + bg[ACTIVE] = { 0, 0, 0 } + bg[PRELIGHT] = { 0, 0, 0 } + bg[INSENSITIVE] = { 0, 0, 0 } + bg[SELECTED] = { 0, 0, 0 } } */ style "fatal_message" = "medium_text" @@ -389,15 +409,15 @@ style "warning_message" = "medium_text" style "medium_entry" = "medium_text" { - fg[NORMAL] = { 0.50, 1.0, 1.0 } - fg[ACTIVE] = { 0.50, 1.0, 1.0 } - fg[SELECTED] = { 0.50, 1.0, 0.50 } + fg[NORMAL] = { 0.70, 0.70, 0.70 } + fg[ACTIVE] = { 0.70, 0.70, 0.70 } + fg[SELECTED] = { 1.0, 1.0, 1.0 } - bg[NORMAL] = { 0.40, 0.40, 0.40 } + bg[NORMAL] = { 0.35, 0.35, 0.40 } base[NORMAL] = { 0, 0, 0 } base[ACTIVE] = { 0, 0, 0 } - base[SELECTED] = { 0.5, 0.5, 1.0 } + base[SELECTED] = { 0.70, 0.70, 0.70 } } style "medium_entry_noselection_fg" = "medium_entry" @@ -407,15 +427,15 @@ style "medium_entry_noselection_fg" = "medium_entry" style "medium_entry_noselection_bg" = "medium_entry" { - bg[SELECTED] = { 0.50, 1.0, 1.0 } + bg[SELECTED] = { 1.0, 1.0, 1.0 } } style "medium_bold_entry" = "medium_bold_text" { - fg[NORMAL] = { 0.50, 1.0, 1.0 } - fg[ACTIVE] = { 0.50, 1.0, 1.0 } + fg[NORMAL] = { 0.70, 0.70, 0.70 } + fg[ACTIVE] = { 0.70, 0.70, 0.70 } - bg[NORMAL] = { 0.40, 0.40, 0.40 } + bg[NORMAL] = { 0.35, 0.35, 0.40 } base[NORMAL] = { 0, 0, 0 } base[ACTIVE] = { 0, 0, 0 } @@ -425,8 +445,8 @@ style "medium_bold_entry" = "medium_bold_text" style "small_entry" = "small_text" { - fg[NORMAL] = { 0.50, 1.0, 1.0 } - fg[ACTIVE] = { 0.50, 1.0, 1.0 } + fg[NORMAL] = { 0.70, 0.70, 0.70 } + fg[ACTIVE] = { 0.70, 0.70, 0.70 } bg[NORMAL] = { 0.0, 0.0, 0.0 } base[NORMAL] = { 0, 0, 0 } base[ACTIVE] = { 0, 0, 0 } @@ -441,10 +461,10 @@ style "red_active_small_entry" = "small_entry" style "small_bold_entry" = "small_bold_text" { - fg[NORMAL] = { 0.50, 1.0, 1.0 } - fg[ACTIVE] = { 0.50, 1.0, 1.0 } + fg[NORMAL] = { 0.70, 0.70, 0.70 } + fg[ACTIVE] = { 0.70, 0.70, 0.70 } - bg[NORMAL] = { 0.40, 0.40, 0.40 } + bg[NORMAL] = { 0.35, 0.35, 0.40 } base[NORMAL] = { 0, 0, 0 } base[ACTIVE] = { 0, 0, 0 } @@ -523,7 +543,7 @@ style "audio_track_base" = "default_base" { font_name = "sans 6" fg[NORMAL] = { 0.77, 0.77, 0.72 } - bg[NORMAL] = { 0.32, 0.32, 0.45 } + bg[NORMAL] = { 0.18, 0.19, 0.22 } bg[ACTIVE] = { 0.20, 0.20, 0.20 } bg[PRELIGHT] = { 0.20, 0.20, 0.20 } bg[INSENSITIVE] = { 0.20, 0.20, 0.20 } @@ -534,8 +554,9 @@ style "midi_bus_base" { font_name = "sans 6" fg[NORMAL] = { 0.77, 0.77, 0.72 } - fg[NORMAL] = { 0.8, 0.7, 0.2 } - bg[NORMAL] = { 0.26, 0.20, 0.20 } + fg[NORMAL] = { 0.7, 0.8, 0.2 } + #bg[NORMAL] = {0, 0.36, 0.40 } + bg[NORMAL] = "#444466" } style "midi_track_base" = "default_base" @@ -570,7 +591,7 @@ style "active_track_name_display" style "track_separator" { - bg[NORMAL] = { 0.40, 0.40, 0.40 } + bg[NORMAL] = { 0.35, 0.35, 0.40 } } # @@ -626,7 +647,7 @@ style "region_list_display" = "small_bold_text" { fg[NORMAL] = { 0.80, 0.80, 0.80 } fg[ACTIVE] = { 0.80, 0.80, 0.80 } - fg[SELECTED] = { 0.50, 1.0, 1.0 } + fg[SELECTED] = { 0.70, 0.70, 0.70 } bg[NORMAL] = { 0, 0, 0 } bg[ACTIVE] = { 0, 0, 0 } bg[SELECTED] = { 0, 0, 0 } @@ -638,11 +659,11 @@ style "region_list_display" = "small_bold_text" style "main_canvas_area" { - bg[NORMAL] = { 0.38, 0.38, 0.38 } - bg[ACTIVE] = { 0.38, 0.38, 0.38 } - bg[INSENSITIVE] = { 0.38, 0.38, 0.38 } - bg[SELECTED] = { 0.38, 0.38, 0.38 } - bg[PRELIGHT] = { 0.38, 0.38, 0.38 } + bg[NORMAL] = { 0.20, 0.20, 0.25 } + bg[ACTIVE] = { 0.20, 0.20, 0.25 } + bg[INSENSITIVE] = { 0.20, 0.20, 0.25 } + bg[SELECTED] = { 0.20, 0.20, 0.25 } + bg[PRELIGHT] = { 0.20, 0.20, 0.25 } } style "track_controls_inactive" @@ -685,7 +706,7 @@ style "plugin_slider" fg[NORMAL] = { 0.37, 0.43, 0.52 } fg[ACTIVE] = { 0.37, 0.43, 0.52 } - fg[INSENSITIVE] = {0.40, 0.40, 0.40 } # matches default_base + fg[INSENSITIVE] = {0.35, 0.35, 0.40 } # matches default_base fg[SELECTED] = { 0.37, 0.43, 0.52 } fg[PRELIGHT] = { 0.37, 0.43, 0.52 } @@ -736,7 +757,7 @@ style "redirect_list_display" font_name = "sans 7" text[NORMAL] = { 0.80, 0.80, 0.80 } - text[ACTIVE] = { 0.5, 0.5, 0.9 } + text[ACTIVE] = { 0.70, 0.70, 0.70 } text[INSENSITIVE] = { 0, 0, 0 } text[SELECTED] = { 0.9, 0.3, 0.3 } @@ -749,7 +770,7 @@ style "redirect_list_display" # text fg[NORMAL] = { 0.5, 0.5, 0.5 } # used for inactive - fg[ACTIVE] = { 0.5, 1.0, 1.0 } # used for active + fg[ACTIVE] = { 1.0, 1.0, 1.0 } # used for active } style "inspector_redirect_list_display" = "redirect_list_display" @@ -768,12 +789,6 @@ style "pan_zone" = "default_base" fg[ACTIVE] = { 0.95, 0.48, 0.11 } } -style "wall_clock" = "medium_bold_text" -{ - fg[NORMAL] = { 1.0, 1.0, 1.0 } - bg[NORMAL] = { 0, 0, 0 } -} - style "paler_red_when_active" = "medium_text" { fg[NORMAL] = { 0.80, 0.80, 0.80 } @@ -812,31 +827,85 @@ style "selected_strip_frame" style "flashing_alert" = "very_small_text" { fg[NORMAL] = { 0.80, 0.80, 0.80 } - bg[NORMAL] = { 0.31, 0.31, 0.31 } + bg[NORMAL] = { 0.26, 0.26, 0.31 } fg[ACTIVE] = { 0.80, 0.80, 0.80 } bg[ACTIVE] = { 1.0, 0, 0} } -style "selected_io_selector_port_list" = "medium_text" +style "selected_io_selector_port_list" = "medium_bold_text" { - fg[NORMAL] = { 0.50, 1.0, 1.0 } - fg[SELECTED] = { 0.50, 1.0, 1.0 } - base[NORMAL] = { 0, 0, 0 } - base[SELECTED] = { 0, 0, 0 } + + GtkTreeView::even-row-color = { 0.64, 0.68, 0.54 } + GtkTreeView::odd-row-color = { 0.64, 0.68, 0.54 } + +# fg is used to color the fg (text) of the column header button + + fg[NORMAL] = { 0.80, 0.80, 0.70 } + fg[SELECTED] = { 0.80, 0.80, 0.70 } + fg[ACTIVE] = { 0.80, 0.80, 0.70 } + fg[PRELIGHT] = { 0.80, 0.80, 0.70 } + fg[INSENSITIVE] = { 0.80, 0.80, 0.70 } + +# bg is used used to color the background of the column header button + + bg[NORMAL] = { 0.30, 0.30, 0.35 } + bg[ACTIVE] = { 0.30, 0.30, 0.35 } + bg[PRELIGHT] = { 0.30, 0.30, 0.35 } + bg[INSENSITIVE] = { 0.30, 0.30, 0.35 } + bg[SELECTED] = { 0.30, 0.30, 0.35 } + +# text is used to color the treeview row text + + text[NORMAL] = { 0.80, 0.80, 0.70 } + text[SELECTED] = { 0.80, 0.80, 0.70 } + +# base is used to color a treeview with no rows + + base[NORMAL] = { 0.64, 0.68, 0.54 } + base[ACTIVE] = { 0.64, 0.68, 0.54 } + base[PRELIGHT] = { 0.64, 0.68, 0.54 } + base[INSENSITIVE] = { 0.64, 0.68, 0.54 } + base[SELECTED] = { 0.64, 0.68, 0.54 } + } style "io_selector_port_list" = "medium_text" { - fg[NORMAL] = {0.80, 0.80, 0.70 } - fg[SELECTED] = {0.80, 0.80, 0.70 } - base[NORMAL] = { 0.26, 0.26, 0.26 } - base[SELECTED] = { 0.26, 0.26, 0.26 } + +# fg is used to color the fg (text) of the column header button + + fg[NORMAL] = { 0.80, 0.80, 0.70 } + fg[SELECTED] = { 0.80, 0.80, 0.70 } + fg[ACTIVE] = { 0.80, 0.80, 0.70 } + fg[PRELIGHT] = { 0.80, 0.80, 0.70 } + fg[INSENSITIVE] = { 0.80, 0.80, 0.70 } + +# bg is used used to color the background of the column header button + + bg[NORMAL] = { 0.30, 0.30, 0.35 } + bg[ACTIVE] = { 0.30, 0.30, 0.35 } + bg[PRELIGHT] = { 0.30, 0.30, 0.35 } + bg[INSENSITIVE] = { 0.30, 0.30, 0.35 } + bg[SELECTED] = { 0.30, 0.30, 0.35 } + +# text is used to color the treeview row text + + text[NORMAL] = { 0.80, 0.80, 0.70 } + text[SELECTED] = { 0.80, 0.80, 0.70 } + +# base is used to color a treeview with no rows + + base[NORMAL] = { 0, 0, 0 } + base[ACTIVE] = { 0, 0, 0 } + base[PRELIGHT] = { 0, 0, 0 } + base[INSENSITIVE] = { 0, 0, 0 } + base[SELECTED] = { 0, 0, 0 } } style "io_selector_notebook" = "default_base" { - fg[NORMAL] = { 0.50, 1.0, 1.0 } + fg[NORMAL] = { 1.0, 1.0, 1.0 } font_name ="sans bold 8" } @@ -880,11 +949,11 @@ style "pan_slider" bg[SELECTED] = { 0, 0, 0 } bg[PRELIGHT] = { 0, 0, 0 } - text[NORMAL] = { 0.85, 0.92, 0.98 } - text[ACTIVE] = { 0.85, 0.92, 0.98 } - text[INSENSITIVE] = { 0.85, 0.92, 0.98 } - text[SELECTED] = { 0.85, 0.92, 0.98 } - text[PRELIGHT] = { 0.85, 0.92, 0.98 } + text[NORMAL] = { 0.70, 0.70, 0.70 } + text[ACTIVE] = { 0.70, 0.70, 0.70 } + text[INSENSITIVE] = { 0.70, 0.70, 0.70 } + text[SELECTED] = { 0.70, 0.70, 0.70 } + text[PRELIGHT] = { 0.70, 0.70, 0.70 } } style "region_list_whole_file" @@ -966,8 +1035,8 @@ widget "*EditorTimeButton*" style "time_button" widget "*EditorMixerButton*" style "default_buttons_menus" widget "*SoloButton*" style "solo_button" widget "*SoloButton.*" style "solo_button" -widget "*SafeSoloButton*" style "solo_button" -widget "*SafeSoloButton.*" style "solo_button" +widget "*SafeSoloButton*" style "safe_solo_button" +widget "*SafeSoloButton.*" style "safe_solo_button" widget "*MixerPhaseInvertButton*" style "very_small_button" widget "*MixerPhaseInvertButton.*" style "very_small_button" widget "*MixerAutomationRecordingButton*" style "very_small_button" @@ -1116,8 +1185,6 @@ widget "*MixerTrackDisplayList" style "track_list_display" widget "*MixerSnapshotDisplayList" style "track_list_display" widget "*MixerAuxDisplayList" style "track_list_display" widget "*MixerGroupList" style "track_list_display" -/*widget "*WallClock" style "wall_clock" -widget "*CPULoad" style "wall_clock"*/ widget "*RegionEditorLabel" style "medium_text" widget "*RegionEditorSmallLabel" style "small_text" widget "*RegionEditorEntry" style "medium_entry" @@ -1151,7 +1218,9 @@ widget "*IOSelectorButton" style "default_buttons_menus" widget "*IOSelectorButton*" style "default_buttons_menus" widget "*IOSelectorList" style "medium_entry_noselection_fg" widget "*IOSelectorPortList" style "io_selector_port_list" +widget "*IOSelectorPortList.*" style "io_selector_port_list" widget "*IOSelectorPortListSelected" style "selected_io_selector_port_list" +widget "*IOSelectorPortListSelected.*" style "selected_io_selector_port_list" widget "*IOSelectorNotebook" style "io_selector_notebook" widget "*IOSelectorNotebookTab" style "io_selector_notebook" widget "*IOSelectorFrame" style "base_frame" diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc index cc7b43b6b6..58e60f7627 100644 --- a/gtk2_ardour/ardour_ui.cc +++ b/gtk2_ardour/ardour_ui.cc @@ -542,11 +542,11 @@ ARDOUR_UI::update_buffer_load () } void -ARDOUR_UI::count_recenabled_diskstreams (Route& route) +ARDOUR_UI::count_recenabled_streams (Route& route) { Track* track = dynamic_cast<Track*>(&route); if (track && track->diskstream()->record_enabled()) { - rec_enabled_diskstreams++; + rec_enabled_streams += track->n_inputs().get_total(); } } @@ -568,11 +568,11 @@ ARDOUR_UI::update_disk_space() int secs; nframes_t fr = session->frame_rate(); - rec_enabled_diskstreams = 0; - session->foreach_route (this, &ARDOUR_UI::count_recenabled_diskstreams); + rec_enabled_streams = 0; + session->foreach_route (this, &ARDOUR_UI::count_recenabled_streams); - if (rec_enabled_diskstreams) { - frames /= rec_enabled_diskstreams; + if (rec_enabled_streams) { + frames /= rec_enabled_streams; } hrs = frames / (fr * 3600); @@ -1038,7 +1038,7 @@ ARDOUR_UI::transport_stop () return; } - if (Config->get_auto_loop()) { + if (session->get_play_loop ()) { session->request_play_loop (false); } @@ -1092,7 +1092,7 @@ ARDOUR_UI::transport_roll () rolling = session->transport_rolling (); - if (Config->get_auto_loop()) { + if (session->get_play_loop()) { session->request_play_loop (false); auto_loop_button.set_active (false); roll_button.set_active (true); @@ -1110,7 +1110,7 @@ void ARDOUR_UI::transport_loop() { if (session) { - if (Config->get_auto_loop()) { + if (session->get_play_loop()) { if (session->transport_rolling()) { Location * looploc = session->locations()->auto_loop_location(); if (looploc) { @@ -1269,7 +1269,6 @@ ARDOUR_UI::engine_stopped () ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, true); } - void ARDOUR_UI::engine_running () { @@ -1471,7 +1470,6 @@ ARDOUR_UI::snapshot_session () prompter.set_name ("Prompter"); prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT); - prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false); prompter.set_prompt (_("Name of New Snapshot")); prompter.set_initial_text (now); @@ -1621,7 +1619,6 @@ ARDOUR_UI::save_template () prompter.set_prompt (_("Name for mix template:")); prompter.set_initial_text(session->name() + _("-template")); prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT); - prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false); switch (prompter.run()) { case RESPONSE_ACCEPT: @@ -1646,18 +1643,25 @@ ARDOUR_UI::new_session (bool startup, std::string predetermined_path) int response = Gtk::RESPONSE_NONE; new_session_dialog->set_modal(true); - new_session_dialog->set_name(predetermined_path); + new_session_dialog->set_name (predetermined_path); new_session_dialog->reset_recent(); new_session_dialog->show(); do { response = new_session_dialog->run (); + + _session_is_new = false; - if(response == Gtk::RESPONSE_CANCEL || response == Gtk::RESPONSE_DELETE_EVENT) { - quit(); + if (response == Gtk::RESPONSE_CANCEL || response == Gtk::RESPONSE_DELETE_EVENT) { + + if (!session) { + quit(); + } + new_session_dialog->hide (); return; } else if (response == Gtk::RESPONSE_NONE) { + /* Clear was pressed */ new_session_dialog->reset(); @@ -1709,8 +1713,6 @@ ARDOUR_UI::new_session (bool startup, std::string predetermined_path) } else { - _session_is_new = true; - if (session_name.empty()) { response = Gtk::RESPONSE_NONE; continue; @@ -1726,14 +1728,43 @@ ARDOUR_UI::new_session (bool startup, std::string predetermined_path) } else { session_path = new_session_dialog->session_folder(); - + } - + //XXX This is needed because session constructor wants a //non-existant path. hopefully this will be fixed at some point. session_path = Glib::build_filename (session_path, session_name); + if (g_file_test (session_path.c_str(), GFileTest (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR))) { + + Glib::ustring str = string_compose (_("This session\n%1\nalready exists. Do you want to open it?"), session_path); + + MessageDialog msg (str, + false, + Gtk::MESSAGE_WARNING, + Gtk::BUTTONS_YES_NO, + true); + + + msg.set_name (X_("CleanupDialog")); + msg.set_wmclass (_("existing_session"), "Ardour"); + msg.set_position (Gtk::WIN_POS_MOUSE); + + switch (msg.run()) { + case RESPONSE_YES: + load_session (session_path, session_name); + goto done; + break; + default: + response = RESPONSE_NONE; + new_session_dialog->reset (); + continue; + } + } + + _session_is_new = true; + std::string template_name = new_session_dialog->session_template_name(); if (new_session_dialog->use_session_template()) { @@ -1793,6 +1824,7 @@ ARDOUR_UI::new_session (bool startup, std::string predetermined_path) } while (response == Gtk::RESPONSE_NONE); + done: show(); new_session_dialog->get_window()->set_cursor(); new_session_dialog->hide(); @@ -1844,6 +1876,9 @@ This prevents the session from being loaded.")); Config->set_current_owner (ConfigVariableBase::Interface); session_loaded = true; + + goto_editor_window (); + return 0; } @@ -1911,10 +1946,6 @@ ARDOUR_UI::show () shown_flag = true; } - - if (about) { - about->present (); - } } void @@ -1922,8 +1953,16 @@ ARDOUR_UI::show_splash () { if (about == 0) { about = new About(); + about->signal_response().connect(mem_fun (*this, &ARDOUR_UI::about_signal_response) ); } about->present(); + flush_pending (); +} + +void +ARDOUR_UI::about_signal_response(int response) +{ + hide_splash(); } void @@ -1947,7 +1986,7 @@ ARDOUR_UI::display_cleanup_results (Session::cleanup_report& rep, const gchar* l _("No audio files were ready for cleanup"), true, Gtk::MESSAGE_INFO, - (Gtk::ButtonsType)(Gtk::BUTTONS_CLOSE) ); + (Gtk::ButtonsType)(Gtk::BUTTONS_OK) ); msgd.set_secondary_text (_("If this seems suprising, \n\ check for any existing snapshots.\n\ These may still include regions that\n\ diff --git a/gtk2_ardour/ardour_ui.h b/gtk2_ardour/ardour_ui.h index d3723e87a5..60b3b309b9 100644 --- a/gtk2_ardour/ardour_ui.h +++ b/gtk2_ardour/ardour_ui.h @@ -151,7 +151,6 @@ class ARDOUR_UI : public Gtkmm2ext::UI void toggle_big_clock_window (); void toggle_connection_editor (); void toggle_route_params_window (); - void toggle_tempo_window (); void toggle_editing_space(); Gtk::Tooltips& tooltips() { return _tooltips; } @@ -168,7 +167,6 @@ class ARDOUR_UI : public Gtkmm2ext::UI void rec_enable_button_blink (bool onoff, ARDOUR::AudioDiskstream *, Gtk::Widget *w); void name_io_setup (ARDOUR::AudioEngine&, string&, ARDOUR::IO& io, bool in); - void choose_io (ARDOUR::IO&, bool input); static gint hide_and_quit (GdkEventAny *ev, ArdourDialog *); @@ -227,7 +225,6 @@ class ARDOUR_UI : public Gtkmm2ext::UI void toggle_click (); void toggle_session_auto_loop (); - void toggle_session_punch_in (); void toggle_options_window (); @@ -284,14 +281,10 @@ class ARDOUR_UI : public Gtkmm2ext::UI Gtk::Table option_table; int setup_windows (); - void setup_session_menu (); void setup_transport (); void setup_clock (); - void setup_session_info (); void setup_adjustables (); - Gtk::MenuBar* make_menubar (); - static ARDOUR_UI *theArdourUI; void startup (); @@ -299,8 +292,6 @@ class ARDOUR_UI : public Gtkmm2ext::UI void finish(); int ask_about_saving_session (const string & why); - gint ask_about_save_deleted (GdkEventAny*); - void save_session_choice_made (int); int save_the_session; void queue_transport_change (); @@ -314,8 +305,6 @@ class ARDOUR_UI : public Gtkmm2ext::UI void use_config (); - void clear_meters (); - static gint _blink (void *); void blink (); gint blink_timeout_tag; @@ -326,6 +315,8 @@ class ARDOUR_UI : public Gtkmm2ext::UI void control_methods_adjusted (); void mmc_device_id_adjusted (); + void about_signal_response(int response); + private: Gtk::VBox top_packer; @@ -444,8 +435,6 @@ class ARDOUR_UI : public Gtkmm2ext::UI void allow_mmc_and_local (); void allow_local_only (); - static void rate_printer (char buf[32], Gtk::Adjustment &, void *); - Gtk::Menu* session_popup_menu; struct RecentSessionModelColumns : public Gtk::TreeModel::ColumnRecord { @@ -465,7 +454,6 @@ class ARDOUR_UI : public Gtkmm2ext::UI Gtk::FileChooserDialog* open_session_selector; void build_session_selector(); - void recent_session_selection_changed (); void redisplay_recent_sessions(); void recent_session_row_activated (const Gtk::TreePath& path, Gtk::TreeViewColumn* col); @@ -483,7 +471,6 @@ class ARDOUR_UI : public Gtkmm2ext::UI void build_menu_bar (); void build_control_surface_menu (); - void pack_toplevel_controls(); Gtk::Label wall_clock_label; Gtk::EventBox wall_clock_box; @@ -521,8 +508,6 @@ class ARDOUR_UI : public Gtkmm2ext::UI void open_session (); void open_recent_session (); - void open_ok_clicked (); - void save_template (); void session_add_audio_route (bool disk, int32_t input_channels, int32_t output_channels, ARDOUR::TrackMode mode, uint32_t how_many); @@ -544,14 +529,11 @@ class ARDOUR_UI : public Gtkmm2ext::UI void transport_rewind (int option); void transport_loop (); - void transport_locating (); void transport_rolling (); void transport_rewinding (); void transport_forwarding (); void transport_stopped (); - void send_all_midi_feedback (); - bool _session_is_new; void connect_to_session (ARDOUR::Session *); void connect_dependents_to_session (ARDOUR::Session *); @@ -563,9 +545,6 @@ class ARDOUR_UI : public Gtkmm2ext::UI void snapshot_session (); - void map_record_state (); - void queue_map_record_state (); - Mixer_UI *mixer; int create_mixer (); @@ -591,7 +570,6 @@ class ARDOUR_UI : public Gtkmm2ext::UI /* route dialog */ AddRouteDialog *add_route_dialog; - void add_route_dialog_done (int status); /* SoundFile Browser */ SoundFileBrowser *sfdb; @@ -604,15 +582,13 @@ class ARDOUR_UI : public Gtkmm2ext::UI /* Keymap handling */ - Glib::RefPtr<Gtk::ActionGroup> get_common_actions(); void install_actions (); - void test_binding_action (const char *); void start_keyboard_prefix(); void toggle_record_enable (uint32_t); - uint32_t rec_enabled_diskstreams; - void count_recenabled_diskstreams (ARDOUR::Route&); + uint32_t rec_enabled_streams; + void count_recenabled_streams (ARDOUR::Route&); About* about; bool shown_flag; @@ -631,8 +607,6 @@ class ARDOUR_UI : public Gtkmm2ext::UI struct timeval last_peak_grab; struct timeval last_shuttle_request; - void editor_display_control_changed (Editing::DisplayControl c); - bool have_disk_overrun_displayed; bool have_disk_underrun_displayed; @@ -678,7 +652,6 @@ class ARDOUR_UI : public Gtkmm2ext::UI void toggle_StopTransportAtEndOfSession(); void toggle_GainReduceFastTransport(); void toggle_LatchedSolo(); - void toggle_SoloViaBus(); void toggle_LatchedRecordEnable (); void mtc_port_changed (); diff --git a/gtk2_ardour/ardour_ui2.cc b/gtk2_ardour/ardour_ui2.cc index 7f724312aa..25fe144233 100644 --- a/gtk2_ardour/ardour_ui2.cc +++ b/gtk2_ardour/ardour_ui2.cc @@ -139,7 +139,7 @@ ARDOUR_UI::transport_rolling () roll_button.set_active (false); auto_loop_button.set_active (false); - } else if (Config->get_auto_loop ()) { + } else if (session->get_play_loop ()) { auto_loop_button.set_active (true); play_selection_button.set_active (false); roll_button.set_active (false); diff --git a/gtk2_ardour/ardour_ui_options.cc b/gtk2_ardour/ardour_ui_options.cc index 82147f04ee..707d3109f7 100644 --- a/gtk2_ardour/ardour_ui_options.cc +++ b/gtk2_ardour/ardour_ui_options.cc @@ -280,7 +280,7 @@ void ARDOUR_UI::toggle_session_auto_loop () { if (session) { - if (Config->get_auto_loop()) { + if (session->get_play_loop()) { if (session->transport_rolling()) { transport_roll(); } else { @@ -769,8 +769,6 @@ ARDOUR_UI::parameter_changed (const char* parameter_name) map_solo_model (); } else if (PARAM_IS ("auto-play")) { ActionManager::map_some_state ("Transport", "ToggleAutoPlay", &Configuration::get_auto_play); - } else if (PARAM_IS ("auto-loop")) { - ActionManager::map_some_state ("Transport", "Loop", &Configuration::get_auto_loop); } else if (PARAM_IS ("auto-return")) { ActionManager::map_some_state ("Transport", "ToggleAutoReturn", &Configuration::get_auto_return); } else if (PARAM_IS ("auto-input")) { diff --git a/gtk2_ardour/audio_clock.cc b/gtk2_ardour/audio_clock.cc index 575f45ca38..4ec8c1b89f 100644 --- a/gtk2_ardour/audio_clock.cc +++ b/gtk2_ardour/audio_clock.cc @@ -1712,7 +1712,7 @@ AudioClock::build_ops_menu () MenuList& mode_items = mode_menu->items(); mode_menu->set_name ("ArdourContextMenu"); - mode_items.push_back (MenuElem (_("SMPTE"), bind (mem_fun(*this, &AudioClock::set_mode), SMPTE))); + mode_items.push_back (MenuElem (_("Timecode"), bind (mem_fun(*this, &AudioClock::set_mode), SMPTE))); mode_items.push_back (MenuElem (_("Bars:Beats"), bind (mem_fun(*this, &AudioClock::set_mode), BBT))); mode_items.push_back (MenuElem (_("Minutes:Seconds"), bind (mem_fun(*this, &AudioClock::set_mode), MinSec))); mode_items.push_back (MenuElem (_("Audio Frames"), bind (mem_fun(*this, &AudioClock::set_mode), Frames))); diff --git a/gtk2_ardour/audio_region_editor.cc b/gtk2_ardour/audio_region_editor.cc index b6bb4589a9..c5645d479c 100644 --- a/gtk2_ardour/audio_region_editor.cc +++ b/gtk2_ardour/audio_region_editor.cc @@ -18,7 +18,10 @@ $Id$ */ +#include <pbd/memento_command.h> + #include <ardour/audioregion.h> +#include <ardour/playlist.h> #include <ardour/utils.h> #include <gtkmm2ext/utils.h> #include <gtkmm2ext/stop_signal.h> @@ -42,28 +45,12 @@ AudioRegionEditor::AudioRegionEditor (Session& s, boost::shared_ptr<AudioRegion> _region (r), _region_view (rv), name_label (_("NAME:")), - lock_button (_("lock")), - mute_button (_("mute")), - opaque_button (_("opaque")), - envelope_active_button(_("active")), - envelope_view_button(_("visible")), - raise_arrow (Gtk::ARROW_UP, Gtk::SHADOW_OUT), - lower_arrow (Gtk::ARROW_DOWN, Gtk::SHADOW_OUT), - layer_label (_("Layer")), audition_button (_("play")), time_table (3, 2), start_clock ("AudioRegionEditorClock", true), end_clock ("AudioRegionEditorClock", true), length_clock ("AudioRegionEditorClock", true, true), - sync_offset_clock ("AudioRegionEditorClock", true, true), - envelope_loop_table (1, 3), - envelope_label (_("ENVELOPE")), - fade_in_table (4, 3), - fade_in_length_adjustment (5.0, 0.0, 10000, 0.05, 1), - fade_in_length_spinner (fade_in_length_adjustment, 10), - fade_out_table (4, 3), - fade_out_length_adjustment (5.0, 0.0, 10000, 0.05, 1), - fade_out_length_spinner (fade_out_length_adjustment, 10) + sync_offset_clock ("AudioRegionEditorClock", true, true) { start_clock.set_session (&_session); @@ -77,66 +64,15 @@ AudioRegionEditor::AudioRegionEditor (Session& s, boost::shared_ptr<AudioRegion> name_hbox.pack_start (name_label, false, false); name_hbox.pack_start (name_entry, false, false); - raise_button.add (raise_arrow); - lower_button.add (lower_arrow); - layer_frame.set_name ("BaseFrame"); - layer_frame.set_shadow_type (Gtk::SHADOW_IN); - layer_frame.add (layer_value_label); - layer_label.set_name ("AudioRegionEditorLabel"); - layer_value_label.set_name ("AudioRegionEditorLabel"); - Gtkmm2ext::set_size_request_to_display_given_text (layer_value_label, "99", 5, 2); - - layer_hbox.set_spacing (5); - layer_hbox.pack_start (layer_label, false, false); - layer_hbox.pack_start (layer_frame, false, false); -#if 0 - layer_hbox.pack_start (raise_button, false, false); - layer_hbox.pack_start (lower_button, false, false); -#endif - - mute_button.set_name ("AudioRegionEditorToggleButton"); - opaque_button.set_name ("AudioRegionEditorToggleButton"); - lock_button.set_name ("AudioRegionEditorToggleButton"); - envelope_active_button.set_name ("AudioRegionEditorToggleButton"); - envelope_view_button.set_name ("AudioRegionEditorToggleButton"); - fade_in_active_button.set_name ("AudioRegionEditorToggleButton"); - fade_out_active_button.set_name ("AudioRegionEditorToggleButton"); - audition_button.set_name ("AudioRegionEditorToggleButton"); - - ARDOUR_UI::instance()->tooltips().set_tip (mute_button, _("mute this region")); - ARDOUR_UI::instance()->tooltips().set_tip (opaque_button, _("regions underneath this one cannot be heard")); - ARDOUR_UI::instance()->tooltips().set_tip (lock_button, _("prevent any changes to this region")); - ARDOUR_UI::instance()->tooltips().set_tip (envelope_active_button, _("use the gain envelope during playback")); - ARDOUR_UI::instance()->tooltips().set_tip (envelope_view_button, _("show the gain envelope")); - ARDOUR_UI::instance()->tooltips().set_tip (fade_in_active_button, _("use fade in curve during playback")); - ARDOUR_UI::instance()->tooltips().set_tip (fade_out_active_button, _("use fade out curve during playback")); ARDOUR_UI::instance()->tooltips().set_tip (audition_button, _("audition this region")); - mute_button.unset_flags (Gtk::CAN_FOCUS); - opaque_button.unset_flags (Gtk::CAN_FOCUS); - lock_button.unset_flags (Gtk::CAN_FOCUS); - envelope_active_button.unset_flags (Gtk::CAN_FOCUS); - envelope_view_button.unset_flags (Gtk::CAN_FOCUS); - fade_in_active_button.unset_flags (Gtk::CAN_FOCUS); - fade_out_active_button.unset_flags (Gtk::CAN_FOCUS); audition_button.unset_flags (Gtk::CAN_FOCUS); - mute_button.set_events (mute_button.get_events() & ~(Gdk::ENTER_NOTIFY_MASK|Gdk::LEAVE_NOTIFY_MASK)); - opaque_button.set_events (opaque_button.get_events() & ~(Gdk::ENTER_NOTIFY_MASK|Gdk::LEAVE_NOTIFY_MASK)); - lock_button.set_events (lock_button.get_events() & ~(Gdk::ENTER_NOTIFY_MASK|Gdk::LEAVE_NOTIFY_MASK)); - envelope_active_button.set_events (envelope_active_button.get_events() & ~(Gdk::ENTER_NOTIFY_MASK|Gdk::LEAVE_NOTIFY_MASK)); - envelope_view_button.set_events (envelope_view_button.get_events() & ~(Gdk::ENTER_NOTIFY_MASK|Gdk::LEAVE_NOTIFY_MASK)); - fade_in_active_button.set_events (fade_in_active_button.get_events() & ~(Gdk::ENTER_NOTIFY_MASK|Gdk::LEAVE_NOTIFY_MASK)); - fade_out_active_button.set_events (fade_out_active_button.get_events() & ~(Gdk::ENTER_NOTIFY_MASK|Gdk::LEAVE_NOTIFY_MASK)); audition_button.set_events (audition_button.get_events() & ~(Gdk::ENTER_NOTIFY_MASK|Gdk::LEAVE_NOTIFY_MASK)); top_row_button_hbox.set_border_width (5); top_row_button_hbox.set_spacing (5); top_row_button_hbox.set_homogeneous (false); - top_row_button_hbox.pack_start (mute_button, false, false); - top_row_button_hbox.pack_start (opaque_button, false, false); - top_row_button_hbox.pack_start (lock_button, false, false); - top_row_button_hbox.pack_start (layer_hbox, false, false, 5); top_row_button_hbox.pack_end (audition_button, false, false); top_row_hbox.pack_start (name_hbox, true, true); @@ -170,87 +106,9 @@ AudioRegionEditor::AudioRegionEditor (Session& s, boost::shared_ptr<AudioRegion> time_table.attach (length_alignment, 0, 1, 2, 3, Gtk::FILL, Gtk::FILL); time_table.attach (length_clock, 1, 2, 2, 3, Gtk::FILL, Gtk::FILL); - envelope_label.set_name ("AudioRegionEditorLabel"); - - envelope_loop_table.set_border_width (5); - envelope_loop_table.set_row_spacings (2); - envelope_loop_table.attach (envelope_label, 0, 1, 0, 1, Gtk::FILL, Gtk::FILL); - envelope_loop_table.attach (envelope_active_button, 0, 1, 1, 2, Gtk::FILL|Gtk::EXPAND, Gtk::FILL); - envelope_loop_table.attach (envelope_view_button, 0, 1, 2, 3, Gtk::FILL|Gtk::EXPAND, Gtk::FILL); - - /* fade in */ - - fade_in_table.set_border_width (5); - fade_in_table.set_homogeneous (false); - - fade_in_label.set_name ("AudioRegionEditorLabel"); - fade_in_active_button_label.set_name ("AudioRegionEditorSmallLabel"); - fade_in_length_label.set_name ("AudioRegionEditorSmallLabel"); - - fade_in_label.set_text (_("FADE IN")); - fade_in_active_button_label.set_text (_("active")); - fade_in_length_label.set_text (_("msecs")); - - fade_in_active_button.add (fade_in_active_button_label); - - fade_in_length_spinner.set_name("GenericSpinner"); - - fade_in_length_spinner.set_digits (3); - - // fade_in_length_spinner.signal_activate().connect (mem_fun(*this, &AudioRegionEditor::activation)); - - Gtkmm2ext::set_size_request_to_display_given_text (fade_in_length_spinner, "500g", 20, -1); - - fade_in_label_align.add (fade_in_label); - fade_in_label_align.set (0.5); - - - fade_in_table.attach (fade_in_label_align, 0, 2, 0, 1, Gtk::FILL|Gtk::EXPAND, Gtk::FILL); - - fade_in_table.attach (fade_in_length_label, 0, 1, 1, 2, Gtk::EXPAND, Gtk::FILL); - fade_in_table.attach (fade_in_length_spinner, 0, 1, 2, 3, Gtk::FILL|Gtk::EXPAND, Gtk::FILL); - - fade_in_table.attach (fade_in_active_button, 0, 2, 3, 5, Gtk::FILL|Gtk::EXPAND, Gtk::FILL); - - /* fade out */ - - fade_out_table.set_border_width (5); - fade_out_table.set_homogeneous (false); - - fade_out_label.set_name ("AudioRegionEditorLabel"); - fade_out_active_button_label.set_name ("AudioRegionEditorSmallLabel"); - fade_out_length_label.set_name ("AudioRegionEditorSmallLabel"); - - fade_out_label.set_text (_("FADE OUT")); - fade_out_active_button_label.set_text (_("active")); - fade_out_length_label.set_text (_("msecs")); - - fade_out_active_button.add (fade_out_active_button_label); - - fade_out_length_spinner.set_name("GenericSpinner"); - - fade_out_length_spinner.set_digits (3); - - fade_out_length_spinner.signal_activate().connect (mem_fun(*this, &AudioRegionEditor::activation)); - - Gtkmm2ext::set_size_request_to_display_given_text (fade_out_length_spinner, "500g", 20, -1); - - fade_out_label_align.add (fade_out_label); - fade_out_label_align.set (0.5); - - fade_out_table.attach (fade_out_label_align, 0, 2, 0, 1, Gtk::FILL|Gtk::EXPAND, Gtk::FILL); - - fade_out_table.attach (fade_out_length_label, 0, 1, 1, 2, Gtk::EXPAND, Gtk::FILL); - fade_out_table.attach (fade_out_length_spinner, 0, 1, 2, 3, Gtk::FILL|Gtk::EXPAND, Gtk::FILL); - - fade_out_table.attach (fade_out_active_button, 0, 2, 3, 5, Gtk::FILL|Gtk::EXPAND, Gtk::FILL); - lower_hbox.pack_start (time_table, true, true); lower_hbox.pack_start (sep1, false, false); - lower_hbox.pack_start (envelope_loop_table, true, true); lower_hbox.pack_start (sep2, false, false); - lower_hbox.pack_start (fade_in_table, true, true); - lower_hbox.pack_start (fade_out_table, true, true); get_vbox()->pack_start (top_row_hbox, true, true); get_vbox()->pack_start (sep3, false, false); @@ -269,29 +127,8 @@ AudioRegionEditor::AudioRegionEditor (Session& s, boost::shared_ptr<AudioRegion> name_changed (); bounds_changed (Change (StartChanged|LengthChanged|PositionChanged)); - envelope_active_changed (); - mute_changed (); - opacity_changed (); - lock_changed (); - layer_changed (); - fade_in_changed (); - fade_out_changed (); - - XMLNode *node = _region->extra_xml ("GUI"); - XMLProperty *prop = 0; - bool showing_envelope = false; - - if (node && (prop = node->property ("envelope-visible")) != 0) { - if (prop->value() == "yes") { - showing_envelope = true; - } - } - if (showing_envelope) { - envelope_view_button.set_active (true); - } else { - envelope_view_button.set_active (false); - } + //XMLNode *node = _region->extra_xml ("GUI"); _region->StateChanged.connect (mem_fun(*this, &AudioRegionEditor::region_changed)); @@ -313,47 +150,6 @@ AudioRegionEditor::region_changed (Change what_changed) if (what_changed & BoundsChanged) { bounds_changed (what_changed); } - - if (what_changed & Region::OpacityChanged) { - opacity_changed (); - } - if (what_changed & Region::MuteChanged) { - mute_changed (); - } - if (what_changed & Region::LockChanged) { - lock_changed (); - } - if (what_changed & Region::LayerChanged) { - layer_changed (); - } - - if (what_changed & AudioRegion::EnvelopeActiveChanged) { - envelope_active_changed (); - } - if (what_changed & AudioRegion::FadeInChanged) { - fade_in_changed (); - } - if (what_changed & AudioRegion::FadeOutChanged) { - fade_out_changed (); - } - if (what_changed & AudioRegion::FadeInActiveChanged) { - fade_in_active_changed (); - } - if (what_changed & AudioRegion::FadeOutActiveChanged) { - fade_out_active_changed (); - } -} - -void -AudioRegionEditor::fade_in_realized () -{ - fade_in_changed (); -} - -void -AudioRegionEditor::fade_out_realized () -{ - fade_out_changed (); } gint @@ -390,76 +186,50 @@ AudioRegionEditor::breleased (GdkEventButton* ev, Gtk::SpinButton* but, void (Au } void -AudioRegionEditor::start_editing_fade_in () -{ - _region->freeze (); -} - -void -AudioRegionEditor::stop_editing_fade_in () -{ - _region->thaw (_("fade in edit")); -} - -void -AudioRegionEditor::start_editing_fade_out () -{ - _region->freeze (); -} - -void -AudioRegionEditor::stop_editing_fade_out () -{ - _region->thaw (_("fade out edit")); -} - -void AudioRegionEditor::connect_editor_events () { - name_entry.signal_changed().connect (mem_fun(*this, &AudioRegionEditor::name_entry_changed)); + name_entry.signal_changed().connect (mem_fun(*this, &AudioRegionEditor::name_entry_changed)); start_clock.ValueChanged.connect (mem_fun(*this, &AudioRegionEditor::start_clock_changed)); end_clock.ValueChanged.connect (mem_fun(*this, &AudioRegionEditor::end_clock_changed)); length_clock.ValueChanged.connect (mem_fun(*this, &AudioRegionEditor::length_clock_changed)); - fade_in_length_spinner.signal_button_press_event().connect (bind (mem_fun(*this, &AudioRegionEditor::bpressed), &fade_in_length_spinner, - &AudioRegionEditor::start_editing_fade_in)); - fade_in_length_spinner.signal_button_release_event().connect (bind (mem_fun (*this, &AudioRegionEditor::breleased), &fade_in_length_spinner, - &AudioRegionEditor::stop_editing_fade_in)); - - fade_out_length_spinner.signal_button_press_event().connect (bind (mem_fun(*this, &AudioRegionEditor::bpressed), &fade_out_length_spinner, - &AudioRegionEditor::start_editing_fade_out)); - fade_out_length_spinner.signal_button_release_event().connect (bind (mem_fun (*this, &AudioRegionEditor::breleased), &fade_out_length_spinner, - &AudioRegionEditor::stop_editing_fade_out)); - - fade_in_length_adjustment.signal_value_changed().connect (mem_fun(*this, &AudioRegionEditor::fade_in_length_adjustment_changed)); - fade_out_length_adjustment.signal_value_changed().connect (mem_fun(*this, &AudioRegionEditor::fade_out_length_adjustment_changed)); - - fade_in_active_button.signal_toggled().connect (mem_fun(*this, &AudioRegionEditor::fade_in_active_toggled)); - fade_out_active_button.signal_toggled().connect (mem_fun(*this, &AudioRegionEditor::fade_out_active_toggled)); - - envelope_active_button.signal_button_press_event().connect (mem_fun(*this, &AudioRegionEditor::envelope_active_button_press)); - envelope_active_button.signal_button_release_event().connect (mem_fun(*this, &AudioRegionEditor::envelope_active_button_release)); audition_button.signal_toggled().connect (mem_fun(*this, &AudioRegionEditor::audition_button_toggled)); - envelope_view_button.signal_toggled().connect (mem_fun(*this, &AudioRegionEditor::envelope_view_button_toggled)); - lock_button.signal_clicked().connect (mem_fun(*this, &AudioRegionEditor::lock_button_clicked)); - mute_button.signal_clicked().connect (mem_fun(*this, &AudioRegionEditor::mute_button_clicked)); - opaque_button.signal_clicked().connect (mem_fun(*this, &AudioRegionEditor::opaque_button_clicked)); - raise_button.signal_clicked().connect (mem_fun(*this, &AudioRegionEditor::raise_button_clicked)); - lower_button.signal_clicked().connect (mem_fun(*this, &AudioRegionEditor::lower_button_clicked)); _session.AuditionActive.connect (mem_fun(*this, &AudioRegionEditor::audition_state_changed)); } void AudioRegionEditor::start_clock_changed () { - _region->set_position (start_clock.current_time(), this); + _session.begin_reversible_command (_("change region start position")); + + Playlist* const pl = _region->playlist(); + + if (pl) { + XMLNode &before = pl->get_state(); + _region->set_position (start_clock.current_time(), this); + XMLNode &after = pl->get_state(); + _session.add_command(new MementoCommand<Playlist>(*pl, &before, &after)); + } + + _session.commit_reversible_command (); } void AudioRegionEditor::end_clock_changed () { - _region->trim_end (end_clock.current_time(), this); + _session.begin_reversible_command (_("change region end position")); + + Playlist* const pl = _region->playlist(); + + if (pl) { + XMLNode &before = pl->get_state(); + _region->trim_end (end_clock.current_time(), this); + XMLNode &after = pl->get_state(); + _session.add_command(new MementoCommand<Playlist>(*pl, &before, &after)); + } + + _session.commit_reversible_command (); end_clock.set (_region->position() + _region->length(), true); } @@ -468,30 +238,21 @@ void AudioRegionEditor::length_clock_changed () { nframes_t frames = length_clock.current_time(); - _region->trim_end (_region->position() + frames, this); - - length_clock.set (_region->length()); -} - -gint -AudioRegionEditor::envelope_active_button_press(GdkEventButton *ev) -{ - return stop_signal (envelope_active_button, "button_press_event"); -} + + _session.begin_reversible_command (_("change region length")); + + Playlist* const pl = _region->playlist(); -gint -AudioRegionEditor::envelope_active_button_release (GdkEventButton *ev) -{ - _region->set_envelope_active (!_region->envelope_active()); - return stop_signal (envelope_active_button, "button_release_event"); -} + if (pl) { + XMLNode &before = pl->get_state(); + _region->trim_end (_region->position() + frames, this); + XMLNode &after = pl->get_state(); + _session.add_command(new MementoCommand<Playlist>(*pl, &before, &after)); + } -void -AudioRegionEditor::envelope_view_button_toggled () -{ - bool visible = envelope_view_button.get_active (); + _session.commit_reversible_command (); - _region_view.set_envelope_visible (visible); + length_clock.set (_region->length()); } void @@ -505,56 +266,6 @@ AudioRegionEditor::audition_button_toggled () } void -AudioRegionEditor::raise_button_clicked () -{ - _region->raise (); -} - -void -AudioRegionEditor::lower_button_clicked () -{ - _region->lower (); -} - -void -AudioRegionEditor::opaque_button_clicked () -{ - bool ractive = _region->opaque(); - - if (opaque_button.get_active() != ractive) { - _region->set_opaque (!ractive); - } -} - -void -AudioRegionEditor::mute_button_clicked () -{ - bool ractive = _region->muted(); - - if (mute_button.get_active() != ractive) { - _region->set_muted (!ractive); - } -} - -void -AudioRegionEditor::lock_button_clicked () -{ - bool ractive = _region->locked(); - - if (lock_button.get_active() != ractive) { - _region->set_locked (!ractive); - } -} - -void -AudioRegionEditor::layer_changed () -{ - char buf[8]; - snprintf (buf, sizeof(buf), "%d", (int) _region->layer() + 1); - layer_value_label.set_text (buf); -} - -void AudioRegionEditor::name_changed () { if (name_entry.get_text() != _region->name()) { @@ -563,48 +274,6 @@ AudioRegionEditor::name_changed () } void -AudioRegionEditor::lock_changed () -{ - bool yn; - - if ((yn = _region->locked()) != lock_button.get_active()) { - lock_button.set_active (yn); - } - - start_clock.set_sensitive (!yn); - end_clock.set_sensitive (!yn); - length_clock.set_sensitive (!yn); -} - -void -AudioRegionEditor::envelope_active_changed () -{ - bool yn; - - if ((yn = _region->envelope_active()) != envelope_active_button.get_active()) { - envelope_active_button.set_active (yn); - } -} - -void -AudioRegionEditor::opacity_changed () -{ - bool yn; - if ((yn = _region->opaque()) != opaque_button.get_active()) { - opaque_button.set_active (yn); - } -} - -void -AudioRegionEditor::mute_changed () -{ - bool yn; - if ((yn = _region->muted()) != mute_button.get_active()) { - mute_button.set_active (yn); - } -} - -void AudioRegionEditor::bounds_changed (Change what_changed) { if (what_changed & Change ((PositionChanged|LengthChanged))) { @@ -629,97 +298,6 @@ AudioRegionEditor::name_entry_changed () } void -AudioRegionEditor::fade_in_changed () -{ - float msecs = fade_in_length_adjustment.get_value(); - nframes_t sr = _session.frame_rate(); - nframes_t adj_frames = (nframes_t) floor (msecs * (sr/1000.0f)); - nframes_t frames; - bool x; - - if (adj_frames != (frames = (nframes_t) _region->fade_in().back()->when)) { - fade_in_length_adjustment.set_value ((frames * 1000.0f) / sr); - } - - if ((x = _region->fade_in_active()) != fade_in_active_button.get_active()) { - fade_in_active_button.set_active (x); - } -} - -void -AudioRegionEditor::fade_out_changed () -{ - float msecs = fade_out_length_adjustment.get_value(); - nframes_t sr = _session.frame_rate(); - nframes_t adj_frames = (nframes_t) floor (msecs * (sr/1000.0f)); - nframes_t frames; - bool x; - if (adj_frames != (frames = (nframes_t) _region->fade_out().back()->when)) { - fade_out_length_adjustment.set_value ((frames * 1000.0f) / sr); - } - - if ((x = _region->fade_out_active()) != fade_out_active_button.get_active()) { - fade_out_active_button.set_active (x); - } -} - -void -AudioRegionEditor::fade_in_length_adjustment_changed () -{ - nframes_t fade_length = (nframes_t) floor (fade_in_length_adjustment.get_value() * _session.frame_rate() * 0.001); - fade_length = max (fade_length, (nframes_t) 64); - fade_length = min (fade_length, _region->length()); - - _region->set_fade_in_length (fade_length); - /* region is frozen, no worries */ - fade_in_changed(); -} - -void -AudioRegionEditor::fade_out_length_adjustment_changed () -{ - nframes_t fade_length = (nframes_t) floor (fade_out_length_adjustment.get_value() * _session.frame_rate() * 0.001); - fade_length = max (fade_length, (nframes_t) 64); - fade_length = min (fade_length, _region->length()); - - _region->set_fade_out_length (fade_length); - /* region is frozen, no worries */ - fade_out_changed(); -} - -void -AudioRegionEditor::fade_in_active_toggled () -{ - _region->set_fade_in_active (fade_in_active_button.get_active()); -} - -void -AudioRegionEditor::fade_out_active_toggled () -{ - _region->set_fade_out_active (fade_out_active_button.get_active()); -} - -void -AudioRegionEditor::fade_out_active_changed () -{ - bool x; - - if ((x = _region->fade_out_active()) != fade_out_active_button.get_active()) { - fade_out_active_button.set_active (x); - } -} - -void -AudioRegionEditor::fade_in_active_changed () -{ - bool x; - - if ((x = _region->fade_in_active()) != fade_in_active_button.get_active()) { - fade_in_active_button.set_active (x); - } -} - -void AudioRegionEditor::audition_state_changed (bool yn) { ENSURE_GUI_THREAD (bind (mem_fun(*this, &AudioRegionEditor::audition_state_changed), yn)); diff --git a/gtk2_ardour/audio_region_editor.h b/gtk2_ardour/audio_region_editor.h index dbbc40f9ba..a84aec27c0 100644 --- a/gtk2_ardour/audio_region_editor.h +++ b/gtk2_ardour/audio_region_editor.h @@ -69,21 +69,6 @@ class AudioRegionEditor : public RegionEditor Gtk::HBox top_row_hbox; Gtk::HBox top_row_button_hbox; - Gtk::ToggleButton lock_button; - Gtk::ToggleButton mute_button; - Gtk::ToggleButton opaque_button; - Gtk::ToggleButton envelope_active_button; - Gtk::ToggleButton envelope_view_button; - - Gtk::Button raise_button; - Gtk::Arrow raise_arrow; - Gtk::Button lower_button; - Gtk::Arrow lower_arrow; - Gtk::Frame layer_frame; - Gtk::Label layer_value_label; - Gtk::Label layer_label; - Gtk::HBox layer_hbox; - Gtk::ToggleButton audition_button; Gtk::HBox lower_hbox; @@ -102,31 +87,6 @@ class AudioRegionEditor : public RegionEditor AudioClock length_clock; AudioClock sync_offset_clock; - Gtk::Table envelope_loop_table; - Gtk::Button loop_button; - Gtk::Label loop_label; - Gtk::Label envelope_label; - - Gtk::Table fade_in_table; - Gtk::Label fade_in_label; - Gtk::Alignment fade_in_label_align; - Gtk::Label fade_in_active_button_label; - Gtk::ToggleButton fade_in_active_button; - Gtk::Label fade_in_length_label; - - Gtk::Adjustment fade_in_length_adjustment; - Gtk::SpinButton fade_in_length_spinner; - - Gtk::Table fade_out_table; - Gtk::Label fade_out_label; - Gtk::Alignment fade_out_label_align; - Gtk::Label fade_out_active_button_label; - Gtk::ToggleButton fade_out_active_button; - Gtk::Label fade_out_length_label; - - Gtk::Adjustment fade_out_length_adjustment; - Gtk::SpinButton fade_out_length_spinner; - Gtk::HSeparator sep3; Gtk::VSeparator sep1; Gtk::VSeparator sep2; @@ -134,16 +94,7 @@ class AudioRegionEditor : public RegionEditor void region_changed (ARDOUR::Change); void bounds_changed (ARDOUR::Change); void name_changed (); - void opacity_changed (); - void mute_changed (); - void envelope_active_changed (); - void lock_changed (); - void layer_changed (); - - void fade_in_length_adjustment_changed (); - void fade_out_length_adjustment_changed (); - void fade_in_changed (); - void fade_out_changed (); + void audition_state_changed (bool); void activation (); @@ -153,29 +104,7 @@ class AudioRegionEditor : public RegionEditor void end_clock_changed (); void length_clock_changed (); - gint envelope_active_button_press (GdkEventButton *); - gint envelope_active_button_release (GdkEventButton *); - void audition_button_toggled (); - void envelope_view_button_toggled (); - void lock_button_clicked (); - void mute_button_clicked (); - void opaque_button_clicked (); - void raise_button_clicked (); - void lower_button_clicked (); - - void fade_in_active_toggled (); - void fade_out_active_toggled (); - void fade_in_active_changed (); - void fade_out_active_changed (); - - void fade_in_realized (); - void fade_out_realized (); - - void start_editing_fade_in (); - void start_editing_fade_out (); - void stop_editing_fade_in (); - void stop_editing_fade_out (); gint bpressed (GdkEventButton* ev, Gtk::SpinButton* but, void (AudioRegionEditor::*pmf)()); gint breleased (GdkEventButton* ev, Gtk::SpinButton* but, void (AudioRegionEditor::*pmf)()); diff --git a/gtk2_ardour/audio_region_view.cc b/gtk2_ardour/audio_region_view.cc index 73ac0c341d..6543907bc8 100644 --- a/gtk2_ardour/audio_region_view.cc +++ b/gtk2_ardour/audio_region_view.cc @@ -29,6 +29,7 @@ #include <ardour/audiosource.h> #include <ardour/audio_diskstream.h> #include <pbd/memento_command.h> +#include <pbd/stacktrace.h> #include "streamview.h" #include "audio_region_view.h" @@ -248,15 +249,51 @@ AudioRegionView::fade_out_changed () } void +AudioRegionView::set_fade_in_shape (AudioRegion::FadeShape shape) +{ + AutomationList& alist = audio_region()->fade_in(); + XMLNode& before (alist.get_state()); + trackview.session().begin_reversible_command ("fade in shape"); + audio_region()->set_fade_in_shape (shape); + XMLNode& after (alist.get_state()); + trackview.session().add_command (new MementoCommand<AutomationList>(alist, &before, &after)); + trackview.session().commit_reversible_command (); +} + +void +AudioRegionView::set_fade_out_shape (AudioRegion::FadeShape shape) +{ + AutomationList& alist = audio_region()->fade_out(); + XMLNode& before (alist.get_state()); + trackview.session().begin_reversible_command ("fade out shape"); + audio_region()->set_fade_out_shape (shape); + XMLNode& after (alist.get_state()); + trackview.session().add_command (new MementoCommand<AutomationList>(alist, &before, &after)); + trackview.session().commit_reversible_command (); +} + +void AudioRegionView::set_fade_in_active (bool yn) { + AutomationList& alist = audio_region()->fade_in(); + XMLNode& before (alist.get_state()); + trackview.session().begin_reversible_command ("fade in shape"); audio_region()->set_fade_in_active (yn); + XMLNode& after (alist.get_state()); + trackview.session().add_command (new MementoCommand<AutomationList>(alist, &before, &after)); + trackview.session().commit_reversible_command (); } void AudioRegionView::set_fade_out_active (bool yn) { + AutomationList& alist = audio_region()->fade_out(); + XMLNode& before (alist.get_state()); + trackview.session().begin_reversible_command ("fade out shape"); audio_region()->set_fade_out_active (yn); + XMLNode& after (alist.get_state()); + trackview.session().add_command (new MementoCommand<AutomationList>(alist, &before, &after)); + trackview.session().commit_reversible_command (); } void @@ -868,6 +905,9 @@ AudioRegionView::create_one_wave (uint32_t which, bool direct) waves = tmp_waves; tmp_waves.clear (); + /* all waves created, don't hook into peaks ready anymore */ + data_ready_connection.disconnect (); + if (!zero_line) { zero_line = new ArdourCanvas::SimpleLine (*group); zero_line->property_x1() = (gdouble) 1.0; @@ -882,11 +922,6 @@ void AudioRegionView::peaks_ready_handler (uint32_t which) { Gtkmm2ext::UI::instance()->call_slot (bind (mem_fun(*this, &AudioRegionView::create_one_wave), which, false)); - - if (!waves.empty()) { - /* all waves created, don't hook into peaks ready anymore */ - data_ready_connection.disconnect (); - } } void @@ -924,12 +959,11 @@ AudioRegionView::add_gain_point_event (ArdourCanvas::Item *item, GdkEvent *ev) trackview.session().begin_reversible_command (_("add gain control point")); XMLNode &before = audio_region()->envelope().get_state(); - if (!audio_region()->envelope_active()) { - XMLNode &before = audio_region()->get_state(); + XMLNode ®ion_before = audio_region()->get_state(); audio_region()->set_envelope_active(true); - XMLNode &after = audio_region()->get_state(); - trackview.session().add_command (new MementoCommand<AudioRegion>(*(audio_region().get()), &before, &after)); + XMLNode ®ion_after = audio_region()->get_state(); + trackview.session().add_command (new MementoCommand<AudioRegion>(*(audio_region().get()), ®ion_before, ®ion_after)); } audio_region()->envelope().add (fx, y); diff --git a/gtk2_ardour/audio_region_view.h b/gtk2_ardour/audio_region_view.h index 7d26f254d2..977c0e3aae 100644 --- a/gtk2_ardour/audio_region_view.h +++ b/gtk2_ardour/audio_region_view.h @@ -24,7 +24,7 @@ #include <libgnomecanvasmm.h> #include <libgnomecanvasmm/polygon.h> #include <sigc++/signal.h> -#include <ardour/region.h> +#include <ardour/audioregion.h> #include "region_view.h" #include "route_time_axis.h" @@ -93,7 +93,9 @@ class AudioRegionView : public RegionView void reset_fade_out_shape_width (nframes_t); void set_fade_in_active (bool); void set_fade_out_active (bool); - + void set_fade_in_shape (ARDOUR::AudioRegion::FadeShape); + void set_fade_out_shape (ARDOUR::AudioRegion::FadeShape); + virtual void entered (); virtual void exited (); diff --git a/gtk2_ardour/automation_line.cc b/gtk2_ardour/automation_line.cc index ee74fabfa4..44c100fd37 100644 --- a/gtk2_ardour/automation_line.cc +++ b/gtk2_ardour/automation_line.cc @@ -245,7 +245,7 @@ AutomationLine::AutomationLine (const string & name, TimeAxisView& tv, ArdourCan alist.StateChanged.connect (mem_fun(*this, &AutomationLine::list_changed)); - trackview.session().register_with_memento_command_factory(_id, this); + trackview.session().register_with_memento_command_factory(alist.id(), this); } @@ -271,14 +271,6 @@ AutomationLine::queue_reset () } void -AutomationLine::set_point_size (double sz) -{ - for (vector<ControlPoint*>::iterator i = control_points.begin(); i != control_points.end(); ++i) { - (*i)->set_size (sz); - } -} - -void AutomationLine::show () { line->show(); @@ -302,18 +294,27 @@ AutomationLine::hide () _visible = false; } +double +AutomationLine::control_point_box_size () +{ + if (_height > TimeAxisView::hLarger) { + return 8.0; + } else if (_height > (guint32) TimeAxisView::hNormal) { + return 6.0; + } + return 4.0; +} + void AutomationLine::set_height (guint32 h) { if (h != _height) { _height = h; - if (_height > (guint32) TimeAxisView::Larger) { - set_point_size (8.0); - } else if (_height > (guint32) TimeAxisView::Normal) { - set_point_size (6.0); - } else { - set_point_size (4.0); + double bsz = control_point_box_size(); + + for (vector<ControlPoint*>::iterator i = control_points.begin(); i != control_points.end(); ++i) { + (*i)->set_size (bsz); } reset (); @@ -670,11 +671,16 @@ AutomationLine::determine_visible_control_points (ALPoints& points) uint32_t this_ry = 0; uint32_t prev_ry = 0; double* slope; + uint32_t box_size; + uint32_t cpsize; /* hide all existing points, and the line */ + + cpsize = 0; for (vector<ControlPoint*>::iterator i = control_points.begin(); i != control_points.end(); ++i) { (*i)->hide(); + ++cpsize; } line->hide (); @@ -695,6 +701,8 @@ AutomationLine::determine_visible_control_points (ALPoints& points) slope[n] = ydelta/xdelta; } + box_size = (uint32_t) control_point_box_size (); + /* read all points and decide which ones to show as control points */ view_index = 0; @@ -736,29 +744,27 @@ AutomationLine::determine_visible_control_points (ALPoints& points) */ this_rx = (uint32_t) rint (tx); - this_ry = (unsigned long) rint (ty); - - if (view_index && pi != npoints && (this_rx == prev_rx) && (this_ry == prev_ry)) { + this_ry = (uint32_t) rint (ty); + if (view_index && pi != npoints && /* not the first, not the last */ + (((this_rx == prev_rx) && (this_ry == prev_ry)) || /* same point */ + (((this_rx - prev_rx) < (box_size + 2)) && /* too close horizontally */ + ((abs ((int)(this_ry - prev_ry)) < (int) (box_size + 2)))))) { /* too close vertically */ continue; - } + } /* ok, we should display this point */ - if (view_index >= control_points.size()) { + if (view_index >= cpsize) { + /* make sure we have enough control points */ ControlPoint* ncp = new ControlPoint (*this); - - if (_height > (guint32) TimeAxisView::Larger) { - ncp->set_size (8.0); - } else if (_height > (guint32) TimeAxisView::Normal) { - ncp->set_size (6.0); - } else { - ncp->set_size (4.0); - } + + ncp->set_size (box_size); control_points.push_back (ncp); + ++cpsize; } ControlPoint::ShapeType shape; @@ -829,6 +835,10 @@ AutomationLine::determine_visible_control_points (ALPoints& points) line_points.push_back (Art::Point (0,0)); } + while (line_points.size() > npoints) { + line_points.pop_back (); + } + for (view_index = 0; view_index < npoints; ++view_index) { line_points[view_index].set_x (control_points[view_index]->get_x()); line_points[view_index].set_y (control_points[view_index]->get_y()); @@ -1168,16 +1178,8 @@ AutomationLine::hide_selection () // show_selection (); } - -// This is copied into AudioRegionGainLine -UndoAction -AutomationLine::get_memento () -{ - return alist.get_memento(); -} - void -AutomationLine::list_changed (Change ignored) +AutomationLine::list_changed () { queue_reset (); } @@ -1201,9 +1203,7 @@ AutomationLine::reset_callback (const AutomationList& events) for (ai = events.const_begin(); ai != events.const_end(); ++ai) { - double translated_y; - - translated_y = (*ai)->value; + double translated_y = (*ai)->value; model_to_view_y (translated_y); tmp_points.push_back (ALPoint (trackview.editor.frame_to_unit ((*ai)->when), @@ -1271,16 +1271,16 @@ AutomationLine::hide_all_but_selected_control_points () } } -XMLNode &AutomationLine::get_state(void) +XMLNode & +AutomationLine::get_state (void) { - XMLNode *node = new XMLNode("AutomationLine"); - node->add_child_nocopy(alist.get_state()); - return *node; + /* function as a proxy for the model */ + return alist.get_state(); } -int AutomationLine::set_state(const XMLNode &node) +int +AutomationLine::set_state (const XMLNode &node) { - // TODO - //alist.set_state(node); - return 0; + /* function as a proxy for the model */ + return alist.set_state (node); } diff --git a/gtk2_ardour/automation_line.h b/gtk2_ardour/automation_line.h index eb2d204513..b73a1c548a 100644 --- a/gtk2_ardour/automation_line.h +++ b/gtk2_ardour/automation_line.h @@ -96,7 +96,7 @@ class ControlPoint ShapeType _shape; }; -class AutomationLine : public PBD::StatefulDestructible +class AutomationLine : public sigc::trackable, public PBD::StatefulThingWithGoingAway { public: AutomationLine (const string & name, TimeAxisView&, ArdourCanvas::Group&, ARDOUR::AutomationList&); @@ -146,8 +146,6 @@ class AutomationLine : public PBD::StatefulDestructible void show_selection(); void hide_selection (); - void set_point_size (double size); - virtual string get_verbose_cursor_string (float); virtual void view_to_model_y (double&) = 0; virtual void model_to_view_y (double&) = 0; @@ -204,9 +202,7 @@ class AutomationLine : public PBD::StatefulDestructible virtual void change_model_range (ARDOUR::AutomationList::iterator,ARDOUR::AutomationList::iterator, double delta, float ydelta); void reset_callback (const ARDOUR::AutomationList&); - void list_changed (ARDOUR::Change); - - UndoAction get_memento(); + void list_changed (); virtual bool event_handler (GdkEvent*); @@ -221,6 +217,8 @@ class AutomationLine : public PBD::StatefulDestructible void reset_line_coords (ControlPoint&); void update_line (); + double control_point_box_size (); + struct ModelRepresentation { ARDOUR::AutomationList::iterator start; ARDOUR::AutomationList::iterator end; diff --git a/gtk2_ardour/automation_time_axis.cc b/gtk2_ardour/automation_time_axis.cc index 22b6e10ac8..2efb621b37 100644 --- a/gtk2_ardour/automation_time_axis.cc +++ b/gtk2_ardour/automation_time_axis.cc @@ -43,31 +43,22 @@ AutomationTimeAxisView::AutomationTimeAxisView (Session& s, boost::shared_ptr<Ro ignore_state_request = false; first_call_to_set_height = true; - // base_rect = gnome_canvas_item_new (GNOME_CANVAS_GROUP(canvas_display), - // gnome_canvas_simplerect_get_type(), - // "x1", 0.0, - // "y1", 0.0, - // "x2", 1000000.0, - // "outline_color_rgba", color_map[cAutomationTrackOutline], - // /* outline ends and bottom */ - // "outline_what", (guint32) (0x1|0x2|0x8), - // "fill_color_rgba", color_map[cAutomationTrackFill], - // NULL); base_rect = new SimpleRect(*canvas_display); base_rect->property_x1() = 0.0; base_rect->property_y1() = 0.0; - base_rect->property_x2() = 1000000.0; + base_rect->property_x2() = max_frames; base_rect->property_outline_color_rgba() = color_map[cAutomationTrackOutline]; /* outline ends and bottom */ base_rect->property_outline_what() = (guint32) (0x1|0x2|0x8); base_rect->property_fill_color_rgba() = color_map[cAutomationTrackFill]; + //base_rect->property_fill_color_rgba() = color_map[cEnteredControlPoint]; base_rect->set_data ("trackview", this); base_rect->signal_event().connect (bind (mem_fun (editor, &PublicEditor::canvas_automation_track_event), base_rect, this)); - hide_button.add (*(manage (new Gtk::Image (get_xpm("small_x.xpm"))))); + hide_button.add (*(manage (new Gtk::Image (::get_icon("hide"))))); height_button.set_name ("TrackSizeButton"); auto_button.set_name ("TrackVisualButton"); @@ -402,8 +393,13 @@ AutomationTimeAxisView::set_samples_per_unit (double spu) void AutomationTimeAxisView::hide_clicked () { + // LAME fix for refreshing the hide button + hide_button.set_sensitive(false); + set_marked_for_display (false); hide (); + + hide_button.set_sensitive(true); } void diff --git a/gtk2_ardour/canvas-waveview.c b/gtk2_ardour/canvas-waveview.c index 89f5da7bf6..080f6871fa 100644 --- a/gtk2_ardour/canvas-waveview.c +++ b/gtk2_ardour/canvas-waveview.c @@ -1,4 +1,4 @@ - /* +/* Copyright (C) 2000-2002 Paul Davis This program is free software; you can redistribute it and/or modify @@ -16,20 +16,22 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. $Id$ - */ +*/ + +#include <stdio.h> +#include <math.h> +#include <libgnomecanvas/libgnomecanvas.h> +#include <string.h> +#include <limits.h> - #include <stdio.h> - #include <math.h> - #include <libgnomecanvas/libgnomecanvas.h> - #include <string.h> - #include <limits.h> +#include <ardour/dB.h> - #include <ardour/dB.h> +#include "canvas-waveview.h" +#include "rgb_macros.h" - #include "canvas-waveview.h" - #include "rgb_macros.h" +extern void c_stacktrace(); - enum { +enum { PROP_0, PROP_DATA_SRC, PROP_CHANNEL, @@ -48,66 +50,66 @@ PROP_WAVE_COLOR, PROP_RECTIFIED, PROP_REGION_START - }; +}; - static void gnome_canvas_waveview_class_init (GnomeCanvasWaveViewClass *class); +static void gnome_canvas_waveview_class_init (GnomeCanvasWaveViewClass *class); - static void gnome_canvas_waveview_init (GnomeCanvasWaveView *waveview); +static void gnome_canvas_waveview_init (GnomeCanvasWaveView *waveview); - static void gnome_canvas_waveview_destroy (GtkObject *object); +static void gnome_canvas_waveview_destroy (GtkObject *object); - static void gnome_canvas_waveview_set_property (GObject *object, +static void gnome_canvas_waveview_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); - static void gnome_canvas_waveview_get_property (GObject *object, +static void gnome_canvas_waveview_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); - static void gnome_canvas_waveview_update (GnomeCanvasItem *item, +static void gnome_canvas_waveview_update (GnomeCanvasItem *item, double *affine, ArtSVP *clip_path, int flags); - static void gnome_canvas_waveview_bounds (GnomeCanvasItem *item, +static void gnome_canvas_waveview_bounds (GnomeCanvasItem *item, double *x1, double *y1, double *x2, double *y2); - static double gnome_canvas_waveview_point (GnomeCanvasItem *item, +static double gnome_canvas_waveview_point (GnomeCanvasItem *item, double x, double y, int cx, int cy, GnomeCanvasItem **actual_item); - static void gnome_canvas_waveview_render (GnomeCanvasItem *item, +static void gnome_canvas_waveview_render (GnomeCanvasItem *item, GnomeCanvasBuf *buf); - static void gnome_canvas_waveview_draw (GnomeCanvasItem *item, +static void gnome_canvas_waveview_draw (GnomeCanvasItem *item, GdkDrawable *drawable, int x, int y, int w, int h); - static void gnome_canvas_waveview_set_data_src (GnomeCanvasWaveView *, +static void gnome_canvas_waveview_set_data_src (GnomeCanvasWaveView *, void *); - static void gnome_canvas_waveview_set_channel (GnomeCanvasWaveView *, +static void gnome_canvas_waveview_set_channel (GnomeCanvasWaveView *, guint32); - static gint32 gnome_canvas_waveview_ensure_cache (GnomeCanvasWaveView *waveview, +static gint32 gnome_canvas_waveview_ensure_cache (GnomeCanvasWaveView *waveview, gulong start_sample, gulong end_sample); - static GnomeCanvasItemClass *parent_class; +static GnomeCanvasItemClass *parent_class; - GType - gnome_canvas_waveview_get_type (void) - { +GType +gnome_canvas_waveview_get_type (void) +{ static GType waveview_type; if (!waveview_type) { @@ -131,9 +133,9 @@ return waveview_type; } - static void - gnome_canvas_waveview_class_init (GnomeCanvasWaveViewClass *class) - { +static void +gnome_canvas_waveview_class_init (GnomeCanvasWaveViewClass *class) +{ GObjectClass *gobject_class; GtkObjectClass *object_class; GnomeCanvasItemClass *item_class; @@ -266,7 +268,7 @@ item_class->point = gnome_canvas_waveview_point; item_class->render = gnome_canvas_waveview_render; item_class->draw = gnome_canvas_waveview_draw; - } +} GnomeCanvasWaveViewCache* gnome_canvas_waveview_cache_new () @@ -331,6 +333,7 @@ gnome_canvas_waveview_destroy (GtkObject *object) } #define DEBUG_CACHE 0 +#undef CACHE_MEMMOVE_OPTIMIZATION static gint32 gnome_canvas_waveview_ensure_cache (GnomeCanvasWaveView *waveview, gulong start_sample, gulong end_sample) @@ -345,6 +348,10 @@ gnome_canvas_waveview_ensure_cache (GnomeCanvasWaveView *waveview, gulong start_ gulong copied; GnomeCanvasWaveViewCache *cache; float* gain; +#ifdef CACHE_MEMMOVE_OPTIMIZATION + gulong present_frames; + gulong present_entries; +#endif cache = waveview->cache; @@ -422,7 +429,6 @@ gnome_canvas_waveview_ensure_cache (GnomeCanvasWaveView *waveview, gulong start_ ostart = new_cache_start; -#undef CACHE_MEMMOVE_OPTIMIZATION #ifdef CACHE_MEMMOVE_OPTIMIZATION /* data is not entirely in the cache, so go fetch it, making sure to fill the cache */ @@ -971,7 +977,7 @@ gnome_canvas_waveview_render (GnomeCanvasItem *item, #if 0 printf ("0x%x r (%d..%d)(%d..%d) bbox (%d..%d)(%d..%d)" - " b/e %d..%d s= %lu..%lu\n", + " b/e %d..%d s= %lu..%lu @ %f\n", waveview, buf->rect.x0, buf->rect.x1, @@ -981,7 +987,8 @@ gnome_canvas_waveview_render (GnomeCanvasItem *item, waveview->bbox_lrx, waveview->bbox_uly, waveview->bbox_lry, - begin, end, s1, s2); + begin, end, s1, s2, + waveview->samples_per_unit); #endif /* now ensure that the cache is full and properly diff --git a/gtk2_ardour/editing.cc b/gtk2_ardour/editing.cc index 1513856ea6..34378a332d 100644 --- a/gtk2_ardour/editing.cc +++ b/gtk2_ardour/editing.cc @@ -2,6 +2,8 @@ #include "editing.h" +#include "i18n.h" + using namespace std; // This involves some cpp magic. --taybin @@ -24,6 +26,13 @@ str2snaptype (const string & str) { #include "editing_syms.h" return SnapToBar; } + +#undef SNAPTYPE +#define SNAPTYPE(s) N_(#s), +const char *snaptypestrs[] = { + #include "editing_syms.h" + 0 +}; #undef SNAPTYPE #define SNAPTYPE(a) /*empty*/ @@ -36,9 +45,17 @@ str2snapmode (const string & str) { #include "editing_syms.h" return SnapNormal; } + +#undef SNAPMODE +#define SNAPMODE(s) N_(#s), +const char *snapmodestrs[] = { + #include "editing_syms.h" + 0 +}; #undef SNAPMODE #define SNAPMODE(a) /*empty*/ + // REGIONLISTSORTTYPE #undef REGIONLISTSORTTYPE #define REGIONLISTSORTTYPE(s) if (!strcmp(type, #s)) {return s;} @@ -48,6 +65,13 @@ str2regionlistsorttype (const string & str) { #include "editing_syms.h" return ByName; } + +#undef REGIONLISTSORTTYPE +#define REGIONLISTSORTTYPE(s) N_(#s), +const char *regionlistsorttypestrs[] = { + #include "editing_syms.h" + 0 +}; #undef REGIONLISTSORTTYPE #define REGIONLISTSORTTYPE(a) /*empty*/ @@ -60,6 +84,13 @@ str2mousemode (const string & str) { #include "editing_syms.h" return MouseObject; } + +#undef MOUSEMODE +#define MOUSEMODE(s) N_(#s), +const char *mousemodestrs[] = { + #include "editing_syms.h" + 0 +}; #undef MOUSEMODE #define MOUSEMODE(a) /*empty*/ @@ -72,6 +103,13 @@ str2zoomfocus (const string & str) { #include "editing_syms.h" return ZoomFocusPlayhead; } + +#undef ZOOMFOCUS +#define ZOOMFOCUS(s) N_(#s), +const char *zoomfocusstrs[] = { + #include "editing_syms.h" + 0 +}; #undef ZOOMFOCUS #define ZOOMFOCUS(a) /*empty*/ @@ -84,7 +122,25 @@ str2displaycontrol (const string & str) { #include "editing_syms.h" return FollowPlayhead; } + +#undef DISPLAYCONTROL +#define DISPLAYCONTROL(s) N_(#s), +const char *displaycontrolstrs[] = { + #include "editing_syms.h" + 0 +}; #undef DISPLAYCONTROL #define DISPLAYCONTROL(a) /*empty*/ +//IMPORTMODE +#undef IMPORTMODE +#define IMPORTMODE(s) N_(#s), +const char *importmodestrs[] = { + #include "editing_syms.h" + 0 +}; +#undef IMPORTMODE +#define IMPORTMODE(a) /*empty*/ + } // namespace Editing + diff --git a/gtk2_ardour/editing.h b/gtk2_ardour/editing.h index b25b935ee0..05aab74750 100644 --- a/gtk2_ardour/editing.h +++ b/gtk2_ardour/editing.h @@ -24,11 +24,7 @@ enum SnapType { #include "editing_syms.h" }; -#undef SNAPTYPE -#define SNAPTYPE(s) #s, -static const char *snaptypestrs[] = { - #include "editing_syms.h" -}; +extern const char *snaptypestrs[]; inline const char* enum2str(SnapType m) {return snaptypestrs[m];} SnapType str2snaptype(const std::string &); @@ -42,11 +38,7 @@ enum SnapMode { #include "editing_syms.h" }; -#undef SNAPMODE -#define SNAPMODE(s) #s, -static const char *snapmodestrs[] = { - #include "editing_syms.h" -}; +extern const char *snapmodestrs[]; inline const char* enum2str(SnapMode m) {return snapmodestrs[m];} SnapMode str2snapmode(const std::string &); @@ -60,11 +52,7 @@ enum RegionListSortType { #include "editing_syms.h" }; -#undef REGIONLISTSORTTYPE -#define REGIONLISTSORTTYPE(s) #s, -static const char *regionlistsorttypestrs[] = { - #include "editing_syms.h" -}; +extern const char *regionlistsorttypestrs[]; inline const char* enum2str(RegionListSortType m) {return regionlistsorttypestrs[m];} RegionListSortType str2regionlistsorttype(const std::string &); @@ -78,11 +66,7 @@ enum MouseMode { #include "editing_syms.h" }; -#undef MOUSEMODE -#define MOUSEMODE(s) #s, -static const char *mousemodestrs[] = { - #include "editing_syms.h" -}; +extern const char *mousemodestrs[]; inline const char* enum2str(MouseMode m) {return mousemodestrs[m];} MouseMode str2mousemode(const std::string &); @@ -96,11 +80,7 @@ enum ZoomFocus { #include "editing_syms.h" }; -#undef ZOOMFOCUS -#define ZOOMFOCUS(s) #s, -static const char *zoomfocusstrs[] = { - #include "editing_syms.h" -}; +extern const char *zoomfocusstrs[]; inline const char* enum2str(ZoomFocus m) {return zoomfocusstrs[m];} ZoomFocus str2zoomfocus(const std::string &); @@ -114,11 +94,7 @@ enum DisplayControl { #include "editing_syms.h" }; -#undef DISPLAYCONTROL -#define DISPLAYCONTROL(s) #s, -static const char *displaycontrolstrs[] = { - #include "editing_syms.h" -}; +extern const char *displaycontrolstrs[]; inline const char* enum2str(DisplayControl m) {return displaycontrolstrs[m];} DisplayControl str2displaycontrol (const std::string &); @@ -132,11 +108,7 @@ enum ImportMode { #include "editing_syms.h" }; -#undef IMPORTMODE -#define IMPORTMODE(s) #s, -static const char *importmodestrs[] = { - #include "editing_syms.h" -}; +extern const char *importmodestrs[]; inline const char* enum2str(ImportMode m) {return importmodestrs[m];} ImportMode str2importmode (const std::string &); diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc index b3e2285714..bb87204916 100644 --- a/gtk2_ardour/editor.cc +++ b/gtk2_ardour/editor.cc @@ -62,6 +62,7 @@ #include "selection.h" #include "audio_streamview.h" #include "time_axis_view.h" +#include "audio_time_axis.h" #include "utils.h" #include "crossfade_view.h" #include "editing.h" @@ -98,7 +99,7 @@ const double Editor::timebar_height = 15.0; #include "editor_xpms" -static const gchar *snap_type_strings[] = { +static const gchar *_snap_type_strings[] = { N_("None"), N_("CD Frames"), N_("SMPTE Frames"), @@ -122,13 +123,13 @@ static const gchar *snap_type_strings[] = { 0 }; -static const gchar *snap_mode_strings[] = { - N_("Normal Snap"), - N_("Magnetic Snap"), +static const gchar *_snap_mode_strings[] = { + N_("Normal"), + N_("Magnetic"), 0 }; -static const gchar *zoom_focus_strings[] = { +static const gchar *_zoom_focus_strings[] = { N_("Left"), N_("Right"), N_("Center"), @@ -177,7 +178,7 @@ Editor::Editor (AudioEngine& eng) minsec_label (_("Mins:Secs")), bbt_label (_("Bars:Beats")), - smpte_label (_("SMPTE")), + smpte_label (_("Timecode")), frame_label (_("Frames")), tempo_label (_("Tempo")), meter_label (_("Meter")), @@ -240,6 +241,10 @@ Editor::Editor (AudioEngine& eng) current_mixer_strip = 0; current_bbt_points = 0; + snap_type_strings = I18N (_snap_type_strings); + snap_mode_strings = I18N (_snap_mode_strings); + zoom_focus_strings = I18N(_zoom_focus_strings); + snap_type = SnapToFrame; set_snap_to (snap_type); snap_mode = SnapNormal; @@ -285,6 +290,7 @@ Editor::Editor (AudioEngine& eng) transport_marker_menu = 0; new_transport_marker_menu = 0; editor_mixer_strip_width = Wide; + show_editor_mixer_when_tracks_arrive = false; repos_zoom_queued = false; region_edit_menu_split_item = 0; temp_location = 0; @@ -302,6 +308,7 @@ Editor::Editor (AudioEngine& eng) edit_cursor = 0; playhead_cursor = 0; button_release_can_deselect = true; + canvas_idle_queued = false; location_marker_color = color_map[cLocationMarker]; location_range_color = color_map[cLocationRange]; @@ -511,7 +518,7 @@ Editor::Editor (AudioEngine& eng) edit_group_display.signal_button_press_event().connect (mem_fun(*this, &Editor::edit_group_list_button_press_event), false); VBox* edit_group_display_packer = manage (new VBox()); - HButtonBox* edit_group_display_button_box = manage (new HButtonBox()); + HBox* edit_group_display_button_box = manage (new HBox()); edit_group_display_button_box->set_homogeneous (true); Button* edit_group_add_button = manage (new Button ()); @@ -546,7 +553,6 @@ Editor::Editor (AudioEngine& eng) region_list_display.set_model (region_list_model); region_list_display.append_column (_("Regions"), region_list_columns.name); region_list_display.set_headers_visible (false); - region_list_display.set_hover_expand (true); region_list_display.get_selection()->set_select_function (mem_fun (*this, &Editor::region_list_selection_filter)); @@ -632,6 +638,8 @@ Editor::Editor (AudioEngine& eng) the_notebook.popup_enable (); the_notebook.set_tab_pos (Gtk::POS_RIGHT); + post_maximal_editor_width = 0; + post_maximal_pane_position = 0; edit_pane.pack1 (edit_packer, true, true); edit_pane.pack2 (the_notebook, false, true); @@ -1116,6 +1124,7 @@ Editor::connect_to_session (Session *t) update_title (); session->GoingAway.connect (mem_fun(*this, &Editor::session_going_away)); + session->history().Changed.connect (mem_fun (*this, &Editor::history_changed)); /* These signals can all be emitted by a non-GUI thread. Therefore the handlers for them must not attempt to directly interact with the GUI, @@ -1308,7 +1317,6 @@ Editor::popup_fade_context_menu (int button, int32_t time, ArdourCanvas::Item* i } MenuList& items (fade_context_menu.items()); - AudioRegion& ar (*arv->audio_region().get()); // FIXME items.clear (); @@ -1323,11 +1331,11 @@ Editor::popup_fade_context_menu (int button, int32_t time, ArdourCanvas::Item* i items.push_back (SeparatorElem()); - items.push_back (MenuElem (_("Linear"), bind (mem_fun (ar, &AudioRegion::set_fade_in_shape), AudioRegion::Linear))); - items.push_back (MenuElem (_("Slowest"), bind (mem_fun (ar, &AudioRegion::set_fade_in_shape), AudioRegion::LogB))); - items.push_back (MenuElem (_("Slow"), bind (mem_fun (ar, &AudioRegion::set_fade_in_shape), AudioRegion::Fast))); - items.push_back (MenuElem (_("Fast"), bind (mem_fun (ar, &AudioRegion::set_fade_in_shape), AudioRegion::LogA))); - items.push_back (MenuElem (_("Fastest"), bind (mem_fun (ar, &AudioRegion::set_fade_in_shape), AudioRegion::Slow))); + items.push_back (MenuElem (_("Linear"), bind (mem_fun (*arv, &AudioRegionView::set_fade_in_shape), AudioRegion::Linear))); + items.push_back (MenuElem (_("Slowest"), bind (mem_fun (*arv, &AudioRegionView::set_fade_in_shape), AudioRegion::LogB))); + items.push_back (MenuElem (_("Slow"), bind (mem_fun (*arv, &AudioRegionView::set_fade_in_shape), AudioRegion::Fast))); + items.push_back (MenuElem (_("Fast"), bind (mem_fun (*arv, &AudioRegionView::set_fade_in_shape), AudioRegion::LogA))); + items.push_back (MenuElem (_("Fastest"), bind (mem_fun (*arv, &AudioRegionView::set_fade_in_shape), AudioRegion::Slow))); break; case FadeOutItem: @@ -1340,13 +1348,14 @@ Editor::popup_fade_context_menu (int button, int32_t time, ArdourCanvas::Item* i items.push_back (SeparatorElem()); - items.push_back (MenuElem (_("Linear"), bind (mem_fun (ar, &AudioRegion::set_fade_out_shape), AudioRegion::Linear))); - items.push_back (MenuElem (_("Slowest"), bind (mem_fun (ar, &AudioRegion::set_fade_out_shape), AudioRegion::Fast))); - items.push_back (MenuElem (_("Slow"), bind (mem_fun (ar, &AudioRegion::set_fade_out_shape), AudioRegion::LogB))); - items.push_back (MenuElem (_("Fast"), bind (mem_fun (ar, &AudioRegion::set_fade_out_shape), AudioRegion::LogA))); - items.push_back (MenuElem (_("Fastest"), bind (mem_fun (ar, &AudioRegion::set_fade_out_shape), AudioRegion::Slow))); + items.push_back (MenuElem (_("Linear"), bind (mem_fun (*arv, &AudioRegionView::set_fade_out_shape), AudioRegion::Linear))); + items.push_back (MenuElem (_("Slowest"), bind (mem_fun (*arv, &AudioRegionView::set_fade_out_shape), AudioRegion::Fast))); + items.push_back (MenuElem (_("Slow"), bind (mem_fun (*arv, &AudioRegionView::set_fade_out_shape), AudioRegion::LogB))); + items.push_back (MenuElem (_("Fast"), bind (mem_fun (*arv, &AudioRegionView::set_fade_out_shape), AudioRegion::LogA))); + items.push_back (MenuElem (_("Fastest"), bind (mem_fun (*arv, &AudioRegionView::set_fade_out_shape), AudioRegion::Slow))); break; + default: fatal << _("programming error: ") << X_("non-fade canvas item passed to popup_fade_context_menu()") @@ -1691,7 +1700,7 @@ Editor::add_region_context_items (AudioStreamView* sv, boost::shared_ptr<Region> become selected. */ - region_menu->signal_map_event().connect (bind (mem_fun(*this, &Editor::set_selected_regionview_from_map_event), sv, boost::weak_ptr<Region>(region))); + // region_menu->signal_map_event().connect (bind (mem_fun(*this, &Editor::set_selected_regionview_from_map_event), sv, boost::weak_ptr<Region>(region))); items.push_back (MenuElem (_("Popup region editor"), mem_fun(*this, &Editor::edit_region))); items.push_back (MenuElem (_("Raise to top layer"), mem_fun(*this, &Editor::raise_region_to_top))); @@ -1711,32 +1720,50 @@ Editor::add_region_context_items (AudioStreamView* sv, boost::shared_ptr<Region> items.push_back (SeparatorElem()); - /* XXX hopefully this nonsense will go away with SigC++ 2.X, where the compiler - might be able to figure out which overloaded member function to use in - a bind() call ... - */ + items.push_back (CheckMenuElem (_("Lock"), mem_fun(*this, &Editor::toggle_region_lock))); + region_lock_item = static_cast<CheckMenuItem*>(&items.back()); + if (region->locked()) { + region_lock_item->set_active(); + } + items.push_back (CheckMenuElem (_("Mute"), mem_fun(*this, &Editor::toggle_region_mute))); + region_mute_item = static_cast<CheckMenuItem*>(&items.back()); + if (region->muted()) { + region_mute_item->set_active(); + } + items.push_back (CheckMenuElem (_("Opaque"), mem_fun(*this, &Editor::toggle_region_opaque))); + region_opaque_item = static_cast<CheckMenuItem*>(&items.back()); + if (region->opaque()) { + region_opaque_item->set_active(); + } - void (Editor::*type_A_pmf)(void (Region::*pmf)(bool), bool) = &Editor::region_selection_op; + items.push_back (CheckMenuElem (_("Original position"), mem_fun(*this, &Editor::naturalize))); + if (region->at_natural_position()) { + items.back().set_sensitive (false); + } - items.push_back (MenuElem (_("Lock"), bind (mem_fun(*this, type_A_pmf), &Region::set_locked, true))); - items.push_back (MenuElem (_("Unlock"), bind (mem_fun(*this, type_A_pmf), &Region::set_locked, false))); items.push_back (SeparatorElem()); - if (region->muted()) { - items.push_back (MenuElem (_("Unmute"), bind (mem_fun(*this, type_A_pmf), &Region::set_muted, false))); - } else { - items.push_back (MenuElem (_("Mute"), bind (mem_fun(*this, type_A_pmf), &Region::set_muted, true))); - } - items.push_back (SeparatorElem()); + if (ar) { + + RegionView* rv = sv->find_view (ar); + AudioRegionView* arv = dynamic_cast<AudioRegionView*>(rv); - items.push_back (MenuElem (_("Original position"), mem_fun(*this, &Editor::naturalize))); - items.push_back (SeparatorElem()); + items.push_back (MenuElem (_("Reset Envelope"), mem_fun(*this, &Editor::reset_region_gain_envelopes))); + + items.push_back (CheckMenuElem (_("Envelope Visible"), mem_fun(*this, &Editor::toggle_gain_envelope_visibility))); + region_envelope_visible_item = static_cast<CheckMenuItem*> (&items.back()); + if (arv->envelope_visible()) { + region_envelope_visible_item->set_active (true); + } - if (ar) { + items.push_back (CheckMenuElem (_("Envelope Active"), mem_fun(*this, &Editor::toggle_gain_envelope_active))); + region_envelope_active_item = static_cast<CheckMenuItem*> (&items.back()); + + if (ar->envelope_active()) { + region_envelope_active_item->set_active (true); + } - items.push_back (MenuElem (_("Toggle envelope visibility"), mem_fun(*this, &Editor::toggle_gain_envelope_visibility))); - items.push_back (MenuElem (_("Toggle envelope active"), mem_fun(*this, &Editor::toggle_gain_envelope_active))); items.push_back (SeparatorElem()); if (ar->scale_amplitude() != 1.0f) { @@ -1752,7 +1779,7 @@ Editor::add_region_context_items (AudioStreamView* sv, boost::shared_ptr<Region> /* range related stuff */ items.push_back (MenuElem (_("Add Range Markers"), mem_fun (*this, &Editor::add_location_from_audio_region))); - items.push_back (MenuElem (_("Set Range"), mem_fun (*this, &Editor::set_selection_from_audio_region))); + items.push_back (MenuElem (_("Set Range Selection"), mem_fun (*this, &Editor::set_selection_from_audio_region))); items.push_back (SeparatorElem()); /* Nudge region */ @@ -1789,8 +1816,6 @@ Editor::add_region_context_items (AudioStreamView* sv, boost::shared_ptr<Region> items.push_back (MenuElem (_("Fill Track"), (mem_fun(*this, &Editor::region_fill_track)))); items.push_back (SeparatorElem()); items.push_back (MenuElem (_("Remove"), mem_fun(*this, &Editor::remove_clicked_region))); - items.push_back (SeparatorElem()); - items.push_back (MenuElem (_("Destroy"), mem_fun(*this, &Editor::destroy_clicked_region))); /* OK, stick the region submenu at the top of the list, and then add the standard items. @@ -1861,7 +1886,7 @@ Editor::add_dstream_context_items (Menu_Helpers::MenuList& edit_items) MenuList& play_items = play_menu->items(); play_menu->set_name ("ArdourContextMenu"); - play_items.push_back (MenuElem (_("Play from edit cursor"))); + play_items.push_back (MenuElem (_("Play from edit cursor"), mem_fun(*this, &Editor::play_from_edit_cursor))); play_items.push_back (MenuElem (_("Play from start"), mem_fun(*this, &Editor::play_from_start))); play_items.push_back (MenuElem (_("Play region"), mem_fun(*this, &Editor::play_selected_region))); play_items.push_back (SeparatorElem()); @@ -1946,7 +1971,7 @@ Editor::add_bus_context_items (Menu_Helpers::MenuList& edit_items) MenuList& play_items = play_menu->items(); play_menu->set_name ("ArdourContextMenu"); - play_items.push_back (MenuElem (_("Play from edit cursor"))); + play_items.push_back (MenuElem (_("Play from edit cursor"), mem_fun(*this, &Editor::play_from_edit_cursor))); play_items.push_back (MenuElem (_("Play from start"), mem_fun(*this, &Editor::play_from_start))); edit_items.push_back (MenuElem (_("Play"), *play_menu)); @@ -1995,10 +2020,13 @@ Editor::add_bus_context_items (Menu_Helpers::MenuList& edit_items) void Editor::set_snap_to (SnapType st) -{ +{ snap_type = st; - vector<string> txt = internationalize (snap_type_strings); - snap_type_selector.set_active_text (txt[(int)st]); + string str = snap_type_strings[(int) st]; + + if (str != snap_type_selector.get_active_text()) { + snap_type_selector.set_active_text (str); + } instant_save (); @@ -2019,8 +2047,11 @@ void Editor::set_snap_mode (SnapMode mode) { snap_mode = mode; - vector<string> txt = internationalize (snap_mode_strings); - snap_mode_selector.set_active_text (txt[(int)mode]); + string str = snap_mode_strings[(int)mode]; + + if (str != snap_mode_selector.get_active_text ()) { + snap_mode_selector.set_active_text (str); + } instant_save (); } @@ -2147,6 +2178,7 @@ Editor::set_state (const XMLNode& node) Glib::RefPtr<Action> act = ActionManager::get_action (X_("Editor"), X_("show-editor-mixer")); if (act) { + Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act); bool yn = (prop->value() == X_("yes")); @@ -2584,10 +2616,10 @@ Editor::setup_toolbar () zoom_box.pack_start (zoom_out_full_button, false, false); ARDOUR_UI::instance()->tooltips().set_tip (zoom_range_clock, _("Current Zoom Range\n(Width of visible area)")); - + zoom_focus_selector.set_name ("ZoomFocusSelector"); Gtkmm2ext::set_size_request_to_display_given_text (zoom_focus_selector, "Focus Center", 2+FUDGE, 0); - set_popdown_strings (zoom_focus_selector, internationalize (zoom_focus_strings)); + set_popdown_strings (zoom_focus_selector, zoom_focus_strings); zoom_focus_selector.signal_changed().connect (mem_fun(*this, &Editor::zoom_focus_selection_done)); ARDOUR_UI::instance()->tooltips().set_tip (zoom_focus_selector, _("Zoom focus")); @@ -2601,13 +2633,13 @@ Editor::setup_toolbar () snap_type_selector.set_name ("SnapTypeSelector"); Gtkmm2ext::set_size_request_to_display_given_text (snap_type_selector, "SMPTE Seconds", 2+FUDGE, 10); - set_popdown_strings (snap_type_selector, internationalize (snap_type_strings)); + set_popdown_strings (snap_type_selector, snap_type_strings); snap_type_selector.signal_changed().connect (mem_fun(*this, &Editor::snap_type_selection_done)); ARDOUR_UI::instance()->tooltips().set_tip (snap_type_selector, _("Unit to snap cursors and ranges to")); snap_mode_selector.set_name ("SnapModeSelector"); Gtkmm2ext::set_size_request_to_display_given_text (snap_mode_selector, "Magnetic Snap", 2+FUDGE, 10); - set_popdown_strings (snap_mode_selector, internationalize (snap_mode_strings)); + set_popdown_strings (snap_mode_selector, snap_mode_strings); snap_mode_selector.signal_changed().connect (mem_fun(*this, &Editor::snap_mode_selection_done)); snap_box.pack_start (edit_cursor_clock, false, false); @@ -2819,33 +2851,36 @@ Editor::commit_reversible_command () } bool -Editor::set_selected_track_from_click (bool press, Selection::Operation op, bool with_undo, bool no_remove) +Editor::set_selected_track (TimeAxisView& view, Selection::Operation op, bool no_remove) { bool commit = false; - if (!clicked_axisview) { - return false; - } - switch (op) { case Selection::Toggle: - if (selection->selected (clicked_axisview)) { + if (selection->selected (&view)) { if (!no_remove) { - selection->remove (clicked_axisview); + selection->remove (&view); commit = true; } } else { - selection->add (clicked_axisview); + selection->add (&view); commit = false; } break; + case Selection::Add: + if (!selection->selected (&view)) { + selection->add (&view); + commit = true; + } + break; + case Selection::Set: - if (selection->selected (clicked_axisview) && selection->tracks.size() == 1) { + if (selection->selected (&view) && selection->tracks.size() == 1) { /* no commit necessary */ } - selection->set (clicked_axisview); + selection->set (&view); break; case Selection::Extend: @@ -2857,7 +2892,17 @@ Editor::set_selected_track_from_click (bool press, Selection::Operation op, bool } bool -Editor::set_selected_control_point_from_click (bool press, Selection::Operation op, bool with_undo, bool no_remove) +Editor::set_selected_track_from_click (Selection::Operation op, bool no_remove) +{ + if (!clicked_routeview) { + return false; + } + + return set_selected_track (*clicked_routeview, op, no_remove); +} + +bool +Editor::set_selected_control_point_from_click (Selection::Operation op, bool no_remove) { if (!clicked_control_point) { return false; @@ -2877,7 +2922,7 @@ Editor::set_selected_control_point_from_click (bool press, Selection::Operation } void -Editor::get_relevant_tracks (RouteTimeAxisView& base, set<RouteTimeAxisView*>& relevant_tracks) +Editor::get_relevant_tracks (set<RouteTimeAxisView*>& relevant_tracks) { /* step one: get all selected tracks and all tracks in the relevant edit groups */ @@ -2906,14 +2951,9 @@ Editor::get_relevant_tracks (RouteTimeAxisView& base, set<RouteTimeAxisView*>& r } } } - } else { - - /* no active group, or no group */ - - relevant_tracks.insert (&base); + relevant_tracks.insert (atv); } - } } @@ -2922,14 +2962,10 @@ Editor::mapover_tracks (slot<void,RouteTimeAxisView&,uint32_t> sl) { set<RouteTimeAxisView*> relevant_tracks; - if (!clicked_routeview) { - return; - } - - get_relevant_tracks (*clicked_routeview, relevant_tracks); + get_relevant_tracks (relevant_tracks); uint32_t sz = relevant_tracks.size(); - + for (set<RouteTimeAxisView*>::iterator ati = relevant_tracks.begin(); ati != relevant_tracks.end(); ++ati) { sl (**ati, sz); } @@ -3117,7 +3153,7 @@ Editor::set_selected_regionview_from_click (bool press, Selection::Operation op, set<RouteTimeAxisView*> relevant_tracks; - get_relevant_tracks (*clicked_routeview, relevant_tracks); + get_relevant_tracks (relevant_tracks); for (set<RouteTimeAxisView*>::iterator t = relevant_tracks.begin(); t != relevant_tracks.end(); ++t) { (*t)->get_selectables (first_frame, last_frame, -1.0, -1.0, results); @@ -3192,6 +3228,9 @@ Editor::set_selected_regionview_from_region_list (boost::shared_ptr<Region> regi case Selection::Extend: selection->add (all_equivalent_regions); break; + case Selection::Add: + selection->add (all_equivalent_regions); + break; } commit_reversible_command () ; @@ -3259,89 +3298,27 @@ Editor::set_edit_group_mute (Route& route, bool yn) } void -Editor::set_edit_menu (Menu& menu) -{ - edit_menu = &menu; - edit_menu->signal_map_event().connect (mem_fun(*this, &Editor::edit_menu_map_handler)); -} - -bool -Editor::edit_menu_map_handler (GdkEventAny* ev) +Editor::history_changed () { - using namespace Menu_Helpers; - MenuList& edit_items = edit_menu->items(); string label; - /* Nuke all the old items */ - - edit_items.clear (); - - if (session == 0) { - return false; - } - - if (session->undo_depth() == 0) { - label = _("Undo"); - } else { - label = string_compose(_("Undo (%1)"), session->next_undo()); - } - - edit_items.push_back (MenuElem (label, bind (mem_fun(*this, &Editor::undo), 1U))); - - if (session->undo_depth() == 0) { - edit_items.back().set_sensitive (false); - } - - if (session->redo_depth() == 0) { - label = _("Redo"); - } else { - label = string_compose(_("Redo (%1)"), session->next_redo()); - } - - edit_items.push_back (MenuElem (label, bind (mem_fun(*this, &Editor::redo), 1U))); - if (session->redo_depth() == 0) { - edit_items.back().set_sensitive (false); - } - - vector<MenuItem*> mitems; - - edit_items.push_back (SeparatorElem()); - edit_items.push_back (MenuElem (_("Cut"), mem_fun(*this, &Editor::cut))); - mitems.push_back (&edit_items.back()); - edit_items.push_back (MenuElem (_("Copy"), mem_fun(*this, &Editor::copy))); - mitems.push_back (&edit_items.back()); - edit_items.push_back (MenuElem (_("Paste"), bind (mem_fun(*this, &Editor::paste), 1.0f))); - mitems.push_back (&edit_items.back()); - edit_items.push_back (SeparatorElem()); - edit_items.push_back (MenuElem (_("Align"), bind (mem_fun(*this, &Editor::align), ARDOUR::SyncPoint))); - mitems.push_back (&edit_items.back()); - edit_items.push_back (MenuElem (_("Align Relative"), bind (mem_fun(*this, &Editor::align_relative), ARDOUR::SyncPoint))); - mitems.push_back (&edit_items.back()); - edit_items.push_back (SeparatorElem()); - - if (selection->empty()) { - for (vector<MenuItem*>::iterator i = mitems.begin(); i != mitems.end(); ++i) { - (*i)->set_sensitive (false); + if (undo_action && session) { + if (session->undo_depth() == 0) { + label = _("Undo"); + } else { + label = string_compose(_("Undo (%1)"), session->next_undo()); } + undo_action->property_label() = label; } - Menu* import_menu = manage (new Menu()); - import_menu->set_name ("ArdourContextMenu"); - MenuList& import_items = import_menu->items(); - - import_items.push_back (MenuElem (_("... as new track"), bind (mem_fun(*this, &Editor::add_external_audio_action), ImportAsTrack))); - import_items.push_back (MenuElem (_("... as new region"), bind (mem_fun(*this, &Editor::add_external_audio_action), ImportAsRegion))); - - edit_items.push_back (MenuElem (_("Import audio (copy)"), *import_menu)); - edit_items.push_back (SeparatorElem()); - - edit_items.push_back (MenuElem (_("Remove last capture"), mem_fun(*this, &Editor::remove_last_capture))); - - if (!session->have_captured()) { - edit_items.back().set_sensitive (false); + if (redo_action && session) { + if (session->redo_depth() == 0) { + label = _("Redo"); + } else { + label = string_compose(_("Redo (%1)"), session->next_redo()); + } + redo_action->property_label() = label; } - - return false; } void @@ -3449,10 +3426,6 @@ Editor::edit_mode_selection_done () void Editor::snap_type_selection_done () { - if (session == 0) { - return; - } - string choice = snap_type_selector.get_active_text(); SnapType snaptype = SnapToFrame; @@ -3498,35 +3471,34 @@ Editor::snap_type_selection_done () snaptype = SnapToFrame; } - set_snap_to (snaptype); + RefPtr<RadioAction> ract = snap_type_action (snaptype); + if (ract) { + ract->set_active (); + } } void Editor::snap_mode_selection_done () { - if(session == 0) { - return; - } - string choice = snap_mode_selector.get_active_text(); SnapMode mode = SnapNormal; - if (choice == _("Normal Snap")) { + if (choice == _("Normal")) { mode = SnapNormal; - } else if (choice == _("Magnetic Snap")) { + } else if (choice == _("Magnetic")) { mode = SnapMagnetic; } - set_snap_mode (mode); + RefPtr<RadioAction> ract = snap_mode_action (mode); + + if (ract) { + ract->set_active (true); + } } void Editor::zoom_focus_selection_done () { - if (session == 0) { - return; - } - string choice = zoom_focus_selector.get_active_text(); ZoomFocus focus_type = ZoomFocusLeft; @@ -3541,8 +3513,12 @@ Editor::zoom_focus_selection_done () } else if (choice == _("Edit Cursor")) { focus_type = ZoomFocusEdit; } + + RefPtr<RadioAction> ract = zoom_focus_action (focus_type); - set_zoom_focus (focus_type); + if (ract) { + ract->set_active (); + } } gint @@ -3673,8 +3649,11 @@ Editor::get_valid_views (TimeAxisView* track, RouteGroup* group) void Editor::set_zoom_focus (ZoomFocus f) { - vector<string> txt = internationalize (zoom_focus_strings); - zoom_focus_selector.set_active_text (txt[(int)f]); + string str = zoom_focus_strings[(int)f]; + + if (str != zoom_focus_selector.get_active_text()) { + zoom_focus_selector.set_active_text (str); + } if (zoom_focus != f) { zoom_focus = f; @@ -3985,7 +3964,18 @@ Editor::redisplay_snapshots () for (vector<string*>::iterator i = states->begin(); i != states->end(); ++i) { string statename = *(*i); TreeModel::Row row = *(snapshot_display_model->append()); - row[snapshot_display_columns.visible_name] = statename; + + // we don't have a way of changing the rendering in just one TreeView + // cell so just put an asterisk on each side of the name for now. + string display_name; + if (statename == session->snap_name()) { + display_name = "*"+statename+"*"; + snapshot_display.get_selection()->select(row); + } else { + display_name = statename; + } + + row[snapshot_display_columns.visible_name] = display_name; row[snapshot_display_columns.real_name] = statename; } @@ -4002,24 +3992,48 @@ Editor::session_state_saved (string snap_name) void Editor::maximise_editing_space () { + initial_ruler_update_required = true; + mouse_mode_tearoff->set_visible (false); tools_tearoff->set_visible (false); pre_maximal_pane_position = edit_pane.get_position(); - edit_pane.set_position (edit_pane.get_width()); + pre_maximal_editor_width = this->get_width(); + + if(post_maximal_pane_position == 0) { + post_maximal_pane_position = edit_pane.get_width(); + } + fullscreen(); + if(post_maximal_editor_width) { + edit_pane.set_position (post_maximal_pane_position - + abs(post_maximal_editor_width - pre_maximal_editor_width)); + } else { + edit_pane.set_position (post_maximal_pane_position); + } } void Editor::restore_editing_space () { + initial_ruler_update_required = true; + + // user changed width of pane during fullscreen + if(post_maximal_pane_position != edit_pane.get_position()) { + post_maximal_pane_position = edit_pane.get_position(); + } + + unfullscreen(); + mouse_mode_tearoff->set_visible (true); tools_tearoff->set_visible (true); + post_maximal_editor_width = this->get_width(); - edit_pane.set_position (pre_maximal_pane_position); - unfullscreen(); + edit_pane.set_position ( + pre_maximal_pane_position + abs(this->get_width() - pre_maximal_editor_width) + ); } void diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h index e604053254..9a18516588 100644 --- a/gtk2_ardour/editor.h +++ b/gtk2_ardour/editor.h @@ -174,8 +174,6 @@ class Editor : public PublicEditor /* undo related */ - void set_edit_menu (Gtk::Menu&); - nframes_t unit_to_frame (double unit) { return (nframes_t) rint (unit * frames_per_unit); } @@ -244,11 +242,6 @@ class Editor : public PublicEditor void export_session(); void export_selection(); - /* this is what actually does it */ - - void export_audiofile (ARDOUR::AudioExportSpecification&); - - /* */ void add_toplevel_controls (Gtk::Container&); @@ -355,12 +348,13 @@ class Editor : public PublicEditor PlaylistSelector* _playlist_selector; void set_frames_per_unit (double); - void frames_per_unit_modified (); Editing::MouseMode mouse_mode; - void mouse_insert (GdkEventButton *); + int post_maximal_editor_width; + int post_maximal_pane_position; int pre_maximal_pane_position; + int pre_maximal_editor_width; void pane_allocation_handler (Gtk::Allocation&, Gtk::Paned*); Gtk::Notebook the_notebook; @@ -419,7 +413,7 @@ class Editor : public PublicEditor CrossfadeView* clicked_crossfadeview; ControlPoint* clicked_control_point; - void get_relevant_tracks (RouteTimeAxisView& base, std::set<RouteTimeAxisView*>& relevant_tracks); + void get_relevant_tracks (std::set<RouteTimeAxisView*>& relevant_tracks); void mapover_tracks (sigc::slot<void,RouteTimeAxisView&,uint32_t> sl); /* functions to be passed to mapover_tracks(), possibly with sigc::bind()-supplied arguments */ @@ -436,8 +430,10 @@ class Editor : public PublicEditor void catch_vanishing_regionview (RegionView *); - bool set_selected_control_point_from_click (bool press, Selection::Operation op = Selection::Set, bool with_undo = true, bool no_remove=false); - bool set_selected_track_from_click (bool press, Selection::Operation op = Selection::Set, bool with_undo = true, bool no_remove=false); + bool set_selected_track (TimeAxisView&, Selection::Operation op = Selection::Set, bool no_remove=false); + + bool set_selected_control_point_from_click (Selection::Operation op = Selection::Set, bool no_remove=false); + bool set_selected_track_from_click (Selection::Operation op = Selection::Set, bool no_remove=false); bool set_selected_regionview_from_click (bool press, Selection::Operation op = Selection::Set, bool no_track_remove=false); void set_selected_regionview_from_region_list (boost::shared_ptr<ARDOUR::Region> region, Selection::Operation op = Selection::Set); @@ -495,9 +491,6 @@ class Editor : public PublicEditor bool verbose_cursor_on; // so far unused - void flush_track_canvas (); - void flush_time_canvas (); - Gtk::EventBox time_canvas_event_box; Gtk::EventBox track_canvas_event_box; Gtk::EventBox time_button_event_box; @@ -668,9 +661,6 @@ class Editor : public PublicEditor Gtk::Menu *edit_controls_left_menu; Gtk::Menu *edit_controls_right_menu; - void track_canvas_scroller_realized (); - void time_canvas_scroller_realized (); - Gtk::VBox track_canvas_vbox; Gtk::VBox time_canvas_vbox; Gtk::VBox edit_controls_vbox; @@ -807,9 +797,6 @@ class Editor : public PublicEditor void update_current_screen (); - gint show_track_context_menu (GdkEventButton *); - void hide_track_context_menu (); - void session_going_away (); nframes_t cut_buffer_start; @@ -828,8 +815,8 @@ class Editor : public PublicEditor int ensure_cursor (nframes_t* pos); - void handle_new_region (boost::shared_ptr<ARDOUR::Region>); - void handle_region_removed (boost::shared_ptr<ARDOUR::Region>); + void handle_new_region (boost::weak_ptr<ARDOUR::Region>); + void handle_region_removed (boost::weak_ptr<ARDOUR::Region>); void add_region_to_region_display (boost::shared_ptr<ARDOUR::Region>); void region_hidden (boost::shared_ptr<ARDOUR::Region>); void redisplay_regions (); @@ -849,6 +836,7 @@ class Editor : public PublicEditor void reset_point_selection (); void toggle_region_mute (); + void toggle_region_lock (); void toggle_region_opaque (); void raise_region (); void raise_region_to_top (); @@ -865,7 +853,6 @@ class Editor : public PublicEditor void align_selection_relative (ARDOUR::RegionPoint point, nframes_t position); void align_region (boost::shared_ptr<ARDOUR::Region>, ARDOUR::RegionPoint point, nframes_t position); void align_region_internal (boost::shared_ptr<ARDOUR::Region>, ARDOUR::RegionPoint point, nframes_t position); - void remove_some_regions (); void remove_clicked_region (); void destroy_clicked_region (); void edit_region (); @@ -898,7 +885,6 @@ class Editor : public PublicEditor void keyboard_paste (); void keyboard_duplicate_region (); void keyboard_duplicate_selection (); - void keyboard_nudge (); void keyboard_insert_region_list_selection (); void region_from_selection (); @@ -912,7 +898,6 @@ class Editor : public PublicEditor void play_from_edit_cursor (); void play_selected_region (); void audition_selected_region (); - void toggle_loop_playback (); void loop_selected_region (); void play_location (ARDOUR::Location&); void loop_location (ARDOUR::Location&); @@ -1030,10 +1015,6 @@ class Editor : public PublicEditor Editing::SnapMode snap_mode; double snap_threshold; - void soundfile_chosen_for_insert (const string & selection, bool split_channels); - void soundfile_chosen_for_embed (const string & selection, bool split_channels); - void soundfile_chosen_for_import (const string & selection, bool split_channels); - void handle_gui_changes (const string &, void *); void hide_all_tracks (bool with_select); @@ -1058,7 +1039,6 @@ class Editor : public PublicEditor std::set<ARDOUR::Playlist*> motion_frozen_playlists; void region_drag_motion_callback (ArdourCanvas::Item*, GdkEvent*); void region_drag_finished_callback (ArdourCanvas::Item*, GdkEvent*); - void region_copy_drag_finished_callback (ArdourCanvas::Item*, GdkEvent*); void cursor_drag_motion_callback (ArdourCanvas::Item*, GdkEvent*); void cursor_drag_finished_callback (ArdourCanvas::Item*, GdkEvent*); @@ -1146,11 +1126,10 @@ class Editor : public PublicEditor bool track_canvas_event (GdkEvent* event, ArdourCanvas::Item*); bool track_canvas_scroll (GdkEventScroll* event); - bool track_canvas_button_press_event (GdkEventButton *); - bool track_canvas_button_release_event (GdkEventButton *); - + Gtk::Allocation canvas_allocation; + bool canvas_idle_queued; void track_canvas_allocate (Gtk::Allocation alloc); - void time_canvas_allocate (Gtk::Allocation alloc); + bool track_canvas_idle (); void set_edit_cursor (GdkEvent* event); void set_playhead_cursor (GdkEvent* event); @@ -1176,7 +1155,6 @@ class Editor : public PublicEditor void handle_new_duration (); void initialize_canvas (); void reset_scrolling_region (Gtk::Allocation* alloc = 0); - void scroll_canvas (); /* display control */ @@ -1302,17 +1280,29 @@ class Editor : public PublicEditor Gtk::ComboBoxText snap_mode_selector; Gtk::HBox snap_box; + std::vector<std::string> snap_type_strings; + std::vector<std::string> snap_mode_strings; + void snap_type_selection_done (); void snap_mode_selection_done (); - + void snap_mode_chosen (Editing::SnapMode); + void snap_type_chosen (Editing::SnapType); + + Glib::RefPtr<Gtk::RadioAction> snap_type_action (Editing::SnapType); + Glib::RefPtr<Gtk::RadioAction> snap_mode_action (Editing::SnapMode); + Gtk::ComboBoxText zoom_focus_selector; - Gtk::VBox zoom_focus_box; + Gtk::VBox zoom_focus_box; + + std::vector<std::string> zoom_focus_strings; void zoom_focus_selection_done (); + void zoom_focus_chosen (Editing::ZoomFocus); + + Glib::RefPtr<Gtk::RadioAction> zoom_focus_action (Editing::ZoomFocus); Gtk::HBox zoom_box; - void update_zoom_indicator (); void zoom_adjustment_changed(); void edit_cursor_clock_changed(); @@ -1333,8 +1323,6 @@ class Editor : public PublicEditor void track_selection_changed (); void region_selection_changed (); void point_selection_changed (); - void audio_track_selection_changed (); - void line_selection_changed (); enum SelectionOp { CreateSelection, @@ -1423,7 +1411,6 @@ class Editor : public PublicEditor Glib::RefPtr<Gtk::ListStore> route_display_model; Glib::RefPtr<Gtk::TreeSelection> route_display_selection; - gint route_list_compare_func (Gtk::TreeModel::iterator, Gtk::TreeModel::iterator); Gtkmm2ext::DnDTreeView<boost::shared_ptr<ARDOUR::Route> > route_list_display; Gtk::ScrolledWindow route_list_scroller; Gtk::Menu* route_list_menu; @@ -1438,7 +1425,6 @@ class Editor : public PublicEditor void route_list_reordered (const Gtk::TreeModel::Path& path, const Gtk::TreeModel::iterator& iter, int* what); bool ignore_route_list_reorder; bool no_route_list_redisplay; - void queue_route_list_reordered (); void build_route_list_menu (); void show_route_list_menu (); @@ -1486,9 +1472,6 @@ class Editor : public PublicEditor void new_edit_group (); void edit_group_list_button_clicked (); gint edit_group_list_button_press_event (GdkEventButton* ev); - void edit_group_selection_changed (); - void fake_add_edit_group (ARDOUR::RouteGroup* group); - void fake_remove_edit_group (ARDOUR::RouteGroup* group); void add_edit_group (ARDOUR::RouteGroup* group); void remove_selected_edit_group (); void edit_groups_changed (); @@ -1605,8 +1588,6 @@ class Editor : public PublicEditor UndoHistory visual_history; UndoTransaction current_visual_command; - void begin_reversible_visual_command (const string & cmd_name); - void commit_reversible_visual_command (); void update_title (); void update_title_s (const string & snapshot_name); @@ -1645,11 +1626,6 @@ class Editor : public PublicEditor void duplicate_dialog (bool for_region); - /* edit menu */ - - Gtk::Menu* edit_menu; - bool edit_menu_map_handler (GdkEventAny*); - nframes_t event_frame (GdkEvent*, double* px = 0, double* py = 0); void time_fx_motion (ArdourCanvas::Item*, GdkEvent*); @@ -1691,6 +1667,7 @@ class Editor : public PublicEditor /* editor-mixer strip */ MixerStrip *current_mixer_strip; + bool show_editor_mixer_when_tracks_arrive; Gtk::VBox current_mixer_strip_vbox; void cms_deleted (); void current_mixer_strip_hidden (); @@ -1751,7 +1728,6 @@ class Editor : public PublicEditor void toggle_xfade_active (ARDOUR::Crossfade*); void toggle_xfade_length (ARDOUR::Crossfade*); void edit_xfade (ARDOUR::Crossfade*); - void remove_xfade (); void xfade_edit_left_region (); void xfade_edit_right_region (); @@ -1797,10 +1773,23 @@ class Editor : public PublicEditor void toggle_gain_envelope_visibility (); void toggle_gain_envelope_active (); + void reset_region_gain_envelopes (); + + Gtk::CheckMenuItem* region_envelope_visible_item; + Gtk::CheckMenuItem* region_envelope_active_item; + Gtk::CheckMenuItem* region_mute_item; + Gtk::CheckMenuItem* region_lock_item; + Gtk::CheckMenuItem* region_opaque_item; bool on_key_press_event (GdkEventKey*); void session_state_saved (string); + + Glib::RefPtr<Gtk::Action> undo_action; + Glib::RefPtr<Gtk::Action> redo_action; + + void history_changed (); + }; #endif /* __ardour_editor_h__ */ diff --git a/gtk2_ardour/editor_actions.cc b/gtk2_ardour/editor_actions.cc index 0485f4cc8a..a55aee6232 100644 --- a/gtk2_ardour/editor_actions.cc +++ b/gtk2_ardour/editor_actions.cc @@ -40,7 +40,7 @@ Editor::register_actions () ActionManager::register_action (editor_actions, X_("Monitoring"), _("Monitoring")); ActionManager::register_action (editor_actions, X_("Autoconnect"), _("Autoconnect")); ActionManager::register_action (editor_actions, X_("Layering"), _("Layering")); - ActionManager::register_action (editor_actions, X_("SMPTE"), _("SMPTE fps")); + ActionManager::register_action (editor_actions, X_("Timecode"), _("Timecode fps")); ActionManager::register_action (editor_actions, X_("Pullup"), _("Pullup / Pulldown")); ActionManager::register_action (editor_actions, X_("addExistingAudioFiles"), _("Add Existing Audio")); @@ -201,9 +201,9 @@ Editor::register_actions () act = ActionManager::register_action (editor_actions, "set-region-sync-position", _("Set Region Sync Position"), mem_fun(*this, &Editor::kbd_set_sync_position)); ActionManager::session_sensitive_actions.push_back (act); - act = ActionManager::register_action (editor_actions, "undo", _("Undo"), bind (mem_fun(*this, &Editor::undo), 1U)); + undo_action = act = ActionManager::register_action (editor_actions, "undo", _("Undo"), bind (mem_fun(*this, &Editor::undo), 1U)); ActionManager::session_sensitive_actions.push_back (act); - act = ActionManager::register_action (editor_actions, "redo", _("Redo"), bind (mem_fun(*this, &Editor::redo), 1U)); + redo_action = act = ActionManager::register_action (editor_actions, "redo", _("Redo"), bind (mem_fun(*this, &Editor::redo), 1U)); ActionManager::session_sensitive_actions.push_back (act); act = ActionManager::register_action (editor_actions, "export-session", _("Export Session"), mem_fun(*this, &Editor::export_session)); @@ -258,15 +258,15 @@ Editor::register_actions () Glib::RefPtr<ActionGroup> zoom_actions = ActionGroup::create (X_("Zoom")); RadioAction::Group zoom_group; - ActionManager::register_radio_action (zoom_actions, zoom_group, "zoom-focus-left", _("Zoom Focus Left"), bind (mem_fun(*this, &Editor::set_zoom_focus), Editing::ZoomFocusLeft)); + ActionManager::register_radio_action (zoom_actions, zoom_group, "zoom-focus-left", _("Zoom Focus Left"), bind (mem_fun(*this, &Editor::zoom_focus_chosen), Editing::ZoomFocusLeft)); ActionManager::session_sensitive_actions.push_back (act); - ActionManager::register_radio_action (zoom_actions, zoom_group, "zoom-focus-right", _("Zoom Focus Right"), bind (mem_fun(*this, &Editor::set_zoom_focus), Editing::ZoomFocusRight)); + ActionManager::register_radio_action (zoom_actions, zoom_group, "zoom-focus-right", _("Zoom Focus Right"), bind (mem_fun(*this, &Editor::zoom_focus_chosen), Editing::ZoomFocusRight)); ActionManager::session_sensitive_actions.push_back (act); - ActionManager::register_radio_action (zoom_actions, zoom_group, "zoom-focus-center", _("Zoom Focus Center"), bind (mem_fun(*this, &Editor::set_zoom_focus), Editing::ZoomFocusCenter)); + ActionManager::register_radio_action (zoom_actions, zoom_group, "zoom-focus-center", _("Zoom Focus Center"), bind (mem_fun(*this, &Editor::zoom_focus_chosen), Editing::ZoomFocusCenter)); ActionManager::session_sensitive_actions.push_back (act); - ActionManager::register_radio_action (zoom_actions, zoom_group, "zoom-focus-playhead", _("Zoom Focus Playhead"), bind (mem_fun(*this, &Editor::set_zoom_focus), Editing::ZoomFocusPlayhead)); + ActionManager::register_radio_action (zoom_actions, zoom_group, "zoom-focus-playhead", _("Zoom Focus Playhead"), bind (mem_fun(*this, &Editor::zoom_focus_chosen), Editing::ZoomFocusPlayhead)); ActionManager::session_sensitive_actions.push_back (act); - ActionManager::register_radio_action (zoom_actions, zoom_group, "zoom-focus-edit", _("Zoom Focus Edit"), bind (mem_fun(*this, &Editor::set_zoom_focus), Editing::ZoomFocusEdit)); + ActionManager::register_radio_action (zoom_actions, zoom_group, "zoom-focus-edit", _("Zoom Focus Edit"), bind (mem_fun(*this, &Editor::zoom_focus_chosen), Editing::ZoomFocusEdit)); ActionManager::session_sensitive_actions.push_back (act); Glib::RefPtr<ActionGroup> mouse_mode_actions = ActionGroup::create (X_("MouseMode")); @@ -278,31 +278,36 @@ Editor::register_actions () ActionManager::register_radio_action (mouse_mode_actions, mouse_mode_group, "set-mouse-mode-zoom", _("Zoom Tool"), bind (mem_fun(*this, &Editor::set_mouse_mode), Editing::MouseZoom, false)); ActionManager::register_radio_action (mouse_mode_actions, mouse_mode_group, "set-mouse-mode-timefx", _("Timefx Tool"), bind (mem_fun(*this, &Editor::set_mouse_mode), Editing::MouseTimeFX, false)); + ActionManager::register_action (editor_actions, X_("SnapTo"), _("Snap To")); + ActionManager::register_action (editor_actions, X_("SnapMode"), _("Snap Mode")); + + RadioAction::Group snap_mode_group; + ActionManager::register_radio_action (editor_actions, snap_mode_group, X_("snap-normal"), _("Normal"), (bind (mem_fun(*this, &Editor::snap_mode_chosen), Editing::SnapNormal))); + ActionManager::register_radio_action (editor_actions, snap_mode_group, X_("snap-magnetic"), _("Magnetic"), (bind (mem_fun(*this, &Editor::snap_mode_chosen), Editing::SnapMagnetic))); + Glib::RefPtr<ActionGroup> snap_actions = ActionGroup::create (X_("Snap")); RadioAction::Group snap_choice_group; - ActionManager::register_action (editor_actions, X_("SnapTo"), _("Snap To")); - - ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-frame"), _("Snap to frame"), (bind (mem_fun(*this, &Editor::set_snap_to), Editing::SnapToFrame))); - ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-cd-frame"), _("Snap to cd frame"), (bind (mem_fun(*this, &Editor::set_snap_to), Editing::SnapToCDFrame))); - ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-smpte-frame"), _("Snap to SMPTE frame"), (bind (mem_fun(*this, &Editor::set_snap_to), Editing::SnapToSMPTEFrame))); - ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-smpte-seconds"), _("Snap to SMPTE seconds"), (bind (mem_fun(*this, &Editor::set_snap_to), Editing::SnapToSMPTESeconds))); - ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-smpte-minutes"), _("Snap to SMPTE minutes"), (bind (mem_fun(*this, &Editor::set_snap_to), Editing::SnapToSMPTEMinutes))); - ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-seconds"), _("Snap to seconds"), (bind (mem_fun(*this, &Editor::set_snap_to), Editing::SnapToSeconds))); - ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-minutes"), _("Snap to minutes"), (bind (mem_fun(*this, &Editor::set_snap_to), Editing::SnapToMinutes))); - ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-thirtyseconds"), _("Snap to thirtyseconds"), (bind (mem_fun(*this, &Editor::set_snap_to), Editing::SnapToAThirtysecondBeat))); - ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-asixteenthbeat"), _("Snap to asixteenthbeat"), (bind (mem_fun(*this, &Editor::set_snap_to), Editing::SnapToASixteenthBeat))); - ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-eighths"), _("Snap to eighths"), (bind (mem_fun(*this, &Editor::set_snap_to), Editing::SnapToAEighthBeat))); - ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-quarters"), _("Snap to quarters"), (bind (mem_fun(*this, &Editor::set_snap_to), Editing::SnapToAQuarterBeat))); - ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-thirds"), _("Snap to thirds"), (bind (mem_fun(*this, &Editor::set_snap_to), Editing::SnapToAThirdBeat))); - ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-beat"), _("Snap to beat"), (bind (mem_fun(*this, &Editor::set_snap_to), Editing::SnapToBeat))); - ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-bar"), _("Snap to bar"), (bind (mem_fun(*this, &Editor::set_snap_to), Editing::SnapToBar))); - ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-mark"), _("Snap to mark"), (bind (mem_fun(*this, &Editor::set_snap_to), Editing::SnapToMark))); - ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-edit-cursor"), _("Snap to edit cursor"), (bind (mem_fun(*this, &Editor::set_snap_to), Editing::SnapToEditCursor))); - ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-region-start"), _("Snap to region start"), (bind (mem_fun(*this, &Editor::set_snap_to), Editing::SnapToRegionStart))); - ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-region-end"), _("Snap to region end"), (bind (mem_fun(*this, &Editor::set_snap_to), Editing::SnapToRegionEnd))); - ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-region-sync"), _("Snap to region sync"), (bind (mem_fun(*this, &Editor::set_snap_to), Editing::SnapToRegionSync))); - ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-region-boundary"), _("Snap to region boundary"), (bind (mem_fun(*this, &Editor::set_snap_to), Editing::SnapToRegionBoundary))); + ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-frame"), _("Snap to frame"), (bind (mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToFrame))); + ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-cd-frame"), _("Snap to cd frame"), (bind (mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToCDFrame))); + ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-smpte-frame"), _("Snap to SMPTE frame"), (bind (mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToSMPTEFrame))); + ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-smpte-seconds"), _("Snap to SMPTE seconds"), (bind (mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToSMPTESeconds))); + ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-smpte-minutes"), _("Snap to SMPTE minutes"), (bind (mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToSMPTEMinutes))); + ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-seconds"), _("Snap to seconds"), (bind (mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToSeconds))); + ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-minutes"), _("Snap to minutes"), (bind (mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToMinutes))); + ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-thirtyseconds"), _("Snap to thirtyseconds"), (bind (mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToAThirtysecondBeat))); + ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-asixteenthbeat"), _("Snap to asixteenthbeat"), (bind (mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToASixteenthBeat))); + ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-eighths"), _("Snap to eighths"), (bind (mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToAEighthBeat))); + ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-quarters"), _("Snap to quarters"), (bind (mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToAQuarterBeat))); + ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-thirds"), _("Snap to thirds"), (bind (mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToAThirdBeat))); + ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-beat"), _("Snap to beat"), (bind (mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToBeat))); + ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-bar"), _("Snap to bar"), (bind (mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToBar))); + ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-mark"), _("Snap to mark"), (bind (mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToMark))); + ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-edit-cursor"), _("Snap to edit cursor"), (bind (mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToEditCursor))); + ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-region-start"), _("Snap to region start"), (bind (mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToRegionStart))); + ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-region-end"), _("Snap to region end"), (bind (mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToRegionEnd))); + ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-region-sync"), _("Snap to region sync"), (bind (mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToRegionSync))); + ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-region-boundary"), _("Snap to region boundary"), (bind (mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToRegionBoundary))); /* REGION LIST */ @@ -625,6 +630,206 @@ Editor::set_layer_model (LayerModel model) } } +RefPtr<RadioAction> +Editor::snap_type_action (SnapType type) +{ + + const char* action = 0; + RefPtr<Action> act; + + switch (type) { + case Editing::SnapToFrame: + action = "snap-to-frame"; + break; + case Editing::SnapToCDFrame: + action = "snap-to-cd-frame"; + break; + case Editing::SnapToSMPTEFrame: + action = "snap-to-smpte-frame"; + break; + case Editing::SnapToSMPTESeconds: + action = "snap-to-smpte-seconds"; + break; + case Editing::SnapToSMPTEMinutes: + action = "snap-to-smpte-minutes"; + break; + case Editing::SnapToSeconds: + action = "snap-to-seconds"; + break; + case Editing::SnapToMinutes: + action = "snap-to-minutes"; + break; + case Editing::SnapToAThirtysecondBeat: + action = "snap-to-thirtyseconds"; + break; + case Editing::SnapToASixteenthBeat: + action = "snap-to-asixteenthbeat"; + break; + case Editing::SnapToAEighthBeat: + action = "snap-to-eighths"; + break; + case Editing::SnapToAQuarterBeat: + action = "snap-to-quarters"; + break; + case Editing::SnapToAThirdBeat: + action = "snap-to-thirds"; + break; + case Editing::SnapToBeat: + action = "snap-to-beat"; + break; + case Editing::SnapToBar: + action = "snap-to-bar"; + break; + case Editing::SnapToMark: + action = "snap-to-mark"; + break; + case Editing::SnapToEditCursor: + action = "snap-to-edit-cursor"; + break; + case Editing::SnapToRegionStart: + action = "snap-to-region-start"; + break; + case Editing::SnapToRegionEnd: + action = "snap-to-region-end"; + break; + case Editing::SnapToRegionSync: + action = "snap-to-region-sync"; + break; + case Editing::SnapToRegionBoundary: + action = "snap-to-region-boundary"; + break; + default: + fatal << string_compose (_("programming error: %1: %2"), "Editor: impossible snap-to type", (int) type) << endmsg; + /*NOTREACHED*/ + } + + act = ActionManager::get_action (X_("Snap"), action); + + if (act) { + RefPtr<RadioAction> ract = RefPtr<RadioAction>::cast_dynamic(act); + return ract; + + } else { + error << string_compose (_("programming error: %1"), "Editor::snap_type_chosen could not find action to match type.") << endmsg; + return RefPtr<RadioAction>(); + } +} + +void +Editor::snap_type_chosen (SnapType type) +{ + /* this is driven by a toggle on a radio group, and so is invoked twice, + once for the item that became inactive and once for the one that became + active. + */ + + RefPtr<RadioAction> ract = snap_type_action (type); + + if (ract && ract->get_active()) { + set_snap_to (type); + } +} + +RefPtr<RadioAction> +Editor::snap_mode_action (SnapMode mode) +{ + const char* action = 0; + RefPtr<Action> act; + + switch (mode) { + case Editing::SnapNormal: + action = X_("snap-normal"); + break; + case Editing::SnapMagnetic: + action = X_("snap-magnetic"); + break; + default: + fatal << string_compose (_("programming error: %1: %2"), "Editor: impossible snap mode type", (int) mode) << endmsg; + /*NOTREACHED*/ + } + + act = ActionManager::get_action (X_("Editor"), action); + + if (act) { + RefPtr<RadioAction> ract = RefPtr<RadioAction>::cast_dynamic(act); + return ract; + + } else { + error << string_compose (_("programming error: %1: %2"), "Editor::snap_mode_chosen could not find action to match mode.", action) << endmsg; + return RefPtr<RadioAction> (); + } +} + +void +Editor::snap_mode_chosen (SnapMode mode) +{ + /* this is driven by a toggle on a radio group, and so is invoked twice, + once for the item that became inactive and once for the one that became + active. + */ + + RefPtr<RadioAction> ract = snap_mode_action (mode); + + if (ract && ract->get_active()) { + set_snap_mode (mode); + } +} + + +RefPtr<RadioAction> +Editor::zoom_focus_action (ZoomFocus focus) +{ + const char* action = 0; + RefPtr<Action> act; + + switch (focus) { + case ZoomFocusLeft: + action = X_("zoom-focus-left"); + break; + case ZoomFocusRight: + action = X_("zoom-focus-right"); + break; + case ZoomFocusCenter: + action = X_("zoom-focus-center"); + break; + case ZoomFocusPlayhead: + action = X_("zoom-focus-playhead"); + break; + case ZoomFocusEdit: + action = X_("zoom-focus-edit"); + break; + default: + fatal << string_compose (_("programming error: %1: %2"), "Editor: impossible focus type", (int) focus) << endmsg; + /*NOTREACHED*/ + } + + act = ActionManager::get_action (X_("Zoom"), action); + + if (act) { + RefPtr<RadioAction> ract = RefPtr<RadioAction>::cast_dynamic(act); + return ract; + } else { + error << string_compose (_("programming error: %1: %2"), "Editor::zoom_focus_action could not find action to match focus.", action) << endmsg; + } + + return RefPtr<RadioAction> (); +} + +void +Editor::zoom_focus_chosen (ZoomFocus focus) +{ + /* this is driven by a toggle on a radio group, and so is invoked twice, + once for the item that became inactive and once for the one that became + active. + */ + + RefPtr<RadioAction> ract = zoom_focus_action (focus); + + if (ract && ract->get_active()) { + set_zoom_focus (focus); + } +} + void Editor::smpte_fps_chosen (Session::SmpteFormat format) { diff --git a/gtk2_ardour/editor_audio_import.cc b/gtk2_ardour/editor_audio_import.cc index eb232ff802..426ff57a2a 100644 --- a/gtk2_ardour/editor_audio_import.cc +++ b/gtk2_ardour/editor_audio_import.cc @@ -270,7 +270,11 @@ Editor::embed_sndfile (Glib::ustring path, bool split, bool multiple_files, bool idspec += string_compose(":%1", n); try { - source = boost::dynamic_pointer_cast<AudioFileSource> (SourceFactory::createReadable (DataType::AUDIO, *session, idspec, (mode == ImportAsTrack ? AudioFileSource::Destructive : AudioFileSource::Flag (0)))); + source = boost::dynamic_pointer_cast<AudioFileSource> (SourceFactory::createReadable + (DataType::AUDIO, *session, idspec, + (mode == ImportAsTapeTrack ? + AudioFileSource::Destructive : + AudioFileSource::Flag (0)))); sources.push_back(source); } @@ -285,7 +289,11 @@ Editor::embed_sndfile (Glib::ustring path, bool split, bool multiple_files, bool if (sources.empty()) { goto out; } - + + if (sources[0]->natural_position() != 0) { + pos = sources[0]->natural_position(); + } + region_name = PBD::basename_nosuffix (path); region_name += "-0"; diff --git a/gtk2_ardour/editor_canvas.cc b/gtk2_ardour/editor_canvas.cc index 2d854a384b..07fe56573d 100644 --- a/gtk2_ardour/editor_canvas.cc +++ b/gtk2_ardour/editor_canvas.cc @@ -275,9 +275,32 @@ Editor::initialize_canvas () void Editor::track_canvas_allocate (Gtk::Allocation alloc) { + canvas_allocation = alloc; - canvas_width = alloc.get_width(); - canvas_height = alloc.get_height(); + if (!initial_ruler_update_required) { + if (!canvas_idle_queued) { + /* call this first so that we do stuff before any pending redraw */ + Glib::signal_idle().connect (mem_fun (*this, &Editor::track_canvas_idle), false); + canvas_idle_queued = true; + } + return; + } + + initial_ruler_update_required = false; + + track_canvas_idle (); +} + +bool +Editor::track_canvas_idle () +{ + + if (canvas_idle_queued) { + canvas_idle_queued = false; + } + + canvas_width = canvas_allocation.get_width(); + canvas_height = canvas_allocation.get_height(); zoom_range_clock.set ((nframes_t) floor ((canvas_width * frames_per_unit))); edit_cursor->set_position (edit_cursor->current_frame); @@ -319,18 +342,12 @@ Editor::track_canvas_allocate (Gtk::Allocation alloc) transport_punchout_line->property_y2() = canvas_height; } - if (is_visible() && initial_ruler_update_required) { - /* - this is really dumb, but signal_size_allocate() gets emitted intermittently - depending on whether the canvas contents are visible or not. - we only want to do this once - */ - update_fixed_rulers(); - tempo_map_changed (Change (0)); - initial_ruler_update_required = false; - } + update_fixed_rulers(); + tempo_map_changed (Change (0)); Resized (); /* EMIT_SIGNAL */ + + return false; } void diff --git a/gtk2_ardour/editor_markers.cc b/gtk2_ardour/editor_markers.cc index 46383149a3..6da479bafe 100644 --- a/gtk2_ardour/editor_markers.cc +++ b/gtk2_ardour/editor_markers.cc @@ -925,7 +925,7 @@ Editor::update_loop_range_view (bool visibility) Location* tll; - if (Config->get_auto_loop() && ((tll = transport_loop_location()) != 0)) { + if (session->get_play_loop() && ((tll = transport_loop_location()) != 0)) { double x1 = frame_to_pixel (tll->start()); double x2 = frame_to_pixel (tll->end()); diff --git a/gtk2_ardour/editor_mixer.cc b/gtk2_ardour/editor_mixer.cc index da09a95688..8b100afae5 100644 --- a/gtk2_ardour/editor_mixer.cc +++ b/gtk2_ardour/editor_mixer.cc @@ -49,15 +49,18 @@ Editor::cms_deleted () void Editor::show_editor_mixer (bool yn) { + show_editor_mixer_when_tracks_arrive = false; + if (yn) { if (current_mixer_strip == 0) { if (selection->tracks.empty()) { - if (track_views.empty()) { + if (track_views.empty()) { + show_editor_mixer_when_tracks_arrive = true; return; - } + } for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) { AudioTimeAxisView* atv; diff --git a/gtk2_ardour/editor_mouse.cc b/gtk2_ardour/editor_mouse.cc index e3954f00de..76357070a7 100644 --- a/gtk2_ardour/editor_mouse.cc +++ b/gtk2_ardour/editor_mouse.cc @@ -317,14 +317,14 @@ Editor::button_selection (ArdourCanvas::Item* item, GdkEvent* event, ItemType it switch (item_type) { case RegionItem: - c1 = set_selected_track_from_click (press, op, true, true); + c1 = set_selected_track_from_click (op, true); c2 = set_selected_regionview_from_click (press, op, true); commit = (c1 || c2); break; case RegionViewNameHighlight: case RegionViewName: - c1 = set_selected_track_from_click (press, op, true, true); + c1 = set_selected_track_from_click (op, true); c2 = set_selected_regionview_from_click (press, op, true); commit = (c1 || c2); break; @@ -332,17 +332,17 @@ Editor::button_selection (ArdourCanvas::Item* item, GdkEvent* event, ItemType it case GainAutomationControlPointItem: case PanAutomationControlPointItem: case RedirectAutomationControlPointItem: - c1 = set_selected_track_from_click (press, op, true, true); - c2 = set_selected_control_point_from_click (press, op, false); + c1 = set_selected_track_from_click (op, true); + c2 = set_selected_control_point_from_click (op, false); commit = (c1 || c2); break; case StreamItem: - commit = set_selected_track_from_click (press, op, true, true); + commit = set_selected_track_from_click (op, true); break; case AutomationTrackItem: - commit = set_selected_track_from_click (press, op, true, true); + commit = set_selected_track_from_click (op, true); break; default: @@ -361,7 +361,7 @@ Editor::button_selection (ArdourCanvas::Item* item, GdkEvent* event, ItemType it case StreamItem: case RegionItem: case AutomationTrackItem: - commit = set_selected_track_from_click (press, op, true, true); + commit = set_selected_track_from_click (op, true); break; default: @@ -1819,12 +1819,13 @@ Editor::fade_in_drag_finished_callback (ArdourCanvas::Item* item, GdkEvent* even } begin_reversible_command (_("change fade in length")); - XMLNode &before = arv->audio_region()->get_state(); + AutomationList& alist = arv->audio_region()->fade_in(); + XMLNode &before = alist.get_state(); arv->audio_region()->set_fade_in_length (fade_length); - XMLNode &after = arv->audio_region()->get_state(); - session->add_command(new MementoCommand<ARDOUR::AudioRegion>(*arv->audio_region().get(), &before, &after)); + XMLNode &after = alist.get_state(); + session->add_command(new MementoCommand<AutomationList>(alist, &before, &after)); commit_reversible_command (); fade_in_drag_motion_callback (item, event); } @@ -1914,12 +1915,13 @@ Editor::fade_out_drag_finished_callback (ArdourCanvas::Item* item, GdkEvent* eve } begin_reversible_command (_("change fade out length")); - XMLNode &before = arv->region()->get_state(); + AutomationList& alist = arv->audio_region()->fade_out(); + XMLNode &before = alist.get_state(); arv->audio_region()->set_fade_out_length (fade_length); - XMLNode &after = arv->region()->get_state(); - session->add_command(new MementoCommand<ARDOUR::Region>(*arv->region().get(), &before, &after)); + XMLNode &after = alist.get_state(); + session->add_command(new MementoCommand<AutomationList>(alist, &before, &after)); commit_reversible_command (); fade_out_drag_motion_callback (item, event); diff --git a/gtk2_ardour/editor_ops.cc b/gtk2_ardour/editor_ops.cc index 7122d4663c..93e90f4c2c 100644 --- a/gtk2_ardour/editor_ops.cc +++ b/gtk2_ardour/editor_ops.cc @@ -162,9 +162,9 @@ Editor::remove_clicked_region () void Editor::destroy_clicked_region () { - int32_t selected = selection->regions.size(); + uint32_t selected = selection->regions.size(); - if (!session || clicked_regionview == 0 && selected == 0) { + if (!session || !selected) { return; } @@ -191,7 +191,7 @@ Do you really want to destroy %1 ?"), return; } - if (selected > 0) { + if (selected) { list<boost::shared_ptr<Region> > r; for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) { @@ -199,9 +199,6 @@ Do you really want to destroy %1 ?"), } session->destroy_regions (r); - - } else if (clicked_regionview) { - session->destroy_region (clicked_regionview->region()); } } @@ -1088,7 +1085,7 @@ Editor::temporal_zoom (gdouble fpu) case ZoomFocusEdit: /* try to keep the edit cursor in the center */ - if (edit_cursor->current_frame > leftmost_frame + (new_page/2)) { + if (edit_cursor->current_frame > new_page/2) { leftmost_after_zoom = edit_cursor->current_frame - (new_page/2); } else { leftmost_after_zoom = 0; @@ -1275,6 +1272,9 @@ Editor::select_all_in_track (Selection::Operation op) case Selection::Extend: /* not defined yet */ break; + case Selection::Add: + selection->add (touched); + break; } } @@ -1291,6 +1291,7 @@ Editor::select_all (Selection::Operation op) } begin_reversible_command (_("select all")); switch (op) { + case Selection::Add: case Selection::Toggle: selection->add (touched); break; @@ -1348,6 +1349,7 @@ Editor::select_all_within (nframes_t start, nframes_t end, double top, double bo begin_reversible_command (_("select all within")); switch (op) { + case Selection::Add: case Selection::Toggle: cerr << "toggle\n"; selection->add (touched); @@ -1840,7 +1842,7 @@ Editor::toggle_playback (bool with_abort) if (session->transport_rolling()) { session->request_stop (with_abort); - if (Config->get_auto_loop()) { + if (session->get_play_loop()) { session->request_play_loop (false); } } else { @@ -1855,6 +1857,12 @@ Editor::play_from_start () } void +Editor::play_from_edit_cursor () +{ + session->request_locate (edit_cursor->current_frame, true); +} + +void Editor::play_selection () { if (selection->time.empty()) { @@ -1922,28 +1930,6 @@ Editor::loop_location (Location& location) } } -void -Editor::toggle_region_mute () -{ - if (clicked_regionview) { - clicked_regionview->region()->set_muted (!clicked_regionview->region()->muted()); - } else if (!selection->regions.empty()) { - bool yn = ! (*selection->regions.begin())->region()->muted(); - selection->foreach_region (&Region::set_muted, yn); - } -} - -void -Editor::toggle_region_opaque () -{ - if (clicked_regionview) { - clicked_regionview->region()->set_opaque (!clicked_regionview->region()->opaque()); - } else if (!selection->regions.empty()) { - bool yn = ! (*selection->regions.begin())->region()->opaque(); - selection->foreach_region (&Region::set_opaque, yn); - } -} - void Editor::raise_region () { @@ -3340,7 +3326,7 @@ Editor::normalize_region () continue; XMLNode &before = arv->region()->get_state(); arv->audio_region()->normalize_to (0.0f); - // session->add_command (new MementoCommand<Region>(*(arv->region().get()), &before, &arv->region()->get_state())); + session->add_command (new MementoCommand<Region>(*(arv->region().get()), &before, &arv->region()->get_state())); } commit_reversible_command (); @@ -3489,12 +3475,39 @@ Editor::brush (nframes_t pos) } void +Editor::reset_region_gain_envelopes () +{ + if (!session || selection->regions.empty()) { + return; + } + + session->begin_reversible_command (_("reset region gain")); + + for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) { + AudioRegionView* const arv = dynamic_cast<AudioRegionView*>(*i); + if (arv) { + AutomationList& alist (arv->audio_region()->envelope()); + XMLNode& before (alist.get_state()); + + arv->audio_region()->set_default_envelope (); + session->add_command (new MementoCommand<AutomationList>(arv->audio_region()->envelope(), &before, &alist.get_state())); + } + } + + session->commit_reversible_command (); +} + +void Editor::toggle_gain_envelope_visibility () { for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) { AudioRegionView* const arv = dynamic_cast<AudioRegionView*>(*i); - if (arv) - arv->set_envelope_visible (!arv->envelope_visible()); + if (arv) { + bool x = region_envelope_visible_item->get_active(); + if (x != arv->envelope_visible()) { + arv->set_envelope_visible (x); + } + } } } @@ -3503,7 +3516,53 @@ Editor::toggle_gain_envelope_active () { for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) { AudioRegionView* const arv = dynamic_cast<AudioRegionView*>(*i); - if (arv) - arv->audio_region()->set_envelope_active (true); + if (arv) { + bool x = region_envelope_active_item->get_active(); + if (x != arv->audio_region()->envelope_active()) { + arv->audio_region()->set_envelope_active (x); + } + } + } +} + +void +Editor::toggle_region_lock () +{ + for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) { + AudioRegionView* const arv = dynamic_cast<AudioRegionView*>(*i); + if (arv) { + bool x = region_lock_item->get_active(); + if (x != arv->audio_region()->locked()) { + arv->audio_region()->set_locked (x); + } + } + } +} + +void +Editor::toggle_region_mute () +{ + for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) { + AudioRegionView* const arv = dynamic_cast<AudioRegionView*>(*i); + if (arv) { + bool x = region_mute_item->get_active(); + if (x != arv->audio_region()->muted()) { + arv->audio_region()->set_muted (x); + } + } + } +} + +void +Editor::toggle_region_opaque () +{ + for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) { + AudioRegionView* const arv = dynamic_cast<AudioRegionView*>(*i); + if (arv) { + bool x = region_opaque_item->get_active(); + if (x != arv->audio_region()->opaque()) { + arv->audio_region()->set_opaque (x); + } + } } } diff --git a/gtk2_ardour/editor_region_list.cc b/gtk2_ardour/editor_region_list.cc index 1e75437db2..b30a3092ec 100644 --- a/gtk2_ardour/editor_region_list.cc +++ b/gtk2_ardour/editor_region_list.cc @@ -48,22 +48,27 @@ using namespace Glib; using namespace Editing; void -Editor::handle_region_removed (boost::shared_ptr<Region> region) +Editor::handle_region_removed (boost::weak_ptr<Region> wregion) { - ENSURE_GUI_THREAD (bind (mem_fun (*this, &Editor::handle_region_removed), region)); + ENSURE_GUI_THREAD (bind (mem_fun (*this, &Editor::handle_region_removed), wregion)); redisplay_regions (); } void -Editor::handle_new_region (boost::shared_ptr<Region> region) +Editor::handle_new_region (boost::weak_ptr<Region> wregion) { - ENSURE_GUI_THREAD (bind (mem_fun (*this, &Editor::handle_new_region), region)); + ENSURE_GUI_THREAD (bind (mem_fun (*this, &Editor::handle_new_region), wregion)); /* don't copy region - the one we are being notified about belongs to the session, and so it will never be edited. */ - add_region_to_region_display (region); + + boost::shared_ptr<Region> region (wregion.lock()); + + if (region) { + add_region_to_region_display (region); + } } void diff --git a/gtk2_ardour/editor_route_list.cc b/gtk2_ardour/editor_route_list.cc index 512e2ecef1..06bf7da625 100644 --- a/gtk2_ardour/editor_route_list.cc +++ b/gtk2_ardour/editor_route_list.cc @@ -118,6 +118,10 @@ Editor::handle_new_route (Session::RouteList& routes) tv->GoingAway.connect (bind (mem_fun(*this, &Editor::remove_route), tv)); } + if (show_editor_mixer_when_tracks_arrive) { + show_editor_mixer (true); + } + editor_mixer_button.set_sensitive(true); } diff --git a/gtk2_ardour/editor_rulers.cc b/gtk2_ardour/editor_rulers.cc index ecf7f0b263..9834ce16db 100644 --- a/gtk2_ardour/editor_rulers.cc +++ b/gtk2_ardour/editor_rulers.cc @@ -138,6 +138,34 @@ Editor::ruler_button_press (GdkEventButton* ev) ruler_grabbed_widget = grab_widget; } + gint x,y; + Gdk::ModifierType state; + + /* need to use the correct x,y, the event lies */ + time_canvas_event_box.get_window()->get_pointer (x, y, state); + + nframes_t where = leftmost_frame + pixel_to_frame (x); + + switch (ev->button) { + case 1: + /* transport playhead */ + snap_to (where); + session->request_locate (where); + break; + + case 2: + /* edit cursor */ + if (snap_type != Editing::SnapToEditCursor) { + snap_to (where); + } + edit_cursor->set_position (where); + edit_cursor_clock.set (where); + break; + + default: + break; + } + return TRUE; } @@ -150,7 +178,6 @@ Editor::ruler_button_release (GdkEventButton* ev) /* need to use the correct x,y, the event lies */ time_canvas_event_box.get_window()->get_pointer (x, y, state); - ruler_pressed_button = 0; if (session == 0) { @@ -345,7 +372,7 @@ Editor::popup_ruler_menu (nframes_t where, ItemType t) mitem->set_active(true); } - ruler_items.push_back (CheckMenuElem (X_("SMPTE"), bind (mem_fun(*this, &Editor::ruler_toggled), (int)ruler_metric_smpte))); + ruler_items.push_back (CheckMenuElem (X_("Timecode"), bind (mem_fun(*this, &Editor::ruler_toggled), (int)ruler_metric_smpte))); mitem = (CheckMenuItem *) &ruler_items.back(); if (ruler_shown[ruler_metric_smpte]) { mitem->set_active(true); @@ -1043,13 +1070,12 @@ Editor::metric_get_bbt (GtkCustomRulerMark **marks, gdouble lower, gdouble upper uint32_t magic_accent_number = 1; gint nmarks; char buf[64]; - gint n; + gint n = 0; nframes_t pos; bool bar_helper_on = true; BBT_Time next_beat; nframes_t next_beat_pos; - nframes_t ilower = (nframes_t) floor (lower); if ((desirable_marks = maxchars / 7) == 0) { return 0; @@ -1091,7 +1117,7 @@ Editor::metric_get_bbt (GtkCustomRulerMark **marks, gdouble lower, gdouble upper beats = current_bbt_points->size() - bars; /*Only show the bar helper if there aren't many bars on the screen */ - if (bars > 2) { + if (bars > 1) { bar_helper_on = false; } @@ -1108,11 +1134,12 @@ Editor::metric_get_bbt (GtkCustomRulerMark **marks, gdouble lower, gdouble upper double position_of_helper; bool i_am_accented = false; bool we_need_ticks = false; + bool helper_active = false; - position_of_helper = ilower + (30 * Editor::get_current_zoom ()); + position_of_helper = lower + (30 * Editor::get_current_zoom ()); if (desirable_marks >= (beats)) { - nmarks = ((beats + 1) * bbt_beat_subdivision) + 1; + nmarks = (beats * bbt_beat_subdivision) + 1; we_need_ticks = true; } else { nmarks = beats + 1; @@ -1121,19 +1148,23 @@ Editor::metric_get_bbt (GtkCustomRulerMark **marks, gdouble lower, gdouble upper *marks = (GtkCustomRulerMark *) g_malloc (sizeof(GtkCustomRulerMark) * nmarks); (*marks)[0].label = g_strdup(" "); - (*marks)[0].position = ilower; + (*marks)[0].position = lower; (*marks)[0].style = GtkCustomRulerMarkMicro; - for (n = 1, i = current_bbt_points->begin(); n < nmarks && i != current_bbt_points->end(); i++) { + for (n = 1, i = current_bbt_points->begin(); n < nmarks && i != current_bbt_points->end(); ++i) { - if ((*i).frame < ilower && (bar_helper_on)) { + if ((*i).frame < lower && (bar_helper_on)) { snprintf (buf, sizeof(buf), "<%" PRIu32 "|%" PRIu32, (*i).bar, (*i).beat); (*marks)[0].label = g_strdup (buf); + helper_active = true; } else { if ((*i).type == TempoMap::Bar) { - (((*i).frame < position_of_helper) && bar_helper_on) ? - snprintf (buf, sizeof(buf), " ") : snprintf (buf, sizeof(buf), "%" PRIu32, (*i).bar); + if (((*i).frame < position_of_helper) && helper_active) { + snprintf (buf, sizeof(buf), " "); + } else { + snprintf (buf, sizeof(buf), "%" PRIu32, (*i).bar); + } (*marks)[n].label = g_strdup (buf); (*marks)[n].position = (*i).frame; (*marks)[n].style = GtkCustomRulerMarkMajor; @@ -1157,7 +1188,7 @@ Editor::metric_get_bbt (GtkCustomRulerMark **marks, gdouble lower, gdouble upper /* Add the tick marks */ - if (we_need_ticks && (*i).type != TempoMap::Bar) { + if (we_need_ticks && (*i).type == TempoMap::Beat) { /* Find the next beat */ @@ -1225,14 +1256,14 @@ Editor::metric_get_bbt (GtkCustomRulerMark **marks, gdouble lower, gdouble upper /* we're in bar land */ - if (desirable_marks < (uint32_t) (bars / 256)) { + if (desirable_marks < (bars / 256)) { nmarks = 1; *marks = (GtkCustomRulerMark *) g_malloc (sizeof(GtkCustomRulerMark) * nmarks); snprintf (buf, sizeof(buf), "too many bars... (currently %" PRIu32 ")", bars ); (*marks)[0].style = GtkCustomRulerMarkMajor; (*marks)[0].label = g_strdup (buf); - (*marks)[0].position = ilower; - } else if (desirable_marks < (uint32_t) (nmarks = (gint) (bars / 64))) { + (*marks)[0].position = lower; + } else if (desirable_marks < (uint32_t)(nmarks = (gint) (bars / 64) + 1)) { *marks = (GtkCustomRulerMark *) g_malloc (sizeof(GtkCustomRulerMark) * nmarks); for (n = 0, i = current_bbt_points->begin(); i != current_bbt_points->end() && n < nmarks; i++) { if ((*i).type == TempoMap::Bar) { @@ -1254,7 +1285,7 @@ Editor::metric_get_bbt (GtkCustomRulerMark **marks, gdouble lower, gdouble upper } } } - } else if (desirable_marks < (uint32_t) (nmarks = (gint)(bars / 16))) { + } else if (desirable_marks < (uint32_t)(nmarks = (bars / 16) + 1)) { *marks = (GtkCustomRulerMark *) g_malloc (sizeof(GtkCustomRulerMark) * nmarks); for (n = 0, i = current_bbt_points->begin(); i != current_bbt_points->end() && n < nmarks; i++) { if ((*i).type == TempoMap::Bar) { @@ -1276,7 +1307,7 @@ Editor::metric_get_bbt (GtkCustomRulerMark **marks, gdouble lower, gdouble upper } } } - } else if (desirable_marks < (uint32_t) (nmarks = (gint)(bars / 4))){ + } else if (desirable_marks < (uint32_t)(nmarks = (bars / 4) + 1)){ *marks = (GtkCustomRulerMark *) g_malloc (sizeof(GtkCustomRulerMark) * nmarks); for (n = 0, i = current_bbt_points->begin(); i != current_bbt_points->end() && n < nmarks; ++i) { if ((*i).type == TempoMap::Bar) { @@ -1299,8 +1330,8 @@ Editor::metric_get_bbt (GtkCustomRulerMark **marks, gdouble lower, gdouble upper } } } else { - nmarks = bars; - *marks = (GtkCustomRulerMark *) g_malloc (sizeof(GtkCustomRulerMark) * nmarks); + nmarks = bars + 1; + *marks = (GtkCustomRulerMark *) g_malloc (sizeof(GtkCustomRulerMark) * nmarks ); for (n = 0, i = current_bbt_points->begin(); i != current_bbt_points->end() && n < nmarks; i++) { if ((*i).type == TempoMap::Bar) { if ((*i).bar % 4 == 1) { @@ -1320,7 +1351,7 @@ Editor::metric_get_bbt (GtkCustomRulerMark **marks, gdouble lower, gdouble upper } } } - return nmarks; + return n; } } diff --git a/gtk2_ardour/editor_tempodisplay.cc b/gtk2_ardour/editor_tempodisplay.cc index c905e696cc..8aa978a79c 100644 --- a/gtk2_ardour/editor_tempodisplay.cc +++ b/gtk2_ardour/editor_tempodisplay.cc @@ -96,6 +96,10 @@ Editor::draw_metric_marks (const Metrics& metrics) void Editor::tempo_map_changed (Change ignored) { + if (!session) { + return; + } + ENSURE_GUI_THREAD(bind (mem_fun(*this, &Editor::tempo_map_changed), ignored)); BBT_Time previous_beat, next_beat; // the beats previous to the leftmost frame and after the rightmost frame @@ -112,13 +116,13 @@ Editor::tempo_map_changed (Change ignored) previous_beat.ticks = 0; if (session->tempo_map().meter_at(leftmost_frame + current_page_frames()).beats_per_bar () > next_beat.beats + 1) { - next_beat.beats += 1; + next_beat.beats += 1; } else { - next_beat.bars += 1; - next_beat.beats = 1; + next_beat.bars += 1; + next_beat.beats = 1; } next_beat.ticks = 0; - + if (current_bbt_points) { delete current_bbt_points; current_bbt_points = 0; @@ -227,9 +231,9 @@ Editor::draw_measures () case TempoMap::Beat: if ((*i).beat == 1) { - color = color_map[cMeasureLineBeat]; - } else { color = color_map[cMeasureLineBar]; + } else { + color = color_map[cMeasureLineBeat]; if (beat_density > 2.0) { /* only draw beat lines if the gaps between beats are large. diff --git a/gtk2_ardour/export_dialog.cc b/gtk2_ardour/export_dialog.cc index e38f0ba946..5a269ffbef 100644 --- a/gtk2_ardour/export_dialog.cc +++ b/gtk2_ardour/export_dialog.cc @@ -212,28 +212,28 @@ ExportDialog::ExportDialog(PublicEditor& e) takes a reference. */ - vector<string> pop_strings = internationalize(sample_rates); + vector<string> pop_strings = I18N(sample_rates); Gtkmm2ext::set_popdown_strings (sample_rate_combo, pop_strings); sample_rate_combo.set_active_text (pop_strings.front()); - pop_strings = internationalize(src_quality); + pop_strings = I18N(src_quality); Gtkmm2ext::set_popdown_strings (src_quality_combo, pop_strings); src_quality_combo.set_active_text (pop_strings.front()); - pop_strings = internationalize(dither_types); + pop_strings = I18N(dither_types); Gtkmm2ext::set_popdown_strings (dither_type_combo, pop_strings); dither_type_combo.set_active_text (pop_strings.front()); - pop_strings = internationalize(channel_strings); + pop_strings = I18N(channel_strings); Gtkmm2ext::set_popdown_strings (channel_count_combo, pop_strings); channel_count_combo.set_active_text (pop_strings.front()); - pop_strings = internationalize((const char **) sndfile_header_formats_strings); + pop_strings = I18N((const char **) sndfile_header_formats_strings); Gtkmm2ext::set_popdown_strings (header_format_combo, pop_strings); header_format_combo.set_active_text (pop_strings.front()); - pop_strings = internationalize((const char **) sndfile_bitdepth_formats_strings); + pop_strings = I18N((const char **) sndfile_bitdepth_formats_strings); Gtkmm2ext::set_popdown_strings (bitdepth_format_combo, pop_strings); bitdepth_format_combo.set_active_text (pop_strings.front()); - pop_strings = internationalize((const char **) sndfile_endian_formats_strings); + pop_strings = I18N((const char **) sndfile_endian_formats_strings); Gtkmm2ext::set_popdown_strings (endian_format_combo, pop_strings); endian_format_combo.set_active_text (pop_strings.front()); - pop_strings = internationalize(cue_file_types); + pop_strings = I18N(cue_file_types); Gtkmm2ext::set_popdown_strings (cue_file_combo, pop_strings); cue_file_combo.set_active_text (pop_strings.front()); diff --git a/gtk2_ardour/export_region_dialog.cc b/gtk2_ardour/export_region_dialog.cc index 3ed282761d..30ff05dc5c 100644 --- a/gtk2_ardour/export_region_dialog.cc +++ b/gtk2_ardour/export_region_dialog.cc @@ -31,7 +31,7 @@ ExportRegionDialog::ExportRegionDialog (PublicEditor& editor, boost::shared_ptr<ARDOUR::Region> region) : ExportDialog(editor) { - boost::shared_ptr<ARDOUR::AudioRegion> audio_region = boost::dynamic_pointer_cast<ARDOUR::AudioRegion>(region); + audio_region = boost::dynamic_pointer_cast<ARDOUR::AudioRegion>(region); assert(audio_region); do_not_allow_track_and_master_selection(); diff --git a/gtk2_ardour/fft_graph.cc b/gtk2_ardour/fft_graph.cc index 367dc54b7c..5d2f383a80 100644 --- a/gtk2_ardour/fft_graph.cc +++ b/gtk2_ardour/fft_graph.cc @@ -123,8 +123,9 @@ FFTGraph::setWindowSize_internal(int windowSize) } _logScale = (int *) malloc(sizeof(int) * _dataSize); + float count = 0; for (int i = 0; i < _dataSize; i++) { - _logScale[i] = (int)floor(log10( 1.0 + i * 9.0 / (double)_dataSize) * (double)scaleWidth); + _logScale[i] = 0; } _plan = fftwf_plan_r2r_1d(_windowSize, _in, _out, FFTW_R2HC, FFTW_ESTIMATE); } @@ -241,8 +242,11 @@ FFTGraph::draw_scales(Glib::RefPtr<Gdk::Window> window) int rate_at_pos = (int)((double)(SR/2) * (double)logscale_pos / (double)_dataSize); char buf[32]; - snprintf(buf,32,"%dhz",rate_at_pos); - + if (rate_at_pos < 1000) + snprintf(buf,32,"%dHz",rate_at_pos); + else + snprintf(buf,32,"%dk",(int)floor( (float)rate_at_pos/(float)1000) ); + std::string label = buf; layout->set_text(label); @@ -371,12 +375,22 @@ FFTGraph::on_size_request(Gtk::Requisition* requisition) if (_logScale != 0) { free(_logScale); } - _logScale = (int *) malloc(sizeof(int) * _dataSize); - //cerr << "LogScale: " << endl; + + float SR = 44100; + float FFT_START = SR/(double)_dataSize; + float FFT_END = SR/2.0; + float FFT_RANGE = log( FFT_END / FFT_START); + float pixel = 0; for (int i = 0; i < _dataSize; i++) { - _logScale[i] = (int)floor(log10( 1.0 + i * 9.0 / (double)_dataSize) * (double)scaleWidth); - //cerr << i << ":\t" << _logScale[i] << endl; + float freq_at_bin = (SR/2.0) * ((double)i / (double)_dataSize); + float freq_at_pixel = FFT_START * exp( FFT_RANGE * pixel / (double)scaleWidth ); + while (freq_at_bin > freq_at_pixel) { + pixel++; + freq_at_pixel = FFT_START * exp( FFT_RANGE * pixel / (double)scaleWidth ); + } + _logScale[i] = floor(pixel); +//printf("logscale at %d = %3.3f, freq_at_pixel %3.3f, freq_at_bin %3.3f, scaleWidth %d\n", i, pixel, freq_at_pixel, freq_at_bin, scaleWidth); } requisition->width = width;; diff --git a/gtk2_ardour/gain_automation_time_axis.cc b/gtk2_ardour/gain_automation_time_axis.cc index 7e4a1b1fbf..c1261fdf23 100644 --- a/gtk2_ardour/gain_automation_time_axis.cc +++ b/gtk2_ardour/gain_automation_time_axis.cc @@ -63,12 +63,10 @@ GainAutomationTimeAxisView::add_automation_event (ArdourCanvas::Item* item, GdkE lines.front()->view_to_model_y (y); _session.begin_reversible_command (_("add gain automation event")); - - XMLNode &before = curve.get_state(); + XMLNode& before = curve.get_state(); curve.add (when, y); - XMLNode &after = curve.get_state(); - _session.add_command(new MementoCommand<ARDOUR::Curve>(curve, &before, &after)); - _session.commit_reversible_command (); + XMLNode& after = curve.get_state(); + _session.commit_reversible_command (new MementoCommand<ARDOUR::Curve>(curve, &before, &after)); _session.set_dirty (); } diff --git a/gtk2_ardour/gui_thread.h b/gtk2_ardour/gui_thread.h index 22381e3536..1f53f97004 100644 --- a/gtk2_ardour/gui_thread.h +++ b/gtk2_ardour/gui_thread.h @@ -2,6 +2,7 @@ #define __ardour_gtk_gui_thread_h__ #include <gtkmm2ext/gtk_ui.h> +#include <pbd/crossthread.h> #define ENSURE_GUI_THREAD(slot) \ if (!Gtkmm2ext::UI::instance()->caller_is_ui_thread()) {\ @@ -9,4 +10,8 @@ return;\ } +#define GTK_SAFE(theSlot) crossthread_safe (Gtkmm2ext::UI::instance()->thread_id(),\ + *Gtkmm2ext::UI::instance(), \ + (theSlot)) + #endif /* __ardour_gtk_gui_thread_h__ */ diff --git a/gtk2_ardour/i18n.h b/gtk2_ardour/i18n.h index 71a3dccab8..5d68c79edd 100644 --- a/gtk2_ardour/i18n.h +++ b/gtk2_ardour/i18n.h @@ -2,6 +2,7 @@ #define __i18n_h__ #include <pbd/compose.h> +#include <pbd/convert.h> #include "gettext.h" #include <vector> @@ -10,5 +11,6 @@ #define _(Text) dgettext (PACKAGE,Text) #define N_(Text) gettext_noop (Text) #define X_(Text) Text +#define I18N(Array) PBD::internationalize (PACKAGE, Array) #endif // __i18n_h__ diff --git a/gtk2_ardour/icons/hide.png b/gtk2_ardour/icons/hide.png Binary files differnew file mode 100644 index 0000000000..2db8173101 --- /dev/null +++ b/gtk2_ardour/icons/hide.png diff --git a/gtk2_ardour/icons/record_normal_red.png b/gtk2_ardour/icons/record_normal_red.png Binary files differnew file mode 100644 index 0000000000..c4bbaff0b0 --- /dev/null +++ b/gtk2_ardour/icons/record_normal_red.png diff --git a/gtk2_ardour/icons/record_tape_red.png b/gtk2_ardour/icons/record_tape_red.png Binary files differnew file mode 100644 index 0000000000..f9e231381a --- /dev/null +++ b/gtk2_ardour/icons/record_tape_red.png diff --git a/gtk2_ardour/icons/strip_width.png b/gtk2_ardour/icons/strip_width.png Binary files differnew file mode 100644 index 0000000000..99a0e72797 --- /dev/null +++ b/gtk2_ardour/icons/strip_width.png diff --git a/gtk2_ardour/io_selector.cc b/gtk2_ardour/io_selector.cc index 71e0a84bfd..366e2c2769 100644 --- a/gtk2_ardour/io_selector.cc +++ b/gtk2_ardour/io_selector.cc @@ -258,6 +258,46 @@ IOSelector::~IOSelector () { } +void +IOSelector::set_button_sensitivity () +{ + DataType t = io->default_type(); + + if (for_input) { + + if (io->input_maximum().get(t) < 0 || io->input_maximum().get(t) > io->n_inputs().get(t)) { + add_port_button.set_sensitive (true); + } else { + add_port_button.set_sensitive (false); + } + + } else { + + if (io->output_maximum().get(t) < 0 || io->output_maximum().get(t) > io->n_outputs().get(t)) { + add_port_button.set_sensitive (true); + } else { + add_port_button.set_sensitive (false); + } + + } + + if (for_input) { + if (io->n_inputs().get(t) && (io->input_minimum().get(t) < 0 || io->input_minimum().get(t) < io->n_inputs().get(t))) { + remove_port_button.set_sensitive (true); + } else { + remove_port_button.set_sensitive (false); + } + + } else { + if (io->n_outputs().get(t) && (io->output_minimum().get(t) < 0 || io->output_minimum().get(t) < io->n_outputs().get(t))) { + remove_port_button.set_sensitive (true); + } else { + remove_port_button.set_sensitive (false); + } + } +} + + void IOSelector::name_changed (void* src) { @@ -288,7 +328,10 @@ IOSelector::rescan () gint current_page; vector<string> rowdata; + page_selection_connection.disconnect (); + current_page = notebook.get_current_page (); + pages.clear (); /* get relevant current JACK ports */ @@ -347,7 +390,6 @@ IOSelector::rescan () row[port_display_columns.full_name] = s->second; } - //display->get_selection()->signal_changed().connect (bind (mem_fun(*this, &IOSelector::port_selection_changed), display)); display->signal_button_release_event().connect (bind (mem_fun(*this, &IOSelector::port_selection_changed), display)); Label *tab_label = manage (new Label); @@ -363,7 +405,7 @@ IOSelector::rescan () } notebook.set_current_page (current_page); - //notebook.signal_show().connect (bind (mem_fun (notebook, &Notebook::set_current_page), current_page)); + page_selection_connection = notebook.signal_show().connect (bind (mem_fun (notebook, &Notebook::set_current_page), current_page)); selector_box.show_all (); } @@ -372,12 +414,11 @@ IOSelector::display_ports () { TreeView *firsttview = 0; TreeView *selected_port_tview = 0; - { Glib::Mutex::Lock lm (port_display_lock); Port *port; uint32_t limit; - + // The IO selector only works for single typed IOs const ARDOUR::DataType t = io->default_type(); @@ -386,22 +427,21 @@ IOSelector::display_ports () } else { limit = io->n_outputs().get(t); } - - for (slist<TreeView *>::iterator i = port_displays.begin(); i != port_displays.end(); ) { + for (slist<TreeView *>::iterator i = port_displays.begin(); i != port_displays.end(); ) { + slist<TreeView *>::iterator tmp; - + tmp = i; ++tmp; - + port_box.remove (**i); delete *i; port_displays.erase (i); - + i = tmp; } - - + for (uint32_t n = 0; n < limit; ++n) { TreeView* tview; @@ -415,13 +455,13 @@ IOSelector::display_ports () } /* we know there is '/' because we put it there */ - + really_short_name = port->short_name(); really_short_name = really_short_name.substr (really_short_name.find ('/') + 1); - + tview = manage (new TreeView()); RefPtr<ListStore> port_model = ListStore::create (port_display_columns); - + if (!firsttview) { firsttview = tview; } @@ -429,18 +469,18 @@ IOSelector::display_ports () tview->set_model (port_model); tview->append_column (really_short_name, port_display_columns.displayed_name); tview->get_selection()->set_mode (SELECTION_SINGLE); - tview->set_data ("port", port); + tview->set_data (X_("port"), port); tview->set_headers_visible (true); - tview->set_name ("IOSelectorPortList"); + tview->set_name (X_("IOSelectorPortList")); port_box.pack_start (*tview); port_displays.insert (port_displays.end(), tview); /* now fill the clist with the current connections */ - + const char **connections = port->get_connections (); - + if (connections) { for (uint32_t c = 0; connections[c]; ++c) { TreeModel::Row row = *(port_model->append()); @@ -459,9 +499,9 @@ IOSelector::display_ports () selected_port_tview = tview; } } - + } else { - + if (io->output_maximum().get(t) == 1) { selected_port = port; selected_port_tview = tview; @@ -471,39 +511,27 @@ IOSelector::display_ports () } } } - + TreeViewColumn* col = tview->get_column (0); col->set_clickable (true); - - /* handle button events on the column header and within the treeview itself */ + + /* handle button events on the column header ... */ col->signal_clicked().connect (bind (mem_fun(*this, &IOSelector::select_treeview), tview)); + + /* ... and within the treeview itself */ tview->signal_button_release_event().connect (bind (mem_fun(*this, &IOSelector::connection_button_release), tview)); } - + port_box.show_all (); - - if (selected_port_tview) { - // GTK2FIX - // selected_port_tview->click_column(0); - selected_port_tview->set_name ("IOSelectorPortListSelected"); - for (slist<TreeView *>::iterator i = port_displays.begin(); i != port_displays.end(); ++i) { - if (*i != selected_port_tview) { - (*i)->set_name ("IOSelectorPortList"); - (*i)->queue_draw (); - } - } - } else { - selected_port = 0; - selector_box.hide_all (); - } } + if (!selected_port_tview) { + selected_port_tview = firsttview; + } + if (selected_port_tview) { select_treeview (selected_port_tview); - } else if (firsttview) { - // select first - select_treeview (firsttview); } } @@ -569,14 +597,6 @@ IOSelector::add_port () msg.run (); } - if (io->input_maximum().get(t) >= 0 && io->input_maximum().get(t) <= (size_t) io->n_inputs().get(t)) { - add_port_button.set_sensitive (false); - } - - if (io->input_minimum().get(t) < (size_t) io->n_inputs().get(t)) { - remove_port_button.set_sensitive (true); - } - } else { try { @@ -587,11 +607,9 @@ IOSelector::add_port () MessageDialog msg (0, _("There are no more JACK ports available.")); msg.run (); } - - if (io->output_maximum().get(t) >= 0 && io->output_maximum().get(t) <= (size_t) io->n_outputs().get(t)) { - add_port_button.set_sensitive (false); - } } + + set_button_sensitivity (); } void @@ -608,26 +626,13 @@ IOSelector::remove_port () if ((nports = io->n_inputs().get(t)) > 0) { io->remove_input_port (io->input(nports-1), this); } - if (io->input_minimum().get(t) == (size_t) io->n_inputs().get(t)) { - remove_port_button.set_sensitive (false); - } } else { if ((nports = io->n_outputs().get(t)) > 0) { io->remove_output_port (io->output(nports-1), this); } } -} - -gint -IOSelector::remove_port_when_idle (Port *port) -{ - if (for_input) { - io->remove_input_port (port, this); - } else { - io->remove_output_port (port, this); - } - - return FALSE; + + set_button_sensitivity (); } gint @@ -649,20 +654,15 @@ IOSelector::connection_button_release (GdkEventButton *ev, TreeView *treeview) return false; } - if (!(Keyboard::is_delete_event (ev))) { - //return false; - } - if (!treeview->get_path_at_pos ((int)ev->x, (int)ev->y, path, column, cellx, celly)) { return false; } - cerr << "path = " << path.to_string() << endl; - + if ((iter = treeview->get_model()->get_iter (path.to_string()))) { /* path is valid */ ustring connected_port_name = (*iter)[port_display_columns.full_name]; - Port *port = reinterpret_cast<Port *> (treeview->get_data (_("port"))); + Port *port = reinterpret_cast<Port *> (treeview->get_data (X_("port"))); if (for_input) { Port *p = session.engine().get_port_by_name (connected_port_name); @@ -678,46 +678,15 @@ IOSelector::connection_button_release (GdkEventButton *ev, TreeView *treeview) return true; } -gint -IOSelector::port_column_button_release (GdkEventButton* event, TreeView* treeview) -{ - /* this handles button release on the button at the top of a single-column - treeview (representing a port) - */ - cerr << "IOSelector::port_column_button_release() called" << endl; - - if (Keyboard::is_delete_event (event)) { - Port* port; - { - Glib::Mutex::Lock lm (port_display_lock); - - port = static_cast<Port *> (treeview->get_data (_("port"))); - - if (port == selected_port) { - selected_port = 0; - treeview->set_name ("IOSelectorPortList"); - treeview->queue_draw(); - } - } - - /* remove the port when idle - if we do it here, we will destroy the widget - for whom we are handling an event. not good. - */ - - signal_idle().connect (bind (mem_fun(*this, &IOSelector::remove_port_when_idle), port)); - - } else { - select_treeview (treeview); - } - - return TRUE; -} - void IOSelector::select_next_treeview () { slist<TreeView*>::iterator next; + if (port_displays.empty() || port_displays.size() == 1) { + return; + } + for (slist<TreeView *>::iterator i = port_displays.begin(); i != port_displays.end(); ++i) { if ((*i)->get_name() == "IOSelectorPortListSelected") { @@ -744,21 +713,41 @@ IOSelector::select_treeview (TreeView* tview) */ Glib::Mutex::Lock lm (port_display_lock); - Port* port = reinterpret_cast<Port *> (tview->get_data (_("port"))); + Port* port = reinterpret_cast<Port *> (tview->get_data (X_("port"))); + + selected_port = port; + + tview->set_name ("IOSelectorPortListSelected"); + tview->queue_draw (); + + /* ugly hack to force the column header button to change as well */ + + TreeViewColumn* col = tview->get_column (0); + GtkTreeViewColumn* ccol = col->gobj(); - if (port != selected_port) { - selected_port = port; + if (ccol->button) { + gtk_widget_set_name (ccol->button, "IOSelectorPortListSelected"); + gtk_widget_queue_draw (ccol->button); + } + + for (slist<TreeView*>::iterator i = port_displays.begin(); i != port_displays.end(); ++i) { + if (*i == tview) { + continue; + } - tview->set_name ("IOSelectorPortListSelected"); + col = (*i)->get_column (0); + ccol = col->gobj(); - for (slist<TreeView*>::iterator i = port_displays.begin(); i != port_displays.end(); ++i) { - if (*i != tview) { - (*i)->set_name ("IOSelectorPortList"); - (*i)->queue_draw (); - } + if (ccol->button) { + gtk_widget_set_name (ccol->button, "IOSelectorPortList"); + gtk_widget_queue_draw (ccol->button); } - selector_box.show_all (); + + (*i)->set_name ("IOSelectorPortList"); + (*i)->queue_draw (); } + + selector_box.show_all (); } void diff --git a/gtk2_ardour/io_selector.h b/gtk2_ardour/io_selector.h index b0175644a4..288edd0be5 100644 --- a/gtk2_ardour/io_selector.h +++ b/gtk2_ardour/io_selector.h @@ -72,6 +72,7 @@ class IOSelector : public Gtk::VBox { boost::shared_ptr<ARDOUR::IO> io; bool for_input; ARDOUR::Port *selected_port; + sigc::connection page_selection_connection; Gtk::VBox main_box; Gtk::HBox port_and_selector_box; @@ -123,9 +124,8 @@ class IOSelector : public Gtk::VBox { void add_port (); void remove_port (); - gint remove_port_when_idle (ARDOUR::Port *); + void set_button_sensitivity (); - gint port_column_button_release (GdkEventButton *, Gtk::TreeView*); gint connection_button_release (GdkEventButton *, Gtk::TreeView*); void select_treeview(Gtk::TreeView*); diff --git a/gtk2_ardour/keyboard.cc b/gtk2_ardour/keyboard.cc index 17390b8b4d..a6a14ad55b 100644 --- a/gtk2_ardour/keyboard.cc +++ b/gtk2_ardour/keyboard.cc @@ -796,6 +796,8 @@ Keyboard::modifier_state_equals (guint state, ModifierMask mask) Selection::Operation Keyboard::selection_type (guint state) { + /* note that there is no modifier for "Add" */ + if (modifier_state_equals (state, Shift)) { return Selection::Extend; } else if (modifier_state_equals (state, Control)) { diff --git a/gtk2_ardour/location_ui.cc b/gtk2_ardour/location_ui.cc index 96ce92d42d..13dd95b47d 100644 --- a/gtk2_ardour/location_ui.cc +++ b/gtk2_ardour/location_ui.cc @@ -250,7 +250,7 @@ LocationEditRow::set_location (Location *loc) the row spacing, so make it insensitive (paul). */ - if (location->is_end()) { + if (location->is_end() || location->is_start()) { remove_button.set_sensitive (false); } diff --git a/gtk2_ardour/main.cc b/gtk2_ardour/main.cc index 25b6b32166..a1d85cdb69 100644 --- a/gtk2_ardour/main.cc +++ b/gtk2_ardour/main.cc @@ -44,6 +44,7 @@ #include <gtkmm2ext/popup.h> #include <gtkmm2ext/utils.h> +#include "svn_revision.h" #include "version.h" #include "ardour_ui.h" #include "opts.h" @@ -259,7 +260,6 @@ show_ui_callback (void *arg) ARDOUR_UI * ui = (ARDOUR_UI *) arg; ui->hide_splash(); - ui->show (); return FALSE; } @@ -286,7 +286,7 @@ Please consider the possibilities, and perhaps (re)start JACK.")); win.set_position (Gtk::WIN_POS_CENTER); if (!no_splash) { - ui->hide_splash (); + ui->hide_splash (); } /* we just don't care about the result, but we want to block */ @@ -329,10 +329,12 @@ To create it from the command line, start ardour as \"ardour --new %1"), path) < ui->load_session (path, name); } else { - /* TODO: This bit of code doesn't work properly yet - Glib::signal_idle().connect (bind (mem_fun (*ui, &ARDOUR_UI::cmdline_new_session), path)); - ui->set_will_create_new_session_automatically (true); */ + /* TODO: This bit of code doesn't work properly yet + Glib::signal_idle().connect (bind (mem_fun (*ui, &ARDOUR_UI::cmdline_new_session), path)); + ui->set_will_create_new_session_automatically (true); + */ + /* Show the NSD */ ui->hide_splash (); if (!Config->get_no_new_session_dialog()) { @@ -383,7 +385,7 @@ int main (int argc, char *argv[]) cout << _("Ardour/GTK ") << VERSIONSTRING << _("\n (built using ") - << ARDOUR::get_ardour_revision () + << ardour_svn_revision #ifdef __GNUC__ << _(" and GCC version ") << __VERSION__ #endif diff --git a/gtk2_ardour/marker_time_axis_view.cc b/gtk2_ardour/marker_time_axis_view.cc index 55d5742e8e..b6e87f8715 100644 --- a/gtk2_ardour/marker_time_axis_view.cc +++ b/gtk2_ardour/marker_time_axis_view.cc @@ -57,7 +57,7 @@ MarkerTimeAxisView::MarkerTimeAxisView(MarkerTimeAxis& tv) canvas_rect = new ArdourCanvas::SimpleRect (*canvas_group); canvas_rect->property_x1() = 0.0; canvas_rect->property_y1() = 0.0; - canvas_rect->property_x2() = 1000000.0; + canvas_rect->property_x2() = max_frames; canvas_rect->property_y2() = (double)20; canvas_rect->property_outline_color_rgba() = color_map[cMarkerTrackOutline]; canvas_rect->property_fill_color_rgba() = stream_base_color; diff --git a/gtk2_ardour/mixer_strip.cc b/gtk2_ardour/mixer_strip.cc index 35ca99bee1..289fb45536 100644 --- a/gtk2_ardour/mixer_strip.cc +++ b/gtk2_ardour/mixer_strip.cc @@ -62,6 +62,8 @@ using namespace PBD; using namespace Gtk; using namespace Gtkmm2ext; +int MixerStrip::scrollbar_height = 0; + #ifdef VARISPEED_IN_MIXER_STRIP static void speed_printer (char buf[32], Gtk::Adjustment& adj, void* arg) @@ -108,8 +110,8 @@ MixerStrip::MixerStrip (Mixer_UI& mx, Session& sess, boost::shared_ptr<Route> rt comment_window = 0; comment_area = 0; - width_button.add (*(manage (new Gtk::Image (get_xpm("lr.xpm"))))); - hide_button.add (*(manage (new Gtk::Image (get_xpm("small_x.xpm"))))); + width_button.add (*(manage (new Gtk::Image (::get_icon("strip_width"))))); + hide_button.add (*(manage (new Gtk::Image (::get_icon("hide"))))); input_label.set_text (_("Input")); input_button.add (input_label); @@ -122,34 +124,31 @@ MixerStrip::MixerStrip (Mixer_UI& mx, Session& sess, boost::shared_ptr<Route> rt output_label.set_name ("MixerIOButtonLabel"); _route->meter_change.connect (mem_fun(*this, &MixerStrip::meter_changed)); - meter_point_button.add (meter_point_label); - meter_point_button.set_name ("MixerStripMeterPreButton"); - meter_point_label.set_name ("MixerStripMeterPreButton"); - - switch (_route->meter_point()) { - case MeterInput: - meter_point_label.set_text (_("input")); - break; - - case MeterPreFader: - meter_point_label.set_text (_("pre")); - break; - - case MeterPostFader: - meter_point_label.set_text (_("post")); - break; - } + meter_point_button.add (meter_point_label); + meter_point_button.set_name ("MixerStripMeterPreButton"); + meter_point_label.set_name ("MixerStripMeterPreButton"); + + switch (_route->meter_point()) { + case MeterInput: + meter_point_label.set_text (_("input")); + break; - /* TRANSLATORS: this string should be longest of the strings - used to describe meter points. In english, its "input". - */ + case MeterPreFader: + meter_point_label.set_text (_("pre")); + break; - set_size_request_to_display_given_text (meter_point_button, _("tupni"), 5, 5); - - - bottom_button_table.attach (meter_point_button, 1, 2, 0, 1); - - + case MeterPostFader: + meter_point_label.set_text (_("post")); + break; + } + + /* TRANSLATORS: this string should be longest of the strings + used to describe meter points. In english, it's "input". + */ + set_size_request_to_display_given_text (meter_point_button, _("tupni"), 5, 5); + + bottom_button_table.attach (meter_point_button, 1, 2, 0, 1); + meter_point_button.signal_button_press_event().connect (mem_fun (gpm, &GainMeter::meter_press), false); /* XXX what is this meant to do? */ //meter_point_button.signal_button_release_event().connect (mem_fun (gpm, &GainMeter::meter_release), false); @@ -261,6 +260,20 @@ MixerStrip::MixerStrip (Mixer_UI& mx, Session& sess, boost::shared_ptr<Route> rt global_vpacker.pack_start (output_button, Gtk::PACK_SHRINK); global_vpacker.pack_start (comment_button, Gtk::PACK_SHRINK); + if (route()->master() || route()->control()) { + + if (scrollbar_height == 0) { + HScrollbar scrollbar; + Gtk::Requisition requisition; + scrollbar.size_request (requisition); + scrollbar_height = requisition.height; + } + + EventBox* spacer = manage (new EventBox); + spacer->set_size_request (-1, scrollbar_height); + global_vpacker.pack_start (*spacer, false, false); + } + global_frame.add (global_vpacker); global_frame.set_shadow_type (Gtk::SHADOW_IN); global_frame.set_name ("BaseFrame"); @@ -416,8 +429,10 @@ MixerStrip::set_width (Width w) solo_button->set_label (_("solo")); if (_route->comment() == "") { + comment_button.unset_bg (STATE_NORMAL); comment_button.set_label (_("comments")); } else { + comment_button.modify_bg (STATE_NORMAL, color()); comment_button.set_label (_("*comments*")); } @@ -439,8 +454,10 @@ MixerStrip::set_width (Width w) solo_button->set_label (_("S")); if (_route->comment() == "") { + comment_button.unset_bg (STATE_NORMAL); comment_button.set_label (_("Cmt")); } else { + comment_button.modify_bg (STATE_NORMAL, color()); comment_button.set_label (_("*Cmt*")); } @@ -497,7 +514,7 @@ MixerStrip::output_press (GdkEventButton *ev) citems.push_back (SeparatorElem()); _session.foreach_connection (this, &MixerStrip::add_connection_to_output_menu); - + output_menu.popup (1, ev->time); break; @@ -553,13 +570,13 @@ MixerStrip::input_press (GdkEventButton *ev) switch (ev->button) { case 1: - citems.push_back (MenuElem (_("Edit"), mem_fun(*this, &MixerStrip::edit_input_configuration))); citems.push_back (SeparatorElem()); citems.push_back (MenuElem (_("Disconnect"), mem_fun (*(static_cast<RouteUI*>(this)), &RouteUI::disconnect_input))); citems.push_back (SeparatorElem()); _session.foreach_connection (this, &MixerStrip::add_connection_to_input_menu); + input_menu.popup (1, ev->time); break; @@ -757,6 +774,42 @@ MixerStrip::output_changed (IOChange change, void *src) Gtkmm2ext::UI::instance()->call_slot (mem_fun(*this, &MixerStrip::update_output_display)); } + +void +MixerStrip::comment_editor_done_editing() { + string str = comment_area->get_buffer()->get_text(); + if (_route->comment() != str) { + _route->set_comment (str, this); + + switch (_width) { + + case Wide: + if (! str.empty()) { + comment_button.modify_bg (STATE_NORMAL, color()); + comment_button.set_label (_("*Comments*")); + } else { + comment_button.unset_bg (STATE_NORMAL); + comment_button.set_label (_("Comments")); + } + break; + + case Narrow: + if (! str.empty()) { + comment_button.modify_bg (STATE_NORMAL, color()); + comment_button.set_label (_("*Cmt*")); + } else { + comment_button.unset_bg (STATE_NORMAL); + comment_button.set_label (_("Cmt")); + } + break; + } + + ARDOUR_UI::instance()->tooltips().set_tip (comment_button, + str.empty() ? _("Click to Add/Edit Comments") : str); + } + +} + void MixerStrip::comment_button_clicked () { @@ -764,38 +817,13 @@ MixerStrip::comment_button_clicked () setup_comment_editor (); } - int x, y, cw_width, cw_height; + int x, y, cw_width, cw_height; if (comment_window->is_visible()) { - string str = comment_area->get_buffer()->get_text(); - if (_route->comment() != str) { - _route->set_comment (str, this); + comment_window->hide (); + return; + } - switch (_width) { - - case Wide: - if (! str.empty()) { - comment_button.set_label (_("*Comments*")); - } else { - comment_button.set_label (_("Comments")); - } - break; - - case Narrow: - if (! str.empty()) { - comment_button.set_label (_("*Cmt*")); - } else { - comment_button.set_label (_("Cmt")); - } - break; - } - - ARDOUR_UI::instance()->tooltips().set_tip (comment_button, - str.empty() ? _("Click to Add/Edit Comments") : str); - } - comment_window->hide (); - return; - } comment_window->get_size (cw_width, cw_height); comment_window->get_position(x, y); comment_window->move(x, y - (cw_height / 2) - 45); @@ -806,7 +834,6 @@ MixerStrip::comment_button_clicked () comment_window->show(); comment_window->present(); - } void @@ -819,6 +846,7 @@ MixerStrip::setup_comment_editor () comment_window = new ArdourDialog (title, false); comment_window->set_position (Gtk::WIN_POS_MOUSE); comment_window->set_skip_taskbar_hint (true); + comment_window->signal_hide().connect (mem_fun(*this, &MixerStrip::comment_editor_done_editing)); comment_area = manage (new TextView()); comment_area->set_name ("MixerTrackCommentArea"); @@ -1075,11 +1103,17 @@ MixerStrip::width_clicked () void MixerStrip::hide_clicked () { + // LAME fix to reset the button status for when it is redisplayed (part 1) + hide_button.set_sensitive(false); + if (_embedded) { Hiding(); /* EMIT_SIGNAL */ } else { _mixer.hide_strip (this); } + + // (part 2) + hide_button.set_sensitive(true); } void @@ -1165,21 +1199,11 @@ MixerStrip::mix_group() const void MixerStrip::engine_stopped () { - input_button.set_sensitive (false); - if (rec_enable_button) { - rec_enable_button->set_sensitive (false); - } - output_button.set_sensitive (false); } void MixerStrip::engine_running () { - input_button.set_sensitive (true); - if (rec_enable_button) { - rec_enable_button->set_sensitive (true); - } - output_button.set_sensitive (true); } void diff --git a/gtk2_ardour/mixer_strip.h b/gtk2_ardour/mixer_strip.h index 21db0d14ca..92da4c13fe 100644 --- a/gtk2_ardour/mixer_strip.h +++ b/gtk2_ardour/mixer_strip.h @@ -153,6 +153,7 @@ class MixerStrip : public RouteUI, public Gtk::EventBox Gtk::TextView* comment_area; Gtk::Button comment_button; + void comment_editor_done_editing(); void setup_comment_editor (); void comment_button_clicked (); @@ -245,6 +246,7 @@ class MixerStrip : public RouteUI, public Gtk::EventBox void engine_running(); void engine_stopped(); + static int scrollbar_height; }; #endif /* __ardour_mixer_strip__ */ diff --git a/gtk2_ardour/mixer_ui.cc b/gtk2_ardour/mixer_ui.cc index 1ba1be445e..d8e5fc6988 100644 --- a/gtk2_ardour/mixer_ui.cc +++ b/gtk2_ardour/mixer_ui.cc @@ -76,7 +76,7 @@ Mixer_UI::Mixer_UI (AudioEngine& eng) strip_packer.pack_end (scroller_base, true, true); scroller.add (strip_packer); - scroller.set_policy (Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC); + scroller.set_policy (Gtk::POLICY_ALWAYS, Gtk::POLICY_AUTOMATIC); track_model = ListStore::create (track_columns); track_display.set_model (track_model); @@ -185,7 +185,7 @@ Mixer_UI::Mixer_UI (AudioEngine& eng) list_vpacker.pack_start (rhs_pane1, true, true); global_hpacker.pack_start (scroller, true, true); - global_hpacker.pack_start (out_packer, false, false); + global_hpacker.pack_start (out_packer, false, false, 12); list_hpane.add1(list_vpacker); list_hpane.add2(global_hpacker); @@ -393,11 +393,11 @@ Mixer_UI::disconnect_from_session () void Mixer_UI::show_strip (MixerStrip* ms) { - TreeModel::Children rows = track_model->children(); + TreeModel::Children rows = track_model->children(); TreeModel::Children::iterator i; - + for (i = rows.begin(); i != rows.end(); ++i) { - + MixerStrip* strip = (*i)[track_columns.strip]; if (strip == ms) { (*i)[track_columns.visible] = true; @@ -409,7 +409,7 @@ Mixer_UI::show_strip (MixerStrip* ms) void Mixer_UI::hide_strip (MixerStrip* ms) { - TreeModel::Children rows = track_model->children(); + TreeModel::Children rows = track_model->children(); TreeModel::Children::iterator i; for (i = rows.begin(); i != rows.end(); ++i) { @@ -419,37 +419,37 @@ Mixer_UI::hide_strip (MixerStrip* ms) (*i)[track_columns.visible] = false; break; } - } - } + } +} - gint - Mixer_UI::start_updating () - { - fast_screen_update_connection = ARDOUR_UI::instance()->SuperRapidScreenUpdate.connect (mem_fun(*this, &Mixer_UI::fast_update_strips)); - return 0; - } +gint +Mixer_UI::start_updating () +{ + fast_screen_update_connection = ARDOUR_UI::instance()->SuperRapidScreenUpdate.connect (mem_fun(*this, &Mixer_UI::fast_update_strips)); + return 0; +} - gint - Mixer_UI::stop_updating () - { - fast_screen_update_connection.disconnect(); - return 0; - } +gint +Mixer_UI::stop_updating () +{ + fast_screen_update_connection.disconnect(); + return 0; +} - void - Mixer_UI::fast_update_strips () - { - if (is_mapped () && session) { - for (list<MixerStrip *>::iterator i = strips.begin(); i != strips.end(); ++i) { - (*i)->fast_update (); - } - } - } +void +Mixer_UI::fast_update_strips () +{ + if (is_mapped () && session) { + for (list<MixerStrip *>::iterator i = strips.begin(); i != strips.end(); ++i) { + (*i)->fast_update (); + } + } +} void Mixer_UI::set_all_strips_visibility (bool yn) { - TreeModel::Children rows = track_model->children(); + TreeModel::Children rows = track_model->children(); TreeModel::Children::iterator i; no_track_list_redisplay = true; diff --git a/gtk2_ardour/new_session_dialog.cc b/gtk2_ardour/new_session_dialog.cc index 9a8bcecc42..4c486eaaf8 100644 --- a/gtk2_ardour/new_session_dialog.cc +++ b/gtk2_ardour/new_session_dialog.cc @@ -313,7 +313,6 @@ NewSessionDialog::NewSessionDialog() m_treeview->set_enable_search(true); m_treeview->set_fixed_height_mode(false); m_treeview->set_hover_selection(false); - m_treeview->set_hover_expand(true); m_treeview->set_size_request(-1, 150); recent_scrolledwindow->set_flags(Gtk::CAN_FOCUS); recent_scrolledwindow->set_border_width(6); diff --git a/gtk2_ardour/option_editor.cc b/gtk2_ardour/option_editor.cc index b75ef7ead8..3e461a85d7 100644 --- a/gtk2_ardour/option_editor.cc +++ b/gtk2_ardour/option_editor.cc @@ -318,11 +318,12 @@ OptionEditor::destructo_xfade_adjustment_changed () float val = destructo_xfade_adjustment.get_value(); /* val is in msecs */ + Config->set_destructive_xfade_msecs ((uint32_t) floor (val)); if (session) { - DestructiveFileSource::setup_standard_crossfades (session->frame_rate()); + SndFileSource::setup_standard_crossfades (session->frame_rate()); } } @@ -420,19 +421,19 @@ OptionEditor::setup_midi_options () } tb->set_active (!(*i).second->input()->offline()); - tb->signal_button_press_event().connect (bind (mem_fun(*this, &OptionEditor::port_online_toggled), (*i).second, tb)); + tb->signal_toggled().connect (bind (mem_fun(*this, &OptionEditor::port_online_toggled), (*i).second, tb)); (*i).second->input()->OfflineStatusChanged.connect (bind (mem_fun(*this, &OptionEditor::map_port_online), (*i).second, tb)); table->attach (*tb, 1, 2, n+2, n+3, FILL|EXPAND, FILL); tb = manage (new ToggleButton ()); tb->set_name ("OptionEditorToggleButton"); - tb->signal_button_press_event().connect (bind (mem_fun(*this, &OptionEditor::port_trace_in_toggled), (*i).second, tb)); + tb->signal_toggled().connect (bind (mem_fun(*this, &OptionEditor::port_trace_in_toggled), (*i).second, tb)); tb->set_size_request (10, 10); table->attach (*tb, 2, 3, n+2, n+3, FILL|EXPAND, FILL); tb = manage (new ToggleButton ()); tb->set_name ("OptionEditorToggleButton"); - tb->signal_button_press_event().connect (bind (mem_fun(*this, &OptionEditor::port_trace_out_toggled), (*i).second, tb)); + tb->signal_toggled().connect (bind (mem_fun(*this, &OptionEditor::port_trace_out_toggled), (*i).second, tb)); tb->set_size_request (10, 10); table->attach (*tb, 3, 4, n+2, n+3, FILL|EXPAND, FILL); @@ -544,15 +545,14 @@ OptionEditor::midi_port_chosen (MIDI::Port* port, Gtk::RadioButton* rb) } } -gint -OptionEditor::port_online_toggled (GdkEventButton* ev, MIDI::Port* port, ToggleButton* tb) +void +OptionEditor::port_online_toggled (MIDI::Port* port, ToggleButton* tb) { - bool wanted = tb->get_active(); /* it hasn't changed at this point */ - + bool wanted = tb->get_active(); + if (wanted != port->input()->offline()) { port->input()->set_offline (wanted); } - return stop_signal (*tb, "button_press_event"); } void @@ -567,24 +567,24 @@ OptionEditor::map_port_online (MIDI::Port* port, ToggleButton* tb) } } -gint -OptionEditor::port_trace_in_toggled (GdkEventButton* ev, MIDI::Port* port, ToggleButton* tb) +void +OptionEditor::port_trace_in_toggled (MIDI::Port* port, ToggleButton* tb) { - /* XXX not very good MVC style here */ + bool trace = tb->get_active(); - port->input()->trace (!tb->get_active(), &cerr, string (port->name()) + string (" input: ")); - tb->set_active (!tb->get_active()); - return stop_signal (*tb, "button_press_event"); + if (port->input()->tracing() != trace) { + port->output()->trace (trace, &cerr, string (port->name()) + string (" input: ")); + } } -gint -OptionEditor::port_trace_out_toggled (GdkEventButton* ev,MIDI::Port* port, ToggleButton* tb) +void +OptionEditor::port_trace_out_toggled (MIDI::Port* port, ToggleButton* tb) { - /* XXX not very good MVC style here */ + bool trace = tb->get_active(); - port->output()->trace (!tb->get_active(), &cerr, string (port->name()) + string (" output: ")); - tb->set_active (!tb->get_active()); - return stop_signal (*tb, "button_press_event"); + if (port->output()->tracing() != trace) { + port->output()->trace (trace, &cerr, string (port->name()) + string (" output: ")); + } } void diff --git a/gtk2_ardour/option_editor.h b/gtk2_ardour/option_editor.h index d3235164a6..2076da3935 100644 --- a/gtk2_ardour/option_editor.h +++ b/gtk2_ardour/option_editor.h @@ -116,9 +116,9 @@ class OptionEditor : public Gtk::Dialog Gtk::RadioButton::Group mmc_button_group; Gtk::RadioButton::Group midi_button_group; - gint port_online_toggled (GdkEventButton*,MIDI::Port*,Gtk::ToggleButton*); - gint port_trace_in_toggled (GdkEventButton*,MIDI::Port*,Gtk::ToggleButton*); - gint port_trace_out_toggled (GdkEventButton*,MIDI::Port*,Gtk::ToggleButton*); + void port_online_toggled (MIDI::Port*,Gtk::ToggleButton*); + void port_trace_in_toggled (MIDI::Port*,Gtk::ToggleButton*); + void port_trace_out_toggled (MIDI::Port*,Gtk::ToggleButton*); void mmc_port_chosen (MIDI::Port*,Gtk::RadioButton*); void mtc_port_chosen (MIDI::Port*,Gtk::RadioButton*); diff --git a/gtk2_ardour/plugin_ui.cc b/gtk2_ardour/plugin_ui.cc index b19a9f74eb..56b9e34d35 100644 --- a/gtk2_ardour/plugin_ui.cc +++ b/gtk2_ardour/plugin_ui.cc @@ -118,16 +118,21 @@ PluginUIWindow::PluginUIWindow (boost::shared_ptr<PluginInsert> insert, bool scr PluginUIWindow::~PluginUIWindow () { } + bool PluginUIWindow::on_key_press_event (GdkEventKey* event) { - return PublicEditor::instance().on_key_press_event(event); + if (!key_press_focus_accelerator_handler (*this, event)) { + return PublicEditor::instance().on_key_press_event(event); + } else { + return true; + } } bool PluginUIWindow::on_key_release_event (GdkEventKey* event) { - return PublicEditor::instance().on_key_release_event(event); + return true; } void diff --git a/gtk2_ardour/po/SConscript b/gtk2_ardour/po/SConscript deleted file mode 100644 index d7e957b3eb..0000000000 --- a/gtk2_ardour/po/SConscript +++ /dev/null @@ -1,51 +0,0 @@ -# -*- python -*- -import os -import os.path -import glob - -Import ('env gtkardour install_prefix intl_files') - -potfiles_in = open('POTFILES.in', 'w') - -intl_files.sort() - -print "Generating POTFILES.in in gtk_ardour/po" - -potfiles_in.write("""# This file was automatically generated by a configuration script. -# Contains a list of source files containing translatable -# strings sorted alphabetically. -[encoding: UTF-8] -""") - -for f in intl_files[:]: - potfiles_in.write(f + '\n') - -potfiles_in.close() - -print "Updating pot file: " - -domain = gtkardour['DOMAIN'] -potfile = gtkardour['POTFILE'] - -poaction = env.Action('intltool-update -p -g=' + domain) - -Execute(poaction) - -# this should probably be merged with the i18n builder somehow - -p_oze = [ os.path.basename (po) for po in glob.glob ('*.po') ] -languages = [ po.replace ('.po', '') for po in p_oze ] -m_oze = [ po.replace (".po", ".mo") for po in p_oze ] - -for mo in m_oze[:]: - po = mo.replace (".mo", ".po") - env.Alias ('install', gtkardour.MoBuild (mo, [ po, potfile ])) - -for lang in languages[:]: - modir = (os.path.join (install_prefix, 'share/locale/' + lang + '/LC_MESSAGES/')) - moname = domain + '.mo' - env.Alias('install', env.InstallAs (os.path.join (modir, moname), lang + '.mo')) - -env.Alias ('tarball', env.Distribute (env['DISTTREE'], - [ 'SConscript', 'gtk_ardour.pot' ] + - glob.glob('*.po'))) diff --git a/gtk2_ardour/po/ru_RU.po b/gtk2_ardour/po/ru_RU.po index 2a7183442f..7a11f8bb1d 100644 --- a/gtk2_ardour/po/ru_RU.po +++ b/gtk2_ardour/po/ru_RU.po @@ -1,302 +1,309 @@ +# translation of ru_RU.po to Russian # Copyright (C) 2004 Paul Davis # This file is distributed under the same license as the gtk-ardour package. -# Igor Blinov pitstop@nm.ru, 2004. # +# Igor Blinov pitstop@nm.ru, 2004. +# Alexandre Prokoudine <alexandre.prokoudine@gmail.com>, 2006. msgid "" msgstr "" -"Project-Id-Version: gtk-ardour 0.413.0\n" +"Project-Id-Version: ru_RU\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2006-06-27 13:00-0400\n" -"PO-Revision-Date: 2004-03-31 00:45+0300\n" -"Last-Translator: Igor Blinov pitstop@nm.ru\n" -"Language-Team: Russian\n" +"POT-Creation-Date: 2006-09-21 04:11+0400\n" +"PO-Revision-Date: 2006-09-21 07:53+0400\n" +"Last-Translator: Alexandre Prokoudine <alexandre.prokoudine@gmail.com>\n" +"Language-Team: Russian <ru@li.org>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.11.4\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);\n" -#: about.cc:120 +#: gtk2_ardour/about.cc:120 msgid "Paul Davis" -msgstr "" +msgstr "Paul Davis" -#: about.cc:121 -#, fuzzy +#: gtk2_ardour/about.cc:121 msgid "Jesse Chappell" -msgstr "ОгромнаÑ" +msgstr "Jesse Chappell" -#: about.cc:122 +#: gtk2_ardour/about.cc:122 msgid "Taybin Rutkin" -msgstr "" +msgstr "Taybin Rutkin" -#: about.cc:123 +#: gtk2_ardour/about.cc:123 msgid "Marcus Andersson" -msgstr "" +msgstr "Marcus Andersson" -#: about.cc:124 +#: gtk2_ardour/about.cc:124 msgid "Jeremy Hall" -msgstr "" +msgstr "Jeremy Hall" -#: about.cc:125 +#: gtk2_ardour/about.cc:125 msgid "Steve Harris" -msgstr "" +msgstr "Steve Harris" -#: about.cc:126 +#: gtk2_ardour/about.cc:126 msgid "Tim Mayberry" -msgstr "" +msgstr "Tim Mayberry" -#: about.cc:127 +#: gtk2_ardour/about.cc:127 msgid "Mark Stewart" -msgstr "" +msgstr "Mark Stewart" -#: about.cc:128 +#: gtk2_ardour/about.cc:128 msgid "Sam Chessman" -msgstr "" +msgstr "Sam Chessman" -#: about.cc:129 +#: gtk2_ardour/about.cc:129 msgid "Jack O'Quin" -msgstr "" +msgstr "Jack O'Quin" -#: about.cc:130 +#: gtk2_ardour/about.cc:130 msgid "Matt Krai" -msgstr "" +msgstr "Matt Krai" -#: about.cc:131 +#: gtk2_ardour/about.cc:131 msgid "Ben Bell" -msgstr "" +msgstr "Ben Bell" -#: about.cc:132 +#: gtk2_ardour/about.cc:132 msgid "Gerard van Dongen" -msgstr "" +msgstr "Gerard van Dongen" -#: about.cc:133 +#: gtk2_ardour/about.cc:133 msgid "Thomas Charbonnel" -msgstr "" +msgstr "Thomas Charbonnel" -#: about.cc:134 +#: gtk2_ardour/about.cc:134 msgid "Nick Mainsbridge" -msgstr "" +msgstr "Nick Mainsbridge" -#: about.cc:135 +#: gtk2_ardour/about.cc:135 msgid "Colin Law" -msgstr "" +msgstr "Colin Law" -#: about.cc:136 +#: gtk2_ardour/about.cc:136 msgid "Sampo Savolainen" -msgstr "" +msgstr "Sampo Savolainen" -#: about.cc:137 +#: gtk2_ardour/about.cc:137 msgid "Joshua Leach" -msgstr "" +msgstr "Joshua Leach" -#: about.cc:138 +#: gtk2_ardour/about.cc:138 msgid "Rob Holland" -msgstr "" +msgstr "Rob Holland" -#: about.cc:139 +#: gtk2_ardour/about.cc:139 msgid "Per Sigmond" -msgstr "" +msgstr "Per Sigmond" -#: about.cc:140 +#: gtk2_ardour/about.cc:140 msgid "Doug Mclain" -msgstr "" +msgstr "Doug Mclain" -#: about.cc:141 +#: gtk2_ardour/about.cc:141 msgid "Petter Sundlöf" -msgstr "" +msgstr "Petter Sundlöf" -#: about.cc:146 +#: gtk2_ardour/about.cc:146 msgid "" "French:\n" "\tAlain Fréhel <alain.frehel@free.fr>\n" msgstr "" +"ФранцузÑкий:\n" +"\tAlain Fréhel <alain.frehel@free.fr>\n" -#: about.cc:147 +#: gtk2_ardour/about.cc:147 msgid "" "German:\n" "\tKarsten Petersen <kapet@kapet.de>\n" msgstr "" +"Ðемецкий:\n" +"\tKarsten Petersen <kapet@kapet.de>\n" -#: about.cc:148 +#: gtk2_ardour/about.cc:148 msgid "" "Italian:\n" "\tFilippo Pappalardo <filippo@email.it>\n" msgstr "" +"ИтальÑнÑкий:\n" +"\tFilippo Pappalardo <filippo@email.it>\n" -#: about.cc:149 +#: gtk2_ardour/about.cc:149 msgid "" "Portuguese:\n" "\tRui Nuno Capela <rncbc@rncbc.org>\n" msgstr "" +"ПортугальÑкий:\n" +"\tRui Nuno Capela <rncbc@rncbc.org>\n" -#: about.cc:150 +#: gtk2_ardour/about.cc:150 msgid "" "Brazilian Portuguese:\n" "\tAlexander da Franca Fernandes <alexander@nautae.eti.br>\n" "\tChris Ross <chris@tebibyte.org>\n" msgstr "" +"БразильÑкий португальÑкий:\n" +"\tAlexander da Franca Fernandes <alexander@nautae.eti.br>\n" +"\tChris Ross <chris@tebibyte.org>\n" -#: about.cc:152 +#: gtk2_ardour/about.cc:152 msgid "" "Spanish:\n" "\t Alex Krohn <alexkrohn@fastmail.fm>\n" msgstr "" +"ИÑпанÑкий:\n" +"\t Alex Krohn <alexkrohn@fastmail.fm>\n" -#: about.cc:153 +#: gtk2_ardour/about.cc:153 msgid "" "Russian:\n" "\t Igor Blinov <pitstop@nm.ru>\n" msgstr "" +"РуÑÑкий:\n" +"\t Igor Blinov <pitstop@nm.ru>\n" +"\t Alexandre Prokoudine <alexandre.prokoudine@gmail.com>\n" -#: about.cc:181 -#, fuzzy +#: gtk2_ardour/about.cc:181 msgid "Copyright (C) 1999-2005 Paul Davis\n" -msgstr "ÐвторÑкое право 1999-2004 Paul Davis" +msgstr "ÐвторÑкие права 1999-2005 Paul Davis\n" -#: about.cc:182 +#: gtk2_ardour/about.cc:182 msgid "" "Ardour comes with ABSOLUTELY NO WARRANTY\n" "This is free software, and you are welcome to redistribute it\n" "under certain conditions; see the file COPYING for details.\n" msgstr "" -#: about.cc:188 +#: gtk2_ardour/about.cc:188 msgid "" "%1\n" "(built with ardour/gtk %2.%3.%4 libardour: %5.%6.%7)" msgstr "" -#: actions.cc:261 +#: gtk2_ardour/actions.cc:76 +msgid "badly formatted UI definition file" +msgstr "" + +#: gtk2_ardour/actions.cc:78 +msgid "Ardour menu definition file not found" +msgstr "" + +#: gtk2_ardour/actions.cc:82 +msgid "ardour will not work without a valid ardour.menus file" +msgstr "" + +#: gtk2_ardour/actions.cc:261 #, fuzzy msgid "programmer error: %1 %2" msgstr "ошибка в программе: " -#: add_route_dialog.cc:62 +#: gtk2_ardour/actions.cc:280 +msgid "Unknown action name: %1" +msgstr "" + +#: gtk2_ardour/add_route_dialog.cc:62 msgid "ardour: add track/bus" msgstr "ardour: добавить трек/шину" -#. path = "1" -#: add_route_dialog.cc:63 editor_route_list.cc:73 +#: gtk2_ardour/add_route_dialog.cc:63 gtk2_ardour/editor_route_list.cc:71 msgid "Tracks" -msgstr "Треки" +msgstr "Дорожки" -#. path = "0" -#: add_route_dialog.cc:64 editor_route_list.cc:70 +#: gtk2_ardour/add_route_dialog.cc:64 gtk2_ardour/editor_route_list.cc:68 msgid "Busses" msgstr "Шины" -#: add_route_dialog.cc:96 plugin_ui.cc:833 +#: gtk2_ardour/add_route_dialog.cc:96 gtk2_ardour/plugin_ui.cc:145 msgid "Add" msgstr "Добавить" -#: add_route_dialog.cc:114 +#: gtk2_ardour/add_route_dialog.cc:114 msgid "Name (template)" msgstr "Ð˜Ð¼Ñ (шаблона)" -#: add_route_dialog.cc:120 +#: gtk2_ardour/add_route_dialog.cc:120 #, fuzzy msgid "Channel Configuration" msgstr "Отменить импорт" -#: add_route_dialog.cc:177 editor.cc:134 editor.cc:3688 time_axis_view.cc:552 +#: gtk2_ardour/add_route_dialog.cc:177 gtk2_ardour/time_axis_view.cc:553 msgid "Normal" msgstr "Ðорм." -#: add_route_dialog.cc:179 -#, fuzzy +#: gtk2_ardour/add_route_dialog.cc:179 msgid "Tape" -msgstr "Ðачало" +msgstr "" -#: add_route_dialog.cc:196 -#, fuzzy +#: gtk2_ardour/add_route_dialog.cc:196 msgid "Mono" -msgstr "моно" +msgstr "Моно" -#: add_route_dialog.cc:198 -#, fuzzy +#: gtk2_ardour/add_route_dialog.cc:198 msgid "Stereo" -msgstr "Ñтерео" +msgstr "Стерео" -#. preroll stuff -#: ardour_ui.cc:106 +#: gtk2_ardour/ardour_ui.cc:106 msgid "" "pre\n" "roll" msgstr "откат" -#: ardour_ui.cc:107 +#: gtk2_ardour/ardour_ui.cc:107 msgid "" "post\n" "roll" msgstr "накат" -#. transport -#: ardour_ui.cc:115 -#, fuzzy +#: gtk2_ardour/ardour_ui.cc:115 msgid "" "time\n" "master" -msgstr "JACK-Ñчётчик - маÑтер" +msgstr "" -#: ardour_ui.cc:117 +#: gtk2_ardour/ardour_ui.cc:117 msgid "% " msgstr "% " -#: ardour_ui.cc:119 -msgid "" -"punch\n" -"in" -msgstr "" -"врезка\n" -"до" +#: gtk2_ardour/ardour_ui.cc:119 gtk2_ardour/ardour_ui_ed.cc:267 +msgid "Punch In" +msgstr "Ðачало врезки" -#: ardour_ui.cc:120 -msgid "" -"punch\n" -"out" -msgstr "" -"врезка\n" -"поÑле" +#: gtk2_ardour/ardour_ui.cc:120 gtk2_ardour/ardour_ui_ed.cc:270 +msgid "Punch Out" +msgstr "Конец врезки" -#: ardour_ui.cc:121 -msgid "" -"auto\n" -"return" -msgstr "" -"авто\n" -"возврат" +#: gtk2_ardour/ardour_ui.cc:121 gtk2_ardour/ardour_ui_ed.cc:282 +msgid "Auto Return" +msgstr "Ðвтовозврат" -#: ardour_ui.cc:122 -msgid "" -"auto\n" -"play" -msgstr "" -"авто\n" -"воÑпр." +#: gtk2_ardour/ardour_ui.cc:122 +msgid "Autuo Play" +msgstr "ÐвтовоÑпр." -#: ardour_ui.cc:123 -msgid "" -"auto\n" -"input" -msgstr "" -"авто\n" -"вход" +#: gtk2_ardour/ardour_ui.cc:123 gtk2_ardour/ardour_ui_ed.cc:276 +msgid "Auto Input" +msgstr "Ðвтовход" -#: ardour_ui.cc:124 -msgid "click" -msgstr "метроном" +#: gtk2_ardour/ardour_ui.cc:124 gtk2_ardour/ardour_ui_ed.cc:273 +#: gtk2_ardour/option_editor.cc:128 +msgid "Click" +msgstr "Метроном" -#: ardour_ui.cc:125 -msgid "AUDITIONING" +#: gtk2_ardour/ardour_ui.cc:125 +msgid "AUDITION" msgstr "КОÐТРОЛЬ" -#: ardour_ui.cc:126 +#: gtk2_ardour/ardour_ui.cc:126 msgid "SOLO" msgstr "СОЛО" -#: ardour_ui.cc:375 +#: gtk2_ardour/ardour_ui.cc:374 msgid "quit" msgstr "выйти" -#: ardour_ui.cc:384 +#: gtk2_ardour/ardour_ui.cc:383 msgid "" "Ardour was unable to save your session.\n" "\n" @@ -305,33 +312,33 @@ msgid "" "\"Just quit\" option." msgstr "" -#: ardour_ui.cc:403 +#: gtk2_ardour/ardour_ui.cc:402 msgid "ardour: save session?" msgstr "ardour: Ñохранить ÑеÑÑию?" -#: ardour_ui.cc:410 +#: gtk2_ardour/ardour_ui.cc:409 msgid "Don't %1" msgstr "Отмена" -#: ardour_ui.cc:412 +#: gtk2_ardour/ardour_ui.cc:411 msgid "Just %1" msgstr "Да, %1" -#: ardour_ui.cc:414 +#: gtk2_ardour/ardour_ui.cc:413 msgid "Save and %1" msgstr "Сохранить и %1" -#: ardour_ui.cc:426 +#: gtk2_ardour/ardour_ui.cc:425 #, fuzzy msgid "session" msgstr "СеÑÑиÑ" -#: ardour_ui.cc:428 +#: gtk2_ardour/ardour_ui.cc:427 #, fuzzy msgid "snapshot" msgstr "Снимок" -#: ardour_ui.cc:430 +#: gtk2_ardour/ardour_ui.cc:429 #, fuzzy msgid "" "The %1\"%2\"\n" @@ -350,80 +357,82 @@ msgstr "" "\n" "Что Ð’Ñ‹ хотите Ñделать?" -#: ardour_ui.cc:444 +#: gtk2_ardour/ardour_ui.cc:443 msgid "Prompter" msgstr "" -#: ardour_ui.cc:503 +#: gtk2_ardour/ardour_ui.cc:502 #, fuzzy, c-format msgid "disconnected" msgstr "ОтÑоединить" -#: ardour_ui.cc:510 +#: gtk2_ardour/ardour_ui.cc:509 #, fuzzy, c-format -msgid "SR: %.1f kHz / %4.1f msecs" +msgid "%.1f kHz / %4.1f msecs" msgstr "SR: %.1f кГц" -#: ardour_ui.cc:514 -#, c-format -msgid "SR: %u kHz / %4.1f msecs" -msgstr "" +#: gtk2_ardour/ardour_ui.cc:513 +#, fuzzy, c-format +msgid "%u kHz / %4.1f msecs" +msgstr "SR: %.1f кГц" -#: ardour_ui.cc:527 -#, c-format -msgid "DSP Load: %.1f%%" +#: gtk2_ardour/ardour_ui.cc:526 +#, fuzzy, c-format +msgid "DSP: %.1f%%" msgstr "Загрузка DSP: %.1f%%" -#: ardour_ui.cc:537 +#: gtk2_ardour/ardour_ui.cc:536 #, fuzzy, c-format msgid "Buffers p:%<PRIu32>%% c:%<PRIu32>%%" msgstr "Буферы p:%5.0f%% c:%5.0f%%" -#: ardour_ui.cc:564 -msgid "space: 24hrs+" +#: gtk2_ardour/ardour_ui.cc:564 +#, fuzzy +msgid "Disk: 24hrs+" msgstr "меÑто на диÑке: 24 чаÑа +" -#: ardour_ui.cc:594 -#, c-format -msgid "space: %02dh:%02dm:%02ds" +#: gtk2_ardour/ardour_ui.cc:594 +#, fuzzy, c-format +msgid "Disk: %02dh:%02dm:%02ds" msgstr "Ñвободное меÑто: %02dч:%02dмин:%02dÑек" -#: ardour_ui.cc:633 +#: gtk2_ardour/ardour_ui.cc:633 msgid "programming error: impossible control method" msgstr "ошибка в программе: impossible control method" -#: ardour_ui.cc:741 new_session_dialog.cc:294 +#: gtk2_ardour/ardour_ui.cc:741 gtk2_ardour/new_session_dialog.cc:301 #, fuzzy msgid "Recent Sessions" msgstr "открыть ÑеÑÑию" -#. ardour sessions are folders -#: ardour_ui.cc:834 +#: gtk2_ardour/ardour_ui.cc:834 msgid "open session" msgstr "открыть ÑеÑÑию" -#: ardour_ui.cc:840 -#, fuzzy +#: gtk2_ardour/ardour_ui.cc:840 msgid "Ardour sessions" -msgstr "ardour_новаÑ_ÑеÑÑиÑ" +msgstr "СеÑÑии Ardour" -#: ardour_ui.cc:873 +#: gtk2_ardour/ardour_ui.cc:873 msgid "Patience is a virtue.\n" msgstr "По нитке дойдёшь и до клубка.\n" -#: ardour_ui.cc:882 -msgid "You cannot add a track without a session already loaded." +#: gtk2_ardour/ardour_ui.cc:883 +#, fuzzy +msgid "You cannot add a track or bus without a session already loaded." msgstr "Ð’Ñ‹ не можете добавить трек пока ÑеÑÑÐ¸Ñ Ð½Ðµ загружена." -#: ardour_ui.cc:889 -msgid "could not create new audio track" +#: gtk2_ardour/ardour_ui.cc:893 gtk2_ardour/ardour_ui.cc:905 +#, fuzzy +msgid "could not create a new audio track" msgstr "не удалоÑÑŒ Ñоздать новый аудиотрек" -#: ardour_ui.cc:893 -msgid "could not create new audio bus" -msgstr "не удалоÑÑŒ Ñоздать новую аудиошину" +#: gtk2_ardour/ardour_ui.cc:895 gtk2_ardour/ardour_ui.cc:907 +#, fuzzy +msgid "could not create %1 new audio tracks" +msgstr "не удалоÑÑŒ Ñоздать новый аудиотрек" -#: ardour_ui.cc:912 +#: gtk2_ardour/ardour_ui.cc:927 msgid "" "There are insufficient JACK ports available\n" "to create a new track or bus.\n" @@ -431,14 +440,14 @@ msgid "" "restart JACK with more ports." msgstr "" -#: ardour_ui.cc:1036 +#: gtk2_ardour/ardour_ui.cc:1046 msgid "" "Please create 1 or more track\n" "before trying to record.\n" "Check the Session menu." msgstr "" -#: ardour_ui.cc:1265 +#: gtk2_ardour/ardour_ui.cc:1268 #, fuzzy msgid "" "JACK has either been shutdown or it\n" @@ -451,55 +460,50 @@ msgstr "" "Ðеобходимо Ñохранить ÑеÑÑию и\n" "перезапуÑтить JACK и Ardour." -#: ardour_ui.cc:1282 +#: gtk2_ardour/ardour_ui.cc:1285 msgid "Unable to create all required ports" msgstr "" -#: ardour_ui.cc:1290 +#: gtk2_ardour/ardour_ui.cc:1293 #, fuzzy msgid "Unable to start the session running" msgstr "Ð’ начало ÑеÑÑии" -#: ardour_ui.cc:1426 -msgid "No Stream" -msgstr "Ðет потока" - -#: ardour_ui.cc:1453 ardour_ui.cc:1472 +#: gtk2_ardour/ardour_ui.cc:1399 gtk2_ardour/ardour_ui.cc:1418 msgid "none" msgstr "нет" -#: ardour_ui.cc:1462 ardour_ui.cc:1481 +#: gtk2_ardour/ardour_ui.cc:1408 gtk2_ardour/ardour_ui.cc:1427 msgid "off" msgstr "выкл" -#: ardour_ui.cc:1505 -#, fuzzy +#: gtk2_ardour/ardour_ui.cc:1451 msgid "Name of New Snapshot" -msgstr "Ð˜Ð¼Ñ Ñнимка" +msgstr "Ð˜Ð¼Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ Ñнимка:" -#: ardour_ui.cc:1651 +#: gtk2_ardour/ardour_ui.cc:1597 msgid "Name for mix template:" msgstr "Ð˜Ð¼Ñ mix-шаблона:" -#: ardour_ui.cc:1652 +#: gtk2_ardour/ardour_ui.cc:1598 msgid "-template" msgstr "-шаблон" -#: ardour_ui.cc:1809 +#: gtk2_ardour/ardour_ui.cc:1806 msgid "" "You do not have write access to this session.\n" "This prevents the session from being loaded." msgstr "" -#: ardour_ui.cc:1822 ardour_ui.cc:1877 +#: gtk2_ardour/ardour_ui.cc:1819 gtk2_ardour/ardour_ui.cc:1871 msgid "Session \"%1 (snapshot %2)\" did not load successfully" msgstr "Ðе удалоÑÑŒ загрузить ÑеÑÑию \"%1 (Ñнимок %2)\"" -#: ardour_ui.cc:1933 +#: gtk2_ardour/ardour_ui.cc:1926 msgid "No audio files were ready for cleanup" msgstr "" -#: ardour_ui.cc:1937 +#: gtk2_ardour/ardour_ui.cc:1930 msgid "" "If this seems suprising, \n" "check for any existing snapshots.\n" @@ -507,23 +511,23 @@ msgid "" "require some unused files to continue to exist." msgstr "" -#: ardour_ui.cc:1946 +#: gtk2_ardour/ardour_ui.cc:1939 msgid "ardour: cleanup" msgstr "ardour: очиÑтка" -#: ardour_ui.cc:1982 ardour_ui.cc:1988 +#: gtk2_ardour/ardour_ui.cc:1975 gtk2_ardour/ardour_ui.cc:1981 msgid "files were" msgstr "" -#: ardour_ui.cc:1984 ardour_ui.cc:1990 +#: gtk2_ardour/ardour_ui.cc:1977 gtk2_ardour/ardour_ui.cc:1983 msgid "file was" msgstr "" -#: ardour_ui.cc:2031 +#: gtk2_ardour/ardour_ui.cc:2024 msgid "Are you sure you want to cleanup?" msgstr "" -#: ardour_ui.cc:2036 +#: gtk2_ardour/ardour_ui.cc:2029 msgid "" "Cleanup is a destructive operation.\n" "ALL undo/redo information will be lost if you cleanup.\n" @@ -531,26 +535,26 @@ msgid "" "location." msgstr "" -#: ardour_ui.cc:2042 +#: gtk2_ardour/ardour_ui.cc:2035 #, fuzzy msgid "Clean Up" msgstr "ОчиÑтка" -#: ardour_ui.cc:2045 +#: gtk2_ardour/ardour_ui.cc:2038 #, fuzzy msgid "CleanupDialog" msgstr "ОчиÑтка" -#: ardour_ui.cc:2046 +#: gtk2_ardour/ardour_ui.cc:2039 #, fuzzy msgid "ardour_cleanup" msgstr "ardour: очиÑтка" -#: ardour_ui.cc:2065 +#: gtk2_ardour/ardour_ui.cc:2058 msgid "cleaned files" msgstr "" -#: ardour_ui.cc:2066 +#: gtk2_ardour/ardour_ui.cc:2059 #, fuzzy msgid "" "The following %1 %2 not in use and \n" @@ -565,25 +569,24 @@ msgstr "" "ПоÑÐ»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ Ð¾Ñ‡Ð¸Ñтка корзины оÑвободит\n" "%2 мегабайт меÑта на диÑке." -#: ardour_ui.cc:2091 +#: gtk2_ardour/ardour_ui.cc:2084 #, fuzzy msgid "deleted file" msgstr "удалённые файлы" -#: ardour_ui.cc:2092 +#: gtk2_ardour/ardour_ui.cc:2085 #, fuzzy msgid "" "The following %1 %2 deleted from\n" "%3,\n" "releasing %4 %5bytes of disk space" -msgstr "" -"Следующие %1 файлов были удалены, оÑвободив при Ñтом %2 Мб меÑта на диÑке" +msgstr "Следующие %1 файлов были удалены, оÑвободив при Ñтом %2 Мб меÑта на диÑке" -#: ardour_ui.cc:2215 +#: gtk2_ardour/ardour_ui.cc:2201 msgid "Recording was stopped because your system could not keep up." msgstr "ЗапиÑÑŒ оÑтановлена из-за недоÑтаточного быÑтродейÑÑ‚Ð²Ð¸Ñ ÑиÑтемы" -#: ardour_ui.cc:2238 +#: gtk2_ardour/ardour_ui.cc:2224 msgid "" "The disk system on your computer\n" "was not able to keep up with Ardour.\n" @@ -592,7 +595,7 @@ msgid "" "quickly enough to keep up with recording.\n" msgstr "" -#: ardour_ui.cc:2257 +#: gtk2_ardour/ardour_ui.cc:2243 msgid "" "The disk system on your computer\n" "was not able to keep up with Ardour.\n" @@ -601,7 +604,7 @@ msgid "" "quickly enough to keep up with playback.\n" msgstr "" -#: ardour_ui.cc:2283 +#: gtk2_ardour/ardour_ui.cc:2269 msgid "" "This session appears to have been in\n" "middle of recording when ardour or\n" @@ -612,2866 +615,2742 @@ msgid "" "what you would like to do.\n" msgstr "" -#: ardour_ui.cc:2293 +#: gtk2_ardour/ardour_ui.cc:2279 msgid "Recover from crash" msgstr "" -#: ardour_ui.cc:2294 +#: gtk2_ardour/ardour_ui.cc:2280 msgid "Ignore crash data" msgstr "" -#: ardour_ui.cc:2312 +#: gtk2_ardour/ardour_ui.cc:2298 #, fuzzy msgid "Could not disconnect from JACK" msgstr "Ðе удалоÑÑŒ ÑоединитьÑÑ Ñ Ñервером JACK как \"%1\"" -#: ardour_ui.cc:2325 +#: gtk2_ardour/ardour_ui.cc:2311 #, fuzzy msgid "Could not reconnect to JACK" msgstr "Ðе удалоÑÑŒ ÑоединитьÑÑ Ñ Ñервером JACK как \"%1\"" -#: ardour_ui2.cc:60 +#: gtk2_ardour/ardour_ui2.cc:60 msgid "UI: cannot setup editor" msgstr "ИнтерфейÑ: не удалоÑÑŒ инициализировать редактор" -#: ardour_ui2.cc:65 +#: gtk2_ardour/ardour_ui2.cc:65 msgid "UI: cannot setup mixer" msgstr "ИнтерфейÑ: не удалоÑÑŒ инициализировать микшер" -#: ardour_ui2.cc:91 +#: gtk2_ardour/ardour_ui2.cc:91 msgid "MMC + Local" msgstr "" -#: ardour_ui2.cc:92 +#: gtk2_ardour/ardour_ui2.cc:92 msgid "MMC" msgstr "MMC" -#: ardour_ui2.cc:93 +#: gtk2_ardour/ardour_ui2.cc:93 msgid "Local" msgstr "" -#: ardour_ui2.cc:110 +#: gtk2_ardour/ardour_ui2.cc:110 msgid "MMC ID" msgstr "MMC идентификатор" -#: ardour_ui2.cc:291 +#: gtk2_ardour/ardour_ui2.cc:291 msgid "Play from playhead" msgstr "ВоÑпроизвеÑти от указателÑ" -#: ardour_ui2.cc:292 +#: gtk2_ardour/ardour_ui2.cc:292 msgid "Stop playback" msgstr "Стоп" -#: ardour_ui2.cc:293 +#: gtk2_ardour/ardour_ui2.cc:293 #, fuzzy msgid "Play range/selection" msgstr "ВоÑпроизвеÑти выделенное" -#: ardour_ui2.cc:294 +#: gtk2_ardour/ardour_ui2.cc:294 msgid "Go to start of session" msgstr "Ð’ начало ÑеÑÑии" -#: ardour_ui2.cc:295 +#: gtk2_ardour/ardour_ui2.cc:295 msgid "Go to end of session" msgstr "Ð’ конец ÑеÑÑии" -#: ardour_ui2.cc:296 +#: gtk2_ardour/ardour_ui2.cc:296 msgid "Play loop range" msgstr "ВоÑпроизвеÑти \"кольцо\"" -#: ardour_ui2.cc:297 +#: gtk2_ardour/ardour_ui2.cc:297 msgid "Return to last playback start when stopped" msgstr "ВернутьÑÑ Ðº точке начала воÑпроизведениÑ" -#: ardour_ui2.cc:298 +#: gtk2_ardour/ardour_ui2.cc:298 msgid "Start playback after any locate" msgstr "" -#: ardour_ui2.cc:299 +#: gtk2_ardour/ardour_ui2.cc:299 msgid "Be sensible about input monitoring" msgstr "" -#: ardour_ui2.cc:300 +#: gtk2_ardour/ardour_ui2.cc:300 msgid "Start recording at auto-punch start" msgstr "Ðачать запиÑÑŒ Ñ Ð½Ð°Ñ‡Ð°Ð»Ð° \"авто-врезки\"" -#: ardour_ui2.cc:301 +#: gtk2_ardour/ardour_ui2.cc:301 msgid "Stop recording at auto-punch end" msgstr "ОÑтановить запиÑÑŒ в конце \"авто-врезки\"" -#: ardour_ui2.cc:302 +#: gtk2_ardour/ardour_ui2.cc:302 msgid "Enable/Disable audio click" msgstr "Вкл./Выкл. метроном" -#: ardour_ui2.cc:303 +#: gtk2_ardour/ardour_ui2.cc:303 msgid "Positional sync source" msgstr "" -#: ardour_ui2.cc:304 +#: gtk2_ardour/ardour_ui2.cc:304 msgid "Does Ardour control the time?" msgstr "" -#: ardour_ui2.cc:305 +#: gtk2_ardour/ardour_ui2.cc:305 msgid "Shuttle speed control" msgstr "" -#: ardour_ui2.cc:306 +#: gtk2_ardour/ardour_ui2.cc:306 #, c-format msgid "Select semitones or %%-age for speed display" msgstr "" -#: ardour_ui2.cc:307 +#: gtk2_ardour/ardour_ui2.cc:307 msgid "Current transport speed" msgstr "ТекщаÑÑ ÑкорÑÑ‚ÑŒ транÑпорта" -#: ardour_ui2.cc:330 +#: gtk2_ardour/ardour_ui2.cc:330 msgid "Primary clock" msgstr "ОÑновной Ñчётчик" -#: ardour_ui2.cc:331 +#: gtk2_ardour/ardour_ui2.cc:331 msgid "secondary clock" msgstr "дополнительный Ñчётчик" -#. XXX: this should really be saved in instant.xml or something similar and restored from there -#. Combo's are stupid - they steal space from the entry for the button -#: ardour_ui2.cc:388 ardour_ui2.cc:833 ardour_ui2.cc:846 ardour_ui2.cc:909 -#: ardour_ui2.cc:911 +#: gtk2_ardour/ardour_ui2.cc:388 gtk2_ardour/ardour_ui2.cc:849 +#: gtk2_ardour/ardour_ui2.cc:862 gtk2_ardour/ardour_ui2.cc:925 +#: gtk2_ardour/ardour_ui2.cc:927 msgid "sprung" msgstr "" -#: ardour_ui2.cc:389 ardour_ui2.cc:835 ardour_ui2.cc:857 +#: gtk2_ardour/ardour_ui2.cc:389 gtk2_ardour/ardour_ui2.cc:851 +#: gtk2_ardour/ardour_ui2.cc:873 msgid "wheel" msgstr "" -#: ardour_ui2.cc:451 +#: gtk2_ardour/ardour_ui2.cc:467 msgid "ardour: clock" msgstr "ardour: Ñчётчик" -#: ardour_ui2.cc:596 +#: gtk2_ardour/ardour_ui2.cc:612 msgid "Maximum speed" -msgstr "" +msgstr "МакÑ. ÑкороÑÑ‚ÑŒ" -#: ardour_ui2.cc:823 -msgid "st" -msgstr "" +#: gtk2_ardour/ardour_ui2.cc:839 +#, fuzzy +msgid "ST" +msgstr "УСТÐÐОВИТЬ" -#: ardour_ui2.cc:867 ardour_ui2.cc:890 ardour_ui2.cc:907 -msgid "stopped" -msgstr "оÑтановлено" +#: gtk2_ardour/ardour_ui2.cc:883 gtk2_ardour/ardour_ui2.cc:906 +#, fuzzy +msgid "stop" +msgstr "Стоп" + +#: gtk2_ardour/ardour_ui2.cc:923 +msgid "-0.55" +msgstr "-0.55" -#: ardour_ui_dialogs.cc:153 playlist_selector.cc:70 +#: gtk2_ardour/ardour_ui_dialogs.cc:145 gtk2_ardour/playlist_selector.cc:70 #, fuzzy msgid "close" msgstr "Закрыть" -#: ardour_ui_dialogs.cc:360 ardour_ui_ed.cc:184 -#, fuzzy +#: gtk2_ardour/ardour_ui_dialogs.cc:352 gtk2_ardour/ardour_ui_ed.cc:184 msgid "Sound File Browser" -msgstr "Ðудио-библиотека" +msgstr "Ðудиобиблиотека" -#. menus + submenus that need action items -#: ardour_ui_ed.cc:72 +#: gtk2_ardour/ardour_ui_ed.cc:72 msgid "Session" msgstr "СеÑÑиÑ" -#: ardour_ui_ed.cc:73 ardour_ui_ed.cc:130 editor.cc:1836 export_dialog.cc:350 -#: export_dialog.cc:1059 export_dialog.cc:1063 +#: gtk2_ardour/ardour_ui_ed.cc:73 gtk2_ardour/ardour_ui_ed.cc:130 +#: gtk2_ardour/editor.cc:1786 gtk2_ardour/export_dialog.cc:350 +#: gtk2_ardour/export_dialog.cc:1059 gtk2_ardour/export_dialog.cc:1063 msgid "Export" -msgstr "ÐкÑпорт" +msgstr "ÐкÑпортировать" -#: ardour_ui_ed.cc:74 +#: gtk2_ardour/ardour_ui_ed.cc:74 msgid "Cleanup" -msgstr "ОчиÑтка" +msgstr "ОчиÑтить" -#: ardour_ui_ed.cc:75 option_editor.cc:126 +#: gtk2_ardour/ardour_ui_ed.cc:75 gtk2_ardour/option_editor.cc:125 msgid "Sync" msgstr "Синхр." -#: ardour_ui_ed.cc:76 ardour_ui_ed.cc:77 -#, fuzzy +#: gtk2_ardour/ardour_ui_ed.cc:76 gtk2_ardour/ardour_ui_ed.cc:77 msgid "Options" -msgstr "Редактор параметров" +msgstr "Параметры" -#: ardour_ui_ed.cc:78 +#: gtk2_ardour/ardour_ui_ed.cc:78 msgid "Help" -msgstr "" +msgstr "Справка" -#: ardour_ui_ed.cc:79 +#: gtk2_ardour/ardour_ui_ed.cc:79 msgid "KeyMouse Actions" -msgstr "" +msgstr "ГорÑчие клавиши" -#: ardour_ui_ed.cc:80 -#, fuzzy +#: gtk2_ardour/ardour_ui_ed.cc:80 msgid "Audio File Format" -msgstr "Ðудио кадры" +msgstr "Формат звуковых файлов" -#: ardour_ui_ed.cc:81 -#, fuzzy +#: gtk2_ardour/ardour_ui_ed.cc:81 msgid "Header" -msgstr "Пред фейдер" +msgstr "Заголовок" -#: ardour_ui_ed.cc:82 +#: gtk2_ardour/ardour_ui_ed.cc:82 msgid "Data" -msgstr "" +msgstr "Данные" -#: ardour_ui_ed.cc:83 -#, fuzzy +#: gtk2_ardour/ardour_ui_ed.cc:83 msgid "Control Surfaces" -msgstr "Контрольные выходы" +msgstr "" -#. the real actions -#: ardour_ui_ed.cc:87 audio_time_axis.cc:1854 new_session_dialog.cc:529 +#: gtk2_ardour/ardour_ui_ed.cc:87 gtk2_ardour/route_time_axis.cc:1139 +#: gtk2_ardour/new_session_dialog.cc:546 msgid "New" -msgstr "Ðовый" +msgstr "ÐоваÑ" -#: ardour_ui_ed.cc:89 new_session_dialog.cc:517 +#: gtk2_ardour/ardour_ui_ed.cc:89 gtk2_ardour/new_session_dialog.cc:533 msgid "Open" msgstr "Открыть" -#: ardour_ui_ed.cc:90 +#: gtk2_ardour/ardour_ui_ed.cc:90 msgid "Recent" msgstr "ПоÑледние" -#: ardour_ui_ed.cc:91 io_selector.cc:58 io_selector.cc:792 +#: gtk2_ardour/ardour_ui_ed.cc:91 gtk2_ardour/io_selector.cc:60 +#: gtk2_ardour/io_selector.cc:794 gtk2_ardour/connection_editor.cc:59 msgid "Close" msgstr "Закрыть" -#: ardour_ui_ed.cc:94 route_params_ui.cc:514 +#: gtk2_ardour/ardour_ui_ed.cc:94 gtk2_ardour/route_params_ui.cc:510 msgid "Add Track/Bus" -msgstr "Добавить Трек/Шину" +msgstr "Добавить Дорожку/Шину" -#: ardour_ui_ed.cc:105 +#: gtk2_ardour/ardour_ui_ed.cc:105 msgid "Connect" msgstr "Соединить" -#. </CMT Additions> -#: ardour_ui_ed.cc:113 +#: gtk2_ardour/ardour_ui_ed.cc:113 msgid "Snapshot" msgstr "Снимок" -#: ardour_ui_ed.cc:116 +#: gtk2_ardour/ardour_ui_ed.cc:116 msgid "Save Template..." msgstr "Сохранить шаблон..." -#: ardour_ui_ed.cc:119 +#: gtk2_ardour/ardour_ui_ed.cc:119 msgid "Export session to audiofile..." msgstr "ÐкÑпорт ÑеÑÑии в аудиофайл..." -#: ardour_ui_ed.cc:122 -#, fuzzy +#: gtk2_ardour/ardour_ui_ed.cc:122 msgid "Export selection to audiofile..." -msgstr "ÐкÑпорт ÑеÑÑии в аудиофайл..." +msgstr "ÐкÑпорт выделение в аудиофайл..." -#: ardour_ui_ed.cc:126 -#, fuzzy +#: gtk2_ardour/ardour_ui_ed.cc:126 msgid "Export range markers to audiofile..." -msgstr "ÐкÑпорт ÑеÑÑии в аудиофайл..." +msgstr "ÐкÑпортировать маркеры облаÑти в аудиофайл..." -#: ardour_ui_ed.cc:133 +#: gtk2_ardour/ardour_ui_ed.cc:133 msgid "Cleanup unused sources" -msgstr "" +msgstr "ОчиÑтить неиÑпользуемые иÑточники" -#: ardour_ui_ed.cc:135 +#: gtk2_ardour/ardour_ui_ed.cc:135 msgid "Flush wastebasket" msgstr "ОчиÑтить корзину" -#: ardour_ui_ed.cc:141 ardour_ui_options.cc:408 ardour_ui_options.cc:417 -#: ardour_ui_options.cc:489 +#: gtk2_ardour/ardour_ui_ed.cc:141 gtk2_ardour/ardour_ui_options.cc:425 +#: gtk2_ardour/ardour_ui_options.cc:434 gtk2_ardour/ardour_ui_options.cc:507 msgid "JACK" msgstr "JACK" -#: ardour_ui_ed.cc:142 +#: gtk2_ardour/ardour_ui_ed.cc:142 msgid "Latency" -msgstr "" +msgstr "Задержка отклика" -#: ardour_ui_ed.cc:144 -#, fuzzy +#: gtk2_ardour/ardour_ui_ed.cc:144 msgid "Reconnect" -msgstr "Соединить" +msgstr "ПереÑоединитьÑÑ" -#: ardour_ui_ed.cc:147 mixer_strip.cc:497 mixer_strip.cc:565 +#: gtk2_ardour/ardour_ui_ed.cc:147 gtk2_ardour/mixer_strip.cc:498 +#: gtk2_ardour/mixer_strip.cc:561 msgid "Disconnect" -msgstr "ОтÑоединить" +msgstr "ОтÑоединитьÑÑ" -#: ardour_ui_ed.cc:174 +#: gtk2_ardour/ardour_ui_ed.cc:174 msgid "Windows" msgstr "Окна" -#: ardour_ui_ed.cc:175 +#: gtk2_ardour/ardour_ui_ed.cc:175 msgid "start prefix" msgstr "" -#: ardour_ui_ed.cc:176 +#: gtk2_ardour/ardour_ui_ed.cc:176 msgid "Quit" msgstr "Выйти" -#. windows visibility actions -#: ardour_ui_ed.cc:180 +#: gtk2_ardour/ardour_ui_ed.cc:180 msgid "Maximise Editor Space" -msgstr "" +msgstr "Редактор на полный Ñкран" -#: ardour_ui_ed.cc:182 -#, fuzzy +#: gtk2_ardour/ardour_ui_ed.cc:182 msgid "Show Editor" -msgstr "Редактор" +msgstr "Показать редактор" -#: ardour_ui_ed.cc:183 -#, fuzzy +#: gtk2_ardour/ardour_ui_ed.cc:183 msgid "Show Mixer" -msgstr "Микшер" +msgstr "Показать микшер" -#: ardour_ui_ed.cc:185 +#: gtk2_ardour/ardour_ui_ed.cc:185 msgid "Options Editor" msgstr "Редактор параметров" -#: ardour_ui_ed.cc:186 -#, fuzzy +#: gtk2_ardour/ardour_ui_ed.cc:186 msgid "Track/Bus Inspector" -msgstr "Треки/Шины" +msgstr "ИнÑпектор дорожек/шин" -#: ardour_ui_ed.cc:188 +#: gtk2_ardour/ardour_ui_ed.cc:188 gtk2_ardour/connection_editor.cc:147 +#: gtk2_ardour/connection_editor.cc:148 msgid "Connections" msgstr "СоединениÑ" -#: ardour_ui_ed.cc:190 +#: gtk2_ardour/ardour_ui_ed.cc:190 msgid "Locations" msgstr "Интервалы" -#: ardour_ui_ed.cc:192 +#: gtk2_ardour/ardour_ui_ed.cc:192 msgid "Big Clock" msgstr "Большой Ñчётчик" -#: ardour_ui_ed.cc:194 +#: gtk2_ardour/ardour_ui_ed.cc:194 msgid "About" msgstr "О программе" -#: ardour_ui_ed.cc:195 -#, fuzzy +#: gtk2_ardour/ardour_ui_ed.cc:195 msgid "Colors" -msgstr "Цвет" +msgstr "Цвета" -#: ardour_ui_ed.cc:197 -#, fuzzy +#: gtk2_ardour/ardour_ui_ed.cc:197 msgid "Add Audio Track" -msgstr "Добавить Трек/Шину" +msgstr "Добавить звуковую дорожку" -#: ardour_ui_ed.cc:199 -#, fuzzy +#: gtk2_ardour/ardour_ui_ed.cc:199 msgid "Add Audio Bus" -msgstr "Скрыть вÑе аудиошины" +msgstr "Добавить звуковую шину" -#: ardour_ui_ed.cc:201 +#: gtk2_ardour/ardour_ui_ed.cc:201 msgid "Save" msgstr "Сохранить" -#: ardour_ui_ed.cc:203 editor_actions.cc:255 +#: gtk2_ardour/ardour_ui_ed.cc:203 gtk2_ardour/editor_actions.cc:257 #, fuzzy msgid "Remove Last Capture" msgstr "Удалить поÑледнюю запиÑÑŒ" -#. do-nothing action for the "transport" menu bar item -#: ardour_ui_ed.cc:210 -#, fuzzy +#: gtk2_ardour/ardour_ui_ed.cc:210 msgid "Transport" -msgstr "Triangular" +msgstr "ТранÑпорт" -#. these two are not used by key bindings, instead use ToggleRoll for that. these two do show up in -#. menus and via button proxies. -#. -#: ardour_ui_ed.cc:216 sfdb_ui.cc:57 +#: gtk2_ardour/ardour_ui_ed.cc:216 gtk2_ardour/sfdb_ui.cc:60 msgid "Stop" msgstr "Стоп" -#: ardour_ui_ed.cc:219 +#: gtk2_ardour/ardour_ui_ed.cc:219 msgid "Roll" msgstr "" -#: ardour_ui_ed.cc:223 -#, fuzzy +#: gtk2_ardour/ardour_ui_ed.cc:223 msgid "Start/Stop" -msgstr "Ðачало:" +msgstr "Старт/Стоп" -#: ardour_ui_ed.cc:226 +#: gtk2_ardour/ardour_ui_ed.cc:226 msgid "Stop + Forget Capture" -msgstr "" +msgstr "Стоп+ Забыть захват" -#: ardour_ui_ed.cc:229 -#, fuzzy +#: gtk2_ardour/ardour_ui_ed.cc:229 msgid "Play Loop Range" -msgstr "ВоÑпроизвеÑти \"кольцо\"" +msgstr "ВоÑпроизвеÑти петлю" -#: ardour_ui_ed.cc:232 -#, fuzzy +#: gtk2_ardour/ardour_ui_ed.cc:232 msgid "Play Selection" -msgstr "ВоÑпроизвеÑти выделенную облаÑÑ‚ÑŒ" +msgstr "ВоÑпроизвеÑти выделение" -#: ardour_ui_ed.cc:236 -#, fuzzy +#: gtk2_ardour/ardour_ui_ed.cc:236 msgid "Enable Record" -msgstr "ЗапиÑÑŒ" +msgstr "Разрешить запиÑÑŒ" -#: ardour_ui_ed.cc:239 -#, fuzzy +#: gtk2_ardour/ardour_ui_ed.cc:239 msgid "Rewind" -msgstr "ОблаÑÑ‚ÑŒ" +msgstr "Перемотать назад" -#: ardour_ui_ed.cc:242 +#: gtk2_ardour/ardour_ui_ed.cc:242 msgid "Rewind (Slow)" -msgstr "" +msgstr "Перемотать назад (медленно)" -#: ardour_ui_ed.cc:245 +#: gtk2_ardour/ardour_ui_ed.cc:245 msgid "Rewind (Fast)" -msgstr "" +msgstr "Перемотать назад (быÑтро)" -#: ardour_ui_ed.cc:248 +#: gtk2_ardour/ardour_ui_ed.cc:248 msgid "Forward" -msgstr "" +msgstr "Перемотать вперёд" -#: ardour_ui_ed.cc:251 +#: gtk2_ardour/ardour_ui_ed.cc:251 msgid "Forward (Slow)" -msgstr "" +msgstr "Перемотать вперёд (медленно)" -#: ardour_ui_ed.cc:254 +#: gtk2_ardour/ardour_ui_ed.cc:254 msgid "Forward (Fast)" -msgstr "" +msgstr "Перемотать вперёд (быÑтро)" -#: ardour_ui_ed.cc:257 +#: gtk2_ardour/ardour_ui_ed.cc:257 msgid "Goto Zero" -msgstr "" +msgstr "К нулевой отметке" -#: ardour_ui_ed.cc:260 -#, fuzzy +#: gtk2_ardour/ardour_ui_ed.cc:260 msgid "Goto Start" -msgstr "Ðачало:" +msgstr "К началу" -#: ardour_ui_ed.cc:263 +#: gtk2_ardour/ardour_ui_ed.cc:263 msgid "Goto End" -msgstr "" +msgstr "Ð’ конец" -#. XXX the newline in the displayed names of these action is really wrong, but its because we want the button -#. that proxies for these action to be more compact. It would be nice to find a way to override the action -#. name appearance on the buttons. -#. -#: ardour_ui_ed.cc:272 -#, fuzzy -msgid "" -"Punch\n" -"in" -msgstr "" -"врезка\n" -"до" - -#: ardour_ui_ed.cc:275 -#, fuzzy -msgid "" -"Punch\n" -"out" -msgstr "" -"врезка\n" -"поÑле" - -#: ardour_ui_ed.cc:278 option_editor.cc:129 -msgid "Click" -msgstr "Метроном" - -#: ardour_ui_ed.cc:281 -#, fuzzy -msgid "" -"Auto\n" -"input" -msgstr "" -"авто\n" -"вход" +#: gtk2_ardour/ardour_ui_ed.cc:279 +msgid "Auto Play" +msgstr "ÐвтовоÑпроизведение" -#: ardour_ui_ed.cc:284 -#, fuzzy -msgid "" -"Auto\n" -"play" -msgstr "" -"авто\n" -"воÑпр." - -#: ardour_ui_ed.cc:287 -#, fuzzy -msgid "" -"Auto\n" -"return" -msgstr "" -"авто\n" -"возврат" +#: gtk2_ardour/ardour_ui_ed.cc:286 +msgid "Sync startup to video" +msgstr "Синхронизировать начало Ñ Ð²Ð¸Ð´ÐµÐ¾" -#: ardour_ui_ed.cc:291 +#: gtk2_ardour/ardour_ui_ed.cc:287 #, fuzzy -msgid "" -"Time\n" -"master" +msgid "Time master" msgstr "JACK-Ñчётчик - маÑтер" -#: ardour_ui_ed.cc:294 +#: gtk2_ardour/ardour_ui_ed.cc:290 msgid "Toggle Record Enable Track1" msgstr "" -#: ardour_ui_ed.cc:296 +#: gtk2_ardour/ardour_ui_ed.cc:292 msgid "Toggle Record Enable Track2" msgstr "" -#: ardour_ui_ed.cc:298 +#: gtk2_ardour/ardour_ui_ed.cc:294 msgid "Toggle Record Enable Track3" msgstr "" -#: ardour_ui_ed.cc:300 +#: gtk2_ardour/ardour_ui_ed.cc:296 msgid "Toggle Record Enable Track4" msgstr "" -#: ardour_ui_ed.cc:302 +#: gtk2_ardour/ardour_ui_ed.cc:298 msgid "Toggle Record Enable Track5" msgstr "" -#: ardour_ui_ed.cc:304 +#: gtk2_ardour/ardour_ui_ed.cc:300 msgid "Toggle Record Enable Track6" msgstr "" -#: ardour_ui_ed.cc:306 +#: gtk2_ardour/ardour_ui_ed.cc:302 msgid "Toggle Record Enable Track7" msgstr "" -#: ardour_ui_ed.cc:308 +#: gtk2_ardour/ardour_ui_ed.cc:304 msgid "Toggle Record Enable Track8" msgstr "" -#: ardour_ui_ed.cc:310 +#: gtk2_ardour/ardour_ui_ed.cc:306 msgid "Toggle Record Enable Track9" msgstr "" -#: ardour_ui_ed.cc:312 +#: gtk2_ardour/ardour_ui_ed.cc:308 msgid "Toggle Record Enable Track10" msgstr "" -#: ardour_ui_ed.cc:314 +#: gtk2_ardour/ardour_ui_ed.cc:310 msgid "Toggle Record Enable Track11" msgstr "" -#: ardour_ui_ed.cc:316 +#: gtk2_ardour/ardour_ui_ed.cc:312 msgid "Toggle Record Enable Track12" msgstr "" -#: ardour_ui_ed.cc:318 +#: gtk2_ardour/ardour_ui_ed.cc:314 msgid "Toggle Record Enable Track13" msgstr "" -#: ardour_ui_ed.cc:320 +#: gtk2_ardour/ardour_ui_ed.cc:316 msgid "Toggle Record Enable Track14" msgstr "" -#: ardour_ui_ed.cc:322 +#: gtk2_ardour/ardour_ui_ed.cc:318 msgid "Toggle Record Enable Track15" msgstr "" -#: ardour_ui_ed.cc:324 +#: gtk2_ardour/ardour_ui_ed.cc:320 msgid "Toggle Record Enable Track16" msgstr "" -#: ardour_ui_ed.cc:326 +#: gtk2_ardour/ardour_ui_ed.cc:322 msgid "Toggle Record Enable Track17" msgstr "" -#: ardour_ui_ed.cc:328 +#: gtk2_ardour/ardour_ui_ed.cc:324 msgid "Toggle Record Enable Track18" msgstr "" -#: ardour_ui_ed.cc:330 +#: gtk2_ardour/ardour_ui_ed.cc:326 msgid "Toggle Record Enable Track19" msgstr "" -#: ardour_ui_ed.cc:332 +#: gtk2_ardour/ardour_ui_ed.cc:328 msgid "Toggle Record Enable Track20" msgstr "" -#: ardour_ui_ed.cc:334 +#: gtk2_ardour/ardour_ui_ed.cc:330 msgid "Toggle Record Enable Track21" msgstr "" -#: ardour_ui_ed.cc:336 +#: gtk2_ardour/ardour_ui_ed.cc:332 msgid "Toggle Record Enable Track22" msgstr "" -#: ardour_ui_ed.cc:338 +#: gtk2_ardour/ardour_ui_ed.cc:334 msgid "Toggle Record Enable Track23" msgstr "" -#: ardour_ui_ed.cc:340 +#: gtk2_ardour/ardour_ui_ed.cc:336 msgid "Toggle Record Enable Track24" msgstr "" -#: ardour_ui_ed.cc:342 +#: gtk2_ardour/ardour_ui_ed.cc:338 msgid "Toggle Record Enable Track25" msgstr "" -#: ardour_ui_ed.cc:344 +#: gtk2_ardour/ardour_ui_ed.cc:340 msgid "Toggle Record Enable Track26" msgstr "" -#: ardour_ui_ed.cc:346 +#: gtk2_ardour/ardour_ui_ed.cc:342 msgid "Toggle Record Enable Track27" msgstr "" -#: ardour_ui_ed.cc:348 +#: gtk2_ardour/ardour_ui_ed.cc:344 msgid "Toggle Record Enable Track28" msgstr "" -#: ardour_ui_ed.cc:350 +#: gtk2_ardour/ardour_ui_ed.cc:346 msgid "Toggle Record Enable Track29" msgstr "" -#: ardour_ui_ed.cc:352 +#: gtk2_ardour/ardour_ui_ed.cc:348 msgid "Toggle Record Enable Track30" msgstr "" -#: ardour_ui_ed.cc:354 +#: gtk2_ardour/ardour_ui_ed.cc:350 msgid "Toggle Record Enable Track31" msgstr "" -#: ardour_ui_ed.cc:356 +#: gtk2_ardour/ardour_ui_ed.cc:352 msgid "Toggle Record Enable Track32" msgstr "" -#: ardour_ui_ed.cc:361 +#: gtk2_ardour/ardour_ui_ed.cc:357 msgid "Percentage" msgstr "Процентов" -#: ardour_ui_ed.cc:362 +#: gtk2_ardour/ardour_ui_ed.cc:358 msgid "Semitones" msgstr "Полутонов" -#: ardour_ui_ed.cc:366 +#: gtk2_ardour/ardour_ui_ed.cc:362 msgid "Send MTC" -msgstr "Передача MTC" +msgstr "Передавать MTC" -#: ardour_ui_ed.cc:368 +#: gtk2_ardour/ardour_ui_ed.cc:364 msgid "Send MMC" -msgstr "Передача MMC" +msgstr "Передавать MMC" -#: ardour_ui_ed.cc:370 -#, fuzzy +#: gtk2_ardour/ardour_ui_ed.cc:366 msgid "Use MMC" -msgstr "Передача MMC" +msgstr "ИÑпользовать MMC" -#: ardour_ui_ed.cc:372 +#: gtk2_ardour/ardour_ui_ed.cc:368 msgid "Send MIDI feedback" -msgstr "" +msgstr "Передавать отклик MIDI" -#: ardour_ui_ed.cc:374 -#, fuzzy +#: gtk2_ardour/ardour_ui_ed.cc:370 msgid "Use MIDI control" -msgstr "MMC порт" +msgstr "ИÑпользовать управление по MIDI" -#: ardour_ui_ed.cc:377 -#, fuzzy +#: gtk2_ardour/ardour_ui_ed.cc:373 msgid "Connect new track inputs to hardware" -msgstr "ÐвтоподÑоединение новых треков" +msgstr "Подключать входы новых дорожек к уÑтройÑтву" -#: ardour_ui_ed.cc:396 -#, fuzzy +#: gtk2_ardour/ardour_ui_ed.cc:392 msgid "Connect new track outputs to hardware" -msgstr "ÐвтоподÑоединение новых треков" +msgstr "Подключать выходы новых дорожек к уÑтройÑтву" -#: ardour_ui_ed.cc:398 -#, fuzzy +#: gtk2_ardour/ardour_ui_ed.cc:394 msgid "Connect new track outputs to master" -msgstr "автоматичеÑкое подключение треков к маÑтер-выходам" +msgstr "Подключать выходы новых дорожек к маÑтеру" -#: ardour_ui_ed.cc:400 -#, fuzzy +#: gtk2_ardour/ardour_ui_ed.cc:396 msgid "Manually connect new track outputs" -msgstr "ручное подключение треков к выходам" +msgstr "Ручное подключение дорожек к выходам" -#: ardour_ui_ed.cc:405 -#, fuzzy +#: gtk2_ardour/ardour_ui_ed.cc:401 msgid "Hardware monitoring" msgstr "Ðппаратный контроль" -#: ardour_ui_ed.cc:406 -#, fuzzy +#: gtk2_ardour/ardour_ui_ed.cc:402 msgid "Software monitoring" -msgstr "ИÑпользовать программный контроль" +msgstr "Программный контроль" -#: ardour_ui_ed.cc:407 -#, fuzzy +#: gtk2_ardour/ardour_ui_ed.cc:403 msgid "External monitoring" -msgstr "Ðппаратный контроль" +msgstr "Внешний контроль" -#. Configuration object options (i.e. not session specific) -#: ardour_ui_ed.cc:411 +#: gtk2_ardour/ardour_ui_ed.cc:407 msgid "Stop plugins with transport" -msgstr "ОÑтанавливать модули (plugins) вмеÑте Ñ Ñ‚Ñ€Ð°Ð½Ñпортом" +msgstr "ОÑтанавливать раÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ Ñ Ñ‚Ñ€Ð°Ð½Ñпортом" -#: ardour_ui_ed.cc:412 -#, fuzzy +#: gtk2_ardour/ardour_ui_ed.cc:408 msgid "Verify remove last capture" -msgstr "Удалить поÑледнюю запиÑÑŒ" +msgstr "Проверить удаление поÑледней запиÑи" -#: ardour_ui_ed.cc:413 +#: gtk2_ardour/ardour_ui_ed.cc:409 msgid "Stop recording on xrun" msgstr "ОÑтановить запиÑÑŒ при потере отÑчётов" -#: ardour_ui_ed.cc:414 -#, fuzzy +#: gtk2_ardour/ardour_ui_ed.cc:410 msgid "Stop transport at session end" msgstr "ОÑтанавливать транÑпорт в конце ÑеÑÑии" -#: ardour_ui_ed.cc:415 +#: gtk2_ardour/ardour_ui_ed.cc:411 msgid "-12dB gain reduce ffwd/rewind" msgstr "" -#: ardour_ui_ed.cc:416 +#: gtk2_ardour/ardour_ui_ed.cc:412 msgid "Rec-enable stays engaged at stop" msgstr "" -#. session options -#: ardour_ui_ed.cc:420 +#: gtk2_ardour/ardour_ui_ed.cc:416 #, fuzzy msgid "Do not run plugins while recording" msgstr "ИÑпользовать модули (plugins) во Ð²Ñ€ÐµÐ¼Ñ Ð·Ð°Ð¿Ð¸Ñи" -#: ardour_ui_ed.cc:423 +#: gtk2_ardour/ardour_ui_ed.cc:419 msgid "Latched solo" msgstr "" -#: ardour_ui_ed.cc:428 +#: gtk2_ardour/ardour_ui_ed.cc:424 #, fuzzy msgid "Solo in-place" msgstr "Соло" -#: ardour_ui_ed.cc:430 +#: gtk2_ardour/ardour_ui_ed.cc:426 msgid "Solo via bus" msgstr "" -#: ardour_ui_ed.cc:433 +#: gtk2_ardour/ardour_ui_ed.cc:429 #, fuzzy msgid "Automatically create crossfades" msgstr "ÐвтоматичеÑкий кроÑÑфейд на перекрытии" -#: ardour_ui_ed.cc:435 +#: gtk2_ardour/ardour_ui_ed.cc:431 msgid "Unmute new full crossfades" msgstr "" -#: ardour_ui_options.cc:406 ardour_ui_options.cc:416 ardour_ui_options.cc:483 +#: gtk2_ardour/ardour_ui_options.cc:423 gtk2_ardour/ardour_ui_options.cc:433 +#: gtk2_ardour/ardour_ui_options.cc:501 #, fuzzy msgid "Internal" msgstr "внутренний" -#: ardour_ui_options.cc:407 ardour_ui_options.cc:486 +#: gtk2_ardour/ardour_ui_options.cc:424 gtk2_ardour/ardour_ui_options.cc:504 #, fuzzy msgid "MTC" msgstr "MMC" -#: audio_clock.cc:1742 editor.cc:188 +#: gtk2_ardour/audio_clock.cc:1742 gtk2_ardour/editor.cc:189 msgid "SMPTE" msgstr "SMPTE" -#: audio_clock.cc:1743 editor.cc:187 editor_rulers.cc:360 +#: gtk2_ardour/audio_clock.cc:1743 gtk2_ardour/editor.cc:188 +#: gtk2_ardour/editor_rulers.cc:359 msgid "Bars:Beats" msgstr "Такт:ДолÑ" -#: audio_clock.cc:1744 +#: gtk2_ardour/audio_clock.cc:1744 msgid "Minutes:Seconds" msgstr "Минуты:Секунды" -#: audio_clock.cc:1745 +#: gtk2_ardour/audio_clock.cc:1745 msgid "Audio Frames" msgstr "Ðудио кадры" -#. -#. Slowest = 6.6dB/sec falloff at update rate of 40ms -#. Slow = 6.8dB/sec falloff at update rate of 40ms -#. -#: audio_clock.cc:1746 editor_actions.cc:375 editor_actions.cc:383 -#: gain_meter.cc:172 panner_ui.cc:89 plugin_ui.cc:392 plugin_ui.cc:635 +#: gtk2_ardour/audio_clock.cc:1746 gtk2_ardour/editor_actions.cc:379 +#: gtk2_ardour/editor_actions.cc:387 gtk2_ardour/gain_meter.cc:167 +#: gtk2_ardour/ladspa_pluginui.cc:330 gtk2_ardour/ladspa_pluginui.cc:573 +#: gtk2_ardour/panner_ui.cc:87 msgid "Off" msgstr "Выкл" -#: audio_clock.cc:1748 +#: gtk2_ardour/audio_clock.cc:1748 msgid "Mode" msgstr "Режим" -#: audio_time_axis.cc:91 +#: gtk2_ardour/route_time_axis.cc:86 msgid "m" msgstr "Ñ‚" -#: audio_time_axis.cc:91 +#: gtk2_ardour/route_time_axis.cc:86 msgid "s" msgstr "Ñ" -#: audio_time_axis.cc:91 +#: gtk2_ardour/route_time_axis.cc:86 msgid "r" msgstr "з" -#: audio_time_axis.cc:95 +#: gtk2_ardour/route_time_axis.cc:90 msgid "g" msgstr "г" -#. group -#: audio_time_axis.cc:96 +#: gtk2_ardour/route_time_axis.cc:91 msgid "p" msgstr "Ñп" -#: audio_time_axis.cc:97 automation_time_axis.cc:32 visual_time_axis.cc:74 +#: gtk2_ardour/route_time_axis.cc:92 gtk2_ardour/automation_time_axis.cc:33 +#: gtk2_ardour/visual_time_axis.cc:74 msgid "h" msgstr "в" -#. height -#: audio_time_axis.cc:98 +#: gtk2_ardour/route_time_axis.cc:93 msgid "a" msgstr "а" -#: audio_time_axis.cc:99 visual_time_axis.cc:73 +#: gtk2_ardour/route_time_axis.cc:94 gtk2_ardour/visual_time_axis.cc:73 msgid "v" msgstr "п" -#: audio_time_axis.cc:168 mixer_strip.cc:86 +#: gtk2_ardour/route_time_axis.cc:138 gtk2_ardour/mixer_strip.cc:83 msgid "Record" msgstr "ЗапиÑÑŒ" -#: audio_time_axis.cc:169 editor_actions.cc:37 mixer_strip.cc:86 +#: gtk2_ardour/route_time_axis.cc:146 gtk2_ardour/editor_actions.cc:37 +#: gtk2_ardour/mixer_strip.cc:83 msgid "Solo" msgstr "Соло" -#: audio_time_axis.cc:170 editor.cc:1760 editor.cc:1859 mixer_strip.cc:86 -#: panner_ui.cc:427 +#: gtk2_ardour/route_time_axis.cc:147 gtk2_ardour/editor.cc:1710 +#: gtk2_ardour/editor.cc:1809 gtk2_ardour/mixer_strip.cc:83 +#: gtk2_ardour/panner_ui.cc:417 msgid "Mute" msgstr "Тихо" -#: audio_time_axis.cc:171 +#: gtk2_ardour/route_time_axis.cc:148 msgid "Edit Group" msgstr "Группы" -#: audio_time_axis.cc:172 visual_time_axis.cc:92 +#: gtk2_ardour/route_time_axis.cc:149 gtk2_ardour/visual_time_axis.cc:92 msgid "Display Height" msgstr "Ð’Ñ‹Ñота дорожки" -#: audio_time_axis.cc:173 +#: gtk2_ardour/route_time_axis.cc:150 msgid "Playlist" msgstr "СпиÑок" -#: audio_time_axis.cc:174 audio_time_axis.cc:741 +#: gtk2_ardour/route_time_axis.cc:151 gtk2_ardour/route_time_axis.cc:428 msgid "Automation" msgstr "Ðвтомат" -#: audio_time_axis.cc:175 visual_time_axis.cc:93 +#: gtk2_ardour/route_time_axis.cc:152 gtk2_ardour/visual_time_axis.cc:93 msgid "Visual options" msgstr "Параметры отображениÑ" -#: audio_time_axis.cc:176 visual_time_axis.cc:94 +#: gtk2_ardour/route_time_axis.cc:153 gtk2_ardour/visual_time_axis.cc:94 msgid "Hide this track" msgstr "Скрыть трек" -#: audio_time_axis.cc:333 mixer_strip.cc:927 +#: gtk2_ardour/route_time_axis.cc:272 gtk2_ardour/mixer_strip.cc:887 msgid "No group" msgstr "Ðет группы" -#: audio_time_axis.cc:702 automation_time_axis.cc:450 -#: imageframe_time_axis.cc:255 marker_time_axis.cc:211 -msgid "Height" -msgstr "Ð’Ñ‹Ñота" - -#: audio_time_axis.cc:703 color_manager.cc:41 imageframe_time_axis.cc:256 -#: marker_time_axis.cc:212 -msgid "Color" -msgstr "Цвет" - -#: audio_time_axis.cc:707 -msgid "Hide all crossfades" -msgstr "" - -#: audio_time_axis.cc:708 -msgid "Show all crossfades" -msgstr "" - -#: audio_time_axis.cc:712 mixer_strip.cc:1011 -#, fuzzy -msgid "Remote Control ID" -msgstr "иÑпользовать контрольные выходы" - -#: audio_time_axis.cc:718 +#: gtk2_ardour/route_time_axis.cc:389 #, fuzzy msgid "Show all automation" msgstr "автомат" -#: audio_time_axis.cc:721 +#: gtk2_ardour/route_time_axis.cc:392 #, fuzzy msgid "Show existing automation" msgstr "иÑпользовать имеющийÑÑ ÑˆÐ°Ð±Ð»Ð¾Ð½" -#: audio_time_axis.cc:724 +#: gtk2_ardour/route_time_axis.cc:395 #, fuzzy msgid "Hide all automation" msgstr "очиÑтить интервалы" -#: audio_time_axis.cc:729 -#, fuzzy -msgid "Fader" -msgstr "Затухание" - -#: audio_time_axis.cc:734 -#, fuzzy -msgid "Pan" -msgstr "пан." - -#: audio_time_axis.cc:739 +#: gtk2_ardour/route_time_axis.cc:398 msgid "Plugins" msgstr "Модули (плагины)" -#: audio_time_axis.cc:747 -msgid "Show waveforms" -msgstr "Отображать форму Ñигнала" - -#: audio_time_axis.cc:755 -msgid "Traditional" -msgstr "ОбычнаÑ" +#: gtk2_ardour/route_time_axis.cc:419 gtk2_ardour/automation_time_axis.cc:426 +#: gtk2_ardour/imageframe_time_axis.cc:255 gtk2_ardour/marker_time_axis.cc:211 +msgid "Height" +msgstr "Ð’Ñ‹Ñота" -#: audio_time_axis.cc:758 -msgid "Rectified" -msgstr "УвеличеннаÑ" +#: gtk2_ardour/route_time_axis.cc:420 gtk2_ardour/color_manager.cc:41 +#: gtk2_ardour/imageframe_time_axis.cc:256 gtk2_ardour/marker_time_axis.cc:212 +msgid "Color" +msgstr "Цвет" -#: audio_time_axis.cc:761 -msgid "Waveform" -msgstr "Форма Ñигнала" +#: gtk2_ardour/route_time_axis.cc:425 gtk2_ardour/mixer_strip.cc:971 +#, fuzzy +msgid "Remote Control ID" +msgstr "иÑпользовать контрольные выходы" -#: audio_time_axis.cc:771 +#: gtk2_ardour/route_time_axis.cc:443 #, fuzzy msgid "Align with existing material" msgstr "СущеÑтвующий материал" -#: audio_time_axis.cc:776 +#: gtk2_ardour/route_time_axis.cc:449 #, fuzzy msgid "Align with capture time" msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð·Ð°Ð¿Ð¸Ñи" -#: audio_time_axis.cc:782 +#: gtk2_ardour/route_time_axis.cc:455 #, fuzzy msgid "Alignment" msgstr "ВыровнÑÑ‚ÑŒ" -#: audio_time_axis.cc:788 editor.cc:527 editor_actions.cc:60 -#: mixer_strip.cc:1000 mixer_ui.cc:111 +#: gtk2_ardour/route_time_axis.cc:462 gtk2_ardour/editor.cc:480 +#: gtk2_ardour/editor_actions.cc:62 gtk2_ardour/mixer_strip.cc:960 +#: gtk2_ardour/mixer_ui.cc:109 msgid "Active" -msgstr "Ðктивен" +msgstr "Ðктивны" -#: audio_time_axis.cc:793 editor.cc:1922 editor_actions.cc:320 -#: editor_markers.cc:508 imageframe_time_axis.cc:259 location_ui.cc:57 -#: marker_time_axis.cc:215 mixer_strip.cc:1014 +#: gtk2_ardour/route_time_axis.cc:467 gtk2_ardour/editor.cc:1872 +#: gtk2_ardour/editor_actions.cc:322 gtk2_ardour/editor_markers.cc:511 +#: gtk2_ardour/imageframe_time_axis.cc:259 gtk2_ardour/location_ui.cc:58 +#: gtk2_ardour/marker_time_axis.cc:215 gtk2_ardour/mixer_strip.cc:974 msgid "Remove" msgstr "Удалить" -#: audio_time_axis.cc:833 +#: gtk2_ardour/route_time_axis.cc:733 #, fuzzy msgid "Name for playlist" msgstr "Ð˜Ð¼Ñ Ñнимка" -#: audio_time_axis.cc:835 audio_time_axis.cc:1851 editor_markers.cc:827 -#: editor_mouse.cc:4673 imageframe_time_axis.cc:248 marker_time_axis.cc:208 -#: meter_bridge_strip.cc:224 mixer_strip.cc:998 redirect_box.cc:751 -#: redirect_box.cc:1065 route_ui.cc:739 visual_time_axis.cc:326 +#: gtk2_ardour/route_time_axis.cc:735 gtk2_ardour/route_time_axis.cc:1136 +#: gtk2_ardour/editor_markers.cc:830 gtk2_ardour/editor_mouse.cc:4723 +#: gtk2_ardour/imageframe_time_axis.cc:248 gtk2_ardour/marker_time_axis.cc:208 +#: gtk2_ardour/mixer_strip.cc:958 gtk2_ardour/redirect_box.cc:752 +#: gtk2_ardour/redirect_box.cc:1080 gtk2_ardour/route_ui.cc:746 +#: gtk2_ardour/visual_time_axis.cc:326 msgid "Rename" msgstr "Переименовать" -#: audio_time_axis.cc:868 audio_time_axis.cc:908 +#: gtk2_ardour/route_time_axis.cc:770 gtk2_ardour/route_time_axis.cc:811 #, fuzzy msgid "Name for Playlist" msgstr "Ð˜Ð¼Ñ Ñнимка" -#: audio_time_axis.cc:1126 visual_time_axis.cc:383 +#: gtk2_ardour/route_time_axis.cc:990 gtk2_ardour/visual_time_axis.cc:383 msgid "a track already exists with that name" -msgstr "трек Ñ Ñ‚Ð°ÐºÐ¸Ð¼ именем уже ÑущеÑтвует" - -#: audio_time_axis.cc:1167 editor.cc:218 -msgid "gain" -msgstr "уÑил." - -#: audio_time_axis.cc:1207 -msgid "pan" -msgstr "пан." +msgstr "Дорожка Ñ Ñ‚Ð°ÐºÐ¸Ð¼ именем уже ÑущеÑтвует" -#: audio_time_axis.cc:1410 editor.cc:1483 selection.cc:634 -msgid "programming error: " -msgstr "ошибка в программе: " - -#: audio_time_axis.cc:1848 +#: gtk2_ardour/route_time_axis.cc:1133 msgid "Current: %1" msgstr "" -#: audio_time_axis.cc:1855 +#: gtk2_ardour/route_time_axis.cc:1140 msgid "New Copy" msgstr "ÐÐ¾Ð²Ð°Ñ ÐºÐ¾Ð¿Ð¸Ñ" -#: audio_time_axis.cc:1857 +#: gtk2_ardour/route_time_axis.cc:1142 msgid "Clear Current" msgstr "ОчиÑтить текущий" -#: audio_time_axis.cc:1859 editor.cc:2024 editor.cc:2100 +#: gtk2_ardour/route_time_axis.cc:1144 gtk2_ardour/editor.cc:1974 +#: gtk2_ardour/editor.cc:2050 msgid "Select" -msgstr "Выделеннное" +msgstr "Выделить" + +#: gtk2_ardour/route_time_axis.cc:1333 gtk2_ardour/editor.cc:1432 +#: gtk2_ardour/selection.cc:642 +msgid "programming error: " +msgstr "Ошибка в программе: " + +#: gtk2_ardour/audio_time_axis.cc:229 +msgid "Fader" +msgstr "Фейдер" + +#: gtk2_ardour/audio_time_axis.cc:234 +msgid "Pan" +msgstr "Пан." + +#: gtk2_ardour/audio_time_axis.cc:249 +msgid "Hide all crossfades" +msgstr "Скрыть вÑе кроÑÑфейды" + +#: gtk2_ardour/audio_time_axis.cc:250 +msgid "Show all crossfades" +msgstr "Показать вÑе кроÑÑфейды" + +#: gtk2_ardour/audio_time_axis.cc:257 +msgid "Show waveforms" +msgstr "Показывать форму Ñигнала" + +#: gtk2_ardour/audio_time_axis.cc:265 +msgid "Traditional" +msgstr "ОбычнаÑ" + +#: gtk2_ardour/audio_time_axis.cc:268 +msgid "Rectified" +msgstr "УвеличеннаÑ" + +#: gtk2_ardour/audio_time_axis.cc:271 +msgid "Waveform" +msgstr "Форма Ñигнала" + +#: gtk2_ardour/audio_time_axis.cc:331 +msgid "gain" +msgstr "уÑил." -#: automation_line.cc:884 +#: gtk2_ardour/audio_time_axis.cc:371 +msgid "pan" +msgstr "пан." + +#: gtk2_ardour/automation_line.cc:888 #, fuzzy msgid "automation event move" msgstr "автомат" -#: automation_line.cc:886 +#: gtk2_ardour/automation_line.cc:890 #, fuzzy msgid "automation range drag" msgstr "автомат" -#: automation_line.cc:1015 region_gain_line.cc:62 +#: gtk2_ardour/automation_line.cc:1019 gtk2_ardour/region_gain_line.cc:64 #, fuzzy msgid "remove control point" msgstr "иÑпользовать контрольные выходы" -#: automation_time_axis.cc:33 editor_ops.cc:2885 +#: gtk2_ardour/automation_time_axis.cc:34 gtk2_ardour/editor_ops.cc:2922 msgid "clear" msgstr "очиÑтить" -#: automation_time_axis.cc:75 +#: gtk2_ardour/automation_time_axis.cc:79 msgid "track height" -msgstr "" +msgstr "Ð’Ñ‹Ñота дорожки" -#: automation_time_axis.cc:76 -#, fuzzy +#: gtk2_ardour/automation_time_axis.cc:80 msgid "automation state" -msgstr "автомат" +msgstr "СоÑтоÑние автоматизации" -#: automation_time_axis.cc:77 -#, fuzzy +#: gtk2_ardour/automation_time_axis.cc:81 msgid "clear track" -msgstr "Скрыть трек" +msgstr "ОчиÑтить дорожку" -#: automation_time_axis.cc:78 -#, fuzzy +#: gtk2_ardour/automation_time_axis.cc:82 msgid "hide track" -msgstr "Скрыть трек" +msgstr "Скрыть дорожку" -#: automation_time_axis.cc:184 automation_time_axis.cc:213 -#: automation_time_axis.cc:461 +#: gtk2_ardour/automation_time_axis.cc:188 +#: gtk2_ardour/automation_time_axis.cc:217 +#: gtk2_ardour/automation_time_axis.cc:437 msgid "Manual" msgstr "" -#: automation_time_axis.cc:186 automation_time_axis.cc:224 -#: automation_time_axis.cc:465 editor.cc:2001 editor.cc:2082 gain_meter.cc:174 -#: panner_ui.cc:91 plugin_ui.cc:395 plugin_ui.cc:637 sfdb_ui.cc:56 +#: gtk2_ardour/automation_time_axis.cc:190 +#: gtk2_ardour/automation_time_axis.cc:228 +#: gtk2_ardour/automation_time_axis.cc:441 gtk2_ardour/editor.cc:1951 +#: gtk2_ardour/editor.cc:2032 gtk2_ardour/gain_meter.cc:169 +#: gtk2_ardour/ladspa_pluginui.cc:333 gtk2_ardour/ladspa_pluginui.cc:575 +#: gtk2_ardour/panner_ui.cc:89 gtk2_ardour/sfdb_ui.cc:59 msgid "Play" msgstr "ВоÑпроизвеÑти" -#: automation_time_axis.cc:188 automation_time_axis.cc:235 -#: automation_time_axis.cc:469 gain_meter.cc:176 panner_ui.cc:93 -#: plugin_ui.cc:398 plugin_ui.cc:639 -#, fuzzy +#: gtk2_ardour/automation_time_axis.cc:192 +#: gtk2_ardour/automation_time_axis.cc:239 +#: gtk2_ardour/automation_time_axis.cc:445 gtk2_ardour/gain_meter.cc:171 +#: gtk2_ardour/ladspa_pluginui.cc:336 gtk2_ardour/ladspa_pluginui.cc:577 +#: gtk2_ardour/panner_ui.cc:91 msgid "Write" -msgstr "запиÑÑŒ" +msgstr "ЗапиÑать" -#: automation_time_axis.cc:190 automation_time_axis.cc:246 -#: automation_time_axis.cc:473 gain_meter.cc:178 panner_ui.cc:95 -#: plugin_ui.cc:401 plugin_ui.cc:641 +#: gtk2_ardour/automation_time_axis.cc:194 +#: gtk2_ardour/automation_time_axis.cc:250 +#: gtk2_ardour/automation_time_axis.cc:449 gtk2_ardour/gain_meter.cc:173 +#: gtk2_ardour/ladspa_pluginui.cc:339 gtk2_ardour/ladspa_pluginui.cc:579 +#: gtk2_ardour/panner_ui.cc:93 #, fuzzy msgid "Touch" msgstr "Врезка" -#: automation_time_axis.cc:257 option_editor.cc:183 option_editor.cc:189 -#: plugin_ui.cc:404 +#: gtk2_ardour/automation_time_axis.cc:261 gtk2_ardour/ladspa_pluginui.cc:342 msgid "???" -msgstr "" +msgstr "???" -#: automation_time_axis.cc:271 -#, fuzzy +#: gtk2_ardour/automation_time_axis.cc:275 msgid "clear automation" -msgstr "очиÑтить интервалы" +msgstr "ОчиÑтить автоматизацию" -#: automation_time_axis.cc:452 editor_actions.cc:318 +#: gtk2_ardour/automation_time_axis.cc:428 gtk2_ardour/editor_actions.cc:320 msgid "Hide" msgstr "Скрыть" -#: automation_time_axis.cc:454 crossfade_edit.cc:78 redirect_box.cc:1057 +#: gtk2_ardour/automation_time_axis.cc:430 gtk2_ardour/crossfade_edit.cc:79 +#: gtk2_ardour/redirect_box.cc:1072 gtk2_ardour/connection_editor.cc:57 msgid "Clear" msgstr "ОчиÑтить" -#: automation_time_axis.cc:477 -#, fuzzy +#: gtk2_ardour/automation_time_axis.cc:453 msgid "State" -msgstr "Ðачало" +msgstr "СоÑтоÑние" -#: canvas-imageframe.c:104 +#: gtk2_ardour/canvas-imageframe.c:104 msgid "pixbuf" -msgstr "" +msgstr "pixbuf" -#: canvas-imageframe.c:105 +#: gtk2_ardour/canvas-imageframe.c:105 msgid "the pixbuf" -msgstr "" +msgstr "the pixbuf" -#: canvas-imageframe.c:110 +#: gtk2_ardour/canvas-imageframe.c:110 msgid "x" -msgstr "" +msgstr "x" -#: canvas-imageframe.c:111 canvas-simpleline.c:111 canvas-simplerect.c:107 +#: gtk2_ardour/canvas-imageframe.c:111 gtk2_ardour/canvas-simpleline.c:111 +#: gtk2_ardour/canvas-simplerect.c:107 msgid "x coordinate of upper left corner of rect" msgstr "" -#: canvas-imageframe.c:120 +#: gtk2_ardour/canvas-imageframe.c:120 msgid "y" msgstr "" -#: canvas-imageframe.c:121 canvas-simpleline.c:121 canvas-simplerect.c:117 +#: gtk2_ardour/canvas-imageframe.c:121 gtk2_ardour/canvas-simpleline.c:121 +#: gtk2_ardour/canvas-simplerect.c:117 msgid "y coordinate of upper left corner of rect " msgstr "" -#: canvas-imageframe.c:129 +#: gtk2_ardour/canvas-imageframe.c:129 #, fuzzy msgid "width" msgstr "запиÑÑŒ" -#: canvas-imageframe.c:130 +#: gtk2_ardour/canvas-imageframe.c:130 msgid "the width" msgstr "" -#: canvas-imageframe.c:139 +#: gtk2_ardour/canvas-imageframe.c:139 msgid "drawwidth" msgstr "" -#: canvas-imageframe.c:140 +#: gtk2_ardour/canvas-imageframe.c:140 msgid "drawn width" msgstr "" -#: canvas-imageframe.c:148 +#: gtk2_ardour/canvas-imageframe.c:148 #, fuzzy msgid "height" msgstr "Ð’Ñ‹Ñота" -#: canvas-imageframe.c:149 +#: gtk2_ardour/canvas-imageframe.c:149 #, fuzzy msgid "the height" msgstr "Ð’Ñ‹Ñота" -#: canvas-imageframe.c:157 +#: gtk2_ardour/canvas-imageframe.c:157 msgid "anchor" msgstr "" -#: canvas-imageframe.c:158 +#: gtk2_ardour/canvas-imageframe.c:158 msgid "the anchor" msgstr "" -#: canvas-simpleline.c:110 canvas-simplerect.c:106 +#: gtk2_ardour/canvas-simpleline.c:110 gtk2_ardour/canvas-simplerect.c:106 msgid "x1" msgstr "" -#: canvas-simpleline.c:120 canvas-simplerect.c:116 +#: gtk2_ardour/canvas-simpleline.c:120 gtk2_ardour/canvas-simplerect.c:116 msgid "y1" msgstr "" -#: canvas-simpleline.c:131 canvas-simplerect.c:127 +#: gtk2_ardour/canvas-simpleline.c:131 gtk2_ardour/canvas-simplerect.c:127 msgid "x2" msgstr "" -#: canvas-simpleline.c:132 canvas-simplerect.c:128 +#: gtk2_ardour/canvas-simpleline.c:132 gtk2_ardour/canvas-simplerect.c:128 msgid "x coordinate of lower right corner of rect" msgstr "" -#: canvas-simpleline.c:141 canvas-simplerect.c:137 +#: gtk2_ardour/canvas-simpleline.c:141 gtk2_ardour/canvas-simplerect.c:137 msgid "y2" msgstr "" -#: canvas-simpleline.c:142 canvas-simplerect.c:138 +#: gtk2_ardour/canvas-simpleline.c:142 gtk2_ardour/canvas-simplerect.c:138 msgid "y coordinate of lower right corner of rect " msgstr "" -#: canvas-simpleline.c:150 +#: gtk2_ardour/canvas-simpleline.c:150 msgid "color rgba" msgstr "" -#: canvas-simpleline.c:151 +#: gtk2_ardour/canvas-simpleline.c:151 #, fuzzy msgid "color of line" msgstr "линейное" -#: canvas-simplerect.c:148 +#: gtk2_ardour/canvas-simplerect.c:148 msgid "outline pixels" msgstr "" -#: canvas-simplerect.c:149 +#: gtk2_ardour/canvas-simplerect.c:149 msgid "width in pixels of outline" msgstr "" -#: canvas-simplerect.c:159 +#: gtk2_ardour/canvas-simplerect.c:159 msgid "outline what" msgstr "" -#: canvas-simplerect.c:160 +#: gtk2_ardour/canvas-simplerect.c:160 msgid "which boundaries to outline (mask)" msgstr "" -#: canvas-simplerect.c:171 +#: gtk2_ardour/canvas-simplerect.c:171 msgid "fill" msgstr "" -#: canvas-simplerect.c:172 +#: gtk2_ardour/canvas-simplerect.c:172 #, fuzzy msgid "fill rectangle" msgstr "Закольцевать выделенное" -#: canvas-simplerect.c:179 +#: gtk2_ardour/canvas-simplerect.c:179 msgid "draw" msgstr "" -#: canvas-simplerect.c:180 +#: gtk2_ardour/canvas-simplerect.c:180 msgid "draw rectangle" msgstr "" -#: canvas-simplerect.c:188 +#: gtk2_ardour/canvas-simplerect.c:188 msgid "outline color rgba" msgstr "" -#: canvas-simplerect.c:189 +#: gtk2_ardour/canvas-simplerect.c:189 msgid "color of outline" msgstr "" -#: canvas-simplerect.c:199 +#: gtk2_ardour/canvas-simplerect.c:199 msgid "fill color rgba" msgstr "" -#: canvas-simplerect.c:200 +#: gtk2_ardour/canvas-simplerect.c:200 msgid "color of fill" -msgstr "" +msgstr "Цвет заливки" -#: color_manager.cc:40 -#, fuzzy +#: gtk2_ardour/color_manager.cc:40 msgid "Object" -msgstr "объект" +msgstr "Объект" -#: color_manager.cc:78 +#: gtk2_ardour/color_manager.cc:78 #, fuzzy msgid "cannot open color definition file %1: %2" msgstr "не удалоÑÑŒ отобразить заÑтавку (файл \"%1\")" -#: crossfade_edit.cc:75 -#, fuzzy +#: gtk2_ardour/crossfade_edit.cc:76 msgid "ardour: x-fade edit" -msgstr "ardour: редактор" +msgstr "ardour: редактор кроÑÑфейдов" -#: crossfade_edit.cc:79 panner_ui.cc:443 -#, fuzzy +#: gtk2_ardour/crossfade_edit.cc:80 gtk2_ardour/panner_ui.cc:433 msgid "Reset" -msgstr "ОгромнаÑ" +msgstr "СброÑить" -#: crossfade_edit.cc:80 -#, fuzzy +#: gtk2_ardour/crossfade_edit.cc:81 msgid "Fade" -msgstr "Затухание" +msgstr "Фейд" -#: crossfade_edit.cc:81 -#, fuzzy +#: gtk2_ardour/crossfade_edit.cc:82 msgid "Out (dry)" -msgstr "в %d" +msgstr "" -#: crossfade_edit.cc:82 -#, fuzzy +#: gtk2_ardour/crossfade_edit.cc:83 msgid "Out" -msgstr "Выходов" +msgstr "" -#: crossfade_edit.cc:83 -#, fuzzy +#: gtk2_ardour/crossfade_edit.cc:84 msgid "In (dry)" -msgstr "в %d" +msgstr "" -#: crossfade_edit.cc:84 +#: gtk2_ardour/crossfade_edit.cc:85 msgid "In" msgstr "" -#: crossfade_edit.cc:86 +#: gtk2_ardour/crossfade_edit.cc:87 #, fuzzy msgid "With Pre-roll" msgstr "откат" -#: crossfade_edit.cc:87 +#: gtk2_ardour/crossfade_edit.cc:88 #, fuzzy msgid "With Post-roll" msgstr "накат" -#: crossfade_edit.cc:95 -#, fuzzy +#: gtk2_ardour/crossfade_edit.cc:96 msgid "Fade In" -msgstr "Затухание" +msgstr "ÐараÑтание" -#: crossfade_edit.cc:96 -#, fuzzy +#: gtk2_ardour/crossfade_edit.cc:97 msgid "Fade Out" msgstr "Затухание" -#: crossfade_edit.cc:172 editor.cc:1835 editor_actions.cc:316 -#: option_editor.cc:130 +#: gtk2_ardour/crossfade_edit.cc:173 gtk2_ardour/editor.cc:1785 +#: gtk2_ardour/editor_actions.cc:318 gtk2_ardour/option_editor.cc:129 msgid "Audition" -msgstr "Ðудит" +msgstr "Контроль" -#: editor.cc:104 editor.cc:3616 -msgid "Slide" +#: gtk2_ardour/editor.cc:105 gtk2_ardour/editor.cc:3521 +#, fuzzy +msgid "Slide Edit" msgstr "Скольжение" -#: editor.cc:105 editor.cc:3614 -msgid "Splice" +#: gtk2_ardour/editor.cc:106 gtk2_ardour/editor.cc:3519 +#, fuzzy +msgid "Splice Edit" msgstr "Стыковка" -#. note that this menu list starts at zero, not 1, because zero -#. is a valid, if useless, ID. -#. -#. leave some breathing room -#: editor.cc:110 editor.cc:3671 export_dialog.cc:78 export_dialog.cc:92 -#: export_dialog.cc:893 export_dialog.cc:1225 route_ui.cc:437 +#: gtk2_ardour/editor.cc:111 gtk2_ardour/editor.cc:3576 +#: gtk2_ardour/editor_actions.cc:417 gtk2_ardour/export_dialog.cc:78 +#: gtk2_ardour/export_dialog.cc:92 gtk2_ardour/export_dialog.cc:893 +#: gtk2_ardour/export_dialog.cc:1225 gtk2_ardour/route_ui.cc:438 msgid "None" msgstr "Ðет" -#: editor.cc:111 editor.cc:3659 -#, fuzzy +#: gtk2_ardour/editor.cc:112 gtk2_ardour/editor.cc:3564 msgid "CD Frames" -msgstr "Кадр" +msgstr "Выборка CD" -#: editor.cc:112 editor.cc:3661 -#, fuzzy +#: gtk2_ardour/editor.cc:113 gtk2_ardour/editor.cc:3566 msgid "SMPTE Frames" -msgstr "SMPTE Кадры/Секунды" +msgstr "SMPTE кадры" -#: editor.cc:113 editor.cc:3663 -#, fuzzy +#: gtk2_ardour/editor.cc:114 gtk2_ardour/editor.cc:3568 msgid "SMPTE Seconds" -msgstr "SMPTE Кадры/Секунды" +msgstr "SMPTE Ñекунды" -#: editor.cc:114 editor.cc:3665 +#: gtk2_ardour/editor.cc:115 gtk2_ardour/editor.cc:3570 msgid "SMPTE Minutes" -msgstr "" +msgstr "SMPTE минуты" -#: editor.cc:115 editor.cc:3667 -#, fuzzy +#: gtk2_ardour/editor.cc:116 gtk2_ardour/editor.cc:3572 msgid "Seconds" -msgstr "Минуты:Секунды" +msgstr "Секунд" -#: editor.cc:116 editor.cc:3669 -#, fuzzy +#: gtk2_ardour/editor.cc:117 gtk2_ardour/editor.cc:3574 msgid "Minutes" -msgstr "Главные выходы" +msgstr "Минут" -#: editor.cc:117 editor.cc:3641 +#: gtk2_ardour/editor.cc:118 gtk2_ardour/editor.cc:3546 msgid "Beats/32" msgstr "долÑм/32" -#: editor.cc:118 editor.cc:3639 +#: gtk2_ardour/editor.cc:119 gtk2_ardour/editor.cc:3544 msgid "Beats/16" msgstr "долÑм/16" -#: editor.cc:119 editor.cc:3637 +#: gtk2_ardour/editor.cc:120 gtk2_ardour/editor.cc:3542 msgid "Beats/8" msgstr "долÑм/8" -#: editor.cc:120 editor.cc:3635 +#: gtk2_ardour/editor.cc:121 gtk2_ardour/editor.cc:3540 msgid "Beats/4" msgstr "долÑм/4" -#: editor.cc:121 editor.cc:3633 +#: gtk2_ardour/editor.cc:122 gtk2_ardour/editor.cc:3538 msgid "Beats/3" msgstr "долÑм/3" -#: editor.cc:122 editor.cc:3643 +#: gtk2_ardour/editor.cc:123 gtk2_ardour/editor.cc:3548 msgid "Beats" msgstr "долÑм" -#: editor.cc:123 editor.cc:3645 +#: gtk2_ardour/editor.cc:124 gtk2_ardour/editor.cc:3550 msgid "Bars" msgstr "тактам" -#: editor.cc:124 editor.cc:3647 +#: gtk2_ardour/editor.cc:125 gtk2_ardour/editor.cc:3552 msgid "Marks" msgstr "маркерам" -#: editor.cc:125 editor.cc:144 editor.cc:3649 editor.cc:3715 +#: gtk2_ardour/editor.cc:126 gtk2_ardour/editor.cc:3554 msgid "Edit Cursor" msgstr "курÑору" -#: editor.cc:126 editor.cc:3651 +#: gtk2_ardour/editor.cc:127 gtk2_ardour/editor.cc:3556 msgid "Region starts" msgstr "нач. облаÑтей" -#: editor.cc:127 editor.cc:3653 +#: gtk2_ardour/editor.cc:128 gtk2_ardour/editor.cc:3558 msgid "Region ends" msgstr "оконч. облаÑтей" -#: editor.cc:128 editor.cc:3657 +#: gtk2_ardour/editor.cc:129 gtk2_ardour/editor.cc:3562 msgid "Region syncs" msgstr "" -#: editor.cc:129 editor.cc:3655 +#: gtk2_ardour/editor.cc:130 gtk2_ardour/editor.cc:3560 msgid "Region bounds" msgstr "" -#: editor.cc:135 editor.cc:3690 -msgid "Magnetic" +#: gtk2_ardour/editor.cc:135 gtk2_ardour/editor.cc:3593 +#, fuzzy +msgid "Normal Snap" +msgstr "Ðорм." + +#: gtk2_ardour/editor.cc:136 gtk2_ardour/editor.cc:3595 +#, fuzzy +msgid "Magnetic Snap" msgstr "Магн." -#: editor.cc:140 editor.cc:3707 export_dialog.cc:140 export_dialog.cc:156 -#: export_dialog.cc:1068 export_dialog.cc:1072 -msgid "Left" -msgstr "лев. краю" +#: gtk2_ardour/editor.cc:141 gtk2_ardour/editor.cc:3612 +#, fuzzy +msgid "Focus Left" +msgstr "МаÑштабировать к" -#: editor.cc:141 editor.cc:3709 export_dialog.cc:141 export_dialog.cc:157 -msgid "Right" -msgstr "прав. краю" +#: gtk2_ardour/editor.cc:142 gtk2_ardour/editor.cc:3614 +#, fuzzy +msgid "Focus Right" +msgstr "МаÑштабировать к" + +#: gtk2_ardour/editor.cc:143 gtk2_ardour/editor.cc:3616 +#, fuzzy +msgid "Focus Center" +msgstr "МаÑштабировать к" -#: editor.cc:142 editor.cc:3711 -msgid "Center" -msgstr "центру" +#: gtk2_ardour/editor.cc:144 +#, fuzzy +msgid "Focus Play" +msgstr "МаÑштабировать к" -#: editor.cc:143 editor.cc:3713 -msgid "Playhead" -msgstr "указателю" +#: gtk2_ardour/editor.cc:145 +#, fuzzy +msgid "Focus Edit" +msgstr "МаÑштабировать к" -#. time display buttons -#: editor.cc:186 +#: gtk2_ardour/editor.cc:187 msgid "Mins:Secs" msgstr "Мин:Сек" -#: editor.cc:189 editor_rulers.cc:354 +#: gtk2_ardour/editor.cc:190 gtk2_ardour/editor_rulers.cc:353 msgid "Frames" -msgstr "Кадр" +msgstr "Кадры" -#: editor.cc:190 editor_rulers.cc:374 +#: gtk2_ardour/editor.cc:191 gtk2_ardour/editor_rulers.cc:373 msgid "Tempo" msgstr "Темп" -#: editor.cc:191 editor_rulers.cc:368 +#: gtk2_ardour/editor.cc:192 gtk2_ardour/editor_rulers.cc:367 msgid "Meter" msgstr "Размер" -#: editor.cc:192 editor_rulers.cc:380 +#: gtk2_ardour/editor.cc:193 gtk2_ardour/editor_rulers.cc:379 msgid "Location Markers" msgstr "Маркеры интервалов" -#: editor.cc:193 editor_rulers.cc:386 +#: gtk2_ardour/editor.cc:194 gtk2_ardour/editor_rulers.cc:385 msgid "Range Markers" -msgstr "" +msgstr "Маркеры облаÑтей" -#: editor.cc:194 editor_rulers.cc:392 +#: gtk2_ardour/editor.cc:195 gtk2_ardour/editor_rulers.cc:391 msgid "Loop/Punch Ranges" -msgstr "" - -#: editor.cc:216 -msgid "range" -msgstr "выделÑÑ‚ÑŒ" +msgstr "ОблаÑти колец/врезок" -#: editor.cc:217 -msgid "object" -msgstr "объект" - -#: editor.cc:219 -msgid "zoom" -msgstr "маÑштаб" - -#: editor.cc:220 -msgid "timefx" -msgstr "Ñффект" - -#: editor.cc:221 -msgid "listen" -msgstr "" - -#: editor.cc:223 +#: gtk2_ardour/editor.cc:213 msgid "mode" msgstr "режим" -#: editor.cc:224 +#: gtk2_ardour/editor.cc:214 msgid "automation" msgstr "автомат" -#: editor.cc:226 -msgid "Edit Mode" -msgstr "Режим редактированиÑ" - -#: editor.cc:227 editor_actions.cc:284 -msgid "Snap To" -msgstr "ПривÑзка к" - -#: editor.cc:228 -msgid "Snap Mode" -msgstr "ПривÑзка к" - -#: editor.cc:229 -msgid "Zoom Focus" -msgstr "МаÑштабировать к" - -#. </CMT Additions> -#. nudge -#: editor.cc:237 editor.cc:1900 editor.cc:2066 editor.cc:2122 -msgid "Nudge" -msgstr "" - -#: editor.cc:470 -msgid "Zoom in" -msgstr "Увеличить" - -#: editor.cc:471 -msgid "Zoom out" -msgstr "Уменьшить" - -#: editor.cc:474 -msgid "Zoom to session" -msgstr "Показать вÑÑ‘" - -#: editor.cc:489 -msgid "Zoom Span" -msgstr "ОблаÑÑ‚ÑŒ проÑмотра" - -#: editor.cc:502 editor.cc:528 editor_actions.cc:62 mixer_ui.cc:86 -#: mixer_ui.cc:112 -#, fuzzy +#: gtk2_ardour/editor.cc:455 gtk2_ardour/editor.cc:481 +#: gtk2_ardour/editor_actions.cc:64 gtk2_ardour/mixer_ui.cc:84 +#: gtk2_ardour/mixer_ui.cc:110 gtk2_ardour/analysis_window.cc:64 msgid "Visible" -msgstr "отображать" +msgstr "Видимы" -#: editor.cc:503 editor.cc:526 -#, fuzzy +#: gtk2_ardour/editor.cc:456 gtk2_ardour/editor.cc:479 msgid "Name" -msgstr "Кадр" +msgstr "ИмÑ" -#: editor.cc:602 editor.cc:669 -#, fuzzy +#: gtk2_ardour/editor.cc:555 gtk2_ardour/editor.cc:622 msgid "Regions" -msgstr "ОблаÑÑ‚ÑŒ" +msgstr "ОблаÑти" -#: editor.cc:642 editor.cc:681 +#: gtk2_ardour/editor.cc:595 gtk2_ardour/editor.cc:634 msgid "Chunks" msgstr "Фрагменты" -#: editor.cc:672 -#, fuzzy +#: gtk2_ardour/editor.cc:625 msgid "Tracks/Busses" -msgstr "Треки/Шины" +msgstr "Дорожки/Шины" -#: editor.cc:675 +#: gtk2_ardour/editor.cc:628 msgid "Snapshots" msgstr "Снимки" -#: editor.cc:678 +#: gtk2_ardour/editor.cc:631 msgid "Edit Groups" msgstr "" "Ред.\n" "группы" -#: editor.cc:727 -msgid "Nudge region/selection forwards" +#: gtk2_ardour/editor.cc:680 +msgid "Nudge Region/Selection Forwards" msgstr "" -#: editor.cc:728 -msgid "Nudge region/selection backwards" -msgstr "" +#: gtk2_ardour/editor.cc:681 +#, fuzzy +msgid "Nudge Region/Selection Backwards" +msgstr "Скрыть трек" -#: editor.cc:735 editor_mixer.cc:299 +#: gtk2_ardour/editor.cc:688 gtk2_ardour/editor_mixer.cc:296 msgid "ardour: editor" msgstr "ardour: редактор" -#: editor.cc:736 +#: gtk2_ardour/editor.cc:689 msgid "ardour_editor" msgstr "ardour_редактор" -#: editor.cc:1183 +#: gtk2_ardour/editor.cc:1122 msgid "ardour: editor: " msgstr "ardour: редактор: " -#. force name -#: editor.cc:1268 editor.cc:1277 editor_markers.cc:870 +#: gtk2_ardour/editor.cc:1208 gtk2_ardour/editor.cc:1217 +#: gtk2_ardour/editor_markers.cc:874 msgid "Loop" msgstr "Кольцо" -#. force name -#: editor.cc:1282 editor.cc:1291 editor_markers.cc:896 +#: gtk2_ardour/editor.cc:1222 gtk2_ardour/editor.cc:1231 +#: gtk2_ardour/editor_markers.cc:902 msgid "Punch" msgstr "Врезка" -#: editor.cc:1439 editor_mouse.cc:1742 +#: gtk2_ardour/editor.cc:1387 gtk2_ardour/editor_mouse.cc:1748 #, fuzzy msgid "programming error: fade in canvas item has no regionview data pointer!" msgstr "ошибка в программе: line canvas item has no line pointer!" -#: editor.cc:1451 editor.cc:1468 redirect_box.cc:1073 +#: gtk2_ardour/editor.cc:1400 gtk2_ardour/editor.cc:1417 +#: gtk2_ardour/redirect_box.cc:1088 msgid "Deactivate" msgstr "Деактивировать" -#. activation -#: editor.cc:1453 editor.cc:1470 redirect_box.cc:1071 +#: gtk2_ardour/editor.cc:1402 gtk2_ardour/editor.cc:1419 +#: gtk2_ardour/redirect_box.cc:1086 msgid "Activate" msgstr "Ðктивировать" -#: editor.cc:1458 editor.cc:1475 +#: gtk2_ardour/editor.cc:1407 gtk2_ardour/editor.cc:1424 #, fuzzy msgid "Linear" msgstr "линейное" -#: editor.cc:1459 editor.cc:1476 editor_actions.cc:376 -#, fuzzy +#: gtk2_ardour/editor.cc:1408 gtk2_ardour/editor.cc:1425 +#: gtk2_ardour/editor_actions.cc:380 msgid "Slowest" -msgstr "Меньше" +msgstr "Медленнее вÑего" -#: editor.cc:1460 editor.cc:1477 editor_actions.cc:377 -#, fuzzy +#: gtk2_ardour/editor.cc:1409 gtk2_ardour/editor.cc:1426 +#: gtk2_ardour/editor_actions.cc:381 msgid "Slow" -msgstr "Соло" +msgstr "Медленно" -#: editor.cc:1461 editor.cc:1478 editor_actions.cc:379 -#, fuzzy +#: gtk2_ardour/editor.cc:1410 gtk2_ardour/editor.cc:1427 +#: gtk2_ardour/editor_actions.cc:383 msgid "Fast" -msgstr "Затухание" +msgstr "БыÑтро" -#: editor.cc:1462 editor.cc:1479 editor_actions.cc:381 -#, fuzzy +#: gtk2_ardour/editor.cc:1411 gtk2_ardour/editor.cc:1428 +#: gtk2_ardour/editor_actions.cc:385 msgid "Fastest" -msgstr "быÑтрое" +msgstr "БыÑтрее вÑего" -#: editor.cc:1589 editor.cc:1597 +#: gtk2_ardour/editor.cc:1539 gtk2_ardour/editor.cc:1547 msgid "Freeze" msgstr "Заморозить" -#: editor.cc:1593 +#: gtk2_ardour/editor.cc:1543 msgid "Unfreeze" msgstr "Разморозить" -#: editor.cc:1762 editor.cc:1857 -#, fuzzy +#: gtk2_ardour/editor.cc:1712 gtk2_ardour/editor.cc:1807 msgid "Unmute" -msgstr "тихо" +msgstr "СнÑÑ‚ÑŒ глушение" -#. non-operative menu items for menu bar -#. show editors -#: editor.cc:1766 editor.cc:2046 editor.cc:2748 editor_actions.cc:27 -#: editor_markers.cc:507 mixer_strip.cc:495 mixer_strip.cc:563 -#: redirect_box.cc:1079 +#: gtk2_ardour/editor.cc:1716 gtk2_ardour/editor.cc:1996 +#: gtk2_ardour/editor_actions.cc:27 gtk2_ardour/editor_markers.cc:510 +#: gtk2_ardour/mixer_strip.cc:496 gtk2_ardour/mixer_strip.cc:559 +#: gtk2_ardour/redirect_box.cc:1094 msgid "Edit" msgstr "Правка" -#: editor.cc:1771 +#: gtk2_ardour/editor.cc:1721 msgid "Convert to short" msgstr "" -#: editor.cc:1773 +#: gtk2_ardour/editor.cc:1723 msgid "Convert to full" msgstr "" -#: editor.cc:1784 -#, fuzzy +#: gtk2_ardour/editor.cc:1734 msgid "Crossfade" msgstr "КроÑÑфейд" -#: editor.cc:1827 +#: gtk2_ardour/editor.cc:1777 msgid "Popup region editor" msgstr "Открыть редактор облаÑти" -#: editor.cc:1828 +#: gtk2_ardour/editor.cc:1778 #, fuzzy msgid "Raise to top layer" msgstr "ПоднÑÑ‚ÑŒ облаÑÑ‚ÑŒ в верхний Ñлой" -#: editor.cc:1829 +#: gtk2_ardour/editor.cc:1779 #, fuzzy msgid "Lower to bottom layer" msgstr "ОпуÑтить облаÑÑ‚ÑŒ в нижний Ñлой" -#: editor.cc:1831 +#: gtk2_ardour/editor.cc:1781 msgid "Define sync point" msgstr "" -#: editor.cc:1832 +#: gtk2_ardour/editor.cc:1782 msgid "Remove sync point" msgstr "" -#: editor.cc:1837 +#: gtk2_ardour/editor.cc:1787 #, fuzzy msgid "Bounce" msgstr "СвеÑти выделенное" -#: editor.cc:1840 +#: gtk2_ardour/editor.cc:1790 #, fuzzy msgid "Analyze region" msgstr "ВоÑпроизвеÑти облаÑÑ‚ÑŒ" -#: editor.cc:1852 +#: gtk2_ardour/editor.cc:1802 msgid "Lock" -msgstr "" +msgstr "Запереть" -#: editor.cc:1853 +#: gtk2_ardour/editor.cc:1803 msgid "Unlock" -msgstr "" +msgstr "Отпереть" -#: editor.cc:1863 +#: gtk2_ardour/editor.cc:1813 msgid "Original position" -msgstr "" +msgstr "ИÑходное положение" -#: editor.cc:1869 +#: gtk2_ardour/editor.cc:1819 msgid "Toggle envelope visibility" msgstr "" -#: editor.cc:1870 +#: gtk2_ardour/editor.cc:1820 msgid "Toggle envelope active" msgstr "" -#: editor.cc:1874 -#, fuzzy +#: gtk2_ardour/editor.cc:1824 msgid "DeNormalize" -msgstr "Ðорм." +msgstr "Денормализовать" -#: editor.cc:1876 +#: gtk2_ardour/editor.cc:1826 msgid "Normalize" -msgstr "" +msgstr "Ðормализовать" -#: editor.cc:1879 +#: gtk2_ardour/editor.cc:1829 msgid "Reverse" msgstr "" -#. range related stuff -#: editor.cc:1885 -#, fuzzy +#: gtk2_ardour/editor.cc:1835 msgid "Add Range Markers" -msgstr "Маркеры интервалов" +msgstr "Добавить маркеры облаÑтей" -#: editor.cc:1886 +#: gtk2_ardour/editor.cc:1836 #, fuzzy msgid "Set Range" msgstr "Разделить облаÑÑ‚ÑŒ" -#: editor.cc:1895 +#: gtk2_ardour/editor.cc:1845 msgid "Nudge fwd" -msgstr "" +msgstr "Подвинуть вперёд" -#: editor.cc:1896 +#: gtk2_ardour/editor.cc:1846 msgid "Nudge bwd" -msgstr "" +msgstr "Подвинуть назад" -#: editor.cc:1897 +#: gtk2_ardour/editor.cc:1847 msgid "Nudge fwd by capture offset" msgstr "" -#: editor.cc:1898 +#: gtk2_ardour/editor.cc:1848 msgid "Nudge bwd by capture offset" msgstr "" -#: editor.cc:1907 +#: gtk2_ardour/editor.cc:1850 gtk2_ardour/editor.cc:2016 +#: gtk2_ardour/editor.cc:2072 +msgid "Nudge" +msgstr "Подвинуть" + +#: gtk2_ardour/editor.cc:1857 msgid "Start to edit cursor" msgstr "От начала до курÑора" -#: editor.cc:1908 +#: gtk2_ardour/editor.cc:1858 msgid "Edit cursor to end" msgstr "От курÑора до конца" -#: editor.cc:1910 gain_meter.cc:181 gain_meter.cc:813 panner_ui.cc:98 -#: panner_ui.cc:803 +#: gtk2_ardour/editor.cc:1860 gtk2_ardour/gain_meter.cc:176 +#: gtk2_ardour/gain_meter.cc:808 gtk2_ardour/panner_ui.cc:96 +#: gtk2_ardour/panner_ui.cc:793 msgid "Trim" msgstr "" -#: editor.cc:1913 +#: gtk2_ardour/editor.cc:1863 msgid "Split" msgstr "Склеить" -#: editor.cc:1916 +#: gtk2_ardour/editor.cc:1866 msgid "Make mono regions" msgstr "Создать моно-облаÑти" -#: editor.cc:1919 +#: gtk2_ardour/editor.cc:1869 msgid "Duplicate" msgstr "Размножить" -#: editor.cc:1920 +#: gtk2_ardour/editor.cc:1870 msgid "Fill Track" msgstr "Заполнить трек" -#: editor.cc:1924 +#: gtk2_ardour/editor.cc:1874 msgid "Destroy" msgstr "" -#: editor.cc:1954 +#: gtk2_ardour/editor.cc:1904 #, fuzzy msgid "Play range" msgstr "ВоÑпроизвеÑти \"кольцо\"" -#: editor.cc:1955 +#: gtk2_ardour/editor.cc:1905 msgid "Loop range" msgstr "" -#: editor.cc:1959 +#: gtk2_ardour/editor.cc:1909 #, fuzzy msgid "Analyze range" msgstr "ВоÑпроизвеÑти \"кольцо\"" -#: editor.cc:1963 +#: gtk2_ardour/editor.cc:1913 #, fuzzy msgid "Separate range to track" msgstr "Разделить облаÑÑ‚ÑŒ" -#: editor.cc:1964 +#: gtk2_ardour/editor.cc:1914 #, fuzzy msgid "Separate range to region list" msgstr "ВоÑпроизвеÑти выделенную облаÑÑ‚ÑŒ" -#: editor.cc:1967 +#: gtk2_ardour/editor.cc:1917 #, fuzzy msgid "Select all in range" msgstr "Выделить вÑÑ‘" -#: editor.cc:1969 editor.cc:2014 +#: gtk2_ardour/editor.cc:1919 gtk2_ardour/editor.cc:1964 #, fuzzy msgid "Set range to loop range" msgstr "выбрать окно проÑмотра" -#: editor.cc:1970 editor.cc:2015 +#: gtk2_ardour/editor.cc:1920 gtk2_ardour/editor.cc:1965 #, fuzzy msgid "Set range to punch range" msgstr "Выбрать текущий интервал" -#: editor.cc:1972 +#: gtk2_ardour/editor.cc:1922 #, fuzzy msgid "Crop region to range" msgstr "Обрезать облаÑÑ‚ÑŒ по выделенному" -#: editor.cc:1973 +#: gtk2_ardour/editor.cc:1923 #, fuzzy msgid "Fill range with region" msgstr "Создать облаÑÑ‚ÑŒ" -#: editor.cc:1974 +#: gtk2_ardour/editor.cc:1924 #, fuzzy msgid "Duplicate range" msgstr "Размножить" -#: editor.cc:1975 +#: gtk2_ardour/editor.cc:1925 #, fuzzy msgid "Create chunk from range" msgstr "Создать фрагмент из выделенного" -#: editor.cc:1977 +#: gtk2_ardour/editor.cc:1927 msgid "Bounce range" msgstr "" -#: editor.cc:1978 +#: gtk2_ardour/editor.cc:1928 #, fuzzy msgid "Export range" msgstr "ÐкÑпорт облаÑти" -#: editor.cc:1980 +#: gtk2_ardour/editor.cc:1930 #, fuzzy msgid "Range" msgstr "выделÑÑ‚ÑŒ" -#: editor.cc:1995 editor.cc:2080 -#, fuzzy +#: gtk2_ardour/editor.cc:1945 gtk2_ardour/editor.cc:2030 msgid "Play from edit cursor" msgstr "ВоÑпроизвеÑти от курÑора" -#: editor.cc:1996 editor.cc:2081 +#: gtk2_ardour/editor.cc:1946 gtk2_ardour/editor.cc:2031 msgid "Play from start" -msgstr "ВоÑпроизвеÑти Ñ Ð½Ð°Ñ‡Ð°Ð»Ð°" +msgstr "ВоÑпроизвеÑти Ñначала" -#: editor.cc:1997 -#, fuzzy +#: gtk2_ardour/editor.cc:1947 msgid "Play region" msgstr "ВоÑпроизвеÑти облаÑÑ‚ÑŒ" -#: editor.cc:1999 +#: gtk2_ardour/editor.cc:1949 msgid "Loop Region" -msgstr "\"Закольцевать\" облаÑÑ‚ÑŒ" +msgstr "«Закольцевать» облаÑÑ‚ÑŒ" -#: editor.cc:2009 editor.cc:2090 -#, fuzzy +#: gtk2_ardour/editor.cc:1959 gtk2_ardour/editor.cc:2040 msgid "Select All in track" -msgstr "Выделить вÑÑ‘" +msgstr "Выделить вÑÑ‘ в дорожке" -#: editor.cc:2010 editor.cc:2091 redirect_box.cc:1067 -#, fuzzy +#: gtk2_ardour/editor.cc:1960 gtk2_ardour/editor.cc:2041 +#: gtk2_ardour/redirect_box.cc:1082 msgid "Select All" msgstr "Выделить вÑÑ‘" -#: editor.cc:2011 editor.cc:2092 -#, fuzzy +#: gtk2_ardour/editor.cc:1961 gtk2_ardour/editor.cc:2042 msgid "Invert selection in track" -msgstr "Скрыть трек" +msgstr "Обратить выделение в дорожке" -#: editor.cc:2012 editor.cc:2093 -#, fuzzy +#: gtk2_ardour/editor.cc:1962 gtk2_ardour/editor.cc:2043 msgid "Invert selection" -msgstr "СвеÑти выделенное" +msgstr "Обратить выделение" -#: editor.cc:2017 editor.cc:2095 -#, fuzzy +#: gtk2_ardour/editor.cc:1967 gtk2_ardour/editor.cc:2045 msgid "Select all after edit cursor" -msgstr "От начала до курÑора" +msgstr "Выделить вÑÑ‘ поÑле курÑора" -#: editor.cc:2018 editor.cc:2096 -#, fuzzy +#: gtk2_ardour/editor.cc:1968 gtk2_ardour/editor.cc:2046 msgid "Select all before edit cursor" -msgstr "От начала до курÑора" +msgstr "Выделить вÑÑ‘ до курÑора" -#: editor.cc:2019 editor.cc:2097 -#, fuzzy +#: gtk2_ardour/editor.cc:1969 gtk2_ardour/editor.cc:2047 msgid "Select all after playhead" -msgstr "ВоÑпроизвеÑти от указателÑ" +msgstr "Выделить вÑÑ‘ поÑле указателÑ" -#: editor.cc:2020 editor.cc:2098 -#, fuzzy +#: gtk2_ardour/editor.cc:1970 gtk2_ardour/editor.cc:2048 msgid "Select all before playhead" -msgstr "ВоÑпроизвеÑти от указателÑ" +msgstr "Выделить вÑÑ‘ до указателÑ" -#: editor.cc:2021 -#, fuzzy +#: gtk2_ardour/editor.cc:1971 msgid "Select all between cursors" -msgstr "От начала до курÑора" +msgstr "Выделить вÑÑ‘ между курÑорами" -#. standard editing stuff -#: editor.cc:2032 editor.cc:2108 editor.cc:3483 editor_actions.cc:214 -#: redirect_box.cc:1060 +#: gtk2_ardour/editor.cc:1982 gtk2_ardour/editor.cc:2058 +#: gtk2_ardour/editor.cc:3388 gtk2_ardour/editor_actions.cc:216 +#: gtk2_ardour/redirect_box.cc:1075 msgid "Cut" msgstr "Вырезать" -#: editor.cc:2033 editor.cc:2109 editor.cc:3485 editor_actions.cc:219 -#: redirect_box.cc:1062 +#: gtk2_ardour/editor.cc:1983 gtk2_ardour/editor.cc:2059 +#: gtk2_ardour/editor.cc:3390 gtk2_ardour/editor_actions.cc:221 +#: gtk2_ardour/redirect_box.cc:1077 msgid "Copy" msgstr "Копировать" -#: editor.cc:2034 -#, fuzzy +#: gtk2_ardour/editor.cc:1984 msgid "Paste at edit cursor" -msgstr "От начала до курÑора" +msgstr "Ð’Ñтавить под курÑор редактора" -#: editor.cc:2035 -#, fuzzy +#: gtk2_ardour/editor.cc:1985 msgid "Paste at mouse" -msgstr "иÑпользовать маÑтер-выходы" +msgstr "Ð’Ñтавить под курÑор мыши" -#: editor.cc:2039 editor.cc:3490 +#: gtk2_ardour/editor.cc:1989 gtk2_ardour/editor.cc:3395 msgid "Align" msgstr "ВыровнÑÑ‚ÑŒ" -#: editor.cc:2040 editor.cc:3492 +#: gtk2_ardour/editor.cc:1990 gtk2_ardour/editor.cc:3397 msgid "Align Relative" msgstr "ВыровнÑÑ‚ÑŒ отноÑительно" -#: editor.cc:2044 +#: gtk2_ardour/editor.cc:1994 msgid "Insert chunk" msgstr "Ð’Ñтавить фрагмент" -#: editor.cc:2051 +#: gtk2_ardour/editor.cc:2001 #, fuzzy msgid "Insert Selected Region" msgstr "ВоÑпроизвеÑти выделенную облаÑÑ‚ÑŒ" -#: editor.cc:2052 +#: gtk2_ardour/editor.cc:2002 msgid "Insert Existing Audio" msgstr "" -#: editor.cc:2061 editor.cc:2117 +#: gtk2_ardour/editor.cc:2011 gtk2_ardour/editor.cc:2067 msgid "Nudge entire track fwd" msgstr "" -#: editor.cc:2062 editor.cc:2118 +#: gtk2_ardour/editor.cc:2012 gtk2_ardour/editor.cc:2068 msgid "Nudge track after edit cursor fwd" msgstr "" -#: editor.cc:2063 editor.cc:2119 +#: gtk2_ardour/editor.cc:2013 gtk2_ardour/editor.cc:2069 msgid "Nudge entire track bwd" msgstr "" -#: editor.cc:2064 editor.cc:2120 +#: gtk2_ardour/editor.cc:2014 gtk2_ardour/editor.cc:2070 msgid "Nudge track after edit cursor bwd" msgstr "" -#: editor.cc:2110 editor.cc:3487 editor_actions.cc:221 redirect_box.cc:1064 +#: gtk2_ardour/editor.cc:2060 gtk2_ardour/editor.cc:3392 +#: gtk2_ardour/editor_actions.cc:223 gtk2_ardour/redirect_box.cc:1079 msgid "Paste" msgstr "Ð’Ñтавить" -#: editor.cc:2630 -msgid "select/move objects" +#: gtk2_ardour/editor.cc:2612 +#, fuzzy +msgid "Select/Move Objects" msgstr "выбирать/двигать объекты" -#: editor.cc:2631 -msgid "select/move ranges" +#: gtk2_ardour/editor.cc:2613 +#, fuzzy +msgid "Select/Move Ranges" msgstr "выбирать/двигать диапазоны" -#: editor.cc:2632 -msgid "draw gain automation" -msgstr "" +#: gtk2_ardour/editor.cc:2614 +#, fuzzy +msgid "Draw Gain Automation" +msgstr "автомат" -#: editor.cc:2633 -msgid "select zoom range" +#: gtk2_ardour/editor.cc:2615 +#, fuzzy +msgid "Select Zoom Range" msgstr "выбрать окно проÑмотра" -#: editor.cc:2634 -msgid "stretch/shrink regions" +#: gtk2_ardour/editor.cc:2616 +#, fuzzy +msgid "Stretch/Shrink Regions" msgstr "раÑÑ‚Ñнуть/Ñжать облаÑти" -#: editor.cc:2635 +#: gtk2_ardour/editor.cc:2617 #, fuzzy -msgid "listen to specific regions" +msgid "Listen to Specific Regions" msgstr "ВоÑпроизвеÑти выделенную облаÑÑ‚ÑŒ" -#: editor.cc:2746 -msgid "Start:" -msgstr "Ðачало:" +#: gtk2_ardour/editor.cc:2646 gtk2_ardour/editor_actions.cc:144 +msgid "Zoom In" +msgstr "Увеличить" -#: editor.cc:2747 -msgid "End:" -msgstr "Конец:" +#: gtk2_ardour/editor.cc:2651 gtk2_ardour/editor_actions.cc:142 +msgid "Zoom Out" +msgstr "Уменьшить" + +#: gtk2_ardour/editor.cc:2656 gtk2_ardour/editor_actions.cc:146 +msgid "Zoom to Session" +msgstr "Показать вÑÑ‘" -#: editor.cc:3362 editor.cc:3402 +#: gtk2_ardour/editor.cc:2663 +msgid "" +"Current Zoom Range\n" +"(Width of visible area)" +msgstr "" + +#: gtk2_ardour/editor.cc:2682 +msgid "Unit to snap cursors and ranges to" +msgstr "" + +#: gtk2_ardour/editor.cc:3267 gtk2_ardour/editor.cc:3307 #, fuzzy msgid "set selected regions" msgstr "ВоÑпроизвеÑти выделенную облаÑÑ‚ÑŒ" -#: editor.cc:3458 editor_actions.cc:204 +#: gtk2_ardour/editor.cc:3363 gtk2_ardour/editor_actions.cc:206 msgid "Undo" msgstr "Отменить" -#: editor.cc:3460 +#: gtk2_ardour/editor.cc:3365 msgid "Undo (%1)" msgstr "Отменить (%1)" -#: editor.cc:3470 editor_actions.cc:206 +#: gtk2_ardour/editor.cc:3375 gtk2_ardour/editor_actions.cc:208 msgid "Redo" -msgstr "Вернуть" +msgstr "Повторить" -#: editor.cc:3472 +#: gtk2_ardour/editor.cc:3377 msgid "Redo (%1)" -msgstr "Вернуть (%1)" +msgstr "Повторить (%1)" -#: editor.cc:3506 +#: gtk2_ardour/editor.cc:3411 msgid "... as new track" -msgstr "" +msgstr "... как новую дорожку" -#: editor.cc:3507 -#, fuzzy +#: gtk2_ardour/editor.cc:3412 msgid "... as new region" -msgstr "проÑлушать облаÑÑ‚ÑŒ" +msgstr "... как новую облаÑÑ‚ÑŒ" -#: editor.cc:3509 +#: gtk2_ardour/editor.cc:3414 msgid "Import audio (copy)" -msgstr "Импортировать аудио (копировать)" +msgstr "Импортировать аудио (копией)" -#: editor.cc:3512 +#: gtk2_ardour/editor.cc:3417 msgid "Remove last capture" msgstr "Удалить поÑледнюю запиÑÑŒ" -#: editor.cc:3536 +#: gtk2_ardour/editor.cc:3441 msgid "Duplicate how many times?" msgstr "КоличеÑтво повторов?" -#: editor.cc:4022 +#: gtk2_ardour/editor.cc:3618 +#, fuzzy +msgid "Focus Playhead" +msgstr "МаÑштабировать к" + +#: gtk2_ardour/editor.cc:3620 +#, fuzzy +msgid "Focus Edit Cursor" +msgstr "курÑору" + +#: gtk2_ardour/editor.cc:3929 msgid "" "Playlist %1 is currently unused.\n" "If left alone, no audio files used by it will be cleaned.\n" "If deleted, audio files used by it alone by will cleaned." msgstr "" -#: editor.cc:4030 -#, fuzzy +#: gtk2_ardour/editor.cc:3937 msgid "Delete playlist" -msgstr "Ð˜Ð¼Ñ Ñнимка" +msgstr "Удалить ÑпиÑок воÑпроизведениÑ" -#: editor.cc:4031 -#, fuzzy +#: gtk2_ardour/editor.cc:3938 msgid "Keep playlist" -msgstr "Ð˜Ð¼Ñ Ñнимка" - -#: editor.cc:4032 editor_audio_import.cc:236 editor_ops.cc:2048 -#: editor_timefx.cc:71 export_dialog.cc:971 io_selector.cc:59 -#: io_selector.cc:793 redirect_box.cc:903 tempo_dialog.cc:20 -#: tempo_dialog.cc:37 tempo_dialog.cc:202 tempo_dialog.cc:220 +msgstr "Сохранить ÑпиÑок воÑпроизведениÑ" + +#: gtk2_ardour/editor.cc:3939 gtk2_ardour/editor_audio_import.cc:239 +#: gtk2_ardour/editor_ops.cc:2061 gtk2_ardour/editor_timefx.cc:72 +#: gtk2_ardour/export_dialog.cc:971 gtk2_ardour/io_selector.cc:61 +#: gtk2_ardour/io_selector.cc:795 gtk2_ardour/redirect_box.cc:901 +#: gtk2_ardour/tempo_dialog.cc:20 gtk2_ardour/tempo_dialog.cc:37 +#: gtk2_ardour/tempo_dialog.cc:202 gtk2_ardour/tempo_dialog.cc:220 +#: gtk2_ardour/connection_editor.cc:60 msgid "Cancel" msgstr "Отмена" -#: editor.cc:4199 -#, fuzzy +#: gtk2_ardour/editor.cc:4107 msgid "new playlists" -msgstr "Ð˜Ð¼Ñ Ñнимка" +msgstr "Создать ÑпиÑки воÑпроизведениÑ" -#: editor.cc:4207 -#, fuzzy +#: gtk2_ardour/editor.cc:4115 msgid "copy playlists" -msgstr "Ð˜Ð¼Ñ Ñнимка" +msgstr "Скопировать ÑпиÑки воÑпроизведениÑ" -#: editor.cc:4215 -#, fuzzy +#: gtk2_ardour/editor.cc:4123 msgid "clear playlists" -msgstr "Ð˜Ð¼Ñ Ñнимка" +msgstr "ОчиÑтить ÑпиÑки воÑпроизведениÑ" -#: editor_actions.cc:28 -#, fuzzy +#: gtk2_ardour/editor_actions.cc:28 msgid "Select regions" -msgstr "ВоÑпроизвеÑти выделенную облаÑÑ‚ÑŒ" +msgstr "Выделение облаÑтей" -#: editor_actions.cc:29 -#, fuzzy +#: gtk2_ardour/editor_actions.cc:29 msgid "Select range operations" -msgstr "ВоÑпроизвеÑти выделенную облаÑÑ‚ÑŒ" +msgstr "ДейÑÑ‚Ð²Ð¸Ñ Ñ Ð²Ñ‹Ð´ÐµÐ»ÐµÐ½Ð½Ð¾Ð¹ облаÑтью" -#: editor_actions.cc:30 -#, fuzzy +#: gtk2_ardour/editor_actions.cc:30 msgid "Move edit cursor" -msgstr "От начала до курÑора" +msgstr "ПеремеÑтить курÑор редактора" -#: editor_actions.cc:31 -#, fuzzy +#: gtk2_ardour/editor_actions.cc:31 msgid "Region operations" -msgstr "ОблаÑти/Ñоздание" +msgstr "ДейÑÑ‚Ð²Ð¸Ñ Ñ Ð¾Ð±Ð»Ð°ÑÑ‚Ñми" -#: editor_actions.cc:32 +#: gtk2_ardour/editor_actions.cc:32 msgid "Tools" -msgstr "" +msgstr "ИнÑтрументы" -#: editor_actions.cc:33 +#: gtk2_ardour/editor_actions.cc:33 msgid "View" -msgstr "" +msgstr "Вид" -#: editor_actions.cc:34 -#, fuzzy +#: gtk2_ardour/editor_actions.cc:34 msgid "ZoomFocus" -msgstr "МаÑштабировать к" +msgstr "Ð¤Ð¾ÐºÑƒÑ Ð¿Ñ€Ð¸ маÑштабировании" -#: editor_actions.cc:35 -#, fuzzy +#: gtk2_ardour/editor_actions.cc:35 msgid "Meter hold" -msgstr "Размер" +msgstr "Задержка индикатора" -#: editor_actions.cc:36 +#: gtk2_ardour/editor_actions.cc:36 msgid "Meter falloff" -msgstr "" +msgstr "Спадание индикатора" -#: editor_actions.cc:38 -#, fuzzy +#: gtk2_ardour/editor_actions.cc:38 msgid "Crossfades" -msgstr "КроÑÑфейд" +msgstr "КроÑÑфейды" -#: editor_actions.cc:39 -#, fuzzy +#: gtk2_ardour/editor_actions.cc:39 msgid "Monitoring" -msgstr "Ðппаратный контроль" +msgstr "Контроль" -#: editor_actions.cc:40 -#, fuzzy +#: gtk2_ardour/editor_actions.cc:40 msgid "Autoconnect" -msgstr "Соединить" +msgstr "ÐвтоÑоединение" -#: editor_actions.cc:41 -#, fuzzy +#: gtk2_ardour/editor_actions.cc:41 msgid "Layering" -msgstr "Слой" +msgstr "Слои" -#: editor_actions.cc:42 -#, fuzzy +#: gtk2_ardour/editor_actions.cc:42 +msgid "SMPTE fps" +msgstr "Кадров в Ñекунду SMPTE" + +#: gtk2_ardour/editor_actions.cc:43 +msgid "Pullup / Pulldown" +msgstr "" + +#: gtk2_ardour/editor_actions.cc:44 msgid "Metering" -msgstr "Размер" +msgstr "Индикаторы" -#: editor_actions.cc:43 +#: gtk2_ardour/editor_actions.cc:45 msgid "Fall off rate" -msgstr "" +msgstr "ЧаÑтота Ñпада" -#: editor_actions.cc:44 +#: gtk2_ardour/editor_actions.cc:46 msgid "Hold Time" -msgstr "" +msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð·Ð°Ð´ÐµÑ€Ð¶ÐºÐ¸" -#: editor_actions.cc:45 +#: gtk2_ardour/editor_actions.cc:47 msgid "Add Existing Audio" -msgstr "" +msgstr "Добавить ÑущеÑтвующий файл" -#. add named actions for the editor -#: editor_actions.cc:50 -#, fuzzy +#: gtk2_ardour/editor_actions.cc:52 msgid "Show Editor Mixer" -msgstr "Показать вÑе каналы аудиотреков" +msgstr "Показать микшер редактора" -#: editor_actions.cc:55 +#: gtk2_ardour/editor_actions.cc:57 #, fuzzy msgid "Span Entire Overlap" msgstr "ПоднÑÑ‚ÑŒ облаÑÑ‚ÑŒ на один Ñлой" -#: editor_actions.cc:57 editor_actions.cc:384 -#, fuzzy +#: gtk2_ardour/editor_actions.cc:59 gtk2_ardour/editor_actions.cc:388 msgid "Short" -msgstr "порт" +msgstr "КороткаÑ" -#: editor_actions.cc:64 +#: gtk2_ardour/editor_actions.cc:66 msgid "Created Automatically" -msgstr "" +msgstr "Создано автоматичеÑки" -#: editor_actions.cc:67 +#: gtk2_ardour/editor_actions.cc:69 msgid "Playhead to Next Region Start" -msgstr "" +msgstr "Указатель к началу Ñледующей облаÑти" -#: editor_actions.cc:69 +#: gtk2_ardour/editor_actions.cc:71 msgid "Playhead to Next Region End" -msgstr "" +msgstr "Указатель к концу Ñледующей облаÑти" -#: editor_actions.cc:71 +#: gtk2_ardour/editor_actions.cc:73 msgid "Playhead to Next Region Sync" msgstr "" -#: editor_actions.cc:74 +#: gtk2_ardour/editor_actions.cc:76 msgid "Playhead to Previous Region Start" -msgstr "" +msgstr "Указатель к началу предыдущей облаÑти" -#: editor_actions.cc:76 +#: gtk2_ardour/editor_actions.cc:78 msgid "Playhead to Previous Region End" -msgstr "" +msgstr "Указатель к концу предыдущей облаÑти" -#: editor_actions.cc:78 +#: gtk2_ardour/editor_actions.cc:80 msgid "Playhead to Previous Region Sync" msgstr "" -#: editor_actions.cc:81 -#, fuzzy +#: gtk2_ardour/editor_actions.cc:83 msgid "Edit Cursor to Next Region Start" -msgstr "От курÑора до конца" +msgstr "КурÑор редактора к началу Ñледующей облаÑти" -#: editor_actions.cc:83 -#, fuzzy +#: gtk2_ardour/editor_actions.cc:85 msgid "Edit Cursor to Next Region End" -msgstr "От курÑора до конца" +msgstr "КурÑор редактора к концу Ñледующей облаÑти" -#: editor_actions.cc:85 +#: gtk2_ardour/editor_actions.cc:87 #, fuzzy msgid "Edit Cursor to Next Region Sync" msgstr "От курÑора до конца" -#: editor_actions.cc:88 +#: gtk2_ardour/editor_actions.cc:90 msgid "Edit Cursor to Previous Region Start" -msgstr "" +msgstr "КурÑор редактора к началу предыдущей облаÑти" -#: editor_actions.cc:90 -#, fuzzy +#: gtk2_ardour/editor_actions.cc:92 msgid "Edit Cursor to Previous Region End" -msgstr "От курÑора до конца" +msgstr "КурÑор редактора к концу предыдущей облаÑти" -#: editor_actions.cc:92 -#, fuzzy +#: gtk2_ardour/editor_actions.cc:94 msgid "Edit Cursor to Previous Region Sync" -msgstr "От курÑора до конца" +msgstr "" -#: editor_actions.cc:95 +#: gtk2_ardour/editor_actions.cc:97 msgid "Playhead to Range Start" -msgstr "" +msgstr "Указатель к началу облаÑти" -#: editor_actions.cc:97 -#, fuzzy +#: gtk2_ardour/editor_actions.cc:99 msgid "Playhead to Range End" -msgstr "ВоÑпроизвеÑти \"кольцо\"" +msgstr "Указатель к концу облаÑти" -#: editor_actions.cc:100 -#, fuzzy +#: gtk2_ardour/editor_actions.cc:102 msgid "Edit Cursor to Range Start" -msgstr "От курÑора до конца" +msgstr "КурÑор редактора к началу облаÑти" -#: editor_actions.cc:102 -#, fuzzy +#: gtk2_ardour/editor_actions.cc:104 msgid "Edit Cursor to Range End" -msgstr "От курÑора до конца" +msgstr "КурÑор редактора к концу облаÑти" -#: editor_actions.cc:105 editor_ops.cc:1363 -#, fuzzy +#: gtk2_ardour/editor_actions.cc:107 gtk2_ardour/editor_ops.cc:1373 msgid "select all" msgstr "Выделить вÑÑ‘" -#: editor_actions.cc:107 -#, fuzzy +#: gtk2_ardour/editor_actions.cc:109 msgid "Select All After Edit Cursor" -msgstr "ВоÑпроизвеÑти от курÑора" +msgstr "Выделить вÑÑ‘ поÑле курÑора редактора" -#: editor_actions.cc:109 +#: gtk2_ardour/editor_actions.cc:111 msgid "Select All Before Edit Cursor" -msgstr "" +msgstr "Выделить вÑÑ‘ перед курÑором редактора" -#: editor_actions.cc:112 -#, fuzzy +#: gtk2_ardour/editor_actions.cc:114 msgid "Select All After Playhead" -msgstr "ВоÑпроизвеÑти от указателÑ" +msgstr "Выделить вÑÑ‘ поÑле указателÑ" -#: editor_actions.cc:114 -#, fuzzy +#: gtk2_ardour/editor_actions.cc:116 msgid "Select All Before Playhead" -msgstr "ВоÑпроизвеÑти от указателÑ" +msgstr "Выделить вÑÑ‘ до указателÑ" -#: editor_actions.cc:116 +#: gtk2_ardour/editor_actions.cc:118 #, fuzzy msgid "Select All Between Cursors" msgstr "ВоÑпроизвеÑти от курÑора" -#: editor_actions.cc:119 +#: gtk2_ardour/editor_actions.cc:121 #, fuzzy msgid "Select All in Punch Range" msgstr "Выбрать текущий интервал" -#: editor_actions.cc:121 -#, fuzzy +#: gtk2_ardour/editor_actions.cc:123 msgid "Select All in Loop Range" -msgstr "выбрать окно проÑмотра" +msgstr "Выделить вÑÑ‘ в закольцованной облаÑти" -#: editor_actions.cc:124 +#: gtk2_ardour/editor_actions.cc:126 msgid "Jump Forward to Mark" -msgstr "" +msgstr "К Ñледующей метке" -#: editor_actions.cc:126 +#: gtk2_ardour/editor_actions.cc:128 msgid "Jump Backward to Mark" -msgstr "" +msgstr "К предыдущей метке" -#: editor_actions.cc:128 +#: gtk2_ardour/editor_actions.cc:130 #, fuzzy msgid "Add Location from Playhead" msgstr "ВоÑпроизвеÑти от указателÑ" -#: editor_actions.cc:131 +#: gtk2_ardour/editor_actions.cc:133 msgid "Nudge Forward" -msgstr "" +msgstr "Подвинуть вперёд" -#: editor_actions.cc:133 +#: gtk2_ardour/editor_actions.cc:135 msgid "Nudge Next Forward" msgstr "" -#: editor_actions.cc:135 -#, fuzzy +#: gtk2_ardour/editor_actions.cc:137 msgid "Nudge Backward" -msgstr "Скрыть трек" +msgstr "Подвинуть назад" -#: editor_actions.cc:137 +#: gtk2_ardour/editor_actions.cc:139 #, fuzzy msgid "Nudge Next Backward" msgstr "Скрыть трек" -#: editor_actions.cc:140 -#, fuzzy -msgid "Zoom Out" -msgstr "Уменьшить" - -#: editor_actions.cc:142 -#, fuzzy -msgid "Zoom In" -msgstr "Увеличить" - -#: editor_actions.cc:144 -#, fuzzy -msgid "Zoom to Session" -msgstr "Показать вÑÑ‘" - -#: editor_actions.cc:147 -#, fuzzy +#: gtk2_ardour/editor_actions.cc:149 msgid "Scroll Tracks Up" -msgstr "Заполнить трек" +msgstr "Прокрутить дорожки вверх" -#: editor_actions.cc:149 +#: gtk2_ardour/editor_actions.cc:151 msgid "Scroll Tracks Down" -msgstr "" +msgstr "Прокрутить дорожки вниз" -#: editor_actions.cc:151 +#: gtk2_ardour/editor_actions.cc:153 #, fuzzy msgid "Step Tracks Up" msgstr "Скрыть трек" -#: editor_actions.cc:153 +#: gtk2_ardour/editor_actions.cc:155 msgid "Step Tracks Down" msgstr "" -#: editor_actions.cc:156 +#: gtk2_ardour/editor_actions.cc:158 msgid "Scroll Backward" -msgstr "" +msgstr "Прокрутить назад" -#: editor_actions.cc:158 +#: gtk2_ardour/editor_actions.cc:160 msgid "Scroll Forward" -msgstr "" +msgstr "Прокрутить вперёд" -#: editor_actions.cc:160 +#: gtk2_ardour/editor_actions.cc:162 msgid "goto" -msgstr "" +msgstr "Перейти" -#: editor_actions.cc:162 -#, fuzzy +#: gtk2_ardour/editor_actions.cc:164 msgid "Center Playhead" -msgstr "указателю" +msgstr "Указатель по центру" -#: editor_actions.cc:164 -#, fuzzy +#: gtk2_ardour/editor_actions.cc:166 msgid "Center Edit Cursor" -msgstr "курÑору" +msgstr "КурÑор редактора по центру" -#: editor_actions.cc:166 -#, fuzzy +#: gtk2_ardour/editor_actions.cc:168 msgid "Playhead Forward" -msgstr "указателю" +msgstr "Указатель вперёд" -#: editor_actions.cc:168 -#, fuzzy +#: gtk2_ardour/editor_actions.cc:170 msgid "Playhead Backward" -msgstr "указателю" +msgstr "Указатель назад" -#: editor_actions.cc:170 -#, fuzzy +#: gtk2_ardour/editor_actions.cc:172 msgid "Playhead to Edit" -msgstr "указателю" +msgstr "Указатель к курÑору редактора" -#: editor_actions.cc:172 -#, fuzzy +#: gtk2_ardour/editor_actions.cc:174 msgid "Edit to Playhead" -msgstr "ВоÑпроизвеÑти от указателÑ" +msgstr "КурÑор редактора к указателю" -#: editor_actions.cc:175 -#, fuzzy +#: gtk2_ardour/editor_actions.cc:177 msgid "Align Regions Start" -msgstr "нач. облаÑтей" +msgstr "ВыровнÑÑ‚ÑŒ начало облаÑтей" -#: editor_actions.cc:177 +#: gtk2_ardour/editor_actions.cc:179 #, fuzzy msgid "Align Regions Start Relative" msgstr "ВыровнÑÑ‚ÑŒ отноÑительно" -#: editor_actions.cc:179 -#, fuzzy +#: gtk2_ardour/editor_actions.cc:181 msgid "Align Regions End" -msgstr "проÑлушать облаÑÑ‚ÑŒ" +msgstr "ВыровнÑÑ‚ÑŒ конец облаÑтей" -#: editor_actions.cc:181 +#: gtk2_ardour/editor_actions.cc:183 #, fuzzy msgid "Align Regions End Relative" msgstr "ВыровнÑÑ‚ÑŒ отноÑительно" -#: editor_actions.cc:184 +#: gtk2_ardour/editor_actions.cc:186 #, fuzzy msgid "Align Regions Sync" msgstr "проÑлушать облаÑÑ‚ÑŒ" -#: editor_actions.cc:186 +#: gtk2_ardour/editor_actions.cc:188 #, fuzzy msgid "Align Regions Sync Relative" msgstr "ВыровнÑÑ‚ÑŒ отноÑительно" -#: editor_actions.cc:189 -#, fuzzy +#: gtk2_ardour/editor_actions.cc:191 msgid "Audition at Mouse" -msgstr "Ðудит" +msgstr "Контроль по курÑору мыши" -#: editor_actions.cc:191 -#, fuzzy +#: gtk2_ardour/editor_actions.cc:193 msgid "Brush at Mouse" -msgstr "иÑпользовать маÑтер-выходы" +msgstr "КиÑточка по курÑору" -#: editor_actions.cc:193 -#, fuzzy +#: gtk2_ardour/editor_actions.cc:195 msgid "Set Edit Cursor" -msgstr "курÑору" +msgstr "УÑтановить курÑор редактора" -#: editor_actions.cc:195 -#, fuzzy +#: gtk2_ardour/editor_actions.cc:197 msgid "Mute/Unmute Region" -msgstr "Создать облаÑÑ‚ÑŒ" +msgstr "Приглушить /вернуть звук облаÑти" -#: editor_actions.cc:197 -#, fuzzy +#: gtk2_ardour/editor_actions.cc:199 msgid "Set Playhead" -msgstr "указателю" +msgstr "УÑтановить указатель" -#: editor_actions.cc:199 -#, fuzzy +#: gtk2_ardour/editor_actions.cc:201 msgid "Split Region" msgstr "Разделить облаÑÑ‚ÑŒ" -#: editor_actions.cc:201 +#: gtk2_ardour/editor_actions.cc:203 #, fuzzy msgid "Set Region Sync Position" msgstr "по раÑположению облаÑти" -#: editor_actions.cc:209 -#, fuzzy +#: gtk2_ardour/editor_actions.cc:211 msgid "Export Session" -msgstr "ÐкÑпорт облаÑти" +msgstr "ÐкÑпортировать ÑеÑÑию" -#: editor_actions.cc:211 -#, fuzzy +#: gtk2_ardour/editor_actions.cc:213 msgid "Export Range" -msgstr "Разделить облаÑÑ‚ÑŒ" +msgstr "ÐкÑпортировать облаÑÑ‚ÑŒ" -#. Note: for now, editor-delete does the exact same thing as editor-cut -#: editor_actions.cc:217 -#, fuzzy +#: gtk2_ardour/editor_actions.cc:219 gtk2_ardour/connection_editor.cc:56 msgid "Delete" -msgstr "удалить" +msgstr "Удалить" -#: editor_actions.cc:223 -#, fuzzy +#: gtk2_ardour/editor_actions.cc:225 msgid "Duplicate Region" -msgstr "Разделить облаÑÑ‚ÑŒ" +msgstr "Продублировать облаÑÑ‚ÑŒ" -#: editor_actions.cc:225 -#, fuzzy +#: gtk2_ardour/editor_actions.cc:227 msgid "Duplicate Range" -msgstr "Размножить" +msgstr "Продублировать облаÑÑ‚ÑŒ" -#: editor_actions.cc:227 +#: gtk2_ardour/editor_actions.cc:229 msgid "Insert Region" msgstr "Ð’Ñтавить облаÑÑ‚ÑŒ" -#: editor_actions.cc:229 -#, fuzzy +#: gtk2_ardour/editor_actions.cc:231 msgid "Reverse Region" -msgstr "Разделить облаÑÑ‚ÑŒ" +msgstr "Развернуть облаÑÑ‚ÑŒ" -#: editor_actions.cc:231 -#, fuzzy +#: gtk2_ardour/editor_actions.cc:233 msgid "Normalize Region" -msgstr "Создать облаÑÑ‚ÑŒ" +msgstr "Ðормализовать облаÑÑ‚ÑŒ" -#: editor_actions.cc:233 -#, fuzzy +#: gtk2_ardour/editor_actions.cc:235 msgid "crop" -msgstr "копировать" +msgstr "Обрезать" -#: editor_actions.cc:235 -#, fuzzy +#: gtk2_ardour/editor_actions.cc:237 msgid "Insert Chunk" msgstr "Ð’Ñтавить фрагмент" -#: editor_actions.cc:238 -#, fuzzy +#: gtk2_ardour/editor_actions.cc:240 msgid "Split at edit cursor" -msgstr "От начала до курÑора" +msgstr "Разделить по курÑору редактора" -#: editor_actions.cc:241 -#, fuzzy +#: gtk2_ardour/editor_actions.cc:243 msgid "Start Range" -msgstr "Разделить облаÑÑ‚ÑŒ" +msgstr "" -#: editor_actions.cc:243 +#: gtk2_ardour/editor_actions.cc:245 msgid "Finish Range" msgstr "" -#: editor_actions.cc:245 +#: gtk2_ardour/editor_actions.cc:247 msgid "Finish add Range" msgstr "" -#: editor_actions.cc:248 +#: gtk2_ardour/editor_actions.cc:250 msgid "Extend Range to End of Region" msgstr "" -#: editor_actions.cc:250 +#: gtk2_ardour/editor_actions.cc:252 #, fuzzy msgid "Extend Range to Start of Region" msgstr "Ð’ начало ÑеÑÑии" -#: editor_actions.cc:253 -#, fuzzy +#: gtk2_ardour/editor_actions.cc:255 msgid "Follow Playhead" msgstr "Следовать за указателем" -#: editor_actions.cc:261 -#, fuzzy +#: gtk2_ardour/editor_actions.cc:263 msgid "Zoom Focus Left" -msgstr "МаÑштабировать к" +msgstr "Ð¤Ð¾ÐºÑƒÑ Ð²Ð»ÐµÐ²Ð¾" -#: editor_actions.cc:263 -#, fuzzy +#: gtk2_ardour/editor_actions.cc:265 msgid "Zoom Focus Right" -msgstr "МаÑштабировать к" +msgstr "Ð¤Ð¾ÐºÑƒÑ Ð²Ð¿Ñ€Ð°Ð²Ð¾" -#: editor_actions.cc:265 -#, fuzzy +#: gtk2_ardour/editor_actions.cc:267 msgid "Zoom Focus Center" -msgstr "МаÑштабировать к" +msgstr "Ð¤Ð¾ÐºÑƒÑ Ð¿Ð¾ центру" -#: editor_actions.cc:267 -#, fuzzy +#: gtk2_ardour/editor_actions.cc:269 msgid "Zoom Focus Playhead" -msgstr "МаÑштабировать к" +msgstr "Ð¤Ð¾ÐºÑƒÑ Ð¿Ð¾ указателю" -#: editor_actions.cc:269 -#, fuzzy +#: gtk2_ardour/editor_actions.cc:271 msgid "Zoom Focus Edit" -msgstr "МаÑштабировать к" +msgstr "Ð¤Ð¾ÐºÑƒÑ Ð¿Ð¾ курÑору" -#: editor_actions.cc:275 +#: gtk2_ardour/editor_actions.cc:277 msgid "Object Tool" -msgstr "" +msgstr "Объект" -#: editor_actions.cc:276 -#, fuzzy +#: gtk2_ardour/editor_actions.cc:278 msgid "Range Tool" -msgstr "выделÑÑ‚ÑŒ" +msgstr "ОблаÑÑ‚ÑŒ" -#: editor_actions.cc:277 +#: gtk2_ardour/editor_actions.cc:279 msgid "Gain Tool" -msgstr "" +msgstr "УÑиление" -#: editor_actions.cc:278 -#, fuzzy +#: gtk2_ardour/editor_actions.cc:280 msgid "Zoom Tool" -msgstr "Уменьшить" +msgstr "Лупа" -#: editor_actions.cc:279 +#: gtk2_ardour/editor_actions.cc:281 msgid "Timefx Tool" -msgstr "" +msgstr "ВремÑ" -#: editor_actions.cc:286 -#, fuzzy +#: gtk2_ardour/editor_actions.cc:286 +msgid "Snap To" +msgstr "ПривÑзка" + +#: gtk2_ardour/editor_actions.cc:288 msgid "Snap to frame" -msgstr "ПривÑзка к" +msgstr "ПривÑзка к выборке" -#: editor_actions.cc:287 -#, fuzzy +#: gtk2_ardour/editor_actions.cc:289 msgid "Snap to cd frame" -msgstr "ПривÑзка к" +msgstr "ПривÑзка к выборке CD" -#: editor_actions.cc:288 -#, fuzzy +#: gtk2_ardour/editor_actions.cc:290 msgid "Snap to SMPTE frame" -msgstr "SMPTE Кадры/Секунды" +msgstr "ПривÑзка к кадру SMPTE" -#: editor_actions.cc:289 -#, fuzzy +#: gtk2_ardour/editor_actions.cc:291 msgid "Snap to SMPTE seconds" -msgstr "SMPTE Кадры/Секунды" +msgstr "ПривÑзка к Ñекундам SMPTE" -#: editor_actions.cc:290 +#: gtk2_ardour/editor_actions.cc:292 msgid "Snap to SMPTE minutes" -msgstr "" +msgstr "ПривÑзка к минутам SMPTE" -#: editor_actions.cc:291 -#, fuzzy +#: gtk2_ardour/editor_actions.cc:293 msgid "Snap to seconds" -msgstr "Минуты:Секунды" +msgstr "ПривÑзка к Ñекундам" -#: editor_actions.cc:292 +#: gtk2_ardour/editor_actions.cc:294 msgid "Snap to minutes" -msgstr "" +msgstr "ПривÑзка к минутам" -#: editor_actions.cc:293 -#, fuzzy +#: gtk2_ardour/editor_actions.cc:295 msgid "Snap to thirtyseconds" -msgstr "тридцать-вторых (32)" +msgstr "ПривÑзка по 30 Ñекундам" -#: editor_actions.cc:294 +#: gtk2_ardour/editor_actions.cc:296 msgid "Snap to asixteenthbeat" -msgstr "" +msgstr "ПривÑзка к 1/16" -#: editor_actions.cc:295 +#: gtk2_ardour/editor_actions.cc:297 msgid "Snap to eighths" -msgstr "" +msgstr "ПривÑзка к 1/8" -#: editor_actions.cc:296 +#: gtk2_ardour/editor_actions.cc:298 msgid "Snap to quarters" -msgstr "" +msgstr "ПривÑзка к 1/4" -#: editor_actions.cc:297 -#, fuzzy +#: gtk2_ardour/editor_actions.cc:299 msgid "Snap to thirds" -msgstr "ПривÑзка к" +msgstr "ПривÑзка к 1/3" -#: editor_actions.cc:298 -#, fuzzy +#: gtk2_ardour/editor_actions.cc:300 msgid "Snap to beat" -msgstr "ПривÑзка к" +msgstr "ПривÑзка к доле" -#: editor_actions.cc:299 -#, fuzzy +#: gtk2_ardour/editor_actions.cc:301 msgid "Snap to bar" -msgstr "ПривÑзка к" +msgstr "ПривÑзка к такту" -#: editor_actions.cc:300 -#, fuzzy +#: gtk2_ardour/editor_actions.cc:302 msgid "Snap to mark" -msgstr "добавить маркер" +msgstr "ПривÑзка к маркеру" -#: editor_actions.cc:301 -#, fuzzy +#: gtk2_ardour/editor_actions.cc:303 msgid "Snap to edit cursor" -msgstr "От начала до курÑора" +msgstr "ПривÑзка к курÑору редактора" -#: editor_actions.cc:302 -#, fuzzy +#: gtk2_ardour/editor_actions.cc:304 msgid "Snap to region start" -msgstr "нач. облаÑтей" +msgstr "ПривÑзка к началу облаÑти" -#: editor_actions.cc:303 -#, fuzzy +#: gtk2_ardour/editor_actions.cc:305 msgid "Snap to region end" -msgstr "оконч. облаÑтей" +msgstr "ПривÑзка к концу облаÑти" -#: editor_actions.cc:304 -#, fuzzy +#: gtk2_ardour/editor_actions.cc:306 msgid "Snap to region sync" -msgstr "Создать моно-облаÑти" +msgstr "" -#: editor_actions.cc:305 +#: gtk2_ardour/editor_actions.cc:307 msgid "Snap to region boundary" -msgstr "" +msgstr "ПривÑзка к границам облаÑти" -#. the region list popup menu -#: editor_actions.cc:314 -#, fuzzy +#: gtk2_ardour/editor_actions.cc:316 msgid "Sort" -msgstr "порт" +msgstr "" -#: editor_actions.cc:322 +#: gtk2_ardour/editor_actions.cc:324 msgid "Show all" msgstr "Показать вÑÑ‘" -#: editor_actions.cc:323 -#, fuzzy +#: gtk2_ardour/editor_actions.cc:325 msgid "Show automatic regions" -msgstr "автомат" +msgstr "Показать автомат. облаÑти" -#: editor_actions.cc:325 +#: gtk2_ardour/editor_actions.cc:327 msgid "Ascending" -msgstr "по возраÑтанию" +msgstr "По возраÑтанию" -#: editor_actions.cc:327 +#: gtk2_ardour/editor_actions.cc:329 msgid "Descending" -msgstr "по убыванию" +msgstr "По убыванию" -#: editor_actions.cc:330 +#: gtk2_ardour/editor_actions.cc:332 msgid "By Region Name" -msgstr "по имени облаÑти" +msgstr "По имени облаÑти" -#: editor_actions.cc:332 +#: gtk2_ardour/editor_actions.cc:334 msgid "By Region Length" -msgstr "по длине облаÑти" +msgstr "По длительноÑти облаÑти" -#: editor_actions.cc:334 +#: gtk2_ardour/editor_actions.cc:336 msgid "By Region Position" -msgstr "по раÑположению облаÑти" +msgstr "По раÑположению облаÑти" -#: editor_actions.cc:336 +#: gtk2_ardour/editor_actions.cc:338 msgid "By Region Timestamp" -msgstr "по времени ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¾Ð±Ð»Ð°Ñти" +msgstr "По времени ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¾Ð±Ð»Ð°Ñти" -#: editor_actions.cc:338 +#: gtk2_ardour/editor_actions.cc:340 msgid "By Region Start in File" -msgstr "по началу облаÑти в файле" +msgstr "По началу облаÑти в файле" -#: editor_actions.cc:340 +#: gtk2_ardour/editor_actions.cc:342 msgid "By Region End in File" -msgstr "по концу облаÑти в файле" +msgstr "По концу облаÑти в файле" -#: editor_actions.cc:342 +#: gtk2_ardour/editor_actions.cc:344 msgid "By Source File Name" -msgstr "по имени файла" +msgstr "По имени иÑходного файла" -#: editor_actions.cc:344 +#: gtk2_ardour/editor_actions.cc:346 msgid "By Source File Length" -msgstr "по размеру файла" +msgstr "По длительноÑти иÑходного файла" -#: editor_actions.cc:346 +#: gtk2_ardour/editor_actions.cc:348 msgid "By Source File Creation Date" -msgstr "по дате ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¸Ñходного файла" +msgstr "По дате ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¸Ñходного файла" -#: editor_actions.cc:348 +#: gtk2_ardour/editor_actions.cc:350 msgid "By Source Filesystem" -msgstr "по раÑположению файла" +msgstr "По иÑходной файловой ÑиÑтеме" -#. the next two are duplicate items with different names for use in two different contexts -#: editor_actions.cc:354 -#, fuzzy +#: gtk2_ardour/editor_actions.cc:356 msgid "Add External Audio" -msgstr "Добавить во внешний ÑпиÑок облаÑтей" +msgstr "Добавить внешний звуковой файл" -#: editor_actions.cc:356 -#, fuzzy +#: gtk2_ardour/editor_actions.cc:358 msgid "as Region(s)" -msgstr "ВоÑпроизвеÑти выделенную облаÑÑ‚ÑŒ" +msgstr "как облаÑÑ‚ÑŒ(-и)" -#: editor_actions.cc:358 -#, fuzzy +#: gtk2_ardour/editor_actions.cc:360 msgid "as Tracks" -msgstr "Треки" +msgstr "как дорожки" -#: editor_actions.cc:360 -#, fuzzy +#: gtk2_ardour/editor_actions.cc:362 +msgid "as Tape Tracks" +msgstr "" + +#: gtk2_ardour/editor_actions.cc:364 msgid "to Tracks" -msgstr "Треки" +msgstr "в дорожки" -#: editor_actions.cc:363 -#, fuzzy +#: gtk2_ardour/editor_actions.cc:367 msgid "Show Waveforms" -msgstr "Отображать форму Ñигнала" +msgstr "Показывать форму Ñигнала" -#: editor_actions.cc:364 -#, fuzzy +#: gtk2_ardour/editor_actions.cc:368 msgid "Show Waveforms While Recording" -msgstr "Отображать форму Ñигнала" +msgstr "Показывать форму Ñигнала при запиÑи" -#: editor_actions.cc:365 -#, fuzzy +#: gtk2_ardour/editor_actions.cc:369 msgid "Show Measures" msgstr "Показывать линии тактов" -#: editor_actions.cc:378 editor_actions.cc:385 +#: gtk2_ardour/editor_actions.cc:382 gtk2_ardour/editor_actions.cc:389 msgid "Medium" -msgstr "" +msgstr "Средне" -#: editor_actions.cc:380 -#, fuzzy +#: gtk2_ardour/editor_actions.cc:384 msgid "Faster" -msgstr "Затухание" +msgstr "БыÑтрее" -#: editor_actions.cc:386 +#: gtk2_ardour/editor_actions.cc:390 msgid "Long" -msgstr "" +msgstr "ДолгаÑ" -#: editor_actions.cc:390 +#: gtk2_ardour/editor_actions.cc:394 #, fuzzy msgid "Later is Higher" msgstr "ОпуÑтить облаÑÑ‚ÑŒ на один Ñлой" -#: editor_actions.cc:391 +#: gtk2_ardour/editor_actions.cc:395 #, fuzzy msgid "Most Recently Moved/Added is Higher" msgstr "ОпуÑтить облаÑÑ‚ÑŒ на один Ñлой" -#: editor_actions.cc:392 +#: gtk2_ardour/editor_actions.cc:396 #, fuzzy msgid "Most Recently Added is Higher" msgstr "ОпуÑтить облаÑÑ‚ÑŒ на один Ñлой" -#: editor_audio_import.cc:72 +#: gtk2_ardour/editor_actions.cc:400 +msgid "23.976" +msgstr "" + +#: gtk2_ardour/editor_actions.cc:401 +msgid "24" +msgstr "" + +#: gtk2_ardour/editor_actions.cc:402 +msgid "24.976" +msgstr "" + +#: gtk2_ardour/editor_actions.cc:403 +msgid "25" +msgstr "" + +#: gtk2_ardour/editor_actions.cc:404 +msgid "29.97" +msgstr "" + +#: gtk2_ardour/editor_actions.cc:405 +msgid "29.97 drop" +msgstr "" + +#: gtk2_ardour/editor_actions.cc:406 +msgid "30" +msgstr "" + +#: gtk2_ardour/editor_actions.cc:407 +msgid "30 drop" +msgstr "" + +#: gtk2_ardour/editor_actions.cc:408 +msgid "59.94" +msgstr "" + +#: gtk2_ardour/editor_actions.cc:409 +msgid "60" +msgstr "" + +#: gtk2_ardour/editor_actions.cc:413 +#, c-format +msgid "+4.1667% + 0.1%" +msgstr "" + +#: gtk2_ardour/editor_actions.cc:414 +msgid "+4.1667%" +msgstr "" + +#: gtk2_ardour/editor_actions.cc:415 +#, c-format +msgid "+4.1667% - 0.1%" +msgstr "" + +#: gtk2_ardour/editor_actions.cc:416 +msgid "+ 0.1%" +msgstr "" + +#: gtk2_ardour/editor_actions.cc:418 +msgid "- 0.1%" +msgstr "" + +#: gtk2_ardour/editor_actions.cc:419 +#, c-format +msgid "-4.1667% + 0.1%" +msgstr "" + +#: gtk2_ardour/editor_actions.cc:420 +msgid "-4.1667%" +msgstr "" + +#: gtk2_ardour/editor_actions.cc:421 +#, c-format +msgid "-4.1667% - 0.1%" +msgstr "" + +#: gtk2_ardour/editor_audio_import.cc:75 #, fuzzy msgid "You can't import or embed an audiofile until you have a session loaded." msgstr "Ð’Ñ‹ не можете импортировать аудиофайл пока ÑеÑÑÐ¸Ñ Ð½Ðµ загружена." -#: editor_audio_import.cc:77 +#: gtk2_ardour/editor_audio_import.cc:80 #, fuzzy msgid "Add existing audio to session" msgstr "иÑпользовать имеющийÑÑ ÑˆÐ°Ð±Ð»Ð¾Ð½" -#: editor_audio_import.cc:142 +#: gtk2_ardour/editor_audio_import.cc:145 #, fuzzy msgid "ardour: importing %1" msgstr "ardour: ÑкÑпорт" -#: editor_audio_import.cc:146 +#: gtk2_ardour/editor_audio_import.cc:149 msgid "Cancel Import" msgstr "Отменить импорт" -#: editor_audio_import.cc:224 +#: gtk2_ardour/editor_audio_import.cc:227 #, fuzzy msgid "Editor: cannot open file \"%1\", (%2)" msgstr "Редактор: не удалоÑÑŒ открыть файл \"%1\" (%2)" -#: editor_audio_import.cc:232 +#: gtk2_ardour/editor_audio_import.cc:235 #, fuzzy msgid "Cancel entire import" msgstr "Отменить импорт" -#: editor_audio_import.cc:233 +#: gtk2_ardour/editor_audio_import.cc:236 #, fuzzy msgid "Don't embed it" msgstr "Отмена" -#: editor_audio_import.cc:234 +#: gtk2_ardour/editor_audio_import.cc:237 msgid "Embed all without questions" msgstr "" -#: editor_audio_import.cc:239 +#: gtk2_ardour/editor_audio_import.cc:242 msgid "Embed it anyway" msgstr "" -#: editor_audio_import.cc:242 +#: gtk2_ardour/editor_audio_import.cc:245 #, fuzzy msgid "" "%1\n" @@ -3480,284 +3359,283 @@ msgstr "" "Выбранный аудиофайл имеет чаÑтоту диÑкретизации данных\n" "отличную от текущей ÑеÑÑии!" -#: editor_audio_import.cc:275 +#: gtk2_ardour/editor_audio_import.cc:278 msgid "could not open %1" msgstr "не удалоÑÑŒ открыть %1" -#: editor_audio_import.cc:320 +#: gtk2_ardour/editor_audio_import.cc:323 #, fuzzy msgid "insert sndfile" msgstr "Ð’Ñтавить внешний аудиофайл" -#. stuff for the verbose canvas cursor -#: editor_canvas.cc:118 +#: gtk2_ardour/editor_canvas.cc:119 msgid "VerboseCanvasCursor" msgstr "" -#: editor_edit_groups.cc:53 mixer_ui.cc:736 +#: gtk2_ardour/editor_edit_groups.cc:53 gtk2_ardour/mixer_ui.cc:754 #, fuzzy msgid "Activate All" msgstr "Ðктивировать" -#: editor_edit_groups.cc:54 mixer_ui.cc:737 +#: gtk2_ardour/editor_edit_groups.cc:54 gtk2_ardour/mixer_ui.cc:755 #, fuzzy msgid "Disable All" msgstr "ОтÑоединить" -#: editor_edit_groups.cc:56 mixer_ui.cc:739 +#: gtk2_ardour/editor_edit_groups.cc:56 gtk2_ardour/mixer_ui.cc:757 #, fuzzy msgid "Add group" msgstr "Ðет группы" -#: editor_edit_groups.cc:229 mixer_ui.cc:970 +#: gtk2_ardour/editor_edit_groups.cc:229 gtk2_ardour/mixer_ui.cc:988 #, fuzzy msgid "unnamed" msgstr "Переименовать" -#: editor_edit_groups.cc:258 mixer_ui.cc:834 +#: gtk2_ardour/editor_edit_groups.cc:258 gtk2_ardour/mixer_ui.cc:852 msgid "-all-" msgstr "-вÑе-" -#: editor_export_audio.cc:65 +#: gtk2_ardour/editor_export_audio.cc:67 msgid "" "There is no selection to export.\n" "\n" "Select a selection using the range mouse mode" msgstr "" -#: editor_export_audio.cc:110 +#: gtk2_ardour/editor_export_audio.cc:112 msgid "" "There are no ranges to export.\n" "\n" "Create 1 or more ranges by dragging the mouse in the range bar" msgstr "" -#: editor_imageframe.cc:625 editor_imageframe.cc:655 +#: gtk2_ardour/editor_imageframe.cc:625 gtk2_ardour/editor_imageframe.cc:655 msgid "programming error: no ImageFrameView selected" msgstr "ошибка в программе: no ImageFrameView selected" -#: editor_imageframe.cc:848 editor_imageframe.cc:870 +#: gtk2_ardour/editor_imageframe.cc:848 gtk2_ardour/editor_imageframe.cc:870 msgid "programming error: no MarkerView selected" msgstr "ошибка в программе: no MarkerView selected" -#: editor_keyboard.cc:104 +#: gtk2_ardour/editor_keyboard.cc:105 #, fuzzy msgid "mute region" msgstr "отключить воÑпроизведение Ñтой облаÑти" -#: editor_keys.cc:46 +#: gtk2_ardour/editor_keys.cc:46 #, fuzzy msgid "keyboard selection" msgstr "Выделить по интервалу" -#: editor_markers.cc:292 editor_ops.cc:1290 editor_ops.cc:1303 -#: editor_ops.cc:1321 location_ui.cc:774 +#: gtk2_ardour/editor_markers.cc:293 gtk2_ardour/editor_ops.cc:1297 +#: gtk2_ardour/editor_ops.cc:1311 gtk2_ardour/editor_ops.cc:1330 +#: gtk2_ardour/location_ui.cc:776 msgid "add marker" msgstr "добавить маркер" -#: editor_markers.cc:307 editor_markers.cc:380 editor_markers.cc:552 -#: editor_markers.cc:570 editor_markers.cc:589 editor_markers.cc:608 -#: editor_markers.cc:638 editor_markers.cc:666 editor_markers.cc:694 -#: editor_markers.cc:732 editor_markers.cc:759 editor_markers.cc:782 -#: editor_markers.cc:801 editor_mouse.cc:2015 editor_mouse.cc:4275 +#: gtk2_ardour/editor_markers.cc:309 gtk2_ardour/editor_markers.cc:383 +#: gtk2_ardour/editor_markers.cc:555 gtk2_ardour/editor_markers.cc:573 +#: gtk2_ardour/editor_markers.cc:592 gtk2_ardour/editor_markers.cc:611 +#: gtk2_ardour/editor_markers.cc:641 gtk2_ardour/editor_markers.cc:669 +#: gtk2_ardour/editor_markers.cc:697 gtk2_ardour/editor_markers.cc:735 +#: gtk2_ardour/editor_markers.cc:762 gtk2_ardour/editor_markers.cc:785 +#: gtk2_ardour/editor_markers.cc:804 gtk2_ardour/editor_mouse.cc:2027 +#: gtk2_ardour/editor_mouse.cc:4322 msgid "programming error: marker canvas item has no marker object pointer!" msgstr "ошибка в программе: marker canvas item has no marker object pointer!" -#: editor_markers.cc:331 location_ui.cc:656 +#: gtk2_ardour/editor_markers.cc:333 gtk2_ardour/location_ui.cc:657 msgid "remove marker" msgstr "" -#: editor_markers.cc:458 +#: gtk2_ardour/editor_markers.cc:461 #, fuzzy msgid "Locate to Mark" msgstr "Маркеры интервалов" -#: editor_markers.cc:459 -#, fuzzy +#: gtk2_ardour/editor_markers.cc:462 msgid "Play from Mark" -msgstr "ВоÑпроизвеÑти Ñ Ð½Ð°Ñ‡Ð°Ð»Ð°" +msgstr "ВоÑпроизвеÑти Ñ Ð¼Ð°Ñ€ÐºÐµÑ€Ð°" -#: editor_markers.cc:460 -#, fuzzy +#: gtk2_ardour/editor_markers.cc:463 msgid "Set Mark from Playhead" -msgstr "ВоÑпроизвеÑти от указателÑ" +msgstr "УÑтановить маркер на указатель" -#: editor_markers.cc:464 -#, fuzzy +#: gtk2_ardour/editor_markers.cc:467 msgid "Rename Mark" -msgstr "Переименовать" +msgstr "Переименовать маркер" -#: editor_markers.cc:465 -#, fuzzy +#: gtk2_ardour/editor_markers.cc:468 msgid "Hide Mark" -msgstr "Скрыть трек" +msgstr "Скрыть маркер" -#: editor_markers.cc:466 -#, fuzzy +#: gtk2_ardour/editor_markers.cc:469 msgid "Remove Mark" -msgstr "Удалить поле" +msgstr "Удалить маркер" -#: editor_markers.cc:479 editor_markers.cc:535 +#: gtk2_ardour/editor_markers.cc:482 gtk2_ardour/editor_markers.cc:538 #, fuzzy msgid "Locate to Range Mark" msgstr "Маркеры интервалов" -#: editor_markers.cc:480 editor_markers.cc:536 +#: gtk2_ardour/editor_markers.cc:483 gtk2_ardour/editor_markers.cc:539 #, fuzzy msgid "Play from Range Mark" msgstr "ВоÑпроизвеÑти \"кольцо\"" -#: editor_markers.cc:481 +#: gtk2_ardour/editor_markers.cc:484 #, fuzzy msgid "Loop Range" msgstr "ВоÑпроизвеÑти \"кольцо\"" -#: editor_markers.cc:482 editor_markers.cc:537 +#: gtk2_ardour/editor_markers.cc:485 gtk2_ardour/editor_markers.cc:540 #, fuzzy msgid "Set Range Mark from Playhead" msgstr "ВоÑпроизвеÑти от указателÑ" -#: editor_markers.cc:483 editor_markers.cc:538 +#: gtk2_ardour/editor_markers.cc:486 gtk2_ardour/editor_markers.cc:541 #, fuzzy msgid "Set Range from Range Selection" msgstr "ВоÑпроизвеÑти выделенное" -#: editor_markers.cc:487 +#: gtk2_ardour/editor_markers.cc:490 #, fuzzy msgid "Rename Range" msgstr "Переименовать" -#: editor_markers.cc:488 editor_markers.cc:540 +#: gtk2_ardour/editor_markers.cc:491 gtk2_ardour/editor_markers.cc:543 #, fuzzy msgid "Hide Range" msgstr "выделÑÑ‚ÑŒ" -#: editor_markers.cc:489 +#: gtk2_ardour/editor_markers.cc:492 #, fuzzy msgid "Remove Range" msgstr "Удалить поле" -#: editor_markers.cc:493 editor_markers.cc:542 +#: gtk2_ardour/editor_markers.cc:496 gtk2_ardour/editor_markers.cc:545 #, fuzzy msgid "Separate Regions in Range" msgstr "Создать облаÑÑ‚ÑŒ из выделенного" -#: editor_markers.cc:494 editor_markers.cc:543 +#: gtk2_ardour/editor_markers.cc:497 gtk2_ardour/editor_markers.cc:546 #, fuzzy msgid "Select All in Range" msgstr "Выделить вÑÑ‘" -#: editor_markers.cc:520 +#: gtk2_ardour/editor_markers.cc:523 msgid "Set Loop Range" msgstr "" -#: editor_markers.cc:521 +#: gtk2_ardour/editor_markers.cc:524 msgid "Set Punch Range" msgstr "" -#: editor_markers.cc:815 +#: gtk2_ardour/editor_markers.cc:818 #, fuzzy msgid "New Name:" msgstr "новое имÑ: " -#: editor_markers.cc:818 +#: gtk2_ardour/editor_markers.cc:821 msgid "ardour: rename mark" msgstr "ardour: переименовать маркер" -#: editor_markers.cc:820 +#: gtk2_ardour/editor_markers.cc:823 #, fuzzy msgid "ardour: rename range" msgstr "ardour: переименовать облаÑÑ‚ÑŒ" -#: editor_markers.cc:840 +#: gtk2_ardour/editor_markers.cc:843 #, fuzzy msgid "rename marker" msgstr "добавить маркер" -#: editor_markers.cc:865 +#: gtk2_ardour/editor_markers.cc:869 #, fuzzy msgid "set loop range" msgstr "выбрать окно проÑмотра" -#: editor_markers.cc:891 +#: gtk2_ardour/editor_markers.cc:897 #, fuzzy msgid "set punch range" msgstr "Выбрать текущий интервал" -#: editor_mouse.cc:103 +#: gtk2_ardour/editor_mouse.cc:105 msgid "Editor::event_frame() used on unhandled event type %1" msgstr "Editor::event_frame() used on unhandled event type %1" -#: editor_mouse.cc:313 +#: gtk2_ardour/editor_mouse.cc:315 #, fuzzy msgid "select on click" msgstr "ИÑпользовать как щелчок метронома" -#: editor_mouse.cc:1590 +#: gtk2_ardour/editor_mouse.cc:1596 msgid "programming error: start_grab called without drag item" msgstr "ошибка в программе: start_grab called without drag item" -#: editor_mouse.cc:1814 +#: gtk2_ardour/editor_mouse.cc:1820 #, fuzzy msgid "change fade in length" msgstr "редактировать введение в уровень" -#: editor_mouse.cc:1832 +#: gtk2_ardour/editor_mouse.cc:1841 #, fuzzy msgid "programming error: fade out canvas item has no regionview data pointer!" msgstr "ошибка в программе: cursor canvas item has no cursor data pointer!" -#: editor_mouse.cc:1906 +#: gtk2_ardour/editor_mouse.cc:1915 #, fuzzy msgid "change fade out length" msgstr "редактировать Ñведение в ноль" -#: editor_mouse.cc:1925 +#: gtk2_ardour/editor_mouse.cc:1937 msgid "programming error: cursor canvas item has no cursor data pointer!" msgstr "ошибка в программе: cursor canvas item has no cursor data pointer!" -#: editor_mouse.cc:2142 +#: gtk2_ardour/editor_mouse.cc:2162 #, fuzzy msgid "move marker" msgstr "Удалить поле" -#: editor_mouse.cc:2165 editor_mouse.cc:2196 editor_tempodisplay.cc:459 -msgid "" -"programming error: meter marker canvas item has no marker object pointer!" -msgstr "" -"ошибка в программе: meter marker canvas item has no marker object pointer!" +#: gtk2_ardour/editor_mouse.cc:2190 gtk2_ardour/editor_mouse.cc:2221 +#: gtk2_ardour/editor_tempodisplay.cc:490 +msgid "programming error: meter marker canvas item has no marker object pointer!" +msgstr "ошибка в программе: meter marker canvas item has no marker object pointer!" -#: editor_mouse.cc:2264 +#: gtk2_ardour/editor_mouse.cc:2289 #, fuzzy msgid "copy meter mark" msgstr "добавить маркер" -#: editor_mouse.cc:2274 +#: gtk2_ardour/editor_mouse.cc:2300 msgid "move meter mark" msgstr "" -#: editor_mouse.cc:2289 editor_mouse.cc:2322 editor_tempodisplay.cc:331 -#: editor_tempodisplay.cc:409 editor_tempodisplay.cc:428 -msgid "" -"programming error: tempo marker canvas item has no marker object pointer!" -msgstr "" -"ошибка в программе: tempo marker canvas item has no marker object pointer!" +#: gtk2_ardour/editor_mouse.cc:2316 gtk2_ardour/editor_mouse.cc:2349 +#: gtk2_ardour/editor_tempodisplay.cc:353 +#: gtk2_ardour/editor_tempodisplay.cc:437 +#: gtk2_ardour/editor_tempodisplay.cc:456 +msgid "programming error: tempo marker canvas item has no marker object pointer!" +msgstr "ошибка в программе: tempo marker canvas item has no marker object pointer!" -#: editor_mouse.cc:2294 editor_mouse.cc:2327 editor_tempodisplay.cc:336 -#: editor_tempodisplay.cc:414 +#: gtk2_ardour/editor_mouse.cc:2321 gtk2_ardour/editor_mouse.cc:2354 +#: gtk2_ardour/editor_tempodisplay.cc:358 +#: gtk2_ardour/editor_tempodisplay.cc:442 msgid "programming error: marker for tempo is not a tempo marker!" msgstr "ошибка в программе: marker for tempo is not a tempo marker!" -#: editor_mouse.cc:2394 +#: gtk2_ardour/editor_mouse.cc:2421 #, fuzzy msgid "copy tempo mark" msgstr "добавить маркер" -#: editor_mouse.cc:2404 +#: gtk2_ardour/editor_mouse.cc:2432 msgid "move tempo mark" msgstr "" -#: editor_mouse.cc:2418 editor_mouse.cc:2437 editor_mouse.cc:2450 +#: gtk2_ardour/editor_mouse.cc:2447 gtk2_ardour/editor_mouse.cc:2466 +#: gtk2_ardour/editor_mouse.cc:2479 msgid "" "programming error: control point canvas item has no control point object " "pointer!" @@ -3765,349 +3643,344 @@ msgstr "" "ошибка в программе: control point canvas item has no control point object " "pointer!" -#: editor_mouse.cc:2555 +#: gtk2_ardour/editor_mouse.cc:2585 msgid "programming error: line canvas item has no line pointer!" msgstr "ошибка в программе: line canvas item has no line pointer!" -#: editor_mouse.cc:2664 +#: gtk2_ardour/editor_mouse.cc:2694 #, fuzzy msgid "move region(s)" msgstr "Создать облаÑÑ‚ÑŒ" -#: editor_mouse.cc:2727 +#: gtk2_ardour/editor_mouse.cc:2757 #, fuzzy msgid "Drag region brush" msgstr "проÑлушать облаÑÑ‚ÑŒ" -#. don't copy again -#. this is committed in the grab finished callback. -#: editor_mouse.cc:2751 +#: gtk2_ardour/editor_mouse.cc:2781 msgid "Drag region copy" msgstr "" -#. A selection grab currently creates two undo/redo operations, one for -#. creating the new region and another for moving it. -#. -#: editor_mouse.cc:3609 +#: gtk2_ardour/editor_mouse.cc:3641 #, fuzzy msgid "selection grab" msgstr "Выделенное" -#: editor_mouse.cc:3650 +#: gtk2_ardour/editor_mouse.cc:3683 #, fuzzy msgid "cancel selection" msgstr "ВоÑпроизвеÑти выделенное" -#: editor_mouse.cc:3760 +#: gtk2_ardour/editor_mouse.cc:3793 #, fuzzy msgid "range selection" msgstr "ВоÑпроизвеÑти выделенное" -#: editor_mouse.cc:3776 +#: gtk2_ardour/editor_mouse.cc:3809 #, fuzzy msgid "trim selection start" msgstr "Выделить по интервалу" -#: editor_mouse.cc:3792 +#: gtk2_ardour/editor_mouse.cc:3825 #, fuzzy msgid "trim selection end" msgstr "Выделить по интервалу" -#: editor_mouse.cc:3809 +#: gtk2_ardour/editor_mouse.cc:3842 #, fuzzy msgid "move selection" msgstr "СвеÑти выделенное" -#: editor_mouse.cc:4195 +#: gtk2_ardour/editor_mouse.cc:4231 #, fuzzy msgid "Start point trim" msgstr "От начала до курÑора" -#: editor_mouse.cc:4223 +#: gtk2_ardour/editor_mouse.cc:4263 msgid "End point trim" msgstr "" -#: editor_mouse.cc:4262 +#: gtk2_ardour/editor_mouse.cc:4306 msgid "trimmed region" msgstr "" -#: editor_mouse.cc:4400 -#, fuzzy +#: gtk2_ardour/editor_mouse.cc:4448 msgid "new range marker" -msgstr "Маркеры интервалов" +msgstr "Ðовый маркер облаÑти" -#: editor_mouse.cc:4642 +#: gtk2_ardour/editor_mouse.cc:4692 #, fuzzy msgid "select regions" msgstr "ВоÑпроизвеÑти выделенную облаÑÑ‚ÑŒ" -#: editor_mouse.cc:4671 +#: gtk2_ardour/editor_mouse.cc:4721 msgid "Name for region:" msgstr "Ð˜Ð¼Ñ Ð¾Ð±Ð»Ð°Ñти: " -#: editor_mouse.cc:4735 +#: gtk2_ardour/editor_mouse.cc:4785 #, fuzzy msgid "timestretch" msgstr "ardour: Ñффект timestretch" -#: editor_ops.cc:195 +#: gtk2_ardour/editor_ops.cc:196 #, fuzzy msgid "split" msgstr "Склеить" -#: editor_ops.cc:231 +#: gtk2_ardour/editor_ops.cc:235 #, fuzzy msgid "remove region" msgstr "Создать облаÑÑ‚ÑŒ" -#: editor_ops.cc:250 +#: gtk2_ardour/editor_ops.cc:255 msgid "" " This is destructive, will possibly delete audio files\n" "It cannot be undone\n" "Do you really want to destroy %1 ?" msgstr "" -#: editor_ops.cc:254 +#: gtk2_ardour/editor_ops.cc:259 #, fuzzy msgid "these regions" msgstr "ВоÑпроизвеÑти выделенную облаÑÑ‚ÑŒ" -#: editor_ops.cc:254 +#: gtk2_ardour/editor_ops.cc:259 #, fuzzy msgid "this region" msgstr "отключить воÑпроизведение Ñтой облаÑти" -#: editor_ops.cc:256 editor_ops.cc:3318 route_ui.cc:707 -#: visual_time_axis.cc:278 +#: gtk2_ardour/editor_ops.cc:261 gtk2_ardour/editor_ops.cc:3364 +#: gtk2_ardour/route_ui.cc:715 gtk2_ardour/visual_time_axis.cc:278 msgid "No, do nothing." msgstr "Ðет" -#: editor_ops.cc:259 +#: gtk2_ardour/editor_ops.cc:264 #, fuzzy msgid "Yes, destroy them." msgstr "Да" -#: editor_ops.cc:261 editor_ops.cc:3319 +#: gtk2_ardour/editor_ops.cc:266 gtk2_ardour/editor_ops.cc:3365 msgid "Yes, destroy it." msgstr "Да" -#: editor_ops.cc:352 editor_ops.cc:380 +#: gtk2_ardour/editor_ops.cc:355 gtk2_ardour/editor_ops.cc:383 #, fuzzy msgid "extend selection" msgstr "Выделить по интервалу" -#: editor_ops.cc:396 editor_ops.cc:430 editor_ops.cc:474 editor_ops.cc:500 +#: gtk2_ardour/editor_ops.cc:399 gtk2_ardour/editor_ops.cc:434 +#: gtk2_ardour/editor_ops.cc:479 gtk2_ardour/editor_ops.cc:506 msgid "nudge forward" msgstr "" -#: editor_ops.cc:564 +#: gtk2_ardour/editor_ops.cc:571 msgid "build_region_boundary_cache called with snap_type = %1" msgstr "build_region_boundary_cache called with snap_type = %1" -#: editor_ops.cc:1420 +#: gtk2_ardour/editor_ops.cc:1430 #, fuzzy msgid "select all within" msgstr "Выделить вÑÑ‘" -#: editor_ops.cc:1452 +#: gtk2_ardour/editor_ops.cc:1462 #, fuzzy msgid "set selection from region" msgstr "Создать облаÑÑ‚ÑŒ из выделенного" -#: editor_ops.cc:1485 +#: gtk2_ardour/editor_ops.cc:1495 #, fuzzy msgid "set selection from range" msgstr "Создать облаÑÑ‚ÑŒ из выделенного" -#: editor_ops.cc:1515 +#: gtk2_ardour/editor_ops.cc:1525 #, fuzzy msgid "select all from range" msgstr "выбрать окно проÑмотра" -#: editor_ops.cc:1537 +#: gtk2_ardour/editor_ops.cc:1547 #, fuzzy msgid "select all from punch" msgstr "Выделить вÑÑ‘" -#: editor_ops.cc:1559 +#: gtk2_ardour/editor_ops.cc:1569 #, fuzzy msgid "select all from loop" msgstr "Выделить вÑÑ‘" -#: editor_ops.cc:1573 +#: gtk2_ardour/editor_ops.cc:1583 #, fuzzy msgid "select all after cursor" msgstr "От начала до курÑора" -#: editor_ops.cc:1578 +#: gtk2_ardour/editor_ops.cc:1588 #, fuzzy msgid "select all before cursor" msgstr "ВоÑпроизвеÑти от курÑора" -#: editor_ops.cc:1608 +#: gtk2_ardour/editor_ops.cc:1618 #, fuzzy msgid "select all between cursors" msgstr "ВоÑпроизвеÑти от курÑора" -#: editor_ops.cc:1739 +#: gtk2_ardour/editor_ops.cc:1749 msgid "clear markers" msgstr "очиÑтить маркеры" -#: editor_ops.cc:1751 +#: gtk2_ardour/editor_ops.cc:1762 msgid "clear ranges" msgstr "" -#: editor_ops.cc:1770 +#: gtk2_ardour/editor_ops.cc:1782 msgid "clear locations" msgstr "очиÑтить интервалы" -#: editor_ops.cc:1820 +#: gtk2_ardour/editor_ops.cc:1833 #, fuzzy msgid "insert dragged region" msgstr "Ð’Ñтавить облаÑÑ‚ÑŒ" -#: editor_ops.cc:1856 +#: gtk2_ardour/editor_ops.cc:1869 #, fuzzy msgid "insert region" msgstr "Ð’Ñтавить облаÑÑ‚ÑŒ" -#: editor_ops.cc:2047 io_selector.cc:58 io_selector.cc:792 +#: gtk2_ardour/editor_ops.cc:2060 gtk2_ardour/io_selector.cc:60 +#: gtk2_ardour/io_selector.cc:794 gtk2_ardour/connection_editor.cc:86 msgid "OK" msgstr "ОК" -#: editor_ops.cc:2054 +#: gtk2_ardour/editor_ops.cc:2067 msgid "ardour: rename region" msgstr "ardour: переименовать облаÑÑ‚ÑŒ" -#: editor_ops.cc:2277 editor_ops.cc:2326 +#: gtk2_ardour/editor_ops.cc:2292 gtk2_ardour/editor_ops.cc:2345 #, fuzzy msgid "separate" msgstr "Разделить облаÑÑ‚ÑŒ" -#: editor_ops.cc:2388 +#: gtk2_ardour/editor_ops.cc:2410 #, fuzzy msgid "trim to selection" msgstr "Выделить по интервалу" -#: editor_ops.cc:2428 +#: gtk2_ardour/editor_ops.cc:2451 msgid "region fill" msgstr "" -#: editor_ops.cc:2487 +#: gtk2_ardour/editor_ops.cc:2515 #, fuzzy msgid "fill selection" msgstr "Закольцевать выделенное" -#: editor_ops.cc:2508 +#: gtk2_ardour/editor_ops.cc:2536 #, fuzzy msgid "Programming error. that region doesn't cover that position" msgstr "ошибка в программе: location/marker map does not contain location!" -#: editor_ops.cc:2511 +#: gtk2_ardour/editor_ops.cc:2539 #, fuzzy msgid "set region sync position" msgstr "ОблаÑти/положение" -#: editor_ops.cc:2526 +#: gtk2_ardour/editor_ops.cc:2555 msgid "Place the edit cursor at the desired sync point" msgstr "ПомеÑтите курÑор на точку Ñинхронизации" -#: editor_ops.cc:2531 +#: gtk2_ardour/editor_ops.cc:2560 #, fuzzy msgid "set sync from edit cursor" msgstr "ВоÑпроизвеÑти от курÑора" -#: editor_ops.cc:2543 +#: gtk2_ardour/editor_ops.cc:2573 msgid "remove sync" msgstr "" -#: editor_ops.cc:2557 +#: gtk2_ardour/editor_ops.cc:2588 msgid "naturalize" msgstr "" -#: editor_ops.cc:2621 +#: gtk2_ardour/editor_ops.cc:2653 #, fuzzy msgid "align selection (relative)" msgstr "ВыровнÑÑ‚ÑŒ отноÑительно" -#: editor_ops.cc:2649 +#: gtk2_ardour/editor_ops.cc:2682 #, fuzzy msgid "align selection" msgstr "СвеÑти выделенное" -#: editor_ops.cc:2661 +#: gtk2_ardour/editor_ops.cc:2694 #, fuzzy msgid "align region" msgstr "проÑлушать облаÑÑ‚ÑŒ" -#: editor_ops.cc:2708 editor_ops.cc:2733 +#: gtk2_ardour/editor_ops.cc:2742 gtk2_ardour/editor_ops.cc:2768 #, fuzzy msgid "trim to edit" msgstr "От начала до курÑора" -#: editor_ops.cc:2784 +#: gtk2_ardour/editor_ops.cc:2820 #, fuzzy msgid "ardour: freeze" msgstr "ardour: " -#: editor_ops.cc:2789 +#: gtk2_ardour/editor_ops.cc:2825 #, fuzzy msgid "Cancel Freeze" msgstr "Отмена" -#: editor_ops.cc:2826 +#: gtk2_ardour/editor_ops.cc:2862 #, fuzzy msgid "bounce range" msgstr "Выбрать текущий интервал" -#: editor_ops.cc:2879 +#: gtk2_ardour/editor_ops.cc:2916 msgid "cut" msgstr "вырезать" -#: editor_ops.cc:2882 +#: gtk2_ardour/editor_ops.cc:2919 msgid "copy" msgstr "копировать" -#: editor_ops.cc:2895 +#: gtk2_ardour/editor_ops.cc:2932 msgid " objects" msgstr "объекты" -#: editor_ops.cc:2921 +#: gtk2_ardour/editor_ops.cc:2958 msgid " range" msgstr "" -#: editor_ops.cc:3078 +#: gtk2_ardour/editor_ops.cc:3121 #, fuzzy msgid "paste" msgstr "Ð’Ñтавить" -#: editor_ops.cc:3116 +#: gtk2_ardour/editor_ops.cc:3159 #, fuzzy msgid "paste chunk" msgstr "Создать фрагмент" -#. clear (below) will clear the argument list -#: editor_ops.cc:3157 +#: gtk2_ardour/editor_ops.cc:3200 #, fuzzy msgid "duplicate region" msgstr "Разделить облаÑÑ‚ÑŒ" -#: editor_ops.cc:3202 +#: gtk2_ardour/editor_ops.cc:3245 #, fuzzy msgid "duplicate selection" msgstr "СвеÑти выделенное" -#: editor_ops.cc:3259 +#: gtk2_ardour/editor_ops.cc:3303 #, fuzzy msgid "clear playlist" msgstr "Ð˜Ð¼Ñ Ñнимка" -#: editor_ops.cc:3288 +#: gtk2_ardour/editor_ops.cc:3333 #, fuzzy msgid "nudge track" msgstr "Скрыть трек" -#: editor_ops.cc:3315 +#: gtk2_ardour/editor_ops.cc:3361 msgid "" "Do you really want to destroy the last capture?\n" "(This is destructive and cannot be undone)" @@ -4115,714 +3988,712 @@ msgstr "" "ПоÑледнюю запиÑÑŒ будет удалена. Ð’Ñ‹ уверены?\n" "(отмена операции невозможна)" -#: editor_ops.cc:3343 +#: gtk2_ardour/editor_ops.cc:3389 #, fuzzy msgid "normalize" msgstr "Ðорм." -#: editor_ops.cc:3390 +#: gtk2_ardour/editor_ops.cc:3442 msgid "reverse regions" msgstr "" -#: editor_region_list.cc:98 editor_region_list.cc:103 -#: editor_region_list.cc:106 location_ui.cc:56 +#: gtk2_ardour/editor_region_list.cc:98 gtk2_ardour/editor_region_list.cc:103 +#: gtk2_ardour/editor_region_list.cc:106 gtk2_ardour/location_ui.cc:57 msgid "Hidden" msgstr "Скрытый" -#. added a new fresh one at the end -#: editor_route_list.cc:102 editor_route_list.cc:103 editor_route_list.cc:247 +#: gtk2_ardour/editor_route_list.cc:100 gtk2_ardour/editor_route_list.cc:101 +#: gtk2_ardour/editor_route_list.cc:246 msgid "editor" msgstr "редактор" -#: editor_route_list.cc:310 mixer_ui.cc:699 +#: gtk2_ardour/editor_route_list.cc:313 gtk2_ardour/mixer_ui.cc:717 msgid "Show All" msgstr "Показать вÑÑ‘" -#: editor_route_list.cc:311 mixer_ui.cc:700 +#: gtk2_ardour/editor_route_list.cc:314 gtk2_ardour/mixer_ui.cc:718 msgid "Hide All" msgstr "Скрыть вÑÑ‘" -#: editor_route_list.cc:312 mixer_ui.cc:701 +#: gtk2_ardour/editor_route_list.cc:315 gtk2_ardour/mixer_ui.cc:719 #, fuzzy msgid "Show All Audio Tracks" msgstr "Показать вÑе аудиошины" -#: editor_route_list.cc:313 mixer_ui.cc:702 +#: gtk2_ardour/editor_route_list.cc:316 gtk2_ardour/mixer_ui.cc:720 #, fuzzy msgid "Hide All Audio Tracks" msgstr "Скрыть вÑе аудиошины" -#: editor_route_list.cc:314 mixer_ui.cc:703 +#: gtk2_ardour/editor_route_list.cc:317 gtk2_ardour/mixer_ui.cc:721 #, fuzzy msgid "Show All Audio Busses" msgstr "Показать вÑе аудиошины" -#: editor_route_list.cc:315 mixer_ui.cc:704 +#: gtk2_ardour/editor_route_list.cc:318 gtk2_ardour/mixer_ui.cc:722 #, fuzzy msgid "Hide All Audio Busses" msgstr "Скрыть вÑе аудиошины" -#: editor_rulers.cc:312 +#: gtk2_ardour/editor_rulers.cc:311 #, fuzzy msgid "New location marker" msgstr "Маркеры интервалов" -#: editor_rulers.cc:313 +#: gtk2_ardour/editor_rulers.cc:312 #, fuzzy msgid "Clear all locations" msgstr "очиÑтить интервалы" -#. ruler_items.push_back (MenuElem (_("New Range"))); -#: editor_rulers.cc:318 -#, fuzzy +#: gtk2_ardour/editor_rulers.cc:317 msgid "Clear all ranges" -msgstr "ВоÑпроизвеÑти \"кольцо\"" +msgstr "ОчиÑтить вÑе облаÑти" -#: editor_rulers.cc:327 +#: gtk2_ardour/editor_rulers.cc:326 #, fuzzy msgid "New Tempo" msgstr "Ðовый темп" -#: editor_rulers.cc:328 -#, fuzzy +#: gtk2_ardour/editor_rulers.cc:327 msgid "Clear tempo" -msgstr "Ðовый темп" +msgstr "ОчиÑтить темп" -#: editor_rulers.cc:333 -#, fuzzy +#: gtk2_ardour/editor_rulers.cc:332 msgid "New Meter" -msgstr "Размер" +msgstr "" -#: editor_rulers.cc:334 -#, fuzzy +#: gtk2_ardour/editor_rulers.cc:333 msgid "Clear meter" -msgstr "очиÑтить маркеры" +msgstr "" -#: editor_rulers.cc:342 -#, fuzzy +#: gtk2_ardour/editor_rulers.cc:341 msgid "Min:Secs" -msgstr "Мин:Сек" +msgstr "Мин:С" -#: editor_selection_list.cc:108 -#, fuzzy +#: gtk2_ardour/editor_selection_list.cc:108 msgid "Name for Chunk:" -msgstr "Ð¸Ð¼Ñ Ñ„Ñ€Ð°Ð³Ð¼ÐµÐ½Ñ‚Ð°:" +msgstr "Ð˜Ð¼Ñ Ñ„Ñ€Ð°Ð³Ð¼ÐµÐ½Ñ‚Ð°:" -#: editor_selection_list.cc:111 -#, fuzzy +#: gtk2_ardour/editor_selection_list.cc:111 msgid "Create Chunk" msgstr "Создать фрагмент" -#: editor_selection_list.cc:111 +#: gtk2_ardour/editor_selection_list.cc:111 msgid "Forget it" msgstr "Забыть" -#: editor_tempodisplay.cc:253 editor_tempodisplay.cc:293 +#: gtk2_ardour/editor_tempodisplay.cc:270 +#: gtk2_ardour/editor_tempodisplay.cc:313 msgid "add" msgstr "добавить" -#: editor_tempodisplay.cc:275 +#: gtk2_ardour/editor_tempodisplay.cc:292 #, fuzzy msgid "add tempo mark" msgstr "добавить маркер" -#: editor_tempodisplay.cc:315 +#: gtk2_ardour/editor_tempodisplay.cc:335 #, fuzzy msgid "add meter mark" msgstr "добавить маркер" -#: editor_tempodisplay.cc:348 editor_tempodisplay.cc:376 +#: gtk2_ardour/editor_tempodisplay.cc:370 +#: gtk2_ardour/editor_tempodisplay.cc:401 msgid "done" msgstr "готово" -#: editor_tempodisplay.cc:366 editor_tempodisplay.cc:394 +#: gtk2_ardour/editor_tempodisplay.cc:388 +#: gtk2_ardour/editor_tempodisplay.cc:419 msgid "replace tempo mark" msgstr "" -#: editor_tempodisplay.cc:433 editor_tempodisplay.cc:464 +#: gtk2_ardour/editor_tempodisplay.cc:461 +#: gtk2_ardour/editor_tempodisplay.cc:495 msgid "programming error: marker for meter is not a meter marker!" msgstr "ошибка в программе: marker for meter is not a meter marker!" -#: editor_tempodisplay.cc:443 editor_tempodisplay.cc:476 +#: gtk2_ardour/editor_tempodisplay.cc:471 +#: gtk2_ardour/editor_tempodisplay.cc:507 #, fuzzy msgid "remove tempo mark" msgstr "Да, удалить вÑÑ‘" -#: editor_timefx.cc:51 +#: gtk2_ardour/editor_timefx.cc:52 msgid "Quick but Ugly" msgstr "БыÑтро и грубо" -#: editor_timefx.cc:52 +#: gtk2_ardour/editor_timefx.cc:53 msgid "Skip Anti-aliasing" msgstr "Без фильтрации" -#: editor_timefx.cc:56 +#: gtk2_ardour/editor_timefx.cc:57 msgid "ardour: timestretch" msgstr "ardour: Ñффект timestretch" -#: editor_timefx.cc:57 +#: gtk2_ardour/editor_timefx.cc:58 msgid "TimeStretchDialog" msgstr "TimeStretchDialog" -#: editor_timefx.cc:70 +#: gtk2_ardour/editor_timefx.cc:71 msgid "Stretch/Shrink it" msgstr "РаÑÑ‚Ñнуть/Сжать" -#: editor_timefx.cc:73 editor_timefx.cc:74 +#: gtk2_ardour/editor_timefx.cc:74 gtk2_ardour/editor_timefx.cc:75 msgid "TimeStretchButton" msgstr "TimeStretchButton" -#: editor_timefx.cc:75 +#: gtk2_ardour/editor_timefx.cc:76 msgid "TimeStretchProgress" msgstr "TimeStretchProgress" -#: editor_timefx.cc:139 +#: gtk2_ardour/editor_timefx.cc:140 msgid "timestretch cannot be started - thread creation error" msgstr "" -#: export_dialog.cc:59 export_dialog.cc:399 export_dialog.cc:1027 -#: export_dialog.cc:1195 +#: gtk2_ardour/export_dialog.cc:59 gtk2_ardour/export_dialog.cc:399 +#: gtk2_ardour/export_dialog.cc:1027 gtk2_ardour/export_dialog.cc:1195 msgid "22.05kHz" msgstr "22.05кГц" -#: export_dialog.cc:60 export_dialog.cc:402 export_dialog.cc:417 -#: export_dialog.cc:1029 export_dialog.cc:1197 +#: gtk2_ardour/export_dialog.cc:60 gtk2_ardour/export_dialog.cc:402 +#: gtk2_ardour/export_dialog.cc:417 gtk2_ardour/export_dialog.cc:1029 +#: gtk2_ardour/export_dialog.cc:1197 msgid "44.1kHz" msgstr "44.1кГц" -#: export_dialog.cc:61 export_dialog.cc:405 export_dialog.cc:1031 -#: export_dialog.cc:1199 +#: gtk2_ardour/export_dialog.cc:61 gtk2_ardour/export_dialog.cc:405 +#: gtk2_ardour/export_dialog.cc:1031 gtk2_ardour/export_dialog.cc:1199 msgid "48kHz" msgstr "48кГц" -#: export_dialog.cc:62 export_dialog.cc:408 export_dialog.cc:1033 -#: export_dialog.cc:1201 +#: gtk2_ardour/export_dialog.cc:62 gtk2_ardour/export_dialog.cc:408 +#: gtk2_ardour/export_dialog.cc:1033 gtk2_ardour/export_dialog.cc:1201 msgid "88.2kHz" msgstr "88.2кГц" -#: export_dialog.cc:63 export_dialog.cc:411 export_dialog.cc:1035 -#: export_dialog.cc:1203 +#: gtk2_ardour/export_dialog.cc:63 gtk2_ardour/export_dialog.cc:411 +#: gtk2_ardour/export_dialog.cc:1035 gtk2_ardour/export_dialog.cc:1203 msgid "96kHz" msgstr "96кГц" -#: export_dialog.cc:64 export_dialog.cc:414 export_dialog.cc:1037 -#: export_dialog.cc:1205 +#: gtk2_ardour/export_dialog.cc:64 gtk2_ardour/export_dialog.cc:414 +#: gtk2_ardour/export_dialog.cc:1037 gtk2_ardour/export_dialog.cc:1205 msgid "192kHz" msgstr "192кГц" -#: export_dialog.cc:69 +#: gtk2_ardour/export_dialog.cc:69 msgid "best" msgstr "выÑокое" -#: export_dialog.cc:70 export_dialog.cc:1212 +#: gtk2_ardour/export_dialog.cc:70 gtk2_ardour/export_dialog.cc:1212 msgid "fastest" msgstr "быÑтрое" -#: export_dialog.cc:71 export_dialog.cc:1214 +#: gtk2_ardour/export_dialog.cc:71 gtk2_ardour/export_dialog.cc:1214 msgid "linear" msgstr "линейное" -#: export_dialog.cc:72 export_dialog.cc:1216 +#: gtk2_ardour/export_dialog.cc:72 gtk2_ardour/export_dialog.cc:1216 msgid "better" msgstr "нормальное" -#: export_dialog.cc:73 export_dialog.cc:1218 +#: gtk2_ardour/export_dialog.cc:73 gtk2_ardour/export_dialog.cc:1218 msgid "intermediate" msgstr "Ñреднее" -#: export_dialog.cc:79 export_dialog.cc:1227 +#: gtk2_ardour/export_dialog.cc:79 gtk2_ardour/export_dialog.cc:1227 msgid "Rectangular" msgstr "Rectangular" -#: export_dialog.cc:80 +#: gtk2_ardour/export_dialog.cc:80 msgid "Shaped Noise" msgstr "Shaped Noise" -#: export_dialog.cc:81 export_dialog.cc:1229 +#: gtk2_ardour/export_dialog.cc:81 gtk2_ardour/export_dialog.cc:1229 msgid "Triangular" msgstr "Triangular" -#: export_dialog.cc:86 +#: gtk2_ardour/export_dialog.cc:86 msgid "stereo" msgstr "Ñтерео" -#. default is to use all -#: export_dialog.cc:87 export_dialog.cc:486 export_dialog.cc:1055 -#: export_dialog.cc:1177 +#: gtk2_ardour/export_dialog.cc:87 gtk2_ardour/export_dialog.cc:486 +#: gtk2_ardour/export_dialog.cc:1055 gtk2_ardour/export_dialog.cc:1177 msgid "mono" msgstr "моно" -#: export_dialog.cc:93 +#: gtk2_ardour/export_dialog.cc:93 msgid "CUE" msgstr "" -#: export_dialog.cc:94 +#: gtk2_ardour/export_dialog.cc:94 msgid "TOC" msgstr "" -#: export_dialog.cc:102 +#: gtk2_ardour/export_dialog.cc:102 #, fuzzy msgid "Format" msgstr "Ðорм." -#: export_dialog.cc:103 +#: gtk2_ardour/export_dialog.cc:103 msgid "CD Marker File Type" msgstr "" -#: export_dialog.cc:104 +#: gtk2_ardour/export_dialog.cc:104 #, fuzzy msgid "Channels" msgstr "отмена" -#: export_dialog.cc:105 +#: gtk2_ardour/export_dialog.cc:105 #, fuzzy msgid "File Type" msgstr "Тип" -#: export_dialog.cc:106 +#: gtk2_ardour/export_dialog.cc:106 #, fuzzy msgid "Sample Format" msgstr "Разделить облаÑÑ‚ÑŒ" -#: export_dialog.cc:107 +#: gtk2_ardour/export_dialog.cc:107 msgid "Sample Endianness" msgstr "" -#: export_dialog.cc:108 +#: gtk2_ardour/export_dialog.cc:108 #, fuzzy msgid "Sample Rate" msgstr "Разделить облаÑÑ‚ÑŒ" -#: export_dialog.cc:109 +#: gtk2_ardour/export_dialog.cc:109 msgid "Conversion Quality" msgstr "" -#: export_dialog.cc:110 +#: gtk2_ardour/export_dialog.cc:110 msgid "Dither Type" msgstr "" -#: export_dialog.cc:111 +#: gtk2_ardour/export_dialog.cc:111 msgid "Export CD Marker File Only" msgstr "" -#: export_dialog.cc:112 +#: gtk2_ardour/export_dialog.cc:112 #, fuzzy msgid "Export to File" msgstr "ÐкÑпорт на CD" -#: export_dialog.cc:113 option_editor.cc:83 option_editor.cc:84 +#: gtk2_ardour/export_dialog.cc:113 gtk2_ardour/option_editor.cc:82 +#: gtk2_ardour/option_editor.cc:83 msgid "Browse" msgstr "Обзор" -#: export_dialog.cc:114 +#: gtk2_ardour/export_dialog.cc:114 msgid "Specific tracks ..." msgstr "" -#: export_dialog.cc:125 +#: gtk2_ardour/export_dialog.cc:125 msgid "ardour: export" msgstr "ardour: ÑкÑпорт" -#: export_dialog.cc:126 +#: gtk2_ardour/export_dialog.cc:126 msgid "ardour_export" msgstr "ardour_ÑкÑпорт" -#: export_dialog.cc:139 export_dialog.cc:155 mixer_strip.cc:124 -#: mixer_strip.cc:767 -#, fuzzy +#: gtk2_ardour/export_dialog.cc:139 gtk2_ardour/export_dialog.cc:155 +#: gtk2_ardour/mixer_strip.cc:121 gtk2_ardour/mixer_strip.cc:727 msgid "Output" -msgstr "Выходов" +msgstr "Выход" + +#: gtk2_ardour/export_dialog.cc:140 gtk2_ardour/export_dialog.cc:156 +#: gtk2_ardour/export_dialog.cc:1068 gtk2_ardour/export_dialog.cc:1072 +msgid "Left" +msgstr "Левый" + +#: gtk2_ardour/export_dialog.cc:141 gtk2_ardour/export_dialog.cc:157 +msgid "Right" +msgstr "Правый" -#: export_dialog.cc:633 +#: gtk2_ardour/export_dialog.cc:633 #, fuzzy msgid "Editor: cannot open \"%1\" as export file for CD toc file" -msgstr "" -"Редакор: не могу открыть \"%1\" как файл ÑкÑпорта маркеров Ð´Ð»Ñ CD-треков" +msgstr "Редакор: не могу открыть \"%1\" как файл ÑкÑпорта маркеров Ð´Ð»Ñ CD-треков" -#: export_dialog.cc:759 +#: gtk2_ardour/export_dialog.cc:759 #, fuzzy msgid "Editor: cannot open \"%1\" as export file for CD cue file" -msgstr "" -"Редакор: не могу открыть \"%1\" как файл ÑкÑпорта маркеров Ð´Ð»Ñ CD-треков" +msgstr "Редакор: не могу открыть \"%1\" как файл ÑкÑпорта маркеров Ð´Ð»Ñ CD-треков" -#: export_dialog.cc:778 +#: gtk2_ardour/export_dialog.cc:778 msgid "WAV" -msgstr "" +msgstr "WAV" -#: export_dialog.cc:912 +#: gtk2_ardour/export_dialog.cc:912 msgid "Stop Export" msgstr "ОÑтановить ÑкÑпорт" -#: export_dialog.cc:1131 +#: gtk2_ardour/export_dialog.cc:1131 msgid "Please enter a valid filename." -msgstr "" +msgstr "Введите корректное Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°" -#: export_dialog.cc:1141 +#: gtk2_ardour/export_dialog.cc:1141 msgid "Please specify a complete filename for the audio file." -msgstr "" +msgstr "Укажите полное Ð¸Ð¼Ñ Ð·Ð²ÑƒÐºÐ¾Ð²Ð¾Ð³Ð¾ файла" -#: export_dialog.cc:1147 +#: gtk2_ardour/export_dialog.cc:1147 msgid "File already exists, do you want to overwrite it?" -msgstr "" +msgstr "Файл Ñ Ñ‚Ð°ÐºÐ¸Ð¼ именем уже еÑÑ‚ÑŒ. ПерезапиÑать его?" -#: export_dialog.cc:1159 export_range_markers_dialog.cc:153 +#: gtk2_ardour/export_dialog.cc:1159 +#: gtk2_ardour/export_range_markers_dialog.cc:153 msgid "Cannot write file in: " -msgstr "" +msgstr "Ðевозможно запиÑать файлв в:" -#. warning dialog -#: export_range_markers_dialog.cc:135 +#: gtk2_ardour/export_range_markers_dialog.cc:135 msgid "Please enter a valid target directory." -msgstr "" +msgstr "Введите корректный конечный каталог." -#: export_range_markers_dialog.cc:143 +#: gtk2_ardour/export_range_markers_dialog.cc:143 msgid "" "Please select an existing target directory. Files\n" "are not allowed!" msgstr "" -#: gain_automation_time_axis.cc:62 +#: gtk2_ardour/gain_automation_time_axis.cc:65 #, fuzzy msgid "add gain automation event" msgstr "автомат" -#: gain_meter.cc:67 +#: gtk2_ardour/gain_meter.cc:67 msgid "cannot find images for fader slider" msgstr "" -#: gain_meter.cc:74 +#: gtk2_ardour/gain_meter.cc:74 msgid "cannot find images for fader rail" msgstr "" -#: gain_meter.cc:130 gain_meter.cc:339 gain_meter.cc:494 gain_meter.cc:539 +#: gtk2_ardour/gain_meter.cc:125 gtk2_ardour/gain_meter.cc:334 +#: gtk2_ardour/gain_meter.cc:489 gtk2_ardour/gain_meter.cc:534 #, fuzzy msgid "-inf" msgstr "в" -#: gain_meter.cc:140 -#, fuzzy +#: gtk2_ardour/gain_meter.cc:135 msgid "Fader automation mode" -msgstr "автомат" +msgstr "Режим автоматизации фейдера" -#: gain_meter.cc:141 -#, fuzzy +#: gtk2_ardour/gain_meter.cc:136 msgid "Fader automation type" -msgstr "автомат" +msgstr "Тип автоматизации фейдера" -#. XXX it might different in different languages -#: gain_meter.cc:182 gain_meter.cc:817 panner_ui.cc:99 panner_ui.cc:807 +#: gtk2_ardour/gain_meter.cc:177 gtk2_ardour/gain_meter.cc:812 +#: gtk2_ardour/panner_ui.cc:97 gtk2_ardour/panner_ui.cc:797 msgid "Abs" -msgstr "" +msgstr "ÐбÑ" -#: gain_meter.cc:472 -#, fuzzy +#: gtk2_ardour/gain_meter.cc:467 msgid "-Inf" -msgstr "в" +msgstr "-Inf" -#: gain_meter.cc:781 mixer_strip.cc:770 panner_ui.cc:771 -#, fuzzy +#: gtk2_ardour/gain_meter.cc:776 gtk2_ardour/mixer_strip.cc:730 +#: gtk2_ardour/panner_ui.cc:761 msgid "O" -msgstr "ИЛИ" +msgstr "O" -#: gain_meter.cc:784 panner_ui.cc:774 +#: gtk2_ardour/gain_meter.cc:779 gtk2_ardour/panner_ui.cc:764 msgid "P" -msgstr "" +msgstr "P" -#: gain_meter.cc:787 panner_ui.cc:777 +#: gtk2_ardour/gain_meter.cc:782 gtk2_ardour/panner_ui.cc:767 msgid "T" -msgstr "" +msgstr "T" -#: gain_meter.cc:790 panner_ui.cc:780 +#: gtk2_ardour/gain_meter.cc:785 gtk2_ardour/panner_ui.cc:770 msgid "W" -msgstr "" +msgstr "W" -#: gtk-custom-ruler.c:126 -#, fuzzy +#: gtk2_ardour/gtk-custom-ruler.c:126 msgid "Lower" -msgstr "Слой" +msgstr "Ðиже" -#: gtk-custom-ruler.c:127 +#: gtk2_ardour/gtk-custom-ruler.c:127 #, fuzzy msgid "Lower limit of ruler" msgstr "ОпуÑтить облаÑÑ‚ÑŒ в нижний Ñлой" -#: gtk-custom-ruler.c:136 +#: gtk2_ardour/gtk-custom-ruler.c:136 msgid "Upper" -msgstr "" +msgstr "Выше" -#: gtk-custom-ruler.c:137 +#: gtk2_ardour/gtk-custom-ruler.c:137 msgid "Upper limit of ruler" msgstr "" -#: gtk-custom-ruler.c:146 -#, fuzzy +#: gtk2_ardour/gtk-custom-ruler.c:146 msgid "Position" -msgstr "Ðудит" +msgstr "Положение" -#: gtk-custom-ruler.c:147 +#: gtk2_ardour/gtk-custom-ruler.c:147 msgid "Position of mark on the ruler" -msgstr "" +msgstr "Положение маркера на линейке" -#: gtk-custom-ruler.c:156 +#: gtk2_ardour/gtk-custom-ruler.c:156 msgid "Max Size" -msgstr "" +msgstr "МакÑ. размер" -#: gtk-custom-ruler.c:157 +#: gtk2_ardour/gtk-custom-ruler.c:157 msgid "Maximum size of the ruler" -msgstr "" +msgstr "МакÑ. размер линейки" -#: gtk-custom-ruler.c:166 -#, fuzzy +#: gtk2_ardour/gtk-custom-ruler.c:166 msgid "Show Position" -msgstr "по раÑположению облаÑти" +msgstr "Показать положение" -#: gtk-custom-ruler.c:167 +#: gtk2_ardour/gtk-custom-ruler.c:167 msgid "Draw current ruler position" -msgstr "" +msgstr "ÐариÑовать текущее положение на линейке" -#. end-of-file, other end closed or shutdown? -#: imageframe_socket_handler.cc:127 +#: gtk2_ardour/imageframe_socket_handler.cc:127 msgid "Image Compositor Socket has been shutdown/closed" msgstr "" -#: imageframe_time_axis.cc:286 -#, fuzzy +#: gtk2_ardour/imageframe_time_axis.cc:286 msgid "0.5 seconds" -msgstr "Минуты:Секунды" +msgstr "0,5 Ñекунды" -#: imageframe_time_axis.cc:287 marker_time_axis.cc:242 -#, fuzzy +#: gtk2_ardour/imageframe_time_axis.cc:287 gtk2_ardour/marker_time_axis.cc:242 msgid "1 seconds" -msgstr "Минуты:Секунды" +msgstr "1 Ñекунда" -#: imageframe_time_axis.cc:288 marker_time_axis.cc:243 -#, fuzzy +#: gtk2_ardour/imageframe_time_axis.cc:288 gtk2_ardour/marker_time_axis.cc:243 msgid "1.5 seconds" -msgstr "Минуты:Секунды" +msgstr "1,5 Ñекунды" -#: imageframe_time_axis.cc:289 marker_time_axis.cc:244 -#, fuzzy +#: gtk2_ardour/imageframe_time_axis.cc:289 gtk2_ardour/marker_time_axis.cc:244 msgid "2 seconds" -msgstr "Минуты:Секунды" +msgstr "2 Ñекунды" -#: imageframe_time_axis.cc:290 marker_time_axis.cc:245 -#, fuzzy +#: gtk2_ardour/imageframe_time_axis.cc:290 gtk2_ardour/marker_time_axis.cc:245 msgid "2.5 seconds" -msgstr "Минуты:Секунды" +msgstr "2,5 Ñекунды" -#: imageframe_time_axis.cc:291 marker_time_axis.cc:246 -#, fuzzy +#: gtk2_ardour/imageframe_time_axis.cc:291 gtk2_ardour/marker_time_axis.cc:246 msgid "3 seconds" -msgstr "Минуты:Секунды" +msgstr "3 Ñекунды" -#. duration_items.push_back(SeparatorElem()) ; -#. duration_items.push_back(MenuElem (_("custom"), mem_fun(*this, &ImageFrameTimeAxis::set_marker_duration_custom))) ; -#: imageframe_time_axis.cc:296 marker_time_axis.cc:251 +#: gtk2_ardour/imageframe_time_axis.cc:296 gtk2_ardour/marker_time_axis.cc:251 msgid "Duration (sec)" -msgstr "" +msgstr "ДлительноÑÑ‚ÑŒ (Ñ)" -#: imageframe_time_axis.cc:301 +#: gtk2_ardour/imageframe_time_axis.cc:301 #, fuzzy msgid "Remove Frame" msgstr "Удалить поле" -#: imageframe_time_axis.cc:304 +#: gtk2_ardour/imageframe_time_axis.cc:304 #, fuzzy msgid "Image Frame" msgstr "Кадр" -#: imageframe_time_axis.cc:305 marker_time_axis.cc:257 -#, fuzzy +#: gtk2_ardour/imageframe_time_axis.cc:305 gtk2_ardour/marker_time_axis.cc:257 msgid "Rename Track" -msgstr "Переименовать" +msgstr "Переименовать дорожку" -#: io_selector.cc:60 io_selector.cc:794 -#, fuzzy +#: gtk2_ardour/io_selector.cc:62 gtk2_ardour/io_selector.cc:796 +#: gtk2_ardour/connection_editor.cc:61 gtk2_ardour/connection_editor.cc:110 msgid "Rescan" -msgstr "обновить" +msgstr "" -#: io_selector.cc:68 +#: gtk2_ardour/io_selector.cc:70 msgid "%1 input" msgstr "%1 вход" -#: io_selector.cc:70 +#: gtk2_ardour/io_selector.cc:72 msgid "%1 output" msgstr "%1 выход" -#: io_selector.cc:142 route_params_ui.cc:107 +#: gtk2_ardour/io_selector.cc:144 gtk2_ardour/route_params_ui.cc:103 msgid "Inputs" msgstr "Входов" -#: io_selector.cc:142 route_params_ui.cc:108 +#: gtk2_ardour/io_selector.cc:144 gtk2_ardour/route_params_ui.cc:104 msgid "Outputs" msgstr "Выходов" -#: io_selector.cc:143 -#, fuzzy +#: gtk2_ardour/io_selector.cc:145 msgid "Add Input" -msgstr "добавить вход" +msgstr "Добавить вход" -#: io_selector.cc:143 -#, fuzzy +#: gtk2_ardour/io_selector.cc:145 msgid "Add Output" -msgstr "добавить выход" +msgstr "Добавить выход" -#: io_selector.cc:144 -#, fuzzy +#: gtk2_ardour/io_selector.cc:146 msgid "Remove Input" -msgstr "Удалить" +msgstr "Удалить вход" -#: io_selector.cc:144 -#, fuzzy +#: gtk2_ardour/io_selector.cc:146 msgid "Remove Output" -msgstr "# Выходов" +msgstr "Удалить выход" -#: io_selector.cc:145 -#, fuzzy +#: gtk2_ardour/io_selector.cc:147 msgid "Disconnect All" -msgstr "ОтÑоединить" +msgstr "ОтÑоединить вÑе" -#: io_selector.cc:159 +#: gtk2_ardour/io_selector.cc:161 msgid "Available connections" msgstr "ДоÑтупные ÑоединениÑ" -#: io_selector.cc:555 io_selector.cc:574 +#: gtk2_ardour/io_selector.cc:557 gtk2_ardour/io_selector.cc:576 msgid "There are no more JACK ports available." msgstr "" -#: io_selector.cc:649 io_selector.cc:676 io_selector.cc:729 +#: gtk2_ardour/io_selector.cc:651 gtk2_ardour/io_selector.cc:678 +#: gtk2_ardour/io_selector.cc:731 msgid "port" msgstr "порт" -#: io_selector.cc:798 +#: gtk2_ardour/io_selector.cc:800 msgid "ardour: " msgstr "ardour: " -#: keyboard.cc:299 +#: gtk2_ardour/keyboard.cc:299 msgid "KeyboardTarget: keyname \"%1\" is unknown." msgstr "KeyboardTarget: \"%1\" - неизвеÑтное имÑ." -#: keyboard.cc:525 +#: gtk2_ardour/keyboard.cc:525 msgid "" "Your system is completely broken - NumLock uses \"%1\"as its modifier. This " "is madness - see the man page for xmodmap to find out how to fix this." msgstr "" -#: keyboard.cc:533 +#: gtk2_ardour/keyboard.cc:533 msgid "" "Your system generates \"%1\" when the NumLock key is pressed. This can cause " "problems when editing so Ardour will use %2 to mean Meta rather than %1" msgstr "" -#: keyboard.cc:594 +#: gtk2_ardour/keyboard.cc:594 msgid "You have %1 keys bound to \"mod1\"" msgstr "Ð”Ð»Ñ \"mod1\" назначено кнопок: %1" -#: keyboard.cc:609 +#: gtk2_ardour/keyboard.cc:609 msgid "You have %1 keys bound to \"mod2\"" msgstr "Ð”Ð»Ñ \"mod2\" назначено кнопок: %1" -#: keyboard.cc:624 +#: gtk2_ardour/keyboard.cc:624 msgid "You have %1 keys bound to \"mod3\"" msgstr "Ð”Ð»Ñ \"mod3\" назначено кнопок: %1" -#: keyboard.cc:639 +#: gtk2_ardour/keyboard.cc:639 msgid "You have %1 keys bound to \"mod4\"" msgstr "Ð”Ð»Ñ \"mod4\" назначено кнопок: %1" -#: keyboard.cc:654 +#: gtk2_ardour/keyboard.cc:654 msgid "You have %1 keys bound to \"mod5\"" msgstr "Ð”Ð»Ñ \"mod5\" назначено кнопок: %1" -#: location_ui.cc:48 location_ui.cc:51 -msgid "Set" +#: gtk2_ardour/ladspa_pluginui.cc:77 +msgid "<span size=\"large\">Presets</span>" msgstr "" -#: location_ui.cc:49 location_ui.cc:52 +#: gtk2_ardour/ladspa_pluginui.cc:168 +msgid "Controls" +msgstr "Управление" + +#: gtk2_ardour/ladspa_pluginui.cc:205 +msgid "Plugin Editor: could not build control element for port %1" +msgstr "Редактор модулей: невозможно Ñоздать Ñффект Ð´Ð»Ñ Ð¿Ð¾Ñ€Ñ‚Ð° %1" + +#: gtk2_ardour/ladspa_pluginui.cc:296 +msgid "Automation control" +msgstr "Контроль атовматизации" + +#: gtk2_ardour/location_ui.cc:49 gtk2_ardour/location_ui.cc:52 +msgid "Set" +msgstr "УÑтановить" + +#: gtk2_ardour/location_ui.cc:50 gtk2_ardour/location_ui.cc:53 msgid "Go" msgstr "" -#: location_ui.cc:55 +#: gtk2_ardour/location_ui.cc:56 msgid "CD" msgstr "CD" -#: location_ui.cc:58 +#: gtk2_ardour/location_ui.cc:59 msgid "SCMS" msgstr "" -#: location_ui.cc:59 +#: gtk2_ardour/location_ui.cc:60 msgid "Pre-Emphasis" msgstr "" -#: location_ui.cc:570 +#: gtk2_ardour/location_ui.cc:571 msgid "Add New Location" msgstr "Добавить новый интервал" -#: location_ui.cc:571 +#: gtk2_ardour/location_ui.cc:572 msgid "Add New Range" msgstr "" -#: location_ui.cc:575 +#: gtk2_ardour/location_ui.cc:576 msgid "ardour: locations" msgstr "ardour: интервалы" -#: location_ui.cc:576 +#: gtk2_ardour/location_ui.cc:577 msgid "ardour_locations" msgstr "ardour_интервалы" -#: location_ui.cc:604 +#: gtk2_ardour/location_ui.cc:605 #, fuzzy msgid "Location (CD Index) Markers" msgstr "Маркеры интервалов" -#: location_ui.cc:624 +#: gtk2_ardour/location_ui.cc:625 msgid "Range (CD Track) Markers" msgstr "" -#: location_ui.cc:790 +#: gtk2_ardour/location_ui.cc:793 msgid "add range marker" -msgstr "" +msgstr "Добавить маркер облаÑти" -#: main.cc:72 +#: gtk2_ardour/main.cc:72 msgid "ardour is killing itself for a clean exit\n" msgstr "ardour: принудительное завершение работы\n" -#: main.cc:81 +#: gtk2_ardour/main.cc:81 msgid "stopping user interface\n" msgstr "завершение работы...\n" -#. XXX its doubtful that snprintf() is async-safe -#: main.cc:100 -#, fuzzy, c-format +#: gtk2_ardour/main.cc:100 +#, c-format msgid "%d(%d): received signal %d\n" -msgstr "%d: принÑÑ‚ Ñигнал %d\n" +msgstr "%d(%d): принÑÑ‚ Ñигнал %d\n" -#: main.cc:180 +#: gtk2_ardour/main.cc:180 msgid "cannot become new process group leader (%1)" msgstr "" -#: main.cc:207 +#: gtk2_ardour/main.cc:207 msgid "cannot setup signal handling for %1" msgstr "cannot setup signal handling for %1" -#: main.cc:218 +#: gtk2_ardour/main.cc:218 msgid "cannot set default signal mask (%1)" msgstr "cannot set default signal mask (%1)" -#: main.cc:248 -#, fuzzy +#: gtk2_ardour/main.cc:248 msgid "" "Without a UI style file, ardour will look strange.\n" " Please set ARDOUR2_UI_RC to point to a valid UI style file" msgstr "" -"ГрафичеÑий Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ardour будет выглÑдеть необычно\n" -"без файла определÑющего Ñтиль отображениÑ.\n" -"ПожалуйÑта, укажите его (файл) в переменной Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ ARDOUR_UI_RC" +"ГрафичеÑкий Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ardour будет выглÑдеть необычно\n" +"без файла, определÑющего Ñтиль оформлениÑ.\n" +"ПожалуйÑта, укажите его [файл] в переменной Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ ARDOUR_UI_RC" -#: main.cc:270 -#, fuzzy +#: gtk2_ardour/main.cc:270 msgid "Ardour could not connect to JACK." -msgstr "Ðе удалоÑÑŒ ÑоединитьÑÑ Ñ Ñервером JACK как \"%1\"" +msgstr "Ðе удалоÑÑŒ ÑоединитьÑÑ Ñ Ñервером JACK." -#: main.cc:274 +#: gtk2_ardour/main.cc:274 #, fuzzy msgid "" "There are several possible reasons:\n" @@ -4842,20 +4713,11 @@ msgstr "" "\n" "ПожалуйÑта, проверьте вÑе варианты, возможно потребуетÑÑ (пере)запуÑк JACK." -#: main.cc:304 +#: gtk2_ardour/main.cc:316 msgid "could not load command line session \"%1\"" msgstr "не удалоÑÑŒ загрузить ÑеÑÑию \"%1\", указанную в командной Ñтроке" -#. it wasn't new, but we require a new session -#: main.cc:324 -msgid "" -"\n" -"\n" -"A session named \"%1\" already exists.\n" -"To avoid this message, start ardour as \"ardour %1" -msgstr "" - -#: main.cc:335 +#: gtk2_ardour/main.cc:324 msgid "" "\n" "\n" @@ -4863,515 +4725,426 @@ msgid "" "To create it from the command line, start ardour as \"ardour --new %1" msgstr "" -#: main.cc:399 +#: gtk2_ardour/main.cc:383 msgid "Ardour/GTK " msgstr "Ardour/GTK " -#: main.cc:401 +#: gtk2_ardour/main.cc:385 msgid "" "\n" " (built using " msgstr "" -#: main.cc:405 -#, fuzzy +#: gtk2_ardour/main.cc:389 msgid " with libardour " -msgstr " работает Ñ libardour " +msgstr " Ñ libardour " -#: main.cc:410 +#: gtk2_ardour/main.cc:394 msgid " and GCC version " -msgstr "" +msgstr " и верÑией GCC " -#: main.cc:420 -#, fuzzy +#: gtk2_ardour/main.cc:404 msgid "Copyright (C) 1999-2006 Paul Davis" -msgstr "ÐвторÑкое право 1999-2004 Paul Davis" +msgstr "ÐвторÑкие права © 1999-2006 Paul Davis" -#: main.cc:421 +#: gtk2_ardour/main.cc:405 msgid "" "Some portions Copyright (C) Steve Harris, Ari Johnson, Brett Viren, Joel " "Baker" -msgstr "" +msgstr "ЧаÑтичные авторÑкие права © Steve Harris, Ari Johnson, Brett Viren, Joel Baker" -#: main.cc:423 +#: gtk2_ardour/main.cc:407 msgid "Ardour comes with ABSOLUTELY NO WARRANTY" -msgstr "Ardour раÑпроÑтранÑетÑÑ Ð‘Ð•Ð— ВСЯКИХ ГÐÐ ÐÐТИЙ" +msgstr "Ardour раÑпроÑтранÑетÑÑ Ð‘Ð•Ð—Ðž ВСЯКИХ ГÐÐ ÐÐТИЙ" -#: main.cc:424 +#: gtk2_ardour/main.cc:408 msgid "not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." msgstr "" -#: main.cc:425 +#: gtk2_ardour/main.cc:409 msgid "This is free software, and you are welcome to redistribute it " msgstr "Ðто Ñвободное программное обеÑпечение, Ð’Ñ‹ можете раÑпроÑтранÑÑ‚ÑŒ его" -#: main.cc:426 +#: gtk2_ardour/main.cc:410 #, fuzzy msgid "under certain conditions; see the source for copying conditions." msgstr "на определённых уÑловиÑÑ…; подробнее об Ñтом читайте в файле COPYING." -#: main.cc:435 +#: gtk2_ardour/main.cc:420 msgid "could not create ARDOUR GUI" msgstr "не удалоÑÑŒ Ñоздать графичеÑкий Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð´Ð»Ñ ARDOUR" -#: main.cc:453 +#: gtk2_ardour/main.cc:437 msgid "Could not connect to JACK server as \"%1\"" msgstr "Ðе удалоÑÑŒ ÑоединитьÑÑ Ñ Ñервером JACK как \"%1\"" -#: main.cc:456 +#: gtk2_ardour/main.cc:446 msgid "could not initialize Ardour." msgstr "не удалоÑÑŒ запуÑтить Ardour." -#: marker.cc:244 -#, fuzzy +#: gtk2_ardour/marker.cc:244 msgid "MarkerText" -msgstr "маркерам" +msgstr "ТекÑтМаркера" -#: marker_time_axis.cc:254 +#: gtk2_ardour/marker_time_axis.cc:254 #, fuzzy msgid "Remove Marker" msgstr "Удалить поле" -#: marker_time_axis.cc:256 -#, fuzzy +#: gtk2_ardour/marker_time_axis.cc:256 msgid "Marker" -msgstr "маркерам" +msgstr "Маркер" -#: meter_bridge.cc:78 -msgid "ardour: meter bridge" -msgstr "ardour: индикатор уровнÑ" - -#: meter_bridge.cc:79 -msgid "ardour_meter_bridge" -msgstr "ardour_индикатор_уровнÑ" - -#: meter_bridge_strip.cc:80 meter_bridge_strip.cc:94 -#, c-format -msgid "# of %u-sample overs" -msgstr "" - -#: meter_bridge_strip.cc:222 -#, fuzzy -msgid "New Name for Meter:" -msgstr "Ðовое Ð¸Ð¼Ñ Ð¸Ð½Ð´Ð¸ÐºÐ°Ñ‚Ð¾Ñ€Ð°:" - -#: mixer_strip.cc:95 mixer_strip.cc:140 mixer_strip.cc:1227 +#: gtk2_ardour/mixer_strip.cc:92 gtk2_ardour/mixer_strip.cc:137 +#: gtk2_ardour/mixer_strip.cc:1191 msgid "pre" msgstr "" -#: mixer_strip.cc:96 mixer_strip.cc:822 +#: gtk2_ardour/mixer_strip.cc:93 gtk2_ardour/mixer_strip.cc:782 msgid "Comments" -msgstr "" +msgstr "Комментарии" -#: mixer_strip.cc:119 -#, fuzzy +#: gtk2_ardour/mixer_strip.cc:116 msgid "Input" -msgstr "Входов" +msgstr "Вход" -#: mixer_strip.cc:136 mixer_strip.cc:1223 -#, fuzzy +#: gtk2_ardour/mixer_strip.cc:133 gtk2_ardour/mixer_strip.cc:1187 msgid "input" -msgstr "%1 вход" +msgstr "вход" -#: mixer_strip.cc:144 mixer_strip.cc:1231 -#, fuzzy +#: gtk2_ardour/mixer_strip.cc:141 gtk2_ardour/mixer_strip.cc:1195 msgid "post" -msgstr "порт" +msgstr "" -#. TRANSLATORS: this string should be longest of the strings -#. used to describe meter points. In english, its "input". -#. -#: mixer_strip.cc:152 +#: gtk2_ardour/mixer_strip.cc:149 msgid "tupni" msgstr "" -#: mixer_strip.cc:207 +#: gtk2_ardour/mixer_strip.cc:205 msgid "Varispeed" msgstr "" -#: mixer_strip.cc:233 mixer_strip.cc:836 +#: gtk2_ardour/mixer_strip.cc:231 gtk2_ardour/mixer_strip.cc:796 msgid "Click to Add/Edit Comments" -msgstr "" +msgstr "Ðажмите Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ/правки комментариев" -#: mixer_strip.cc:374 +#: gtk2_ardour/mixer_strip.cc:371 msgid "unknown strip width \"%1\" in XML GUI information" msgstr "неизвеÑÑ‚Ð½Ð°Ñ ÑˆÐ¸Ñ€Ð¸Ð½Ð° трека \"%1\" в XML опиÑании" -#: mixer_strip.cc:417 +#: gtk2_ardour/mixer_strip.cc:415 #, fuzzy msgid "record" msgstr "ЗапиÑÑŒ" -#: mixer_strip.cc:418 region_editor.cc:47 +#: gtk2_ardour/mixer_strip.cc:417 gtk2_ardour/audio_region_editor.cc:46 msgid "mute" msgstr "тихо" -#: mixer_strip.cc:419 +#: gtk2_ardour/mixer_strip.cc:418 msgid "solo" msgstr "Ñоло" -#: mixer_strip.cc:422 +#: gtk2_ardour/mixer_strip.cc:421 msgid "comments" -msgstr "" +msgstr "комментарии" -#: mixer_strip.cc:424 +#: gtk2_ardour/mixer_strip.cc:423 msgid "*comments*" -msgstr "" +msgstr "*комментарии*" -#: mixer_strip.cc:438 -#, fuzzy +#: gtk2_ardour/mixer_strip.cc:438 msgid "Rec" -msgstr "обновить" +msgstr "Зап" -#: mixer_strip.cc:439 +#: gtk2_ardour/mixer_strip.cc:440 msgid "M" -msgstr "" +msgstr "M" -#: mixer_strip.cc:440 +#: gtk2_ardour/mixer_strip.cc:441 msgid "S" -msgstr "" +msgstr "S" -#: mixer_strip.cc:443 mixer_strip.cc:830 -#, fuzzy +#: gtk2_ardour/mixer_strip.cc:444 gtk2_ardour/mixer_strip.cc:790 msgid "Cmt" -msgstr "вырезать" +msgstr "" -#: mixer_strip.cc:445 mixer_strip.cc:828 +#: gtk2_ardour/mixer_strip.cc:446 gtk2_ardour/mixer_strip.cc:788 msgid "*Cmt*" msgstr "" -#: mixer_strip.cc:483 mixer_strip.cc:549 redirect_box.cc:1006 +#: gtk2_ardour/mixer_strip.cc:484 gtk2_ardour/mixer_strip.cc:550 +#: gtk2_ardour/redirect_box.cc:1021 msgid "Not connected to JACK - no I/O changes are possible" msgstr "" -#: mixer_strip.cc:560 -msgid "Track" -msgstr "Трек" - -#: mixer_strip.cc:588 mixer_strip.cc:604 +#: gtk2_ardour/mixer_strip.cc:584 gtk2_ardour/mixer_strip.cc:600 msgid "could not register new ports required for that connection" -msgstr "" +msgstr "Ðе удалоÑÑŒ зарегиÑтрировать новые порты Ð´Ð»Ñ Ñтого ÑоединениÑ" -#: mixer_strip.cc:747 -#, fuzzy +#: gtk2_ardour/mixer_strip.cc:707 msgid " Input" -msgstr "# Входов" +msgstr " Вход" -#: mixer_strip.cc:750 -#, fuzzy +#: gtk2_ardour/mixer_strip.cc:710 msgid "I" msgstr "Ð’Ð¥" -#: mixer_strip.cc:820 +#: gtk2_ardour/mixer_strip.cc:780 msgid "*Comments*" -msgstr "" +msgstr "*Комментарии*" -#: mixer_strip.cc:859 -#, fuzzy +#: gtk2_ardour/mixer_strip.cc:819 msgid ": comment editor" -msgstr "ИнтерфейÑ: не удалоÑÑŒ инициализировать редактор" +msgstr ": редактор комментариев" -#: mixer_strip.cc:953 +#: gtk2_ardour/mixer_strip.cc:913 msgid "Grp" msgstr "" -#: mixer_strip.cc:956 +#: gtk2_ardour/mixer_strip.cc:916 msgid "~G" msgstr "нГр" -#: mixer_strip.cc:1004 -#, fuzzy +#: gtk2_ardour/mixer_strip.cc:964 msgid "Invert Polarity" -msgstr "полÑрноÑÑ‚ÑŒ" +msgstr "Развернуть полÑрноÑÑ‚ÑŒ" -#: mixer_ui.cc:85 +#: gtk2_ardour/mixer_ui.cc:83 msgid "Strips" msgstr "Каналы" -#: mixer_ui.cc:110 -#, fuzzy +#: gtk2_ardour/mixer_ui.cc:108 msgid "Group" -msgstr "Mix группы" +msgstr "Группа" -#: mixer_ui.cc:211 mixer_ui.cc:370 +#: gtk2_ardour/mixer_ui.cc:209 gtk2_ardour/mixer_ui.cc:389 msgid "ardour: mixer" msgstr "ardour: микшер" -#: mixer_ui.cc:212 +#: gtk2_ardour/mixer_ui.cc:210 msgid "ardour_mixer" msgstr "ardour_микшер" -#: mixer_ui.cc:346 +#: gtk2_ardour/mixer_ui.cc:361 msgid "ardour: mixer: " msgstr "ardour: микшер: " -#: mixer_ui.cc:573 +#: gtk2_ardour/mixer_ui.cc:592 msgid "signal" msgstr "Ñигнал" -#: mixer_ui.cc:723 +#: gtk2_ardour/mixer_ui.cc:741 msgid "track display list item for renamed strip not found!" msgstr "" -#: new_session_dialog.cc:39 -#, fuzzy +#: gtk2_ardour/new_session_dialog.cc:41 msgid "New Session Name :" -msgstr "Ð˜Ð¼Ñ ÑеÑÑии:" +msgstr "Ð˜Ð¼Ñ Ð½Ð¾Ð²Ð¾Ð¹ ÑеÑÑии:" -#: new_session_dialog.cc:41 +#: gtk2_ardour/new_session_dialog.cc:45 msgid "Create Session Directory In :" -msgstr "" +msgstr "Создать каталог ÑеÑÑии в:" -#: new_session_dialog.cc:43 -#, fuzzy +#: gtk2_ardour/new_session_dialog.cc:47 msgid "Use Session Template :" -msgstr "иÑпользовать имеющийÑÑ ÑˆÐ°Ð±Ð»Ð¾Ð½" +msgstr "ИÑпользовать шаблон:" -#: new_session_dialog.cc:45 -#, fuzzy +#: gtk2_ardour/new_session_dialog.cc:49 msgid "Channel Count" -msgstr "Отменить импорт" +msgstr "ЧиÑло каналов" -#: new_session_dialog.cc:46 -#, fuzzy +#: gtk2_ardour/new_session_dialog.cc:50 msgid "Create Monitor Bus" -msgstr "Контрольные выходы" +msgstr "Создать контрольную шину" -#: new_session_dialog.cc:53 -#, fuzzy +#: gtk2_ardour/new_session_dialog.cc:57 msgid "Create Master Bus" -msgstr "иÑпользовать маÑтер-выходы" +msgstr "Создать маÑтер-шину" -#: new_session_dialog.cc:55 -#, fuzzy +#: gtk2_ardour/new_session_dialog.cc:59 msgid "Automatically Connect Inputs" -msgstr "автоматичеÑкое подключение треков ко входам" +msgstr "ÐвтоматичеÑкое подключение ко входам" -#: new_session_dialog.cc:56 new_session_dialog.cc:67 -#, fuzzy +#: gtk2_ardour/new_session_dialog.cc:60 gtk2_ardour/new_session_dialog.cc:71 msgid "Port Limit" -msgstr "Забыть" +msgstr "Портов не более чем" -#: new_session_dialog.cc:64 -#, fuzzy +#: gtk2_ardour/new_session_dialog.cc:68 msgid "<b>Track/Bus Inputs</b>" -msgstr "Треки/Шины" +msgstr "<b>Входы дорожек/шин</b>" -#: new_session_dialog.cc:66 -#, fuzzy +#: gtk2_ardour/new_session_dialog.cc:70 msgid "Automatically Connect Outputs" -msgstr "ручное подключение треков к выходам" +msgstr "ÐвтоматичеÑкое подключение к выходам" -#: new_session_dialog.cc:75 +#: gtk2_ardour/new_session_dialog.cc:79 msgid "Connect to Master Bus" -msgstr "" +msgstr "СоединитьÑÑ Ñ Ð¼Ð°Ñтер-шиной" -#: new_session_dialog.cc:76 +#: gtk2_ardour/new_session_dialog.cc:80 msgid "Connect to Physical Outputs" -msgstr "" +msgstr "СоединитьÑÑ Ñ Ñ„Ð¸Ð·Ð¸Ñ‡ÐµÑкими выходами" -#: new_session_dialog.cc:80 -#, fuzzy +#: gtk2_ardour/new_session_dialog.cc:84 msgid "<b>Track/Bus Outputs</b>" -msgstr "Выходов" +msgstr "<b>Выходы дорожек/шин</b>" -#: new_session_dialog.cc:83 -#, fuzzy +#: gtk2_ardour/new_session_dialog.cc:87 msgid "Advanced Options" -msgstr "Редактор параметров" +msgstr "РаÑширенные параметры" -#: new_session_dialog.cc:91 -#, fuzzy +#: gtk2_ardour/new_session_dialog.cc:95 msgid "Open Recent Session" -msgstr "открыть ÑеÑÑию" +msgstr "Открыть недавнюю ÑеÑÑию" -#: new_session_dialog.cc:127 -#, fuzzy +#: gtk2_ardour/new_session_dialog.cc:131 msgid "Open Session File :" -msgstr "открыть ÑеÑÑию" +msgstr "Открыть файл ÑеÑÑии:" -#: new_session_dialog.cc:274 -#, fuzzy +#: gtk2_ardour/new_session_dialog.cc:281 msgid "New Session" -msgstr "СеÑÑиÑ" +msgstr "Создать ÑеÑÑию" -#: new_session_dialog.cc:276 -#, fuzzy +#: gtk2_ardour/new_session_dialog.cc:283 msgid "Open Session" -msgstr "открыть ÑеÑÑию" +msgstr "Открыть ÑеÑÑию" -#: new_session_dialog.cc:281 -#, fuzzy +#: gtk2_ardour/new_session_dialog.cc:288 msgid "ardour: session control" -msgstr "ardour_новаÑ_ÑеÑÑиÑ" +msgstr "СеÑÑии Ardour" -#: new_session_dialog.cc:310 -#, fuzzy +#: gtk2_ardour/new_session_dialog.cc:317 msgid "select template" -msgstr "-шаблон" +msgstr "Выберите шаблон" -#: new_session_dialog.cc:316 -#, fuzzy +#: gtk2_ardour/new_session_dialog.cc:323 msgid "select session file" -msgstr "ВоÑпроизвеÑти выделенную облаÑÑ‚ÑŒ" +msgstr "Выберите файл ÑеÑÑии" -#: new_session_dialog.cc:325 -#, fuzzy +#: gtk2_ardour/new_session_dialog.cc:332 msgid "select directory" -msgstr "ВоÑпроизвеÑти выделенную облаÑÑ‚ÑŒ" +msgstr "Выберите каталог" -#: option_editor.cc:76 -#, fuzzy +#: gtk2_ardour/option_editor.cc:75 msgid "SMPTE offset is negative" -msgstr "Смещение SMPTE" +msgstr "Смещение SMPTE отрицательно" -#: option_editor.cc:102 +#: gtk2_ardour/option_editor.cc:101 msgid "ardour: options editor" -msgstr "adour: редактор параметров" +msgstr "Редактор параметров" -#: option_editor.cc:103 +#: gtk2_ardour/option_editor.cc:102 msgid "ardour_option_editor" -msgstr "adour_редактор_параметров" +msgstr "ardour_редактор_параметров" -#: option_editor.cc:127 +#: gtk2_ardour/option_editor.cc:126 msgid "Paths/Files" msgstr "Пути/Файлы" -#: option_editor.cc:128 +#: gtk2_ardour/option_editor.cc:127 msgid "Kbd/Mouse" msgstr "Клавиатура/Мышь" -#: option_editor.cc:131 +#: gtk2_ardour/option_editor.cc:130 msgid "Layers & Fades" -msgstr "" +msgstr "Слои и фейды" -#: option_editor.cc:135 +#: gtk2_ardour/option_editor.cc:134 msgid "MIDI" msgstr "MIDI" -#: option_editor.cc:177 -msgid "24 FPS" -msgstr "" - -#: option_editor.cc:179 -msgid "25 FPS" -msgstr "" - -#: option_editor.cc:181 -msgid "30 FPS" -msgstr "" - -#: option_editor.cc:187 -msgid "30 FPS drop" -msgstr "" - -#: option_editor.cc:244 +#: gtk2_ardour/option_editor.cc:222 msgid "session RAID path" -msgstr "путь к файлам RAID ÑеÑÑий" +msgstr "Путь к файлам RAID-ÑеÑÑий" -#: option_editor.cc:249 -#, fuzzy +#: gtk2_ardour/option_editor.cc:227 msgid "Soundfile Search Paths" -msgstr "Ðудио-библиотека" - -#: option_editor.cc:254 -#, fuzzy -msgid "Paths" -msgstr "Пути/Файлы" +msgstr "Путь к звуковым файлам" -#: option_editor.cc:268 option_editor.cc:274 option_editor.cc:723 -#: option_editor.cc:750 +#: gtk2_ardour/option_editor.cc:252 gtk2_ardour/option_editor.cc:258 +#: gtk2_ardour/option_editor.cc:670 gtk2_ardour/option_editor.cc:697 msgid "internal" msgstr "внутренний" -#: option_editor.cc:287 +#: gtk2_ardour/option_editor.cc:271 msgid "Short crossfade length (msecs)" msgstr "" -#: option_editor.cc:299 +#: gtk2_ardour/option_editor.cc:283 msgid "Destructive crossfade length (msecs)" msgstr "" -#: option_editor.cc:367 -msgid "SMPTE Frames/second" -msgstr "SMPTE Кадры/Секунды" - -#: option_editor.cc:368 +#: gtk2_ardour/option_editor.cc:342 msgid "SMPTE Offset" msgstr "Смещение SMPTE" -#: option_editor.cc:462 option_editor.cc:469 option_editor.cc:472 -#: option_editor.cc:618 -#, fuzzy +#: gtk2_ardour/option_editor.cc:409 gtk2_ardour/option_editor.cc:416 +#: gtk2_ardour/option_editor.cc:419 gtk2_ardour/option_editor.cc:565 msgid "online" -msgstr "линейное" +msgstr "" -#. remember, we have to handle the i18n case where the relative -#. lengths of the strings in language N is different than in english. -#. -#: option_editor.cc:469 option_editor.cc:470 option_editor.cc:615 -#, fuzzy +#: gtk2_ardour/option_editor.cc:416 gtk2_ardour/option_editor.cc:417 +#: gtk2_ardour/option_editor.cc:562 msgid "offline" -msgstr "линейное" +msgstr "" -#: option_editor.cc:670 +#: gtk2_ardour/option_editor.cc:617 msgid "Choose Click" -msgstr "" +msgstr "Выберите щелчок метронома" -#: option_editor.cc:689 -#, fuzzy +#: gtk2_ardour/option_editor.cc:636 msgid "Choose Click Emphasis" -msgstr "ИÑпользовать как акцентирующий щелчок метронома" +msgstr "Выберите акцентирующий щелчок метронома" -#: option_editor.cc:803 +#: gtk2_ardour/option_editor.cc:750 msgid "Click audio file" msgstr "Файл щелчков метронома" -#: option_editor.cc:809 +#: gtk2_ardour/option_editor.cc:756 msgid "Click emphasis audiofile" msgstr "Файл акцентирующих щелчков метронома" -#: option_editor.cc:846 +#: gtk2_ardour/option_editor.cc:793 msgid "" "The auditioner is a dedicated mixer strip used\n" "for listening to specific regions outside the context\n" "of the overall mix. It can be connected just like any\n" "other mixer strip." msgstr "" -"Контрольный канал - Ñто Ñпециальный канал микшера\n" -"предназначенный Ð´Ð»Ñ Ð¿Ñ€Ð¾ÑÐ»ÑƒÑˆÐ¸Ð²Ð°Ð½Ð¸Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»Ñ‘Ð½Ð½Ñ‹Ñ… облаÑтей\n" -"вне общего контекÑта микÑа. Его можно Ñоединить как любой\n" -"другой канал микшера." +"Контрольный канал — Ñто Ñпециальный канал микшера предназначенный \n" +"Ð´Ð»Ñ Ð¿Ñ€Ð¾ÑÐ»ÑƒÑˆÐ¸Ð²Ð°Ð½Ð¸Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»Ñ‘Ð½Ð½Ñ‹Ñ… облаÑтей вне общего контекÑта микÑа. \n" +"Его можно Ñоединить как любой другой канал микшера." -#: option_editor.cc:919 +#: gtk2_ardour/option_editor.cc:866 msgid "Edit using" -msgstr "Редактировать Ñочетание" +msgstr "Редактировать Ñ" -#: option_editor.cc:926 option_editor.cc:953 +#: gtk2_ardour/option_editor.cc:873 gtk2_ardour/option_editor.cc:900 msgid "+ button" msgstr "+ клавиша" -#: option_editor.cc:946 +#: gtk2_ardour/option_editor.cc:893 msgid "Delete using" -msgstr "Удалить Ñочетание" +msgstr "УдалÑÑ‚ÑŒ Ñ" -#: option_editor.cc:973 +#: gtk2_ardour/option_editor.cc:920 msgid "Ignore snap using" -msgstr "Ðе иÑпользовать \"Ñнимки\"" +msgstr "Игнорировать привÑзку Ñ" -#: opts.cc:46 +#: gtk2_ardour/opts.cc:46 msgid "Usage: " msgstr "ИÑпользование: " -#: opts.cc:47 +#: gtk2_ardour/opts.cc:47 msgid " -v, --version Show version information\n" msgstr " -v, --version Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ верÑии программы\n" -#: opts.cc:48 +#: gtk2_ardour/opts.cc:48 msgid " -h, --help Print this message\n" msgstr " -h, --help Показать Ñто Ñообщение\n" -#: opts.cc:49 +#: gtk2_ardour/opts.cc:49 msgid "" " -b, --bindings Print all possible keyboard binding " "names\n" @@ -5379,234 +5152,198 @@ msgstr "" " -b, --bindings Показать вÑе доÑтупные \"горÑчие\" " "клавиши\n" -#: opts.cc:50 -#, fuzzy +#: gtk2_ardour/opts.cc:50 msgid " -n, --show-splash Show splash screen\n" msgstr " -n, --no-splash Ðе показывать заÑтавку\n" -#: opts.cc:51 -#, fuzzy +#: gtk2_ardour/opts.cc:51 msgid "" " -c, --name name Use a specific jack client name, default " "is ardour\n" msgstr "" -" -c, --jack-client-name Ð¸Ð¼Ñ Ð˜Ñпользовать другое Ð¸Ð¼Ñ jack-клиента, " -"ardour по умолчанию\n" +" -c, --jack-client-name Ð¸Ð¼Ñ Ð˜Ñпользовать другое Ð¸Ð¼Ñ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ð° к JACK, " +"по умолчанию — Ardour\n" -#: opts.cc:52 -#, fuzzy +#: gtk2_ardour/opts.cc:52 msgid "" " -N, --new session-name Create a new session from the command " "line\n" -msgstr "" -" [имÑ-ÑеÑÑии] Загрузить ÑеÑÑию Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ñ‹Ð¼ именем\n" +msgstr " -N, --new имÑ-ÑеÑÑии Создать новую ÑеÑÑию из командной Ñтроки\n" -#: opts.cc:53 -msgid "" -" -o, --use-hw-optimizations Try to use h/w specific optimizations\n" +#: gtk2_ardour/opts.cc:53 +msgid " -o, --use-hw-optimizations Try to use h/w specific optimizations\n" msgstr "" -#: opts.cc:55 +#: gtk2_ardour/opts.cc:55 #, fuzzy msgid " -V, --novst Do not use VST support\n" msgstr " -n, --no-splash Ðе показывать заÑтавку\n" -#: opts.cc:57 +#: gtk2_ardour/opts.cc:57 msgid " [session-name] Name of session to load\n" -msgstr "" -" [имÑ-ÑеÑÑии] Загрузить ÑеÑÑию Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ñ‹Ð¼ именем\n" +msgstr " [имÑ-ÑеÑÑии] Загрузить ÑеÑÑию Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ñ‹Ð¼ именем\n" -#: opts.cc:58 +#: gtk2_ardour/opts.cc:58 msgid " -C, --curvetest filename Curve algorithm debugger\n" msgstr "" -#: opts.cc:59 +#: gtk2_ardour/opts.cc:59 #, fuzzy msgid " -g, --gtktheme Allow GTK to load a theme\n" msgstr " -h, --help Показать Ñто Ñообщение\n" -#: pan_automation_time_axis.cc:60 -msgid "You can't graphically edit panning of more than stream" +#: gtk2_ardour/pan_automation_time_axis.cc:70 +msgid "You need to select which line to edit" msgstr "" -#: pan_automation_time_axis.cc:80 -#, fuzzy +#: gtk2_ardour/pan_automation_time_axis.cc:91 msgid "add pan automation event" -msgstr "автомат" +msgstr "добавить автомат. Ñобытие панорамы" -#: panner2d.cc:589 panner_ui.cc:435 plugin_ui.cc:834 -#, fuzzy +#: gtk2_ardour/panner2d.cc:589 gtk2_ardour/panner_ui.cc:425 +#: gtk2_ardour/plugin_ui.cc:146 msgid "Bypass" -msgstr "обход" +msgstr "Обход" -#: panner_ui.cc:58 panner_ui.cc:225 +#: gtk2_ardour/panner_ui.cc:56 gtk2_ardour/panner_ui.cc:223 #, fuzzy msgid "link" msgstr "в" -#: panner_ui.cc:69 -#, fuzzy +#: gtk2_ardour/panner_ui.cc:67 msgid "Pan automation mode" -msgstr "автомат" +msgstr "Режим автоматизации панорамы" -#: panner_ui.cc:70 -#, fuzzy +#: gtk2_ardour/panner_ui.cc:68 msgid "Pan automation type" -msgstr "автомат" +msgstr "Тип автоматизации панорамы" -#: panner_ui.cc:81 +#: gtk2_ardour/panner_ui.cc:79 msgid "panning link control" msgstr "" -#: panner_ui.cc:83 +#: gtk2_ardour/panner_ui.cc:81 msgid "panning link direction" msgstr "" -#: panner_ui.cc:235 +#: gtk2_ardour/panner_ui.cc:233 msgid "L" -msgstr "" +msgstr "L" -#: panner_ui.cc:335 +#: gtk2_ardour/panner_ui.cc:328 #, c-format -msgid "panner for channel %lu" +msgid "panner for channel %zu" msgstr "" -#: panner_ui.cc:337 -#, c-format -msgid "panner for channel %u" -msgstr "" - -#: panner_ui.cc:445 -#, fuzzy +#: gtk2_ardour/panner_ui.cc:435 msgid "Reset all" -msgstr "ОгромнаÑ" +msgstr "СброÑить вÑе" -#: playlist_selector.cc:52 -#, fuzzy +#: gtk2_ardour/playlist_selector.cc:52 msgid "ardour: playlists" -msgstr "ardour: модули (plugins)" +msgstr "СпиÑки воÑпроизведениÑ" -#: playlist_selector.cc:59 +#: gtk2_ardour/playlist_selector.cc:59 msgid "Playlists grouped by track" -msgstr "" +msgstr "СпиÑки, Ñгруппированные по дорожке" -#: playlist_selector.cc:98 -#, fuzzy +#: gtk2_ardour/playlist_selector.cc:98 msgid "ardour: playlist for " -msgstr "ardour: редактор: " +msgstr "ardour: ÑпиÑок воÑÐ¿Ñ€Ð¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð´Ð»Ñ " -#: playlist_selector.cc:114 -#, fuzzy +#: gtk2_ardour/playlist_selector.cc:114 msgid "Other tracks" -msgstr "Скрыть трек" +msgstr "Другие дорожки" -#: playlist_selector.cc:130 +#: gtk2_ardour/playlist_selector.cc:130 msgid "unassigned" msgstr "" -#: plugin_selector.cc:43 +#: gtk2_ardour/plugin_selector.cc:43 msgid "ardour: plugins" -msgstr "ardour: модули (plugins)" +msgstr "ardour: раÑширениÑ" -#: plugin_selector.cc:56 -#, fuzzy +#: gtk2_ardour/plugin_selector.cc:56 msgid "Available LADSPA Plugins" -msgstr "ДоÑтупные LADSPA модули" +msgstr "ДоÑтупные раÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ LADSPA" -#: plugin_selector.cc:57 +#: gtk2_ardour/plugin_selector.cc:57 msgid "Type" msgstr "Тип" -#: plugin_selector.cc:58 plugin_selector.cc:81 +#: gtk2_ardour/plugin_selector.cc:58 gtk2_ardour/plugin_selector.cc:81 +#: gtk2_ardour/plugin_selector.cc:99 msgid "# Inputs" -msgstr "# Входов" +msgstr "# входов" -#: plugin_selector.cc:59 plugin_selector.cc:82 +#: gtk2_ardour/plugin_selector.cc:59 gtk2_ardour/plugin_selector.cc:82 +#: gtk2_ardour/plugin_selector.cc:100 msgid "# Outputs" -msgstr "# Выходов" +msgstr "# выходов" -#: plugin_selector.cc:68 +#: gtk2_ardour/plugin_selector.cc:68 msgid "Plugins to be Connected to Insert" msgstr "" -#: plugin_selector.cc:80 -#, fuzzy +#: gtk2_ardour/plugin_selector.cc:80 gtk2_ardour/plugin_selector.cc:98 msgid "Available plugins" -msgstr "ДоÑтупные LADSPA модули" +msgstr "ДоÑтупные раÑширениÑ" -#: plugin_selector.cc:98 +#: gtk2_ardour/plugin_selector.cc:117 msgid "Add a plugin to the effect list" -msgstr "Добавить модуль в ÑпиÑок Ñффектов" +msgstr "Добавить раÑширение в ÑпиÑок Ñффектов" -#: plugin_selector.cc:102 +#: gtk2_ardour/plugin_selector.cc:121 msgid "Remove a plugin from the effect list" -msgstr "Удалить модуль из ÑпиÑка Ñффектов" +msgstr "Удалить раÑширение из ÑпиÑка Ñффектов" -#: plugin_selector.cc:104 +#: gtk2_ardour/plugin_selector.cc:123 msgid "Update available plugins" -msgstr "Обновить доÑтупные модули" +msgstr "Обновить доÑтупные раÑширениÑ" -#: plugin_selector.cc:126 -#, fuzzy +#: gtk2_ardour/plugin_selector.cc:146 msgid "LADSPA" -msgstr "ADAT" +msgstr "LADSPA" -#: plugin_selector.cc:129 -#, fuzzy +#: gtk2_ardour/plugin_selector.cc:150 msgid "VST" -msgstr "УСТÐÐОВИТЬ" +msgstr "VST" + +#: gtk2_ardour/plugin_selector.cc:155 +msgid "AudioUnit" +msgstr "AudioUnit" -#: plugin_ui.cc:84 +#: gtk2_ardour/plugin_ui.cc:85 msgid "" "unknown type of editor-supplying plugin (note: no VST support in this " "version of ardour)" msgstr "" -#: plugin_ui.cc:139 -msgid "<span size=\"large\">Presets</span>" -msgstr "" - -#: plugin_ui.cc:230 -#, fuzzy -msgid "Controls" -msgstr "Контрольные выходы" - -#: plugin_ui.cc:267 -msgid "Plugin Editor: could not build control element for port %1" -msgstr "Редактор модулей: невозможно Ñоздать Ñффект Ð´Ð»Ñ Ð¿Ð¾Ñ€Ñ‚Ð° %1" - -#: plugin_ui.cc:358 -#, fuzzy -msgid "Automation control" -msgstr "автомат" - -#: plugin_ui.cc:854 +#: gtk2_ardour/plugin_ui.cc:166 msgid "Plugin preset %1 not found" msgstr "" -#: plugin_ui.cc:864 -#, fuzzy +#: gtk2_ardour/plugin_ui.cc:176 msgid "Name of New Preset:" -msgstr "Ð˜Ð¼Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ ÑоединениÑ:" +msgstr "Ð˜Ð¼Ñ Ð½Ð¾Ð²Ð¾Ð¹ предуÑтановки:" -#: redirect_automation_line.cc:54 +#: gtk2_ardour/redirect_automation_line.cc:54 msgid "redirect automation created for non-plugin" msgstr "" -#: redirect_automation_time_axis.cc:94 +#: gtk2_ardour/redirect_automation_time_axis.cc:96 msgid "add automation event to " msgstr "" -#: redirect_box.cc:223 +#: gtk2_ardour/redirect_box.cc:226 msgid "New send" -msgstr "" +msgstr "Ðовый поÑыл" -#: redirect_box.cc:224 -#, fuzzy +#: gtk2_ardour/redirect_box.cc:227 msgid "Show send controls" -msgstr "иÑпользовать контрольные выходы" +msgstr "" -#: redirect_box.cc:383 +#: gtk2_ardour/redirect_box.cc:386 msgid "" "You attempted to add a plugin (%1).\n" "The plugin has %2 inputs\n" @@ -5617,7 +5354,7 @@ msgid "" "part of the signal." msgstr "" -#: redirect_box.cc:395 +#: gtk2_ardour/redirect_box.cc:398 msgid "" "You attempted to add a plugin (%1).\n" "The plugin has %2 inputs\n" @@ -5629,7 +5366,7 @@ msgid "" "support this type of configuration." msgstr "" -#: redirect_box.cc:408 +#: gtk2_ardour/redirect_box.cc:411 msgid "" "You attempted to add a plugin (%1).\n" "\n" @@ -5642,34 +5379,34 @@ msgid "" "Ardour does not understand what to do in such situations.\n" msgstr "" -#: redirect_box.cc:495 +#: gtk2_ardour/redirect_box.cc:499 msgid "Pre-fader inserts, sends & plugins:" msgstr "" -#: redirect_box.cc:498 +#: gtk2_ardour/redirect_box.cc:502 msgid "Post-fader inserts, sends & plugins:" msgstr "" -#: redirect_box.cc:644 +#: gtk2_ardour/redirect_box.cc:650 msgid "" "You cannot reorder this set of redirects\n" "in that way because the inputs and\n" "outputs do not work correctly." msgstr "" -#: redirect_box.cc:749 +#: gtk2_ardour/redirect_box.cc:750 #, fuzzy msgid "rename redirect" msgstr "ardour: переименовать облаÑÑ‚ÑŒ" -#: redirect_box.cc:826 redirect_box.cc:874 +#: gtk2_ardour/redirect_box.cc:824 gtk2_ardour/redirect_box.cc:872 msgid "" "Copying the set of redirects on the clipboard failed,\n" "probably because the I/O configuration of the plugins\n" "could not match the configuration of this track." msgstr "" -#: redirect_box.cc:896 +#: gtk2_ardour/redirect_box.cc:894 #, fuzzy msgid "" "Do you really want to remove all redirects from this track?\n" @@ -5678,7 +5415,7 @@ msgstr "" "Ð’Ñ‹ дейÑтвительно хотите удалить трек \"%1\" ?\n" "(отмена невозможна)" -#: redirect_box.cc:899 +#: gtk2_ardour/redirect_box.cc:897 #, fuzzy msgid "" "Do you really want to remove all redirects from this bus?\n" @@ -5687,258 +5424,247 @@ msgstr "" "Ð’Ñ‹ дейÑтвительно хотите удалить трек \"%1\" ?\n" "(отмена невозможна)" -#: redirect_box.cc:904 -#, fuzzy +#: gtk2_ardour/redirect_box.cc:902 msgid "Yes, remove them all" -msgstr "Да, удалить." +msgstr "Да, удалить их вÑе" -#: redirect_box.cc:940 +#: gtk2_ardour/redirect_box.cc:938 #, fuzzy msgid "ardour: %1" msgstr "ardour: " -#: redirect_box.cc:982 +#: gtk2_ardour/redirect_box.cc:983 #, fuzzy msgid "ardour: %1: %2 (by %3)" msgstr "ardour: " -#. new stuff -#: redirect_box.cc:1054 +#: gtk2_ardour/redirect_box.cc:1069 msgid "New Plugin ..." -msgstr "" +msgstr "Ðовое раÑширение..." -#: redirect_box.cc:1055 -#, fuzzy +#: gtk2_ardour/redirect_box.cc:1070 msgid "New Insert" -msgstr "новый вход" +msgstr "Ðовый возврат" -#: redirect_box.cc:1056 +#: gtk2_ardour/redirect_box.cc:1071 msgid "New Send ..." -msgstr "" +msgstr "Ðовый поÑыл..." -#: redirect_box.cc:1068 -#, fuzzy +#: gtk2_ardour/redirect_box.cc:1083 msgid "Deselect All" -msgstr "Выделить вÑÑ‘" +msgstr "СнÑÑ‚ÑŒ вÑе выделениÑ" -#: redirect_box.cc:1075 -#, fuzzy +#: gtk2_ardour/redirect_box.cc:1090 msgid "Activate all" -msgstr "Ðктивировать" +msgstr "Ðктивировать вÑе" -#: redirect_box.cc:1076 -#, fuzzy +#: gtk2_ardour/redirect_box.cc:1091 msgid "Deactivate all" -msgstr "Деактивировать" +msgstr "Деактивировать вÑе" -#: region_editor.cc:45 +#: gtk2_ardour/audio_region_editor.cc:44 msgid "NAME:" msgstr "ИМЯ:" -#: region_editor.cc:46 +#: gtk2_ardour/audio_region_editor.cc:45 msgid "lock" -msgstr "фикÑ." +msgstr "запереть" -#: region_editor.cc:48 +#: gtk2_ardour/audio_region_editor.cc:47 msgid "opaque" msgstr "затенить" -#: region_editor.cc:49 region_editor.cc:192 region_editor.cc:226 +#: gtk2_ardour/audio_region_editor.cc:48 +#: gtk2_ardour/audio_region_editor.cc:191 +#: gtk2_ardour/audio_region_editor.cc:225 msgid "active" msgstr "активно" -#: region_editor.cc:50 +#: gtk2_ardour/audio_region_editor.cc:49 msgid "visible" -msgstr "отображать" +msgstr "Видимы" -#: region_editor.cc:53 +#: gtk2_ardour/audio_region_editor.cc:52 msgid "Layer" msgstr "Слой" -#: region_editor.cc:54 +#: gtk2_ardour/audio_region_editor.cc:53 msgid "play" msgstr "воÑпроизвеÑти" -#: region_editor.cc:61 +#: gtk2_ardour/audio_region_editor.cc:60 msgid "ENVELOPE" msgstr "ОГИБÐЮЩÐЯ" -#: region_editor.cc:107 +#: gtk2_ardour/audio_region_editor.cc:106 msgid "mute this region" msgstr "отключить воÑпроизведение Ñтой облаÑти" -#: region_editor.cc:108 +#: gtk2_ardour/audio_region_editor.cc:107 msgid "regions underneath this one cannot be heard" msgstr "облаÑти ниже Ñтой не могут быть проÑлушаны" -#: region_editor.cc:109 +#: gtk2_ardour/audio_region_editor.cc:108 msgid "prevent any changes to this region" msgstr "запретить любые Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñтой облаÑти" -#: region_editor.cc:110 +#: gtk2_ardour/audio_region_editor.cc:109 msgid "use the gain envelope during playback" msgstr "иÑпользовать огибающую при воÑпроизведении" -#: region_editor.cc:111 +#: gtk2_ardour/audio_region_editor.cc:110 msgid "show the gain envelope" msgstr "отображать огибающую" -#: region_editor.cc:112 +#: gtk2_ardour/audio_region_editor.cc:111 msgid "use fade in curve during playback" msgstr "иÑпользовать вводную кривую при воÑпроизведении" -#: region_editor.cc:113 +#: gtk2_ardour/audio_region_editor.cc:112 msgid "use fade out curve during playback" msgstr "иÑпользовать выводную кривую при воÑпроизведении" -#: region_editor.cc:114 +#: gtk2_ardour/audio_region_editor.cc:113 msgid "audition this region" msgstr "проÑлушать облаÑÑ‚ÑŒ" -#: region_editor.cc:147 +#: gtk2_ardour/audio_region_editor.cc:146 msgid "START:" msgstr "ÐÐЧÐЛО:" -#: region_editor.cc:149 +#: gtk2_ardour/audio_region_editor.cc:148 msgid "END:" msgstr "КОÐЕЦ:" -#: region_editor.cc:151 +#: gtk2_ardour/audio_region_editor.cc:150 msgid "LENGTH:" msgstr "ДЛИÐÐ:" -#: region_editor.cc:191 +#: gtk2_ardour/audio_region_editor.cc:190 msgid "FADE IN" msgstr "ВВЕДЕÐИЕ Ð’ УРОВЕÐЬ" -#: region_editor.cc:193 region_editor.cc:227 +#: gtk2_ardour/audio_region_editor.cc:192 +#: gtk2_ardour/audio_region_editor.cc:226 msgid "msecs" -msgstr "мÑек" +msgstr "мÑ" -#: region_editor.cc:225 +#: gtk2_ardour/audio_region_editor.cc:224 msgid "FADE OUT" msgstr "СВЕДЕÐИЕ Ð’ ÐОЛЬ" -#: region_editor.cc:265 +#: gtk2_ardour/audio_region_editor.cc:264 msgid "ardour: region " msgstr "ardour: облаÑÑ‚ÑŒ " -#: region_editor.cc:402 +#: gtk2_ardour/audio_region_editor.cc:401 msgid "fade in edit" msgstr "редактировать введение в уровень" -#: region_editor.cc:414 +#: gtk2_ardour/audio_region_editor.cc:413 msgid "fade out edit" msgstr "редактировать Ñведение в ноль" -#: regionview.cc:1146 +#: gtk2_ardour/audio_region_view.cc:901 #, fuzzy msgid "add gain control point" msgstr "иÑпользовать контрольные выходы" -#: route_params_ui.cc:89 +#: gtk2_ardour/route_params_ui.cc:85 msgid "Tracks/Buses" -msgstr "Треки/Шины" +msgstr "Дорожи/Шины" -#: route_params_ui.cc:109 +#: gtk2_ardour/route_params_ui.cc:105 #, fuzzy msgid "Pre-fader Redirects" msgstr "Предобработка" -#: route_params_ui.cc:110 +#: gtk2_ardour/route_params_ui.cc:106 #, fuzzy msgid "Post-fader Redirects" msgstr "ПоÑтобработка" -#: route_params_ui.cc:144 +#: gtk2_ardour/route_params_ui.cc:140 #, fuzzy msgid "ardour: track/bus inspector" msgstr "ardour: добавить трек/шину" -#: route_params_ui.cc:145 +#: gtk2_ardour/route_params_ui.cc:141 msgid "ardour_route_parameters" msgstr "ardour_параметры_маршрутов" -#: route_params_ui.cc:202 +#: gtk2_ardour/route_params_ui.cc:202 msgid "route display list item for renamed route not found!" msgstr "" -#: route_params_ui.cc:453 +#: gtk2_ardour/route_params_ui.cc:449 msgid "NO TRACK" msgstr "ÐЕТ ТРЕКОВ" -#: route_params_ui.cc:695 +#: gtk2_ardour/route_params_ui.cc:672 #, fuzzy msgid "ardour: track/bus inspector: " msgstr "ardour: добавить трек/шину" -#: route_params_ui.cc:699 +#: gtk2_ardour/route_params_ui.cc:676 msgid "No Route Selected" msgstr "Ðет выбранных маршрутов" -#: route_params_ui.cc:700 +#: gtk2_ardour/route_params_ui.cc:677 #, fuzzy msgid "ardour: track/bus/inspector: no route selected" msgstr "ardour: параметры маршрутов: нет выбранных маршрутов" -#. ctrl-shift-click applies change to all routes -#: route_ui.cc:134 +#: gtk2_ardour/route_ui.cc:131 msgid "mute change" msgstr "" -#. ctrl-shift-click applies change to all routes -#. ctrl-alt-click: exclusively solo this track, not a toggle */ -#: route_ui.cc:209 route_ui.cc:219 +#: gtk2_ardour/route_ui.cc:207 gtk2_ardour/route_ui.cc:218 msgid "solo change" msgstr "" -#: route_ui.cc:282 +#: gtk2_ardour/route_ui.cc:282 msgid "rec-enable change" msgstr "" -#: route_ui.cc:479 +#: gtk2_ardour/route_ui.cc:480 #, fuzzy msgid "Solo-safe" msgstr "Соло" -#: route_ui.cc:487 route_ui.cc:530 -#, fuzzy -msgid "MIDI Bind" -msgstr "MIDI" - -#: route_ui.cc:501 +#: gtk2_ardour/route_ui.cc:502 msgid "Pre Fader" msgstr "Пред фейдер" -#: route_ui.cc:508 +#: gtk2_ardour/route_ui.cc:509 msgid "Post Fader" msgstr "ПоÑÑ‚ фейдер" -#: route_ui.cc:515 +#: gtk2_ardour/route_ui.cc:516 msgid "Control Outs" msgstr "Контрольные выходы" -#: route_ui.cc:522 +#: gtk2_ardour/route_ui.cc:523 msgid "Main Outs" msgstr "Главные выходы" -#: route_ui.cc:559 +#: gtk2_ardour/route_ui.cc:560 msgid "mix group solo change" msgstr "" -#: route_ui.cc:593 +#: gtk2_ardour/route_ui.cc:599 msgid "mix group mute change" msgstr "" -#: route_ui.cc:609 +#: gtk2_ardour/route_ui.cc:616 msgid "mix group rec-enable change" msgstr "" -#: route_ui.cc:626 visual_time_axis.cc:237 +#: gtk2_ardour/route_ui.cc:634 gtk2_ardour/visual_time_axis.cc:237 msgid "ardour: color selection" msgstr "ardour: выбор цвета" -#: route_ui.cc:702 +#: gtk2_ardour/route_ui.cc:710 #, fuzzy msgid "" "Do you really want to remove track \"%1\" ?\n" @@ -5949,7 +5675,7 @@ msgstr "" "Ð’Ñ‹ дейÑтвительно хотите удалить трек \"%1\" ?\n" "(отмена невозможна)" -#: route_ui.cc:704 +#: gtk2_ardour/route_ui.cc:712 msgid "" "Do you really want to remove bus \"%1\" ?\n" "(cannot be undone)" @@ -5957,212 +5683,212 @@ msgstr "" "Ð’Ñ‹ дейÑтвительно хотите удалить шину \"%1\" ?\n" "(отмена невозможна)" -#: route_ui.cc:708 visual_time_axis.cc:279 +#: gtk2_ardour/route_ui.cc:716 gtk2_ardour/visual_time_axis.cc:279 msgid "Yes, remove it." msgstr "Да, удалить." -#: route_ui.cc:737 +#: gtk2_ardour/route_ui.cc:744 #, fuzzy msgid "New Name: " msgstr "новое имÑ: " -#: sfdb_ui.cc:58 +#: gtk2_ardour/sfdb_ui.cc:61 msgid "Add Field..." msgstr "Добавить поле..." -#: sfdb_ui.cc:59 +#: gtk2_ardour/sfdb_ui.cc:62 msgid "Remove Field" msgstr "Удалить поле" -#: sfdb_ui.cc:62 +#: gtk2_ardour/sfdb_ui.cc:65 msgid "Soundfile Info" msgstr "Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ файле" -#: sfdb_ui.cc:80 +#: gtk2_ardour/sfdb_ui.cc:83 msgid "Field" msgstr "Критерий" -#: sfdb_ui.cc:81 +#: gtk2_ardour/sfdb_ui.cc:84 msgid "Value" msgstr "Значение" -#: sfdb_ui.cc:161 +#: gtk2_ardour/sfdb_ui.cc:167 #, fuzzy msgid "channels" msgstr "отмена" -#: sfdb_ui.cc:161 +#: gtk2_ardour/sfdb_ui.cc:167 #, fuzzy msgid "samplerate" msgstr "Разделить облаÑÑ‚ÑŒ" -#: sfdb_ui.cc:162 +#: gtk2_ardour/sfdb_ui.cc:168 #, fuzzy msgid "resolution" msgstr "ВоÑпроизвеÑти выделенное" -#: sfdb_ui.cc:162 +#: gtk2_ardour/sfdb_ui.cc:168 #, fuzzy msgid "format" msgstr "Ðорм." -#: sfdb_ui.cc:183 +#: gtk2_ardour/sfdb_ui.cc:189 #, fuzzy msgid "Could not read file: %1 (%2)." msgstr "Редактор: не удалоÑÑŒ открыть файл \"%1\" (%2)" -#: sfdb_ui.cc:199 +#: gtk2_ardour/sfdb_ui.cc:205 msgid "Could not access soundfile: " msgstr "Файл недоÑтупен: " -#: sfdb_ui.cc:236 +#: gtk2_ardour/sfdb_ui.cc:244 #, fuzzy msgid "Name for Field" msgstr "Ð˜Ð¼Ñ Ð¾Ð±Ð»Ð°Ñти: " -#: sfdb_ui.cc:335 +#: gtk2_ardour/sfdb_ui.cc:356 msgid "Split Channels" msgstr "" -#: sfdb_ui.cc:342 +#: gtk2_ardour/sfdb_ui.cc:363 msgid "Create a region for each channel" msgstr "" -#: sfdb_ui.cc:344 +#: gtk2_ardour/sfdb_ui.cc:365 msgid "Embed" msgstr "" -#: sfdb_ui.cc:346 +#: gtk2_ardour/sfdb_ui.cc:367 #, fuzzy msgid "Link to an external file" msgstr "Ð’Ñтавить внешний аудиофайл" -#: sfdb_ui.cc:348 +#: gtk2_ardour/sfdb_ui.cc:369 msgid "Import" msgstr "Импорт" -#: sfdb_ui.cc:350 +#: gtk2_ardour/sfdb_ui.cc:371 msgid "Copy a file to the session folder" msgstr "" -#: sfdb_ui.cc:414 +#: gtk2_ardour/sfdb_ui.cc:438 #, fuzzy msgid "programming error: %1" msgstr "ошибка в программе: " -#: tempo_dialog.cc:18 tempo_dialog.cc:35 +#: gtk2_ardour/tempo_dialog.cc:18 gtk2_ardour/tempo_dialog.cc:35 msgid "Beats per minute" msgstr "Ударов в минуту" -#: tempo_dialog.cc:21 tempo_dialog.cc:38 tempo_dialog.cc:203 -#: tempo_dialog.cc:221 +#: gtk2_ardour/tempo_dialog.cc:21 gtk2_ardour/tempo_dialog.cc:38 +#: gtk2_ardour/tempo_dialog.cc:203 gtk2_ardour/tempo_dialog.cc:221 msgid "Bar" msgstr "Такт" -#: tempo_dialog.cc:22 tempo_dialog.cc:39 tempo_dialog.cc:204 -#: tempo_dialog.cc:222 +#: gtk2_ardour/tempo_dialog.cc:22 gtk2_ardour/tempo_dialog.cc:39 +#: gtk2_ardour/tempo_dialog.cc:204 gtk2_ardour/tempo_dialog.cc:222 msgid "Beat" msgstr "ДолÑ" -#: tempo_dialog.cc:24 tempo_dialog.cc:41 tempo_dialog.cc:205 -#: tempo_dialog.cc:223 +#: gtk2_ardour/tempo_dialog.cc:24 gtk2_ardour/tempo_dialog.cc:41 +#: gtk2_ardour/tempo_dialog.cc:205 gtk2_ardour/tempo_dialog.cc:223 msgid "Location" msgstr "РаÑположение" -#: tempo_dialog.cc:199 tempo_dialog.cc:217 +#: gtk2_ardour/tempo_dialog.cc:199 gtk2_ardour/tempo_dialog.cc:217 msgid "Meter denominator" msgstr "Знаменатель размера" -#: tempo_dialog.cc:200 tempo_dialog.cc:218 +#: gtk2_ardour/tempo_dialog.cc:200 gtk2_ardour/tempo_dialog.cc:218 msgid "Beats per bar" msgstr "Долей на такт" -#: tempo_dialog.cc:236 tempo_dialog.cc:247 +#: gtk2_ardour/tempo_dialog.cc:236 gtk2_ardour/tempo_dialog.cc:247 msgid "whole (1)" msgstr "целых (1)" -#: tempo_dialog.cc:237 tempo_dialog.cc:249 +#: gtk2_ardour/tempo_dialog.cc:237 gtk2_ardour/tempo_dialog.cc:249 msgid "second (2)" msgstr "половины (2)" -#: tempo_dialog.cc:238 tempo_dialog.cc:251 +#: gtk2_ardour/tempo_dialog.cc:238 gtk2_ardour/tempo_dialog.cc:251 msgid "third (3)" msgstr "трети (3)" -#: tempo_dialog.cc:239 tempo_dialog.cc:253 tempo_dialog.cc:261 +#: gtk2_ardour/tempo_dialog.cc:239 gtk2_ardour/tempo_dialog.cc:253 +#: gtk2_ardour/tempo_dialog.cc:261 msgid "quarter (4)" msgstr "четверти (4)" -#: tempo_dialog.cc:240 tempo_dialog.cc:255 +#: gtk2_ardour/tempo_dialog.cc:240 gtk2_ardour/tempo_dialog.cc:255 msgid "eighth (8)" msgstr "воÑьмых (8)" -#: tempo_dialog.cc:241 tempo_dialog.cc:257 +#: gtk2_ardour/tempo_dialog.cc:241 gtk2_ardour/tempo_dialog.cc:257 msgid "sixteenth (16)" msgstr "шеÑтьнадцатых (16)" -#: tempo_dialog.cc:242 tempo_dialog.cc:259 +#: gtk2_ardour/tempo_dialog.cc:242 gtk2_ardour/tempo_dialog.cc:259 msgid "thirty-second (32)" msgstr "тридцать-вторых (32)" -#: tempo_dialog.cc:420 +#: gtk2_ardour/tempo_dialog.cc:420 msgid "garbaged note type entry (%1)" msgstr "неÑÑное определение ноты (%1)" -#: tempo_dialog.cc:430 +#: gtk2_ardour/tempo_dialog.cc:430 msgid "incomprehensible note type entry (%1)" msgstr "некорректное определение ноты (%1)" -#: time_axis_view.cc:112 +#: gtk2_ardour/time_axis_view.cc:112 msgid "gTortnam" msgstr "" -#: time_axis_view.cc:549 +#: gtk2_ardour/time_axis_view.cc:550 msgid "Largest" msgstr "ОгромнаÑ" -#: time_axis_view.cc:550 +#: gtk2_ardour/time_axis_view.cc:551 msgid "Large" msgstr "БольшаÑ" -#: time_axis_view.cc:551 +#: gtk2_ardour/time_axis_view.cc:552 msgid "Larger" msgstr "Больше" -#: time_axis_view.cc:553 +#: gtk2_ardour/time_axis_view.cc:554 msgid "Smaller" msgstr "Меньше" -#: time_axis_view.cc:554 +#: gtk2_ardour/time_axis_view.cc:555 msgid "Small" msgstr "МаленькаÑ" -#: time_axis_view.cc:870 +#: gtk2_ardour/time_axis_view.cc:869 msgid "unknown track height name \"%1\" in XML GUI information" msgstr "неизвеÑтное Ð¸Ð¼Ñ ÑˆÐ¸Ñ€Ð¸Ð½Ñ‹ трека \"%1\" в XML опиÑании" -#. first constructed item sets up font info -#: time_axis_view_item.cc:79 +#: gtk2_ardour/time_axis_view_item.cc:79 msgid "TimeAxisViewItemName" msgstr "" -#: time_axis_view_item.cc:298 +#: gtk2_ardour/time_axis_view_item.cc:302 msgid "new duration %1 frames is out of bounds for %2" msgstr "" -#: time_selection.cc:41 +#: gtk2_ardour/time_selection.cc:41 msgid "programming error: request for non-existent audio range (%1)!" msgstr "ошибка в программе: request for non-existent audio range (%1)!" -#: utils.cc:107 utils.cc:150 +#: gtk2_ardour/utils.cc:107 gtk2_ardour/utils.cc:150 msgid "bad XPM header %1" msgstr "ошибка в XPM заголовке %1" -#: utils.cc:332 +#: gtk2_ardour/utils.cc:332 msgid "missing RGBA style for \"%1\"" msgstr "" -#: visual_time_axis.cc:276 +#: gtk2_ardour/visual_time_axis.cc:276 msgid "" "Do you really want to remove track \"%1\" ?\n" "(cannot be undone)" @@ -6170,564 +5896,97 @@ msgstr "" "Ð’Ñ‹ дейÑтвительно хотите удалить трек \"%1\" ?\n" "(отмена невозможна)" -#: visual_time_axis.cc:325 +#: gtk2_ardour/visual_time_axis.cc:325 msgid "new name: " msgstr "новое имÑ: " -#: visual_time_axis.cc:336 +#: gtk2_ardour/visual_time_axis.cc:336 msgid "A track already exists with that name" msgstr "Трек Ñ Ñ‚Ð°ÐºÐ¸Ð¼ именем уже ÑущеÑтвует" -#, fuzzy -#~ msgid "set selected trackview" -#~ msgstr "Ð’Ñтавить выбранное" - -#, fuzzy -#~ msgid "set selected control point" -#~ msgstr "иÑпользовать контрольные выходы" - -#, fuzzy -#~ msgid "set selected regionview" -#~ msgstr "ВоÑпроизвеÑти выделенную облаÑÑ‚ÑŒ" - -#~ msgid "Start a new session\n" -#~ msgstr "Ðачать новую ÑеÑÑию\n" - -#~ msgid "via Session menu" -#~ msgstr "в меню \"СеÑÑиÑ\"" - -#, fuzzy -#~ msgid "<b>Advanced</b>" -#~ msgstr "Дополнительно..." - -#, fuzzy -#~ msgid "Select a File" -#~ msgstr "Выделить вÑÑ‘" - -#, fuzzy -#~ msgid "Track/Bus connection options" -#~ msgstr "Треки/Шины" - -#~ msgid "RECORD" -#~ msgstr "ЗÐПИСЬ" - -#~ msgid "INPUT" -#~ msgstr "ВХОД" - -#~ msgid "OUTPUT" -#~ msgstr "ВЫХОД" - -#, fuzzy -#~ msgid "Gain automation mode" -#~ msgstr "автомат" - -#, fuzzy -#~ msgid "Gain automation type" -#~ msgstr "автомат" - -#, fuzzy -#~ msgid "gain automation mode" -#~ msgstr "автомат" - -#, fuzzy -#~ msgid "gain automation state" -#~ msgstr "автомат" - -#, fuzzy -#~ msgid "pan automation state" -#~ msgstr "автомат" - -#~ msgid "REC" -#~ msgstr "ЗÐП" - -#~ msgid "OUT" -#~ msgstr "ВЫХ" - -#~ msgid "aplay" -#~ msgstr "авоÑпр" - -#, fuzzy -#~ msgid "awrite" -#~ msgstr "запиÑÑŒ" - -#~ msgid "no group" -#~ msgstr "нет группы" - -#, fuzzy -#~ msgid "normal" -#~ msgstr "Ðорм." - -#~ msgid "Disk r:%5.1f w:%5.1f MB/s" -#~ msgstr "ДиÑк r:%5.1f w:%5.1f MB/Ñек" - -#, fuzzy -#~ msgid "ardour cleanup" -#~ msgstr "ardour: очиÑтка" - -#~ msgid "close session" -#~ msgstr "закрыть ÑеÑÑию" - -#, fuzzy -#~ msgid "SetRegionLayerMode" -#~ msgstr "оконч. облаÑтей" - -#, fuzzy -#~ msgid "SetCrossfadeModel" -#~ msgstr "КроÑÑфейд" - -#~ msgid "Play from" -#~ msgstr "ВоÑпроизвеÑти от" - -#, fuzzy -#~ msgid "Set from range" -#~ msgstr "выбрать окно проÑмотра" - -#~ msgid "FORMAT" -#~ msgstr "ФОРМÐТ" +#: gtk2_ardour/connection_editor.cc:51 +msgid "ardour: connections" +msgstr "ardour: ÑоединениÑ" -#, fuzzy -#~ msgid "CD MARKER FILE TYPE" -#~ msgstr "ТИП ФÐЙЛÐ" - -#~ msgid "CHANNELS" -#~ msgstr "КÐÐÐЛЫ" - -#~ msgid "FILE TYPE" -#~ msgstr "ТИП ФÐЙЛÐ" - -#~ msgid "SAMPLE FORMAT" -#~ msgstr "Ð ÐЗРЯДÐОСТЬ" - -#~ msgid "SAMPLE ENDIANNESS" -#~ msgstr "СВОЙСТВÐ" - -#~ msgid "SAMPLE RATE" -#~ msgstr "ЧÐСТОТРДИСКРЕТИЗÐЦИИ" - -#~ msgid "CONVERSION QUALITY" -#~ msgstr "КÐЧЕСТВО ПРЕОБРÐЗОВÐÐИЯ" - -#~ msgid "DITHER TYPE" -#~ msgstr "ТИП ПОДМЕШИВÐЕМОГО ШУМÐ" - -#, fuzzy -#~ msgid "EXPORT CD MARKER FILE ONLY" -#~ msgstr "ТИП ФÐЙЛÐ" - -#~ msgid "EXPORT TO FILE" -#~ msgstr "ÐКСПОРТ Ð’ ФÐЙЛ" - -#~ msgid "ardour: unplugged" -#~ msgstr "ardour: нет ÑоединениÑ" - -#~ msgid "pol" -#~ msgstr "пол" - -#~ msgid "To be added" -#~ msgstr "Добавлено" - -#~ msgid "Update" -#~ msgstr "Обновить" - -#, fuzzy -#~ msgid "save" -#~ msgstr "Сохранить" - -#~ msgid "bypass" -#~ msgstr "обход" - -#~ msgid "Name for plugin settings:" -#~ msgstr "Ð˜Ð¼Ñ Ð½Ð°Ñтроек модулей:" - -#~ msgid "rescan" -#~ msgstr "обновить" - -#~ msgid "UI: cannot setup meter_bridge" -#~ msgstr "ИнтерфейÑ: не удалоÑÑŒ инициализировать индикаторы" - -#, fuzzy -#~ msgid "Enable/Disable follow playhead" -#~ msgstr "Разрешить/запретить цикл" - -#~ msgid "Audio Library" -#~ msgstr "Ðудио-библиотека" - -#~ msgid "Meter Bridge" -#~ msgstr "Индикаторы" - -#~ msgid "Input Connections" -#~ msgstr "Входные ÑоединениÑ" - -#~ msgid "Output Connections" -#~ msgstr "Выходные ÑоединениÑ" - -#, fuzzy -#~ msgid "New Input" -#~ msgstr "новый вход" - -#, fuzzy -#~ msgid "New Output" -#~ msgstr "новый выход" - -#, fuzzy -#~ msgid "Add Port" -#~ msgstr "добавить порт" - -#~ msgid "Available Ports" -#~ msgstr "ДоÑтупные порты" - -#~ msgid "ardour: connections" -#~ msgstr "ardour: ÑоединениÑ" - -#~ msgid "in %d" -#~ msgstr "в %d" - -#, fuzzy -#~ msgid "crossfade editor" -#~ msgstr "редактировать введение в уровень" - -#~ msgid "Regions/name" -#~ msgstr "ОблаÑти/имÑ" - -#~ msgid "" -#~ "editor\n" -#~ "mixer" -#~ msgstr "" -#~ "редактор\n" -#~ "микшер" - -#, fuzzy -#~ msgid "Invert" -#~ msgstr "Ðовый \"возврат\"" - -#~ msgid "Edit:" -#~ msgstr "Редактировать:" - -#, fuzzy -#~ msgid "Cancel cleanup" -#~ msgstr "ОчиÑтка" - -#~ msgid "programming error: line canvas item has no line object pointer!" -#~ msgstr "ошибка в программе: line canvas item has no line object pointer!" - -#~ msgid "" -#~ "programming error: no \"rect\" pointer associated with selection item" -#~ msgstr "" -#~ "ошибка в программе: no \"rect\" pointer associated with selection item" - -#~ msgid "Name for new edit group" -#~ msgstr "Ð˜Ð¼Ñ Ð½Ð¾Ð²Ð¾Ð¹ группы" - -#, fuzzy -#~ msgid "Import selected as tracks" -#~ msgstr "" -#~ "Импортировать\n" -#~ "выбранное" - -#~ msgid "ardour: audio import in progress" -#~ msgstr "ardour: ... идёт импорт аудио" - -#~ msgid "You can't embed an audiofile until you have a session loaded." -#~ msgstr "Ð’Ñ‹ не можете импортировать аудиофайл пока ÑеÑÑÐ¸Ñ Ð½Ðµ загружена." - -#, fuzzy -#~ msgid "Insert selected as new tracks" -#~ msgstr "Ð’Ñтавить выбранное" - -#~ msgid "Insert selected" -#~ msgstr "Ð’Ñтавить выбранное" - -#, fuzzy -#~ msgid "hidden" -#~ msgstr "Скрытый" - -#~ msgid "Sorting" -#~ msgstr "Сортировка" - -#~ msgid "Regions/length" -#~ msgstr "ОблаÑти/длина" - -#~ msgid "Regions/start" -#~ msgstr "ОблаÑти/начало" - -#~ msgid "Regions/end" -#~ msgstr "ОблаÑти/конец" - -#~ msgid "Regions/file name" -#~ msgstr "ОблаÑти/Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°" - -#~ msgid "Regions/file size" -#~ msgstr "ОблаÑти/размер файла" - -#~ msgid "Regions/file date" -#~ msgstr "ОблаÑти/дата файла" - -#~ msgid "Regions/file system" -#~ msgstr "ОблаÑти/Ñ„Ð°Ð¹Ð»Ð¾Ð²Ð°Ñ ÑиÑтема" - -#~ msgid "Show All AbstractTracks" -#~ msgstr "Показать вÑе треки" - -#~ msgid "Hide All AbstractTracks" -#~ msgstr "Скрыть вÑе треки" - -#~ msgid "slereg" -#~ msgstr "slereg" - -#~ msgid "KeyboardTarget: no translation found for \"%1\"" -#~ msgstr "KeyboardTarget: Ð´Ð»Ñ \"%1\" ÑопоÑтавление не найдено" - -#~ msgid "KeyboardTarget: unknown action \"%1\"" -#~ msgstr "KeyboardTarget: \"%1\" - неизвеÑтное Ñобытие" - -#~ msgid "misformed binding node - ignored" -#~ msgstr "неверное определение ÑвÑзи - пропущено" +#: gtk2_ardour/connection_editor.cc:52 +msgid "Input Connections" +msgstr "Входные ÑоединениÑ" -#~ msgid "ardour: soundfile selector" -#~ msgstr "ardour: выбор файлов" +#: gtk2_ardour/connection_editor.cc:53 +msgid "Output Connections" +msgstr "Выходные ÑоединениÑ" -#~ msgid "Add to Library..." -#~ msgstr "" -#~ "Добавить\n" -#~ "в библиотеку..." +#: gtk2_ardour/connection_editor.cc:54 +msgid "New Input" +msgstr "Ðовый вход" -#~ msgid "Remove..." -#~ msgstr "Удалить..." +#: gtk2_ardour/connection_editor.cc:55 +msgid "New Output" +msgstr "Ðовый выход" -#~ msgid "Find..." -#~ msgstr "Ðайти..." +#: gtk2_ardour/connection_editor.cc:58 gtk2_ardour/connection_editor.cc:101 +msgid "Add Port" +msgstr "Добавить порт" -#~ msgid "Add Folder" -#~ msgstr "" -#~ "Создать\n" -#~ "папку" +#: gtk2_ardour/connection_editor.cc:106 +msgid "Available Ports" +msgstr "ДоÑтупные порты" -#~ msgid "Add audio file or directory" -#~ msgstr "Добавить аудиофайл или каталог" +#: gtk2_ardour/connection_editor.cc:501 +msgid "Connection \"" +msgstr "Соединение \"" -#~ msgid "Importing" -#~ msgstr "Импорт" +#: gtk2_ardour/connection_editor.cc:503 +msgid "\"" +msgstr "\"" -#~ msgid "%1 not added to database" -#~ msgstr "%1 не добавлен в базу" - -#~ msgid "Folder name:" -#~ msgstr "Ð˜Ð¼Ñ Ð¿Ð°Ð¿ÐºÐ¸:" - -#~ msgid "Should not be reached" -#~ msgstr "Станет недоÑтупен" - -#~ msgid "file \"%1\" could not be opened" -#~ msgstr "не удалоÑÑŒ открыть файл \"%1\" !" - -#~ msgid "Field name:" -#~ msgstr "Ð˜Ð¼Ñ Ð¿Ð¾Ð»Ñ:" - -#~ msgid "Field value:" -#~ msgstr "Значение полÑ:" - -#~ msgid "Find" -#~ msgstr "Ðайти" - -#~ msgid "AND" -#~ msgstr "И" - -#~ msgid "ardour: locate soundfiles" -#~ msgstr "ardour: раÑположение звуковых файлов" - -#~ msgid "Results" -#~ msgstr "Результаты" - -#~ msgid "Uris" -#~ msgstr "Uris" - -#~ msgid "Create multi-channel region" -#~ msgstr "" -#~ "Создать\n" -#~ "многоканальный" - -#~ msgid "Ardour: Search Results" -#~ msgstr "Ardour: ПоиÑк результатов" - -#~ msgid "***" -#~ msgstr "***" - -#~ msgid "Hide All AudioTrack MixerStrips" -#~ msgstr "Скрыть вÑе каналы аудиотреков" - -#~ msgid "Show All AudioBus MixerStrips" -#~ msgstr "Показать вÑе каналы аудиошин" - -#~ msgid "Hide All AudioBus MixerStrips" -#~ msgstr "Скрыть вÑе каналы аудиошин" - -#~ msgid "Name for new mix group" -#~ msgstr "Ð˜Ð¼Ñ Ð½Ð¾Ð²Ð¾Ð¹ mix группы" - -#~ msgid "Create" -#~ msgstr "Создать" - -#~ msgid "use control outs" -#~ msgstr "иÑпользовать контрольные выходы" - -#, fuzzy -#~ msgid "automatically connect track outputs to master outs" -#~ msgstr "автоматичеÑкое подключение треков к маÑтер-выходам" - -#, fuzzy -#~ msgid "automatically connect track outputs to physical ports" -#~ msgstr "автоматичеÑкое подключение треков к выходам" - -#~ msgid "new session setup" -#~ msgstr "наÑтройки новой ÑеÑÑии" - -#~ msgid "This session will playback and record at %1 Hz" -#~ msgstr "" -#~ "Ðта ÑеÑÑÐ¸Ñ Ð±ÑƒÐ´ÐµÑ‚ запиÑыватьÑÑ Ð¸ воÑпроизводитьÑÑ\n" -#~ "Ñ Ñ‡Ð°Ñтотой диÑкретизации %1 Гц" - -#~ msgid "" -#~ "This rate is set by JACK and cannot be changed.\n" -#~ "If you want to use a different sample rate\n" -#~ "please exit and restart JACK" -#~ msgstr "" -#~ "Ðтот параметр уÑтанавливаетÑÑ Ñервером JACK и не может быть изменён.\n" -#~ "ЕÑли вы хотите иÑпользовать другую чаÑтоту диÑкретизации,\n" -#~ "вам необходимо закрыть Ardour и перезапуÑтить JACK" - -#~ msgid "blank" -#~ msgstr "пуÑтой" - -#, fuzzy -#~ msgid "Slave to MTC" -#~ msgstr "Передача MTC" - -#~ msgid "Narrow mixer strips" -#~ msgstr "Узкие каналы микшера" - -#~ msgid "Debug keyboard events" -#~ msgstr "Отладка наÑтроек клавиатуры" - -#~ msgid "Misc" -#~ msgstr "Прочее" - -#~ msgid "Display" -#~ msgstr "Ðкран" - -#~ msgid "Broadcast WAVE/floating point" -#~ msgstr "Broadcast WAVE/Ð¿Ð»Ð°Ð²Ð°ÑŽÑ‰Ð°Ñ Ñ‚Ð¾Ñ‡ÐºÐ°" - -#~ msgid "WAVE/floating point" -#~ msgstr "WAVE/Ð¿Ð»Ð°Ð²Ð°ÑŽÑ‰Ð°Ñ Ñ‚Ð¾Ñ‡ÐºÐ°" - -#~ msgid "Native Format" -#~ msgstr "Внутренний формат" - -#~ msgid "--unknown--" -#~ msgstr "--неизвеÑтный--" - -#~ msgid "in" -#~ msgstr "в" - -#~ msgid "ins" -#~ msgstr "вÑÑ‚" - -#~ msgid "out" -#~ msgstr "выход" - -#~ msgid "outs" -#~ msgstr "выходы" - -#, fuzzy -#~ msgid "Select all" -#~ msgstr "Выделить вÑÑ‘" - -#, fuzzy -#~ msgid "Inserts" -#~ msgstr "Ðовый \"возврат\"" - -#, fuzzy -#~ msgid "Sends" -#~ msgstr "Минуты:Секунды" - -#, fuzzy -#~ msgid "Select all ..." -#~ msgstr "Выделить вÑÑ‘" - -#~ msgid "Pre Redirects" -#~ msgstr "Предобработка" - -#~ msgid "Post Redirects" -#~ msgstr "ПоÑтобработка" - -#~ msgid "No toggle button pixmaps found to match toggle-button-[0-9]*.xpm$" -#~ msgstr "Файлы изображений toggle-button-[0-9]*.xpm$ не найдены" - -#~ msgid "" -#~ "No small push button pixmaps found to match small-round-button-[0-9]*.xpm$" -#~ msgstr "Файлы изображений small-round-button-[0-9]*.xpm$ не найдены" - -#~ msgid "No pixmaps found to match hslider[0-9]*.xpm$" -#~ msgstr "Файлы изображений hslider[0-9]*.xpm$ не найдены" +#: gtk2_ardour/connection_editor.cc:532 +#, c-format +msgid "in %d" +msgstr "вх %d" -#~ msgid "No pixmaps found to match vslider[0-9]*.xpm$" -#~ msgstr "Файлы изображений vslider[0-9]*.xpm$ не найдены" +#: gtk2_ardour/connection_editor.cc:534 +#, c-format +msgid "out %d" +msgstr "вых %d" -#~ msgid "Trace MIDI Input" -#~ msgstr "ТраÑÑировка входа MIDI" +#: gtk2_ardour/connection_editor.cc:658 +msgid "Name for new connection:" +msgstr "Ð˜Ð¼Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ ÑоединениÑ: " -#~ msgid "Trace MIDI Output" -#~ msgstr "ТраÑÑировка выхода MIDI" +#: gtk2_ardour/analysis_window.cc:46 +msgid "analysis window" +msgstr "Окно анализа" -#~ msgid "MTC Port" -#~ msgstr "MTC порт" +#: gtk2_ardour/analysis_window.cc:48 +msgid "Signal source" +msgstr "ИÑточник Ñигнала" -#~ msgid "attempt to timestretch a non-audio track!" -#~ msgstr "попытка применить timestretch-Ñффект к неаудиотреку" +#: gtk2_ardour/analysis_window.cc:49 +msgid "Selected ranges" +msgstr "Выбранные диапазоны" -#~ msgid "cannot create timestretch thread - operation not carried out" -#~ msgstr "cannot create timestretch thread - operation not carried out" +#: gtk2_ardour/analysis_window.cc:50 +msgid "Selected regions" +msgstr "Выделенные облаÑти" -#~ msgid "ardour: tempo editor" -#~ msgstr "ardour: редактор ритма" +#: gtk2_ardour/analysis_window.cc:52 +msgid "Display model" +msgstr "Модель отображениÑ" -#~ msgid "ardour_add_track_bus" -#~ msgstr "ardour_add_track_bus" +#: gtk2_ardour/analysis_window.cc:53 +msgid "Composite graphs for each track" +msgstr "СоÑтавной график Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ дорожки" -#~ msgid "ok" -#~ msgstr "ок" +#: gtk2_ardour/analysis_window.cc:54 +msgid "Composite graph of all tracks" +msgstr "СоÑтавной график Ð´Ð»Ñ Ð²Ñех дорожек" -#, fuzzy -#~ msgid "apply" -#~ msgstr "авоÑпр" - -#, fuzzy -#~ msgid "fade" -#~ msgstr "Затухание" - -#, fuzzy -#~ msgid "Edit left" -#~ msgstr "Режим редактированиÑ" - -#, fuzzy -#~ msgid "Edit right" -#~ msgstr "Редактировать Ñочетание" - -#, fuzzy -#~ msgid "Edit fade" -#~ msgstr "Режим редактированиÑ" - -#~ msgid "clear connections" -#~ msgstr "очиÑтить Ñоед." - -#, fuzzy -#~ msgid "Crossfades in use" -#~ msgstr "КроÑÑфейд" +#: gtk2_ardour/analysis_window.cc:63 +msgid "Track" +msgstr "Дорожка" -#, fuzzy -#~ msgid "outside this computer" -#~ msgstr "Скрыть трек" +#: gtk2_ardour/analysis_window.cc:131 +msgid "Analyze data" +msgstr "Проанализировать данные" -#, fuzzy -#~ msgid "inside this computer" -#~ msgstr "Скрыть трек" diff --git a/gtk2_ardour/po/sv_SE.po b/gtk2_ardour/po/sv_SE.po new file mode 100644 index 0000000000..6dbef3b7eb --- /dev/null +++ b/gtk2_ardour/po/sv_SE.po @@ -0,0 +1,5865 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: ardour-gtk 1.0.2\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2006-06-12 22:09+0200\n" +"PO-Revision-Date: 2006-06-26 23:57+GMT+1\n" +"Last-Translator: Petter Sundlöf <petter.sundlof@findus.dhs.org>\n" +"Language-Team: Svenska <sv@li.org>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../about.cc:119 +msgid "Paul Davis" +msgstr "" + +#: ../about.cc:120 +msgid "Jesse Chappell" +msgstr "" + +#: ../about.cc:121 +msgid "Taybin Rutkin" +msgstr "" + +#: ../about.cc:122 +msgid "Marcus Andersson" +msgstr "" + +#: ../about.cc:123 +msgid "Jeremy Hall" +msgstr "" + +#: ../about.cc:124 +msgid "Steve Harris" +msgstr "" + +#: ../about.cc:125 +msgid "Tim Mayberry" +msgstr "" + +#: ../about.cc:126 +msgid "Mark Stewart" +msgstr "" + +#: ../about.cc:127 +msgid "Sam Chessman" +msgstr "" + +#: ../about.cc:128 +msgid "Jack O'Quin" +msgstr "" + +#: ../about.cc:129 +msgid "Matt Krai" +msgstr "" + +#: ../about.cc:130 +msgid "Ben Bell" +msgstr "" + +#: ../about.cc:131 +msgid "Gerard van Dongen" +msgstr "" + +#: ../about.cc:132 +msgid "Thomas Charbonnel" +msgstr "" + +#: ../about.cc:133 +msgid "Nick Mainsbridge" +msgstr "" + +#: ../about.cc:134 +msgid "Colin Law" +msgstr "" + +#: ../about.cc:135 +msgid "Sampo Savolainen" +msgstr "" + +#: ../about.cc:136 +msgid "Joshua Leach" +msgstr "" + +#: ../about.cc:137 +msgid "Rob Holland" +msgstr "" + +#: ../about.cc:138 +msgid "Per Sigmond" +msgstr "" + +#: ../about.cc:139 +msgid "Doug Mclain" +msgstr "" + +#: ../about.cc:140 +msgid "Petter Sundlöf" +msgstr "" + +#: ../about.cc:145 +msgid "" +"French:\n" +"\tAlain Fréhel <alain.frehel@free.fr>\n" +msgstr "" + +#: ../about.cc:146 +msgid "" +"German:\n" +"\tKarsten Petersen <kapet@kapet.de>\n" +msgstr "" + +#: ../about.cc:147 +msgid "" +"Italian:\n" +"\tFilippo Pappalardo <filippo@email.it>\n" +msgstr "" + +#: ../about.cc:148 +msgid "" +"Portuguese:\n" +"\tRui Nuno Capela <rncbc@rncbc.org>\n" +msgstr "" + +#: ../about.cc:149 +msgid "" +"Brazilian Portuguese:\n" +"\tAlexander da Franca Fernandes <alexander@nautae.eti.br>\n" +"\tChris Ross <chris@tebibyte.org>\n" +msgstr "" + +#: ../about.cc:151 +msgid "" +"Spanish:\n" +"\t Alex Krohn <alexkrohn@fastmail.fm>\n" +msgstr "" + +#: ../about.cc:152 +msgid "" +"Russian:\n" +"\t Igor Blinov <pitstop@nm.ru>\n" +msgstr "" + +#: ../about.cc:180 +msgid "Copyright (C) 1999-2005 Paul Davis\n" +msgstr "" + +#: ../about.cc:181 +msgid "" +"Ardour comes with ABSOLUTELY NO WARRANTY\n" +"This is free software, and you are welcome to redistribute it\n" +"under certain conditions; see the file COPYING for details.\n" +msgstr "" + +#: ../about.cc:187 +msgid "" +"%1\n" +"(built with ardour/gtk %2.%3.%4 libardour: %5.%6.%7)" +msgstr "" +"%1\n" +"(kompilerat med ardour/gtk %2.%3.%4 libardour: %5.%6.%7)" + +#: ../actions.cc:260 +msgid "programmer error: %1 %2" +msgstr "" + +#: ../add_route_dialog.cc:61 +msgid "ardour: add track/bus" +msgstr "ardour: lägg till spÃ¥r/buss(ar)" + +#. path = "1" +#: ../add_route_dialog.cc:62 ../editor_route_list.cc:72 +msgid "Tracks" +msgstr "SpÃ¥r" + +#. path = "0" +#: ../add_route_dialog.cc:63 ../editor_route_list.cc:69 +msgid "Busses" +msgstr "Bussar" + +#: ../add_route_dialog.cc:95 ../plugin_ui.cc:832 +msgid "Add" +msgstr "Lägg till" + +#: ../add_route_dialog.cc:113 +msgid "Name (template)" +msgstr "Namn (mall)" + +#: ../add_route_dialog.cc:119 +msgid "Channel Configuration" +msgstr "Kanalkonfiguration" + +#: ../add_route_dialog.cc:176 ../editor.cc:133 ../editor.cc:3687 +#: ../time_axis_view.cc:551 +msgid "Normal" +msgstr "" + +#: gtk2_ardour/add_route_dialog.cc:179 +msgid "Tape" +msgstr "Band" + +#: ../add_route_dialog.cc:195 +msgid "Mono" +msgstr "" + +#: ../add_route_dialog.cc:197 +msgid "Stereo" +msgstr "" + +#: gtk2_ardour/add_route_dialog.cc:43 +msgid "3 Channels" +msgstr "3 Kanaler" + +#: gtk2_ardour/add_route_dialog.cc:44 +msgid "4 Channels" +msgstr "4 Kanaler" + +#: gtk2_ardour/add_route_dialog.cc:45 +msgid "6 Channels" +msgstr "6 Kanaler" + +#: gtk2_ardour/add_route_dialog.cc:46 +msgid "8 Channels" +msgstr "8 Kanaler" + +#: gtk2_ardour/add_route_dialog.cc:47 +msgid "Manual Setup" +msgstr "Manuellt" + +#. preroll stuff +#: ../ardour_ui.cc:105 +msgid "" +"pre\n" +"roll" +msgstr "" +"för-\n" +"roll" + +#: ../ardour_ui.cc:106 +msgid "" +"post\n" +"roll" +msgstr "" +"efter-\n" +"roll" + +#. transport +#: ../ardour_ui.cc:114 +msgid "" +"time\n" +"master" +msgstr "" +"huvud-\n" +"klocka" + +#: ../ardour_ui.cc:116 +msgid "% " +msgstr "" + +#: ../ardour_ui.cc:118 +msgid "" +"punch\n" +"in" +msgstr "" +"punch-\n" +"in" + +#: ../ardour_ui.cc:119 +msgid "" +"punch\n" +"out" +msgstr "" +"punch-\n" +"ut" + +#: ../ardour_ui.cc:120 +msgid "" +"auto\n" +"return" +msgstr "" +"auto-\n" +"Ã¥tervänd" + +#: ../ardour_ui.cc:121 +msgid "" +"auto\n" +"play" +msgstr "" +"auto-\n" +"spela" + +#: ../ardour_ui.cc:122 +msgid "" +"auto\n" +"input" +msgstr "" +"auto-\n" +"inljud" + +#: ../ardour_ui.cc:123 +msgid "click" +msgstr "klick" + +#: gtk2_ardour/ardour_ui.cc:125 +msgid "AUDITION" +msgstr "AVLYSSNING" + +#: gtk2_ardour/ardour_ui.cc:126 +msgid "SOLO" +msgstr "" + +#: ../ardour_ui.cc:374 +msgid "quit" +msgstr "avsluta" + +#: ../ardour_ui.cc:383 +msgid "" +"Ardour was unable to save your session.\n" +"\n" +"If you still wish to quit, please use the\n" +"\n" +"\"Just quit\" option." +msgstr "" +"Ardour kunde inte spara din session.\n" +"\n" +"Om du fortfarande vill avsluta, välj\n" +"\n" +"\"Avsluta bara\"-alternativet." + +#: ../ardour_ui.cc:402 +msgid "ardour: save session?" +msgstr "ardour: spara sessionen?" + +#: ../ardour_ui.cc:409 +msgid "Don't %1" +msgstr "Stäng inte" + +#: ../ardour_ui.cc:411 +msgid "Just %1" +msgstr "Stäng utan att spara" + +#: ../ardour_ui.cc:413 +msgid "Save and %1" +msgstr "Spara och stäng" + +#: ../ardour_ui.cc:425 +msgid "session" +msgstr "Sessionen" + +#: ../ardour_ui.cc:427 +msgid "snapshot" +msgstr "ögonblickskopia" + +#: ../ardour_ui.cc:429 +msgid "" +"The %1\"%2\"\n" +"has not been saved.\n" +"\n" +"Any changes made this time\n" +"will be lost unless you save it.\n" +"\n" +"What do you want to do?" +msgstr "" +"%1\n" +"\"%2\"\n" +"har ej sparats.\n" +"\n" +"Ändringar du gjort kommer\n" +"att förloras ifall du inte sparar.\n" +"\n" +"Vad vill du göra?" + +#: ../ardour_ui.cc:443 +msgid "Prompter" +msgstr "FrÃ¥ga" + +#: ../ardour_ui.cc:502 +#, c-format +msgid "disconnected" +msgstr "frÃ¥nkopplad" + +#: ../ardour_ui.cc:509 +#, c-format +msgid "SR: %.1f kHz / %4.1f msecs" +msgstr "Samplingsfrekvens: %.1f kHz / %4.1f msek" + +#: ../ardour_ui.cc:513 +#, c-format +msgid "SR: %u kHz / %4.1f msecs" +msgstr "Samplingsfrekvens: %u kHz / %4.1f msek" + +#: ../ardour_ui.cc:526 +#, c-format +msgid "DSP Load: %.1f%%" +msgstr "DSP-belastning: %.1f%%" + +#: ../ardour_ui.cc:536 +#, c-format +msgid "Buffers p:%<PRIu32>%% c:%<PRIu32>%%" +msgstr "Buffertar u-s:%<PRIu32>%% i-s:%<PRIu32>%%" + +#: ../ardour_ui.cc:563 +msgid "space: 24hrs+" +msgstr "Utrymme: 24h+" + +#: ../ardour_ui.cc:593 +#, c-format +msgid "space: %02dh:%02dm:%02ds" +msgstr "Utrymme: %02dh:%02dm:%02ds" + +#: ../ardour_ui.cc:632 +msgid "programming error: impossible control method" +msgstr "programmeringsfel: omöjlig kontroll-metod" + +#: ../ardour_ui.cc:740 ../new_session_dialog.cc:294 +msgid "Recent Sessions" +msgstr "Tidigare Sessioner" + +#. ardour sessions are folders +#: ../ardour_ui.cc:833 +msgid "open session" +msgstr "öppna session" + +#: ../ardour_ui.cc:839 +msgid "Ardour sessions" +msgstr "Sessioner" + +#: ../ardour_ui.cc:872 +msgid "Patience is a virtue.\n" +msgstr "TÃ¥lamod är en dygd.\n" + +#: ../ardour_ui.cc:881 +msgid "You cannot add a track without a session already loaded." +msgstr "Du kan inte lägga till ett spÃ¥r utan en session laddad." + +#: ../ardour_ui.cc:888 +msgid "could not create new audio track" +msgstr "kunde inte skapa nytt ljudspÃ¥r" + +#: ../ardour_ui.cc:892 +msgid "could not create new audio bus" +msgstr "kunde inte skapa ny ljudbuss" + +#: ../ardour_ui.cc:911 +msgid "" +"There are insufficient JACK ports available\n" +"to create a new track or bus.\n" +"You should save Ardour, exit and\n" +"restart JACK with more ports." +msgstr "" +"Det finns inte tillräckligt med JACK-portar\n" +"för att skapa ett nytt spÃ¥r eller en y buss.\n" +"Du bör spara, avsluta och\n" +"starta om JACK med fler portar." + +#: ../ardour_ui.cc:1035 +msgid "" +"Please create 1 or more track\n" +"before trying to record.\n" +"Check the Session menu." +msgstr "" +"Skapa 1 eller fler spÃ¥r\n" +"innan du försöker spela in.\n" +"Se Session-menyn." + +#: ../ardour_ui.cc:1264 +msgid "" +"JACK has either been shutdown or it\n" +"disconnected Ardour because Ardour\n" +"was not fast enough. You can save the\n" +"session and/or try to reconnect to JACK ." +msgstr "" +"JACK har stängts av eller sÃ¥ har\n" +"det kopplat bort Ardour eftersom\n" +"Ardour inte var snabb nog. Du kan spara\n" +"och/eller försöka Ã¥teransluta till JACK ." + +#: ../ardour_ui.cc:1281 +msgid "Unable to create all required ports" +msgstr "Kan ej skapa alla nödvändiga portar" + +#: ../ardour_ui.cc:1289 +msgid "Unable to start the session running" +msgstr "Kan ej starta sessionen" + +#: ../ardour_ui.cc:1425 +msgid "No Stream" +msgstr "Ingen ljudström" + +#: ../ardour_ui.cc:1452 ../ardour_ui.cc:1471 +msgid "none" +msgstr "ingen" + +#: ../ardour_ui.cc:1461 ../ardour_ui.cc:1480 +msgid "off" +msgstr "av" + +#: ../ardour_ui.cc:1504 +msgid "Name of New Snapshot" +msgstr "Namn för ögonblickskopia" + +#: ../ardour_ui.cc:1650 +msgid "Name for mix template:" +msgstr "Namn för mixmall: " + +#: ../ardour_ui.cc:1651 +msgid "-template" +msgstr "-mall" + +#: ../ardour_ui.cc:1808 +msgid "" +"You do not have write access to this session.\n" +"This prevents the session from being loaded." +msgstr "" +"Du har ej skrivrättigheter till denna session.\n" +"Detta hindrar sessionen frÃ¥n att laddas." + +#: ../ardour_ui.cc:1821 ../ardour_ui.cc:1876 +msgid "Session \"%1 (snapshot %2)\" did not load successfully" +msgstr "Session \"%1 (ögonblickskopia %2)\" kunde inte laddas" + +#: ../ardour_ui.cc:1932 +msgid "No audio files were ready for cleanup" +msgstr "Inga ljudfiler var redo för rensning" + +#: ../ardour_ui.cc:1936 +msgid "" +"If this seems suprising, \n" +"check for any existing snapshots.\n" +"These may still include regions that\n" +"require some unused files to continue to exist." +msgstr "" +"Om detta är överraskande, sök efter existerande\n" +"ögonblickskopior. Dessa kan använda regioner som\n" +"använder oanvända filer för att kunna fungera." + +#: ../ardour_ui.cc:1945 +msgid "ardour: cleanup" +msgstr "ardour: rensning" + +#: ../ardour_ui.cc:1981 ../ardour_ui.cc:1987 +msgid "files were" +msgstr "filer" + +#: ../ardour_ui.cc:1983 ../ardour_ui.cc:1989 +msgid "file was" +msgstr "fil" + +#: ../ardour_ui.cc:2030 +msgid "Are you sure you want to cleanup?" +msgstr "Är du säker pÃ¥ att du vill göra en rensning?" + +#: ../ardour_ui.cc:2035 +msgid "" +"Cleanup is a destructive operation.\n" +"ALL undo/redo information will be lost if you cleanup.\n" +"After cleanup, unused audio files will be moved to a \"dead sounds\" " +"location." +msgstr "" +"Rensning är en destruktiv funktion.\n" +"ALL Ã¥ngra-/gör om-information kommer att förloras om du rensar.\n" +"Oanvända filer kommer att flyttas till en \"döda ljud\"-plats." + +#: ../ardour_ui.cc:2041 +msgid "Clean Up" +msgstr "Rensning" + +#: ../ardour_ui.cc:2044 +msgid "CleanupDialog" +msgstr "Rensningsdialog" + +#: ../ardour_ui.cc:2045 +msgid "ardour_cleanup" +msgstr "ardour_rensning" + +#: ../ardour_ui.cc:2064 +msgid "cleaned files" +msgstr "rensade filer" + +#: ../ardour_ui.cc:2065 +msgid "" +"The following %1 %2 not in use and \n" +"have been moved to:\n" +"%3. \n" +"\n" +"Flushing the wastebasket will \n" +"release an additional\n" +"%4 %5bytes of disk space.\n" +msgstr "" +"Följande %1 %2 användes inte \n" +"och har flyttats till:\n" +"%3. \n" +"\n" +"Tömma papperskorgen kommer att \n" +"frigöra ytterligarel\n" +"%4 %5byte diskutrymme.\n" + +#: ../ardour_ui.cc:2090 +msgid "deleted file" +msgstr "raderad fil" + +#: ../ardour_ui.cc:2091 +msgid "" +"The following %1 %2 deleted from\n" +"%3,\n" +"releasing %4 %5bytes of disk space" +msgstr "" +"Följande %1 %2 raderades frÃ¥n\n" +"%3,\n" +"vilket frigjorde %4 %5byte diskutrymme" + +#: ../ardour_ui.cc:2214 +msgid "Recording was stopped because your system could not keep up." +msgstr "Inspelningen avstannades eftersom ditt system inte kunde hänga med." + +#: ../ardour_ui.cc:2237 +msgid "" +"The disk system on your computer\n" +"was not able to keep up with Ardour.\n" +"\n" +"Specifically, it failed to write data to disk\n" +"quickly enough to keep up with recording.\n" +msgstr "" +"HÃ¥rddisksystemet pÃ¥ din dator\n" +"kunde inte matcha Ardour.\n" +"\n" +"Närmare bestämt, det kunde inte skriva data till disk\n" +"snabbt nog för att matcha inspelningen.\n" + +#: ../ardour_ui.cc:2256 +msgid "" +"The disk system on your computer\n" +"was not able to keep up with Ardour.\n" +"\n" +"Specifically, it failed to read data from disk\n" +"quickly enough to keep up with playback.\n" +msgstr "" +"HÃ¥rddisksystemet pÃ¥ din dator\n" +"kunde inte matcha Ardour.\n" +"\n" +"Närmare bestämt, det kunde inte läsa data frÃ¥n disk\n" +"snabbt nog för att matcha uppspelningen.\n" + +#: ../ardour_ui.cc:2282 +msgid "" +"This session appears to have been in\n" +"middle of recording when ardour or\n" +"the computer was shutdown.\n" +"\n" +"Ardour can recover any captured audio for\n" +"you, or it can ignore it. Please decide\n" +"what you would like to do.\n" +msgstr "" +"Denna session tycks ha varit\n" +"mitt i inspelning när ardour eller\n" +"datorn stängdes av.\n" +"\n" +"Ardour kan Ã¥terhämta inspelade ljud Ã¥t\n" +"dig, eller ignorera dem. Välj\n" +"vad du vill göra.\n" + +#: ../ardour_ui.cc:2292 +msgid "Recover from crash" +msgstr "Ã…terhämta frÃ¥n krasch" + +#: ../ardour_ui.cc:2293 +msgid "Ignore crash data" +msgstr "Ignorera kraschdata" + +#: ../ardour_ui.cc:2311 +msgid "Could not disconnect from JACK" +msgstr "Kunde inte koppla loss frÃ¥n JACK" + +#: ../ardour_ui.cc:2324 +msgid "Could not reconnect to JACK" +msgstr "Kunde inte Ã¥teransluta till JACK" + +#: ../ardour_ui2.cc:59 +msgid "UI: cannot setup editor" +msgstr "Gränssnitt: kan ej konfigurera editorn" + +#: ../ardour_ui2.cc:64 +msgid "UI: cannot setup mixer" +msgstr "Gränssnitt: kan inte konfigurera mixern" + +#: ../ardour_ui2.cc:90 +msgid "MMC + Local" +msgstr "MMC + Lokal" + +#: ../ardour_ui2.cc:91 +msgid "MMC" +msgstr "" + +#: ../ardour_ui2.cc:92 +msgid "Local" +msgstr "Lokal" + +#: ../ardour_ui2.cc:109 +msgid "MMC ID" +msgstr "MMC-ID" + +#: ../ardour_ui2.cc:290 +msgid "Play from playhead" +msgstr "Spela frÃ¥n startmarkören" + +#: ../ardour_ui2.cc:291 +msgid "Stop playback" +msgstr "Stanna uppspelning" + +#: ../ardour_ui2.cc:292 +msgid "Play range/selection" +msgstr "Spela omfÃ¥ng/markering" + +#: ../ardour_ui2.cc:293 +msgid "Go to start of session" +msgstr "GÃ¥ till början av sessionen" + +#: ../ardour_ui2.cc:294 +msgid "Go to end of session" +msgstr "GÃ¥ till slutet av sessionen" + +#: ../ardour_ui2.cc:295 +msgid "Play loop range" +msgstr "Spela loop-omfÃ¥ng" + +#: ../ardour_ui2.cc:296 +msgid "Return to last playback start when stopped" +msgstr "Ã…tervänd till senaste startmarkörpunkten vid stopp" + +#: ../ardour_ui2.cc:297 +msgid "Start playback after any locate" +msgstr "Starta uppspelning vid markörsplacering" + +#: ../ardour_ui2.cc:298 +msgid "Be sensible about input monitoring" +msgstr "Rimlig inljudsmedhörning" + +#: ../ardour_ui2.cc:299 +msgid "Start recording at auto-punch start" +msgstr "Starta inspelning vid auto-punch-start" + +#: ../ardour_ui2.cc:300 +msgid "Stop recording at auto-punch end" +msgstr "Stanna inspelning vid auto-punch-slut" + +#: ../ardour_ui2.cc:301 +msgid "Enable/Disable audio click" +msgstr "SlÃ¥ pÃ¥/av audio-klick" + +#: ../ardour_ui2.cc:302 +msgid "Positional sync source" +msgstr "Källa till positionell synk." + +#: ../ardour_ui2.cc:303 +msgid "Does Ardour control the time?" +msgstr "Är Ardour huvudklocka?" + +#: ../ardour_ui2.cc:304 +msgid "Shuttle speed control" +msgstr "Shuttle-hastighetskontrol" + +#: ../ardour_ui2.cc:305 +#, c-format +msgid "Select semitones or %%-age for speed display" +msgstr "Välj halvtoner eller %% för hastighetsvisning" + +#: ../ardour_ui2.cc:306 +msgid "Current transport speed" +msgstr "Nuvarande uppspelningshastighet" + +#: ../ardour_ui2.cc:329 +msgid "Primary clock" +msgstr "Primär klocka" + +#: ../ardour_ui2.cc:330 +msgid "secondary clock" +msgstr "sekundär klocka" + +#. XXX: this should really be saved in instant.xml or something similar and restored from there +#. Combo's are stupid - they steal space from the entry for the button +#: ../ardour_ui2.cc:387 ../ardour_ui2.cc:832 ../ardour_ui2.cc:845 +#: ../ardour_ui2.cc:908 ../ardour_ui2.cc:910 +msgid "sprung" +msgstr "fjäder" + +#: ../ardour_ui2.cc:388 ../ardour_ui2.cc:834 ../ardour_ui2.cc:856 +msgid "wheel" +msgstr "hjul" + +#: ../ardour_ui2.cc:450 +msgid "ardour: clock" +msgstr "ardour: klocka" + +#: ../ardour_ui2.cc:595 +msgid "Maximum speed" +msgstr "Maxhastighet" + +#: ../ardour_ui2.cc:822 +msgid "st" +msgstr "halvtoner" + +#: ../ardour_ui2.cc:866 ../ardour_ui2.cc:889 ../ardour_ui2.cc:906 +msgid "stopped" +msgstr "stannad" + +#: ../ardour_ui_dialogs.cc:152 ../playlist_selector.cc:69 +msgid "close" +msgstr "stäng" + +#: ../ardour_ui_dialogs.cc:359 ../ardour_ui_ed.cc:183 +msgid "Sound File Browser" +msgstr "Ljudfilsbibliotek" + +#. menus + submenus that need action items +#: ../ardour_ui_ed.cc:71 +msgid "Session" +msgstr "" + +#: ../ardour_ui_ed.cc:72 ../ardour_ui_ed.cc:129 ../editor.cc:1835 +#: ../export_dialog.cc:349 ../export_dialog.cc:1058 ../export_dialog.cc:1062 +msgid "Export" +msgstr "Exportera" + +#: ../ardour_ui_ed.cc:73 +msgid "Cleanup" +msgstr "Upprensning" + +#: ../ardour_ui_ed.cc:74 ../option_editor.cc:125 +msgid "Sync" +msgstr "Synk." + +#: ../ardour_ui_ed.cc:75 ../ardour_ui_ed.cc:76 +msgid "Options" +msgstr "Inställningar" + +#: ../ardour_ui_ed.cc:77 +msgid "Help" +msgstr "Hjälp" + +#: ../ardour_ui_ed.cc:78 +msgid "KeyMouse Actions" +msgstr "Tangent-/musÃ¥tgärder" + +#: ../ardour_ui_ed.cc:79 +msgid "Audio File Format" +msgstr "Ljudfilsformat" + +#: ../ardour_ui_ed.cc:80 +msgid "Header" +msgstr "" + +#: ../ardour_ui_ed.cc:81 +msgid "Data" +msgstr "" + +#: ../ardour_ui_ed.cc:82 +msgid "Control Surfaces" +msgstr "Kontrollytor" + +#. the real actions +#: ../ardour_ui_ed.cc:86 ../audio_time_axis.cc:1853 +#: ../new_session_dialog.cc:524 +msgid "New" +msgstr "Ny" + +#: ../ardour_ui_ed.cc:88 ../new_session_dialog.cc:512 +msgid "Open" +msgstr "Öppna" + +#: ../ardour_ui_ed.cc:89 +msgid "Recent" +msgstr "Tidigare" + +#: ../ardour_ui_ed.cc:90 ../io_selector.cc:57 ../io_selector.cc:791 +msgid "Close" +msgstr "Stäng" + +#: ../ardour_ui_ed.cc:93 ../route_params_ui.cc:513 +msgid "Add Track/Bus" +msgstr "Lägg till SpÃ¥r/Buss" + +#: ../ardour_ui_ed.cc:104 +msgid "Connect" +msgstr "Anslut" + +#. </CMT Additions> +#: ../ardour_ui_ed.cc:112 +msgid "Snapshot" +msgstr "Ögonblickskopia" + +#: ../ardour_ui_ed.cc:115 +msgid "Save Template..." +msgstr "Spara mall..." + +#: ../ardour_ui_ed.cc:118 +msgid "Export session to audiofile..." +msgstr "Exportera sessionen till ljudfil" + +#: ../ardour_ui_ed.cc:121 +msgid "Export selection to audiofile..." +msgstr "Exportera markeringen till ljudfil" + +#: ../ardour_ui_ed.cc:125 +msgid "Export range markers to audiofile..." +msgstr "Exportera omfÃ¥nget till ljudfil" + +#: ../ardour_ui_ed.cc:132 +msgid "Cleanup unused sources" +msgstr "Rensa oanvända källor" + +#: ../ardour_ui_ed.cc:134 +msgid "Flush wastebasket" +msgstr "Töm papperskorgen" + +#: ../ardour_ui_ed.cc:140 ../ardour_ui_options.cc:409 +#: ../ardour_ui_options.cc:418 ../ardour_ui_options.cc:490 +msgid "JACK" +msgstr "" + +#: ../ardour_ui_ed.cc:141 +msgid "Latency" +msgstr "Fördröjning" + +#: ../ardour_ui_ed.cc:143 +msgid "Reconnect" +msgstr "Ã…teranslut" + +#: ../ardour_ui_ed.cc:146 ../mixer_strip.cc:497 ../mixer_strip.cc:565 +msgid "Disconnect" +msgstr "Koppla ifrÃ¥n" + +#: ../ardour_ui_ed.cc:173 +msgid "Windows" +msgstr "Fönster" + +#: ../ardour_ui_ed.cc:174 +msgid "start prefix" +msgstr "start-prefix" + +#: ../ardour_ui_ed.cc:175 +msgid "Quit" +msgstr "Avsluta" + +#. windows visibility actions +#: ../ardour_ui_ed.cc:179 +msgid "Maximise Editor Space" +msgstr "Fullskärmsläge" + +#: ../ardour_ui_ed.cc:181 +msgid "Show Editor" +msgstr "Visa Redigerare" + +#: ../ardour_ui_ed.cc:182 +msgid "Show Mixer" +msgstr "Visa Mixer" + +#: ../ardour_ui_ed.cc:184 +msgid "Options Editor" +msgstr "Inställningar" + +#: ../ardour_ui_ed.cc:185 +msgid "Track/Bus Inspector" +msgstr "SpÃ¥r/Buss-inspektör" + +#: ../ardour_ui_ed.cc:187 +msgid "Connections" +msgstr "Anslutningar" + +#: ../ardour_ui_ed.cc:189 +msgid "Locations" +msgstr "Platser" + +#: ../ardour_ui_ed.cc:191 +msgid "Big Clock" +msgstr "Stor klocka" + +#: ../ardour_ui_ed.cc:193 +msgid "About" +msgstr "Om" + +#: ../ardour_ui_ed.cc:194 +msgid "Colors" +msgstr "Färger" + +#: ../ardour_ui_ed.cc:196 +msgid "Add Audio Track" +msgstr "Lägg till spÃ¥r" + +#: ../ardour_ui_ed.cc:198 +msgid "Add Audio Bus" +msgstr "Lägg till buss" + +#: ../ardour_ui_ed.cc:200 +msgid "Save" +msgstr "Spara" + +#: ../ardour_ui_ed.cc:202 ../editor_actions.cc:254 +msgid "Remove Last Capture" +msgstr "Ta bort senaste inspelningen" + +#. do-nothing action for the "transport" menu bar item +#: ../ardour_ui_ed.cc:209 +msgid "Transport" +msgstr "Uppspelning" + +#. these two are not used by key bindings, instead use ToggleRoll for that. these two do show up in +#. menus and via button proxies. +#. +#: ../ardour_ui_ed.cc:215 ../sfdb_ui.cc:56 +msgid "Stop" +msgstr "Stopp" + +#: ../ardour_ui_ed.cc:218 +msgid "Roll" +msgstr "" + +#: ../ardour_ui_ed.cc:222 +msgid "Start/Stop" +msgstr "Start/Stopp" + +#: ../ardour_ui_ed.cc:225 +msgid "Stop + Forget Capture" +msgstr "Stanna + Glöm inspelning" + +#: ../ardour_ui_ed.cc:228 +msgid "Play Loop Range" +msgstr "Spela loop-omfÃ¥ng" + +#: ../ardour_ui_ed.cc:231 +msgid "Play Selection" +msgstr "Spela markering" + +#: ../ardour_ui_ed.cc:235 +msgid "Enable Record" +msgstr "TillÃ¥t inspelning" + +#: ../ardour_ui_ed.cc:238 +msgid "Rewind" +msgstr "BakÃ¥tspolning" + +#: ../ardour_ui_ed.cc:241 +msgid "Rewind (Slow)" +msgstr "BakÃ¥tspolning (lÃ¥ngsam)" + +#: ../ardour_ui_ed.cc:244 +msgid "Rewind (Fast)" +msgstr "BakÃ¥tspolning (snabb)" + +#: ../ardour_ui_ed.cc:247 +msgid "Forward" +msgstr "Framspolning" + +#: ../ardour_ui_ed.cc:250 +msgid "Forward (Slow)" +msgstr "Framspolning (lÃ¥ngsam)" + +#: ../ardour_ui_ed.cc:253 +msgid "Forward (Fast)" +msgstr "Framspolning (snabb)" + +#: ../ardour_ui_ed.cc:256 +msgid "Goto Zero" +msgstr "GÃ¥ till noll" + +#: ../ardour_ui_ed.cc:259 +msgid "Goto Start" +msgstr "GÃ¥ till början" + +#: ../ardour_ui_ed.cc:262 +msgid "Goto End" +msgstr "GÃ¥ till slutet" + +#. XXX the newline in the displayed names of these action is really wrong, but its because we want the button +#. that proxies for these action to be more compact. It would be nice to find a way to override the action +#. name appearance on the buttons. +#. + +#: gtk2_ardour/ardour_ui.cc:119 gtk2_ardour/ardour_ui_ed.cc:267 +msgid "Punch In" +msgstr "Punch-in" + +#: gtk2_ardour/ardour_ui.cc:120 gtk2_ardour/ardour_ui_ed.cc:270 +msgid "Punch Out" +msgstr "Punch-ut" + +#: gtk2_ardour/ardour_ui.cc:121 gtk2_ardour/ardour_ui_ed.cc:282 +msgid "Auto Return" +msgstr "AutoÃ¥tervänd" + +#: gtk2_ardour/ardour_ui.cc:122 +msgid "Auto Play" +msgstr "Autospela" + +#: gtk2_ardour/ardour_ui.cc:123 gtk2_ardour/ardour_ui_ed.cc:276 +msgid "Auto Input" +msgstr "Autoinljud" + +#: gtk2_ardour/ardour_ui.cc:124 gtk2_ardour/ardour_ui_ed.cc:273 +#: gtk2_ardour/option_editor.cc:128 +msgid "Click" +msgstr "Klick" + +#: gtk2_ardour/ardour_ui_ed.cc:287 +msgid "Time master" +msgstr "Huvudklocka" + +#: gtk2_ardour/ardour_ui_ed.cc:290 +msgid "Sync startup to video" +msgstr "Synka start till video" + +#: ../ardour_ui_ed.cc:293 +msgid "Toggle Record Enable Track1" +msgstr "Ändra inspelningsläge för SpÃ¥r1" + +#: ../ardour_ui_ed.cc:295 +msgid "Toggle Record Enable Track2" +msgstr "Ändra inspelningsläge för SpÃ¥r2" + +#: ../ardour_ui_ed.cc:297 +msgid "Toggle Record Enable Track3" +msgstr "Ändra inspelningsläge för SpÃ¥r3" + +#: ../ardour_ui_ed.cc:299 +msgid "Toggle Record Enable Track4" +msgstr "Ändra inspelningsläge för SpÃ¥r4" + +#: ../ardour_ui_ed.cc:301 +msgid "Toggle Record Enable Track5" +msgstr "Ändra inspelningsläge för SpÃ¥r5" + +#: ../ardour_ui_ed.cc:303 +msgid "Toggle Record Enable Track6" +msgstr "Ändra inspelningsläge för SpÃ¥r6" + +#: ../ardour_ui_ed.cc:305 +msgid "Toggle Record Enable Track7" +msgstr "Ändra inspelningsläge för SpÃ¥r7" + +#: ../ardour_ui_ed.cc:307 +msgid "Toggle Record Enable Track8" +msgstr "Ändra inspelningsläge för SpÃ¥r8" + +#: ../ardour_ui_ed.cc:309 +msgid "Toggle Record Enable Track9" +msgstr "Ändra inspelningsläge för SpÃ¥r9" + +#: ../ardour_ui_ed.cc:311 +msgid "Toggle Record Enable Track10" +msgstr "Ändra inspelningsläge för SpÃ¥r10" + +#: ../ardour_ui_ed.cc:313 +msgid "Toggle Record Enable Track11" +msgstr "Ändra inspelningsläge för SpÃ¥r11" + +#: ../ardour_ui_ed.cc:315 +msgid "Toggle Record Enable Track12" +msgstr "Ändra inspelningsläge för SpÃ¥r12" + +#: ../ardour_ui_ed.cc:317 +msgid "Toggle Record Enable Track13" +msgstr "Ändra inspelningsläge för SpÃ¥r13" + +#: ../ardour_ui_ed.cc:319 +msgid "Toggle Record Enable Track14" +msgstr "Ändra inspelningsläge för SpÃ¥r14" + +#: ../ardour_ui_ed.cc:321 +msgid "Toggle Record Enable Track15" +msgstr "Ändra inspelningsläge för SpÃ¥r15" + +#: ../ardour_ui_ed.cc:323 +msgid "Toggle Record Enable Track16" +msgstr "Ändra inspelningsläge för SpÃ¥r16" + +#: ../ardour_ui_ed.cc:325 +msgid "Toggle Record Enable Track17" +msgstr "Ändra inspelningsläge för SpÃ¥r17" + +#: ../ardour_ui_ed.cc:327 +msgid "Toggle Record Enable Track18" +msgstr "Ändra inspelningsläge för SpÃ¥r18" + +#: ../ardour_ui_ed.cc:329 +msgid "Toggle Record Enable Track19" +msgstr "Ändra inspelningsläge för SpÃ¥r19" + +#: ../ardour_ui_ed.cc:331 +msgid "Toggle Record Enable Track20" +msgstr "Ändra inspelningsläge för SpÃ¥r20" + +#: ../ardour_ui_ed.cc:333 +msgid "Toggle Record Enable Track21" +msgstr "Ändra inspelningsläge för SpÃ¥r21" + +#: ../ardour_ui_ed.cc:335 +msgid "Toggle Record Enable Track22" +msgstr "Ändra inspelningsläge för SpÃ¥r22" + +#: ../ardour_ui_ed.cc:337 +msgid "Toggle Record Enable Track23" +msgstr "Ändra inspelningsläge för SpÃ¥r23" + +#: ../ardour_ui_ed.cc:339 +msgid "Toggle Record Enable Track24" +msgstr "Ändra inspelningsläge för SpÃ¥r24" + +#: ../ardour_ui_ed.cc:341 +msgid "Toggle Record Enable Track25" +msgstr "Ändra inspelningsläge för SpÃ¥r25" + +#: ../ardour_ui_ed.cc:343 +msgid "Toggle Record Enable Track26" +msgstr "Ändra inspelningsläge för SpÃ¥r26" + +#: ../ardour_ui_ed.cc:345 +msgid "Toggle Record Enable Track27" +msgstr "Ändra inspelningsläge för SpÃ¥r27" + +#: ../ardour_ui_ed.cc:347 +msgid "Toggle Record Enable Track28" +msgstr "Ändra inspelningsläge för SpÃ¥r28" + +#: ../ardour_ui_ed.cc:349 +msgid "Toggle Record Enable Track29" +msgstr "Ändra inspelningsläge för SpÃ¥r29" + +#: ../ardour_ui_ed.cc:351 +msgid "Toggle Record Enable Track30" +msgstr "Ändra inspelningsläge för SpÃ¥r30" + +#: ../ardour_ui_ed.cc:353 +msgid "Toggle Record Enable Track31" +msgstr "Ändra inspelningsläge för SpÃ¥r31" + +#: ../ardour_ui_ed.cc:355 +msgid "Toggle Record Enable Track32" +msgstr "Ändra inspelningsläge för SpÃ¥r32" + +#: ../ardour_ui_ed.cc:360 +msgid "Percentage" +msgstr "Procent" + +#: ../ardour_ui_ed.cc:361 +msgid "Semitones" +msgstr "Halvtoner" + +#: ../ardour_ui_ed.cc:365 +msgid "Send MTC" +msgstr "Skicka MTC" + +#: ../ardour_ui_ed.cc:367 +msgid "Send MMC" +msgstr "Skicka MMC" + +#: ../ardour_ui_ed.cc:369 +msgid "Use MMC" +msgstr "Använd MMC" + +#: ../ardour_ui_ed.cc:371 +msgid "Send MIDI feedback" +msgstr "Skicka MIDI-gensvar" + +#: ../ardour_ui_ed.cc:373 +msgid "Use MIDI control" +msgstr "Använd MIDI-kontroll" + +#: gtk2_ardour/ardour_ui_ed.cc:437 +msgid "Auto-connect inputs to physical inputs" +msgstr "Anslut automatiskt ingÃ¥ngar till fysiska ingÃ¥ngar" + +#: gtk2_ardour/ardour_ui_ed.cc:439 +msgid "Manually connect inputs" +msgstr "Anslut ingÃ¥ngar manuellt" + +#: gtk2_ardour/ardour_ui_ed.cc:444 +msgid "Auto-connect outputs to physical outs" +msgstr "Anslut automatiskt utgÃ¥ngar till fysiska utgÃ¥ngar" + +#: gtk2_ardour/ardour_ui_ed.cc:446 +msgid "Auto-connect outputs to master bus" +msgstr "Ansluta automatiskt utgÃ¥ngar till master-bussen" + +#: gtk2_ardour/ardour_ui_ed.cc:448 +msgid "Manually connect outputs" +msgstr "Anslut utgÃ¥ngar manuellt" + +#: ../ardour_ui_ed.cc:376 +msgid "Connect new track inputs to hardware" +msgstr "Koppla nya ingÃ¥ngar till hÃ¥rdvara" + +#: ../ardour_ui_ed.cc:394 +msgid "Connect new track outputs to hardware" +msgstr "Koppla nya utgÃ¥ngar till hÃ¥rdvara" + +#: ../ardour_ui_ed.cc:396 +msgid "Connect new track outputs to master" +msgstr "Koppla nya utgÃ¥ngar till master" + +#: ../ardour_ui_ed.cc:398 +msgid "Manually connect new track outputs" +msgstr "Manuell koppling av nya utgÃ¥ngar" + +#: ../ardour_ui_ed.cc:403 +msgid "Hardware monitoring" +msgstr "HÃ¥rdvarumedhörning" + +#: ../ardour_ui_ed.cc:404 +msgid "Software monitoring" +msgstr "Mjukvarumedhörning" + +#: ../ardour_ui_ed.cc:405 +msgid "External monitoring" +msgstr "Extern medhörning" + +#. Configuration object options (i.e. not session specific) +#: ../ardour_ui_ed.cc:409 +msgid "Stop plugins with transport" +msgstr "Stoppa insticksprogram vid stopp" + +#: ../ardour_ui_ed.cc:410 +msgid "Verify remove last capture" +msgstr "Bekräfta borttagning av senaste inspelade ljudet" + +#: ../ardour_ui_ed.cc:411 +msgid "Stop recording on xrun" +msgstr "Stanna inspelning vid xrun-förekomst" + +#: ../ardour_ui_ed.cc:412 +msgid "Stop transport at session end" +msgstr "Stanna uppspelning vid slutet av sessionen" + +#: ../ardour_ui_ed.cc:413 +msgid "-12dB gain reduce ffwd/rewind" +msgstr "-12dB volymreduktion för snabbspolning" + +#: ../ardour_ui_ed.cc:414 +msgid "Rec-enable stays engaged at stop" +msgstr "Inspelningsläge ändras ej vid stopp" + +#. session options +#: ../ardour_ui_ed.cc:418 +msgid "Do not run plugins while recording" +msgstr "Kör ej insticksprogram vid inspelning" + +#: ../ardour_ui_ed.cc:421 +msgid "Latched solo" +msgstr "LÃ¥st solo" + +#: ../ardour_ui_ed.cc:426 +msgid "Solo in-place" +msgstr "In place-solo " + +#: ../ardour_ui_ed.cc:428 +msgid "Solo via bus" +msgstr "Solo via buss" + +#: ../ardour_ui_ed.cc:431 +msgid "Automatically create crossfades" +msgstr "Skapa övertoningar automatiskt" + +#: ../ardour_ui_ed.cc:433 +msgid "Unmute new full crossfades" +msgstr "Nya fulla övertoningar är pÃ¥slagna" + +#: gtk2_ardour/ardour_ui_options.cc:490 +msgid "ST" +msgstr "HT" + +#: ../ardour_ui_options.cc:407 ../ardour_ui_options.cc:417 +#: ../ardour_ui_options.cc:484 +msgid "Internal" +msgstr "Intern" + +#: ../ardour_ui_options.cc:408 ../ardour_ui_options.cc:487 +msgid "MTC" +msgstr "" + +#: ../audio_clock.cc:1720 ../editor.cc:187 +msgid "SMPTE" +msgstr "" + +#: ../audio_clock.cc:1721 ../editor.cc:186 ../editor_rulers.cc:359 +msgid "Bars:Beats" +msgstr "Takt:Slag" + +#: ../audio_clock.cc:1722 +msgid "Minutes:Seconds" +msgstr "Minuter:Sekunder" + +#: ../audio_clock.cc:1723 +msgid "Audio Frames" +msgstr "" + +#. +#. Slowest = 6.6dB/sec falloff at update rate of 40ms +#. Slow = 6.8dB/sec falloff at update rate of 40ms +#. +#: ../audio_clock.cc:1724 ../editor_actions.cc:374 ../editor_actions.cc:382 +#: ../gain_meter.cc:171 ../panner_ui.cc:88 ../plugin_ui.cc:391 +#: ../plugin_ui.cc:634 +msgid "Off" +msgstr "Av" + +#: ../audio_clock.cc:1726 +msgid "Mode" +msgstr "Visningsläge" + +#: ../audio_time_axis.cc:90 +msgid "m" +msgstr "" + +#: ../audio_time_axis.cc:90 +msgid "s" +msgstr "" + +#: ../audio_time_axis.cc:90 +msgid "r" +msgstr "" + +#: ../audio_time_axis.cc:94 +msgid "g" +msgstr "" + +#. group +#: ../audio_time_axis.cc:95 +msgid "p" +msgstr "" + +#: ../audio_time_axis.cc:96 ../automation_time_axis.cc:31 +#: ../visual_time_axis.cc:73 +msgid "h" +msgstr "" + +#. height +#: ../audio_time_axis.cc:97 +msgid "a" +msgstr "" + +#: ../audio_time_axis.cc:98 ../visual_time_axis.cc:72 +msgid "v" +msgstr "" + +#: ../audio_time_axis.cc:167 ../mixer_strip.cc:85 +msgid "Record" +msgstr "Spela in" + +#: ../audio_time_axis.cc:168 ../editor_actions.cc:36 ../mixer_strip.cc:85 +msgid "Solo" +msgstr "" + +#: ../audio_time_axis.cc:169 ../editor.cc:1759 ../editor.cc:1858 +#: ../mixer_strip.cc:85 ../panner_ui.cc:426 +msgid "Mute" +msgstr "Tysta" + +#: ../audio_time_axis.cc:170 +msgid "Edit Group" +msgstr "Redigera Grupp" + +#: ../audio_time_axis.cc:171 ../visual_time_axis.cc:91 +msgid "Display Height" +msgstr "Visningshöjd" + +#: ../audio_time_axis.cc:172 +msgid "Playlist" +msgstr "Spellista" + +#: ../audio_time_axis.cc:173 ../audio_time_axis.cc:740 +msgid "Automation" +msgstr "Automatisering" + +#: ../audio_time_axis.cc:174 ../visual_time_axis.cc:92 +msgid "Visual options" +msgstr "Visuella inställningar" + +#: ../audio_time_axis.cc:175 ../visual_time_axis.cc:93 +msgid "Hide this track" +msgstr "Dölj detta spÃ¥r" + +#: ../audio_time_axis.cc:332 ../mixer_strip.cc:927 +msgid "No group" +msgstr "Ingen grupp" + +#: ../audio_time_axis.cc:701 ../automation_time_axis.cc:449 +#: ../imageframe_time_axis.cc:254 ../marker_time_axis.cc:210 +msgid "Height" +msgstr "Höjd" + +#: ../audio_time_axis.cc:702 ../color_manager.cc:40 +#: ../imageframe_time_axis.cc:255 ../marker_time_axis.cc:211 +msgid "Color" +msgstr "Färg" + +#: ../audio_time_axis.cc:706 +msgid "Hide all crossfades" +msgstr "Dölj alla övertoningar" + +#: ../audio_time_axis.cc:707 +msgid "Show all crossfades" +msgstr "Visa alla övertoningar" + +#: ../audio_time_axis.cc:711 ../mixer_strip.cc:1011 +msgid "Remote Control ID" +msgstr "Fjärrstyrnings-ID" + +#: ../audio_time_axis.cc:717 +msgid "Show all automation" +msgstr "Visa all automatisering" + +#: ../audio_time_axis.cc:720 +msgid "Show existing automation" +msgstr "Visa existerande automatisering" + +#: ../audio_time_axis.cc:723 +msgid "Hide all automation" +msgstr "Göm all automatisering" + +#: ../audio_time_axis.cc:728 +msgid "Fader" +msgstr "Volym" + +#: ../audio_time_axis.cc:733 +msgid "Pan" +msgstr "Panorering" + +#: ../audio_time_axis.cc:738 +msgid "Plugins" +msgstr "Insticksprogram" + +#: ../audio_time_axis.cc:746 +msgid "Show waveforms" +msgstr "Visa vÃ¥gformer" + +#: ../audio_time_axis.cc:754 +msgid "Traditional" +msgstr "Traditionell" + +#: ../audio_time_axis.cc:757 +msgid "Rectified" +msgstr "Korrigerad" + +#: ../audio_time_axis.cc:760 +msgid "Waveform" +msgstr "VÃ¥gform" + +#: ../audio_time_axis.cc:770 +msgid "Align with existing material" +msgstr "Efter existerande material" + +#: ../audio_time_axis.cc:775 +msgid "Align with capture time" +msgstr "Efter inspelningstiden" + +#: ../audio_time_axis.cc:781 +msgid "Alignment" +msgstr "Justera" + +#: ../audio_time_axis.cc:787 ../editor.cc:526 ../editor_actions.cc:59 +#: ../mixer_strip.cc:1000 ../mixer_ui.cc:110 +msgid "Active" +msgstr "Aktiva" + +#: ../audio_time_axis.cc:792 ../editor.cc:1921 ../editor_actions.cc:319 +#: ../editor_markers.cc:507 ../imageframe_time_axis.cc:258 +#: ../location_ui.cc:56 ../marker_time_axis.cc:214 ../mixer_strip.cc:1014 +msgid "Remove" +msgstr "Ta bort" + +#: ../audio_time_axis.cc:832 +msgid "Name for playlist" +msgstr "Spellistans namn" + +#: ../audio_time_axis.cc:834 ../audio_time_axis.cc:1850 +#: ../editor_markers.cc:826 ../editor_mouse.cc:4672 +#: ../imageframe_time_axis.cc:247 ../marker_time_axis.cc:207 +#: ../meter_bridge_strip.cc:223 ../mixer_strip.cc:998 ../redirect_box.cc:750 +#: ../redirect_box.cc:1064 ../route_ui.cc:732 ../visual_time_axis.cc:325 +msgid "Rename" +msgstr "Döp om" + +#: ../audio_time_axis.cc:867 ../audio_time_axis.cc:907 +msgid "Name for Playlist" +msgstr "Spellistans namn" + +#: ../audio_time_axis.cc:1125 ../visual_time_axis.cc:382 +msgid "a track already exists with that name" +msgstr "ett spÃ¥r med det namnet existerar redan" + +#: ../audio_time_axis.cc:1166 ../editor.cc:217 +msgid "gain" +msgstr "volym" + +#: ../audio_time_axis.cc:1206 +msgid "pan" +msgstr "panorering" + +#: ../audio_time_axis.cc:1409 ../editor.cc:1482 ../selection.cc:633 +msgid "programming error: " +msgstr "programmeringsfel: " + +#: ../audio_time_axis.cc:1847 +msgid "Current: %1" +msgstr "Aktuell: %1" + +#: ../audio_time_axis.cc:1854 +msgid "New Copy" +msgstr "Ny kopia" + +#: ../audio_time_axis.cc:1856 +msgid "Clear Current" +msgstr "Rensa aktuell" + +#: ../audio_time_axis.cc:1858 ../editor.cc:2023 ../editor.cc:2099 +msgid "Select" +msgstr "Välj" + +#: ../automation_line.cc:883 +msgid "automation event move" +msgstr "automatiseringshändelse: förflyttning" + +#: ../automation_line.cc:885 +msgid "automation range drag" +msgstr "automatiseringsomfÃ¥ng: dragning" + +#: ../automation_line.cc:1014 ../region_gain_line.cc:61 +msgid "remove control point" +msgstr "ta bort kontrollpunkt" + +#: ../automation_time_axis.cc:32 ../editor_ops.cc:2886 +msgid "clear" +msgstr "rensa" + +#: ../automation_time_axis.cc:74 +msgid "track height" +msgstr "spÃ¥rhöjd" + +#: ../automation_time_axis.cc:75 +msgid "automation state" +msgstr "automatiseringstillstÃ¥nd" + +#: ../automation_time_axis.cc:76 +msgid "clear track" +msgstr "rensa spÃ¥r" + +#: ../automation_time_axis.cc:77 +msgid "hide track" +msgstr "dölj spÃ¥r" + +#: ../automation_time_axis.cc:183 ../automation_time_axis.cc:212 +#: ../automation_time_axis.cc:460 +msgid "Manual" +msgstr "Manuell" + +#: ../automation_time_axis.cc:185 ../automation_time_axis.cc:223 +#: ../automation_time_axis.cc:464 ../editor.cc:2000 ../editor.cc:2081 +#: ../gain_meter.cc:173 ../panner_ui.cc:90 ../plugin_ui.cc:394 +#: ../plugin_ui.cc:636 ../sfdb_ui.cc:55 +msgid "Play" +msgstr "Spela" + +#: ../automation_time_axis.cc:187 ../automation_time_axis.cc:234 +#: ../automation_time_axis.cc:468 ../gain_meter.cc:175 ../panner_ui.cc:92 +#: ../plugin_ui.cc:397 ../plugin_ui.cc:638 +msgid "Write" +msgstr "Skriv" + +#: ../automation_time_axis.cc:189 ../automation_time_axis.cc:245 +#: ../automation_time_axis.cc:472 ../gain_meter.cc:177 ../panner_ui.cc:94 +#: ../plugin_ui.cc:400 ../plugin_ui.cc:640 +msgid "Touch" +msgstr "Beröring" + +#: ../automation_time_axis.cc:256 ../option_editor.cc:182 +#: ../option_editor.cc:188 ../plugin_ui.cc:403 +msgid "???" +msgstr "" + +#: ../automation_time_axis.cc:270 +msgid "clear automation" +msgstr "rensa automatisering" + +#: ../automation_time_axis.cc:451 ../editor_actions.cc:317 +msgid "Hide" +msgstr "Göm" + +#: ../automation_time_axis.cc:453 ../crossfade_edit.cc:76 +#: ../redirect_box.cc:1056 +msgid "Clear" +msgstr "Rensa" + +#: ../automation_time_axis.cc:476 +msgid "State" +msgstr "TillstÃ¥nd" + +#: ../canvas-imageframe.c:104 +msgid "pixbuf" +msgstr "" + +#: ../canvas-imageframe.c:105 +msgid "the pixbuf" +msgstr "" + +#: ../canvas-imageframe.c:110 +msgid "x" +msgstr "" + +#: ../canvas-imageframe.c:111 ../canvas-simpleline.c:111 +#: ../canvas-simplerect.c:107 +msgid "x coordinate of upper left corner of rect" +msgstr "" + +#: ../canvas-imageframe.c:120 +msgid "y" +msgstr "" + +#: ../canvas-imageframe.c:121 ../canvas-simpleline.c:121 +#: ../canvas-simplerect.c:117 +msgid "y coordinate of upper left corner of rect " +msgstr "" + +#: ../canvas-imageframe.c:129 +msgid "width" +msgstr "bredd" + +#: ../canvas-imageframe.c:130 +msgid "the width" +msgstr "bredden" + +#: ../canvas-imageframe.c:139 +msgid "drawwidth" +msgstr "" + +#: ../canvas-imageframe.c:140 +msgid "drawn width" +msgstr "uppritningsbredd" + +#: ../canvas-imageframe.c:148 +msgid "height" +msgstr "höjd" + +#: ../canvas-imageframe.c:149 +msgid "the height" +msgstr "höjden" + +#: ../canvas-imageframe.c:157 +msgid "anchor" +msgstr "ankare" + +#: ../canvas-imageframe.c:158 +msgid "the anchor" +msgstr "ankaret" + +#: ../canvas-simpleline.c:110 ../canvas-simplerect.c:106 +msgid "x1" +msgstr "" + +#: ../canvas-simpleline.c:120 ../canvas-simplerect.c:116 +msgid "y1" +msgstr "" + +#: ../canvas-simpleline.c:131 ../canvas-simplerect.c:127 +msgid "x2" +msgstr "" + +#: ../canvas-simpleline.c:132 ../canvas-simplerect.c:128 +msgid "x coordinate of lower right corner of rect" +msgstr "" + +#: ../canvas-simpleline.c:141 ../canvas-simplerect.c:137 +msgid "y2" +msgstr "" + +#: ../canvas-simpleline.c:142 ../canvas-simplerect.c:138 +msgid "y coordinate of lower right corner of rect " +msgstr "" + +#: ../canvas-simpleline.c:150 +msgid "color rgba" +msgstr "" + +#: ../canvas-simpleline.c:151 +msgid "color of line" +msgstr "" + +#: ../canvas-simplerect.c:148 +msgid "outline pixels" +msgstr "" + +#: ../canvas-simplerect.c:149 +msgid "width in pixels of outline" +msgstr "" + +#: ../canvas-simplerect.c:159 +msgid "outline what" +msgstr "" + +#: ../canvas-simplerect.c:160 +msgid "which boundaries to outline (mask)" +msgstr "" + +#: ../canvas-simplerect.c:171 +msgid "fill" +msgstr "" + +#: ../canvas-simplerect.c:172 +msgid "fill rectangle" +msgstr "" + +#: ../canvas-simplerect.c:179 +msgid "draw" +msgstr "" + +#: ../canvas-simplerect.c:180 +msgid "draw rectangle" +msgstr "" + +#: ../canvas-simplerect.c:188 +msgid "outline color rgba" +msgstr "" + +#: ../canvas-simplerect.c:189 +msgid "color of outline" +msgstr "" + +#: ../canvas-simplerect.c:199 +msgid "fill color rgba" +msgstr "" + +#: ../canvas-simplerect.c:200 +msgid "color of fill" +msgstr "" + +#: ../color_manager.cc:39 +msgid "Object" +msgstr "Objekt" + +#: ../color_manager.cc:77 +msgid "cannot open color definition file %1: %2" +msgstr "kan ej öppna färgdefinitionsfil %1: %2" + +#: ../crossfade_edit.cc:73 +msgid "ardour: x-fade edit" +msgstr "ardour: övertoningsredigerare" + +#: ../crossfade_edit.cc:77 ../panner_ui.cc:442 +msgid "Reset" +msgstr "Nollställ" + +#: ../crossfade_edit.cc:78 +msgid "Fade" +msgstr "Tona" + +#: ../crossfade_edit.cc:79 +msgid "Out (dry)" +msgstr "Ut (torr)" + +#: ../crossfade_edit.cc:80 +msgid "Out" +msgstr "Ut" + +#: ../crossfade_edit.cc:81 +msgid "In (dry)" +msgstr "In (torr)" + +#: ../crossfade_edit.cc:82 +msgid "In" +msgstr "" + +#: ../crossfade_edit.cc:84 +msgid "With Pre-roll" +msgstr "Med För-rull" + +#: ../crossfade_edit.cc:85 +msgid "With Post-roll" +msgstr "Med Efter-rull" + +#: ../crossfade_edit.cc:93 +msgid "Fade In" +msgstr "Tona In" + +#: ../crossfade_edit.cc:94 +msgid "Fade Out" +msgstr "Tona Ut" + +#: ../crossfade_edit.cc:170 ../editor.cc:1834 ../editor_actions.cc:315 +#: ../option_editor.cc:129 +msgid "Audition" +msgstr "Avlyssna" + + +#: gtk2_ardour/editor.cc:105 gtk2_ardour/editor.cc:3517 +msgid "Slide Edit" +msgstr "Glidred." + +#: gtk2_ardour/editor.cc:106 gtk2_ardour/editor.cc:3515 +msgid "Splice Edit" +msgstr "Fogred." + +#: gtk2_ardour/editor.cc:111 gtk2_ardour/editor.cc:3572 +#: gtk2_ardour/export_dialog.cc:78 gtk2_ardour/export_dialog.cc:92 +#: gtk2_ardour/export_dialog.cc:893 gtk2_ardour/export_dialog.cc:1225 +#: gtk2_ardour/route_ui.cc:438 +msgid "None" +msgstr "Ingen" + +#: gtk2_ardour/editor.cc:112 gtk2_ardour/editor.cc:3560 +msgid "CD Frames" +msgstr "CD-frames" + +#: gtk2_ardour/editor.cc:113 gtk2_ardour/editor.cc:3562 +msgid "SMPTE Frames" +msgstr "SMPTE-frames" + +#: gtk2_ardour/editor.cc:114 gtk2_ardour/editor.cc:3564 +msgid "SMPTE Seconds" +msgstr "SMPTE-sekunder" + +#: gtk2_ardour/editor.cc:115 gtk2_ardour/editor.cc:3566 +msgid "SMPTE Minutes" +msgstr "SMPTE-minuter" + +#: gtk2_ardour/editor.cc:116 gtk2_ardour/editor.cc:3568 +msgid "Seconds" +msgstr "Sekunder" + +#: gtk2_ardour/editor.cc:117 gtk2_ardour/editor.cc:3570 +msgid "Minutes" +msgstr "Minuter" + +#: gtk2_ardour/editor.cc:109 gtk2_ardour/editor.cc:3464 +msgid "Beats/32" +msgstr "Slag/32" + +#: gtk2_ardour/editor.cc:119 gtk2_ardour/editor.cc:3540 +msgid "Beats/16" +msgstr "Slag/16" + +#: gtk2_ardour/editor.cc:120 gtk2_ardour/editor.cc:3538 +msgid "Beats/8" +msgstr "Slag/8" + +#: gtk2_ardour/editor.cc:121 gtk2_ardour/editor.cc:3536 +msgid "Beats/4" +msgstr "Slag/4" + +#: gtk2_ardour/editor.cc:122 gtk2_ardour/editor.cc:3534 +msgid "Beats/3" +msgstr "Slag/3" + +#: gtk2_ardour/editor.cc:123 gtk2_ardour/editor.cc:3544 +msgid "Beats" +msgstr "Slag" + +#: gtk2_ardour/editor.cc:124 gtk2_ardour/editor.cc:3546 +msgid "Bars" +msgstr "Takter" + +#: gtk2_ardour/editor.cc:125 gtk2_ardour/editor.cc:3548 +msgid "Marks" +msgstr "Markörer" + +#: gtk2_ardour/editor.cc:126 gtk2_ardour/editor.cc:3550 +msgid "Edit Cursor" +msgstr "Redigeringsmarkör" + +#: gtk2_ardour/editor.cc:127 gtk2_ardour/editor.cc:3552 +msgid "Region starts" +msgstr "Region börjar" + +#: gtk2_ardour/editor.cc:128 gtk2_ardour/editor.cc:3554 +msgid "Region ends" +msgstr "Region slutar" + +#: gtk2_ardour/editor.cc:129 gtk2_ardour/editor.cc:3558 +msgid "Region syncs" +msgstr "Region synkar" + +#: gtk2_ardour/editor.cc:130 gtk2_ardour/editor.cc:3556 +msgid "Region bounds" +msgstr "Region gränsar" + +#: gtk2_ardour/editor.cc:126 gtk2_ardour/editor.cc:3511 +msgid "Normal Snap" +msgstr "Vanligt fästläge " + +#: gtk2_ardour/editor.cc:127 gtk2_ardour/editor.cc:3513 +msgid "Magnetic Snap" +msgstr "Magnetiskt fästläge" + +#: gtk2_ardour/editor.cc:132 gtk2_ardour/editor.cc:3530 +msgid "Focus Left" +msgstr "Fokus: vänster" + +#: gtk2_ardour/editor.cc:133 gtk2_ardour/editor.cc:3532 +msgid "Focus Right" +msgstr "Fokus: höger" + +#: gtk2_ardour/editor.cc:134 gtk2_ardour/editor.cc:3534 +msgid "Focus Center" +msgstr "Fokus: mitten" + +#: gtk2_ardour/editor.cc:135 +msgid "Focus Play" +msgstr "Fokus: spelhuvud" + +#: gtk2_ardour/editor.cc:136 +msgid "Focus Edit" +msgstr "Fokus: redigeringsmarkör" + +#. time display buttons +#: ../editor.cc:185 +msgid "Mins:Secs" +msgstr "Min:Sek" + +#: ../editor.cc:188 ../editor_rulers.cc:353 +msgid "Frames" +msgstr "Rutor" + +#: ../editor.cc:189 ../editor_rulers.cc:373 +msgid "Tempo" +msgstr "" + +#: ../editor.cc:190 ../editor_rulers.cc:367 +msgid "Meter" +msgstr "Taktart" + +#: ../editor.cc:191 ../editor_rulers.cc:379 +msgid "Location Markers" +msgstr "Platsmarkörer" + +#: ../editor.cc:192 ../editor_rulers.cc:385 +msgid "Range Markers" +msgstr "OmfÃ¥ngsmarkörer" + +#: ../editor.cc:193 ../editor_rulers.cc:391 +msgid "Loop/Punch Ranges" +msgstr "Loop-/punch-markörer" + +#: ../editor.cc:215 +msgid "range" +msgstr "omfÃ¥ng" + +#: ../editor.cc:216 +msgid "object" +msgstr "objekt" + +#: ../editor.cc:218 +msgid "zoom" +msgstr "" + +#: ../editor.cc:219 +msgid "timefx" +msgstr "tidsfx" + +#: ../editor.cc:220 +msgid "listen" +msgstr "lyssna" + +#: ../editor.cc:222 +msgid "mode" +msgstr "läge" + +#: ../editor.cc:223 +msgid "automation" +msgstr "automatisering" + +#: ../editor.cc:225 +msgid "Edit Mode" +msgstr "Redigeringsläge" + +#: ../editor.cc:226 ../editor_actions.cc:283 +msgid "Snap To" +msgstr "Fäst mot" + +#: ../editor.cc:227 +msgid "Snap Mode" +msgstr "Fästläge" + +#: ../editor.cc:228 +msgid "Zoom Focus" +msgstr "Zoomfokus" + +#. </CMT Additions> +#. nudge +#: ../editor.cc:236 ../editor.cc:1899 ../editor.cc:2065 ../editor.cc:2121 +msgid "Nudge" +msgstr "Knuffa" + +#: ../editor.cc:469 +msgid "Zoom in" +msgstr "Zooma in" + +#: ../editor.cc:470 +msgid "Zoom out" +msgstr "Zooma ut" + +#: ../editor.cc:473 +msgid "Zoom to session" +msgstr "Zooma in/ut till hela sessionen" + +#: ../editor.cc:488 +msgid "Zoom Span" +msgstr "Zoom-räckvidd" + +#: ../editor.cc:501 ../editor.cc:527 ../editor_actions.cc:61 ../mixer_ui.cc:85 +#: ../mixer_ui.cc:111 +msgid "Visible" +msgstr "Synliga" + +#: ../editor.cc:502 ../editor.cc:525 +msgid "Name" +msgstr "Namn" + +#: ../editor.cc:601 ../editor.cc:668 +msgid "Regions" +msgstr "Regioner" + +#: ../editor.cc:641 ../editor.cc:680 +msgid "Chunks" +msgstr "Bitar" + +#: ../editor.cc:671 +msgid "Tracks/Busses" +msgstr "SpÃ¥r/Bussar" + +#: ../editor.cc:674 +msgid "Snapshots" +msgstr "Ögonblickskopior" + +#: ../editor.cc:677 +msgid "Edit Groups" +msgstr "Redigeringsgrupper" + +#: gtk2_ardour/editor.cc:680 +msgid "Nudge Region/Selection Forwards" +msgstr "Knuffa region/markering framÃ¥t" + +#: gtk2_ardour/editor.cc:681 +msgid "Nudge Region/Selection Backwards" +msgstr "Knuffa region/markering bakÃ¥t" + +#: ../editor.cc:734 ../editor_mixer.cc:299 +msgid "ardour: editor" +msgstr "ardour: redigerare" + +#: ../editor.cc:735 +msgid "ardour_editor" +msgstr "" + +#: ../editor.cc:1182 +msgid "ardour: editor: " +msgstr "ardour: redigerare: " + +#. force name +#: ../editor.cc:1267 ../editor.cc:1276 ../editor_markers.cc:869 +msgid "Loop" +msgstr "" + +#. force name +#: ../editor.cc:1281 ../editor.cc:1290 ../editor_markers.cc:895 +msgid "Punch" +msgstr "" + +#: ../editor.cc:1438 ../editor_mouse.cc:1741 +msgid "programming error: fade in canvas item has no regionview data pointer!" +msgstr "" + +#: ../editor.cc:1450 ../editor.cc:1467 ../redirect_box.cc:1072 +msgid "Deactivate" +msgstr "Avaktivera" + +#. activation +#: ../editor.cc:1452 ../editor.cc:1469 ../redirect_box.cc:1070 +msgid "Activate" +msgstr "Aktivera" + +#: ../editor.cc:1457 ../editor.cc:1474 +msgid "Linear" +msgstr "Linjär" + +#: ../editor.cc:1458 ../editor.cc:1475 ../editor_actions.cc:375 +msgid "Slowest" +msgstr "LÃ¥ngsammast" + +#: ../editor.cc:1459 ../editor.cc:1476 ../editor_actions.cc:376 +msgid "Slow" +msgstr "LÃ¥ngsam" + +#: ../editor.cc:1460 ../editor.cc:1477 ../editor_actions.cc:378 +msgid "Fast" +msgstr "Snabb" + +#: ../editor.cc:1461 ../editor.cc:1478 ../editor_actions.cc:380 +msgid "Fastest" +msgstr "Snabbast" + +#: ../editor.cc:1588 ../editor.cc:1596 +msgid "Freeze" +msgstr "Frys" + +#: ../editor.cc:1592 +msgid "Unfreeze" +msgstr "Ofrys" + +#: ../editor.cc:1761 ../editor.cc:1856 +msgid "Unmute" +msgstr "Sluta tysta" + +#. non-operative menu items for menu bar +#. show editors +#: ../editor.cc:1765 ../editor.cc:2045 ../editor.cc:2747 +#: ../editor_actions.cc:26 ../editor_markers.cc:506 ../mixer_strip.cc:495 +#: ../mixer_strip.cc:563 ../redirect_box.cc:1078 +msgid "Edit" +msgstr "Redigera" + +#: ../editor.cc:1770 +msgid "Convert to short" +msgstr "Konvertera till kort" + +#: ../editor.cc:1772 +msgid "Convert to full" +msgstr "Konvertera till full" + +#: ../editor.cc:1783 +msgid "Crossfade" +msgstr "Övertoning" + +#: ../editor.cc:1826 +msgid "Popup region editor" +msgstr "Visa regionsredigerare" + +#: ../editor.cc:1827 +msgid "Raise to top layer" +msgstr "Höj till översta lagret" + +#: ../editor.cc:1828 +msgid "Lower to bottom layer" +msgstr "Sänk till lägsta lagret" + +#: ../editor.cc:1830 +msgid "Define sync point" +msgstr "Definiera synk.-punkt" + +#: ../editor.cc:1831 +msgid "Remove sync point" +msgstr "Ta bort synk.-punkt" + +#: ../editor.cc:1836 +msgid "Bounce" +msgstr "Skriv till disk" + +#: ../editor.cc:1839 +msgid "Analyze region" +msgstr "Analysera regioner" + +#: ../editor.cc:1851 +msgid "Lock" +msgstr "LÃ¥s" + +#: ../editor.cc:1852 +msgid "Unlock" +msgstr "LÃ¥s upp" + +#: ../editor.cc:1862 +msgid "Original position" +msgstr "Ursprunglig position" + +#: ../editor.cc:1868 +msgid "Toggle envelope visibility" +msgstr "Ändra konvolutsvisning" + +#: ../editor.cc:1869 +msgid "Toggle envelope active" +msgstr "SlÃ¥ pÃ¥/av konvolut" + +#: ../editor.cc:1873 +msgid "DeNormalize" +msgstr "Avnormalisera" + +#: ../editor.cc:1875 +msgid "Normalize" +msgstr "Normalisera" + +#: ../editor.cc:1878 +msgid "Reverse" +msgstr "Motsatt riktning" + +#. range related stuff +#: ../editor.cc:1884 +msgid "Add Range Markers" +msgstr "Lägg till omfÃ¥ngsmarkörer" + +#: ../editor.cc:1885 +msgid "Set Range" +msgstr "Definiera omfÃ¥ng" + +#: ../editor.cc:1894 +msgid "Nudge fwd" +msgstr "Knuffa framÃ¥t" + +#: ../editor.cc:1895 +msgid "Nudge bwd" +msgstr "Knuffa bakÃ¥t" + +#: ../editor.cc:1896 +msgid "Nudge fwd by capture offset" +msgstr "Knuffa framÃ¥t utifrÃ¥n inspelningskompensation" + +#: ../editor.cc:1897 +msgid "Nudge bwd by capture offset" +msgstr "Knuffa bakÃ¥t utifrÃ¥n inspelningskompensation" + +#: ../editor.cc:1906 +msgid "Start to edit cursor" +msgstr "Början till redigeringsmarkören" + +#: ../editor.cc:1907 +msgid "Edit cursor to end" +msgstr "Redigeringsmarkör till slutet" + +#: ../editor.cc:1909 ../gain_meter.cc:180 ../gain_meter.cc:808 +#: ../panner_ui.cc:97 ../panner_ui.cc:802 +msgid "Trim" +msgstr "Beskära" + +#: ../editor.cc:1912 +msgid "Split" +msgstr "Dela" + +#: ../editor.cc:1915 +msgid "Make mono regions" +msgstr "Skapa monoregioner" + +#: ../editor.cc:1918 +msgid "Duplicate" +msgstr "Duplicera" + +#: ../editor.cc:1919 +msgid "Fill Track" +msgstr "Fyll spÃ¥ret" + +#: ../editor.cc:1923 +msgid "Destroy" +msgstr "Förstör" + +#: ../editor.cc:1953 +msgid "Play range" +msgstr "Spela omfÃ¥ng" + +#: ../editor.cc:1954 +msgid "Loop range" +msgstr "Loop-omfÃ¥ng" + +#: ../editor.cc:1958 +msgid "Analyze range" +msgstr "Analysera omfÃ¥ng" + +#: ../editor.cc:1962 +msgid "Separate range to track" +msgstr "Separera omfÃ¥ng till spÃ¥r" + +#: ../editor.cc:1963 +msgid "Separate range to region list" +msgstr "Separera omfÃ¥ng till regionlista" + +#: ../editor.cc:1966 +msgid "Select all in range" +msgstr "Välj allt i omfÃ¥ng" + +#: ../editor.cc:1968 ../editor.cc:2013 +msgid "Set range to loop range" +msgstr "Ställ in omfÃ¥ng till loop-omfÃ¥nget" + +#: ../editor.cc:1969 ../editor.cc:2014 +msgid "Set range to punch range" +msgstr "Ställ in omfÃ¥ng till punch-omfÃ¥nget" + +#: ../editor.cc:1971 +msgid "Crop region to range" +msgstr "Beskär region till omfÃ¥ng" + +#: ../editor.cc:1972 +msgid "Fill range with region" +msgstr "Fyll omfÃ¥ng med region" + +#: ../editor.cc:1973 +msgid "Duplicate range" +msgstr "Duplicera region" + +#: ../editor.cc:1974 +msgid "Create chunk from range" +msgstr "Skapa bit frÃ¥n omfÃ¥ng" + +#: ../editor.cc:1976 +msgid "Bounce range" +msgstr "OmfÃ¥ng till disk" + +#: ../editor.cc:1977 +msgid "Export range" +msgstr "Exportera omfÃ¥ng" + +#: ../editor.cc:1979 +msgid "Range" +msgstr "OmfÃ¥ng" + +#: ../editor.cc:1994 ../editor.cc:2079 +msgid "Play from edit cursor" +msgstr "Spela frÃ¥n redigeringsmarkören" + +#: ../editor.cc:1995 ../editor.cc:2080 +msgid "Play from start" +msgstr "Spela frÃ¥n början" + +#: ../editor.cc:1996 +msgid "Play region" +msgstr "Spela region" + +#: ../editor.cc:1998 +msgid "Loop Region" +msgstr "Loopa region" + +#: ../editor.cc:2008 ../editor.cc:2089 +msgid "Select All in track" +msgstr "Välj allt i spÃ¥ret" + +#: ../editor.cc:2009 ../editor.cc:2090 ../redirect_box.cc:1066 +msgid "Select All" +msgstr "Välj allt" + +#: ../editor.cc:2010 ../editor.cc:2091 +msgid "Invert selection in track" +msgstr "Invertera i spÃ¥ret" + +#: ../editor.cc:2011 ../editor.cc:2092 +msgid "Invert selection" +msgstr "Invertera" + +#: ../editor.cc:2016 ../editor.cc:2094 +msgid "Select all after edit cursor" +msgstr "Välj allt efter redigeringsmarkören" + +#: ../editor.cc:2017 ../editor.cc:2095 +msgid "Select all before edit cursor" +msgstr "Välj allt innan redigeringsmarkören" + +#: ../editor.cc:2018 ../editor.cc:2096 +msgid "Select all after playhead" +msgstr "Välj allt efter startmarkören" + +#: ../editor.cc:2019 ../editor.cc:2097 +msgid "Select all before playhead" +msgstr "Välj allt innan startmarkören" + +#: ../editor.cc:2020 +msgid "Select all between cursors" +msgstr "Välj allt mellan markörerna" + +#. standard editing stuff +#: ../editor.cc:2031 ../editor.cc:2107 ../editor.cc:3482 +#: ../editor_actions.cc:213 ../redirect_box.cc:1059 +msgid "Cut" +msgstr "Klipp" + +#: ../editor.cc:2032 ../editor.cc:2108 ../editor.cc:3484 +#: ../editor_actions.cc:218 ../redirect_box.cc:1061 +msgid "Copy" +msgstr "Kopiera" + +#: ../editor.cc:2033 +msgid "Paste at edit cursor" +msgstr "Klistra in vid redigeringsmarkören" + +#: ../editor.cc:2034 +msgid "Paste at mouse" +msgstr "Klistra in vid muspekaren" + +#: ../editor.cc:2038 ../editor.cc:3489 +msgid "Align" +msgstr "Justera" + +#: ../editor.cc:2039 ../editor.cc:3491 +msgid "Align Relative" +msgstr "Justera relativt" + +#: ../editor.cc:2043 +msgid "Insert chunk" +msgstr "Infoga bit" + +#: ../editor.cc:2050 +msgid "Insert Selected Region" +msgstr "Infoga vald region" + +#: ../editor.cc:2051 +msgid "Insert Existing Audio" +msgstr "Infoga ljudfil" + +#: ../editor.cc:2060 ../editor.cc:2116 +msgid "Nudge entire track fwd" +msgstr "Knuffa hela spÃ¥ret framÃ¥t" + +#: ../editor.cc:2061 ../editor.cc:2117 +msgid "Nudge track after edit cursor fwd" +msgstr "Knuffa spÃ¥ret framÃ¥t efter redigeringsmarkören" + +#: ../editor.cc:2062 ../editor.cc:2118 +msgid "Nudge entire track bwd" +msgstr "Knuffa hela spÃ¥ret bakÃ¥t" + +#: ../editor.cc:2063 ../editor.cc:2119 +msgid "Nudge track after edit cursor bwd" +msgstr "Knuffa spÃ¥ret bakÃ¥t efter redigeringsmarkören" + +#: ../editor.cc:2109 ../editor.cc:3486 ../editor_actions.cc:220 +#: ../redirect_box.cc:1063 +msgid "Paste" +msgstr "Klistra in" + +#: gtk2_ardour/editor.cc:2608 +msgid "Select/Move Objects" +msgstr "Välj/flytta objekt" + +#: gtk2_ardour/editor.cc:2609 +msgid "Select/Move Ranges" +msgstr "Välj/flytta omfÃ¥ng" + +#: gtk2_ardour/editor.cc:2610 +msgid "Draw Gain Automation" +msgstr "Rita volymautomatisering" + +#: gtk2_ardour/editor.cc:2611 +msgid "Select Zoom Range" +msgstr "Välj zoom-omfÃ¥ng" + +#: gtk2_ardour/editor.cc:2612 +msgid "Stretch/Shrink Regions" +msgstr "Förläng/förkorta regioner" + +#: gtk2_ardour/editor.cc:2613 +msgid "Listen to Specific Regions" +msgstr "Lyssna pÃ¥ specifika regioner" + + +#: ../editor.cc:2745 +msgid "Start:" +msgstr "Början:" + +#: ../editor.cc:2746 +msgid "End:" +msgstr "Slut:" + +#: ../editor.cc:3361 ../editor.cc:3401 +msgid "set selected regions" +msgstr "ställ in valda regioner" + +#: ../editor.cc:3457 ../editor_actions.cc:203 +msgid "Undo" +msgstr "Ã…ngra" + +#: ../editor.cc:3459 +msgid "Undo (%1)" +msgstr "Ã…ngra (%1)" + +#: ../editor.cc:3469 ../editor_actions.cc:205 +msgid "Redo" +msgstr "Gör om" + +#: ../editor.cc:3471 +msgid "Redo (%1)" +msgstr "Gör om (%1)" + +#: ../editor.cc:3505 +msgid "... as new track" +msgstr "... som ny region" + +#: ../editor.cc:3506 +msgid "... as new region" +msgstr "... som ny region" + +#: ../editor.cc:3508 +msgid "Import audio (copy)" +msgstr "Importera ljudfil (kopiera)" + +#: ../editor.cc:3511 +msgid "Remove last capture" +msgstr "Ta bort senaste inspelningen" + +#: ../editor.cc:3535 +msgid "Duplicate how many times?" +msgstr "Duplicera hur mÃ¥nga gÃ¥nger?" + +#: ../editor.cc:4021 +msgid "" +"Playlist %1 is currently unused.\n" +"If left alone, no audio files used by it will be cleaned.\n" +"If deleted, audio files used by it alone by will cleaned." +msgstr "" +"Spellista %1 används inte.\n" +"Om den lämnas ifred kommer inga filer använda av den rensas.\n" +"Om den tas bort kommer filer som används av den att rensas." + +#: ../editor.cc:4029 +msgid "Delete playlist" +msgstr "Radera spellista" + +#: ../editor.cc:4030 +msgid "Keep playlist" +msgstr "BehÃ¥ll spellista" + +#: ../editor.cc:4031 ../editor_audio_import.cc:236 ../editor_ops.cc:2049 +#: ../editor_timefx.cc:70 ../export_dialog.cc:970 ../io_selector.cc:58 +#: ../io_selector.cc:792 ../redirect_box.cc:902 ../tempo_dialog.cc:19 +#: ../tempo_dialog.cc:36 ../tempo_dialog.cc:201 ../tempo_dialog.cc:219 +msgid "Cancel" +msgstr "Avbryt" + +#: ../editor.cc:4198 +msgid "new playlists" +msgstr "nya spellistor" + +#: ../editor.cc:4206 +msgid "copy playlists" +msgstr "kopiera spellistor" + +#: ../editor.cc:4214 +msgid "clear playlists" +msgstr "rensa spellistor" + +#: ../editor_actions.cc:27 +msgid "Select regions" +msgstr "Välj regioner" + +#: ../editor_actions.cc:28 +msgid "Select range operations" +msgstr "Välj omfÃ¥ngsÃ¥tgärder" + +#: ../editor_actions.cc:29 +msgid "Move edit cursor" +msgstr "Flytta redigeringsmarkör" + +#: ../editor_actions.cc:30 +msgid "Region operations" +msgstr "RegionsÃ¥tgärder" + +#: ../editor_actions.cc:31 +msgid "Tools" +msgstr "Verktyg" + +#: ../editor_actions.cc:32 +msgid "View" +msgstr "Visa" + +#: ../editor_actions.cc:33 +msgid "ZoomFocus" +msgstr "Zoomfokus" + +#: ../editor_actions.cc:34 +msgid "Meter hold" +msgstr "NivÃ¥mätartopphÃ¥llning" + +#: ../editor_actions.cc:35 +msgid "Meter falloff" +msgstr "NivÃ¥mätarnedfall" + +#: ../editor_actions.cc:37 +msgid "Crossfades" +msgstr "Övertoningar" + +#: ../editor_actions.cc:38 +msgid "Monitoring" +msgstr "Medhörning" + +#: ../editor_actions.cc:39 +msgid "Autoconnect" +msgstr "Automatisk anslutning" + +#: ../editor_actions.cc:40 +msgid "Layering" +msgstr "Lager" + +#: ../editor_actions.cc:41 +msgid "Metering" +msgstr "NivÃ¥mätning" + +#: ../editor_actions.cc:42 +msgid "Fall off rate" +msgstr "Nedfallshastighet" + +#: ../editor_actions.cc:43 +msgid "Hold Time" +msgstr "HÃ¥llningslängd" + +#: ../editor_actions.cc:44 +msgid "Add Existing Audio" +msgstr "Lägg till ljudfil" + +#. add named actions for the editor +#: ../editor_actions.cc:49 +msgid "Show Editor Mixer" +msgstr "Visa redigeringsmixer" + +#: ../editor_actions.cc:54 +msgid "Span Entire Overlap" +msgstr "Sträck över hela överlappnngen" + +#: ../editor_actions.cc:56 ../editor_actions.cc:383 +msgid "Short" +msgstr "Kort" + +#: ../editor_actions.cc:63 +msgid "Created Automatically" +msgstr "Skapas automatiskt" + +#: ../editor_actions.cc:66 +msgid "Playhead to Next Region Start" +msgstr "Startmarkören till nästa regionstart" + +#: ../editor_actions.cc:68 +msgid "Playhead to Next Region End" +msgstr "Startmarkören till nästa regionslut" + +#: ../editor_actions.cc:70 +msgid "Playhead to Next Region Sync" +msgstr "Startmarkören till nästa" + +#: ../editor_actions.cc:73 +msgid "Playhead to Previous Region Start" +msgstr "Startmarkören till förra regionstarten" + +#: ../editor_actions.cc:75 +msgid "Playhead to Previous Region End" +msgstr "Startmarkören till förra regionslutet" + +#: ../editor_actions.cc:77 +msgid "Playhead to Previous Region Sync" +msgstr "Startmarkören till förra regionsynk.-punkten" + +#: ../editor_actions.cc:80 +msgid "Edit Cursor to Next Region Start" +msgstr "Redigeringsmarkören till nästa regionstart" + +#: ../editor_actions.cc:82 +msgid "Edit Cursor to Next Region End" +msgstr "Redigeringsmarkören till nästa regionslut" + +#: ../editor_actions.cc:84 +msgid "Edit Cursor to Next Region Sync" +msgstr "Redigeringsmarkören till nästa regionssynk.-punkt" + +#: ../editor_actions.cc:87 +msgid "Edit Cursor to Previous Region Start" +msgstr "Redigeringsmarkören till förra regionstart" + +#: ../editor_actions.cc:89 +msgid "Edit Cursor to Previous Region End" +msgstr "Redigeringsmarkören till förra regionslutet" + +#: ../editor_actions.cc:91 +msgid "Edit Cursor to Previous Region Sync" +msgstr "Redigeringsmarkören till förra regionssynk.-punkten" + +#: ../editor_actions.cc:94 +msgid "Playhead to Range Start" +msgstr "Startmarkören till regionstarten" + +#: ../editor_actions.cc:96 +msgid "Playhead to Range End" +msgstr "Startmarkören till regionslutet" + +#: ../editor_actions.cc:99 +msgid "Edit Cursor to Range Start" +msgstr "Redigeringsmarkören till regionstarten" + +#: ../editor_actions.cc:101 +msgid "Edit Cursor to Range End" +msgstr "Redigeringsmarkören till regionslutet" + +#: ../editor_actions.cc:104 ../editor_ops.cc:1364 +msgid "select all" +msgstr "välj allt" + +#: ../editor_actions.cc:106 +msgid "Select All After Edit Cursor" +msgstr "Välj allt efter redigeringsmarkören" + +#: ../editor_actions.cc:108 +msgid "Select All Before Edit Cursor" +msgstr "Välj allt innan redigeringsmarkören" + +#: ../editor_actions.cc:111 +msgid "Select All After Playhead" +msgstr "Välj allt efter startmarkören" + +#: ../editor_actions.cc:113 +msgid "Select All Before Playhead" +msgstr "Välj allt innan startmarkören" + +#: ../editor_actions.cc:115 +msgid "Select All Between Cursors" +msgstr "Välj allt mellan markörerna" + +#: ../editor_actions.cc:118 +msgid "Select All in Punch Range" +msgstr "Välj allt i punch-omfÃ¥nget" + +#: ../editor_actions.cc:120 +msgid "Select All in Loop Range" +msgstr "Välj allt i loop-omfÃ¥nget" + +#: ../editor_actions.cc:123 +msgid "Jump Forward to Mark" +msgstr "Hoppa framÃ¥t till markör" + +#: ../editor_actions.cc:125 +msgid "Jump Backward to Mark" +msgstr "Hoppa framÃ¥t till markör" + +#: ../editor_actions.cc:127 +msgid "Add Location from Playhead" +msgstr "Lägg till Plats frÃ¥n startmarkören" + +#: ../editor_actions.cc:130 +msgid "Nudge Forward" +msgstr "Knuffa framÃ¥t" + +#: ../editor_actions.cc:132 +msgid "Nudge Next Forward" +msgstr "Knuffa nästa framÃ¥t" + +#: ../editor_actions.cc:134 +msgid "Nudge Backward" +msgstr "Knuffa bakÃ¥t" + +#: ../editor_actions.cc:136 +msgid "Nudge Next Backward" +msgstr "Knuffa nästa bakÃ¥t" + +#: ../editor_actions.cc:139 +msgid "Zoom Out" +msgstr "Zooma ut" + +#: ../editor_actions.cc:141 +msgid "Zoom In" +msgstr "Zooma in" + +#: ../editor_actions.cc:143 +msgid "Zoom to Session" +msgstr "Zooma in/ut till hela sessionen" + +#: ../editor_actions.cc:146 +msgid "Scroll Tracks Up" +msgstr "Skrolla spÃ¥r uppÃ¥t" + +#: ../editor_actions.cc:148 +msgid "Scroll Tracks Down" +msgstr "Skrolla spÃ¥r ner" + +#: ../editor_actions.cc:150 +msgid "Step Tracks Up" +msgstr "Stega spÃ¥r uppÃ¥t" + +#: ../editor_actions.cc:152 +msgid "Step Tracks Down" +msgstr "Stega spÃ¥r nerÃ¥t" + +#: ../editor_actions.cc:155 +msgid "Scroll Backward" +msgstr "Skrolla bakÃ¥t" + +#: ../editor_actions.cc:157 +msgid "Scroll Forward" +msgstr "Skrolla framÃ¥t" + +#: ../editor_actions.cc:159 +msgid "goto" +msgstr "gÃ¥ till" + +#: ../editor_actions.cc:161 +msgid "Center Playhead" +msgstr "Centrera startmarkören" + +#: ../editor_actions.cc:163 +msgid "Center Edit Cursor" +msgstr "Centrera redigeringsmarkören" + +#: ../editor_actions.cc:165 +msgid "Playhead Forward" +msgstr "Startmarkören framÃ¥t" + +#: ../editor_actions.cc:167 +msgid "Playhead Backward" +msgstr "Startmarkören bakÃ¥t" + +#: ../editor_actions.cc:169 +msgid "Playhead to Edit" +msgstr "Startmarkören till redigeringsmarkören" + +#: ../editor_actions.cc:171 +msgid "Edit to Playhead" +msgstr "Redigeringsmarkören till Startmarkören" + +#: ../editor_actions.cc:174 +msgid "Align Regions Start" +msgstr "Justera regioners start" + +#: ../editor_actions.cc:176 +msgid "Align Regions Start Relative" +msgstr "Justera regioners start relativt" + +#: ../editor_actions.cc:178 +msgid "Align Regions End" +msgstr "Justera regions slut" + +#: ../editor_actions.cc:180 +msgid "Align Regions End Relative" +msgstr "Justera regions slut relativt" + +#: ../editor_actions.cc:183 +msgid "Align Regions Sync" +msgstr "Justera regions synk." + +#: ../editor_actions.cc:185 +msgid "Align Regions Sync Relative" +msgstr "Justera regions synk. relativt" + +#: ../editor_actions.cc:188 +msgid "Audition at Mouse" +msgstr "Avlyssning vid muspekaren" + +#: ../editor_actions.cc:190 +msgid "Brush at Mouse" +msgstr "MÃ¥la vid mus" + +#: ../editor_actions.cc:192 +msgid "Set Edit Cursor" +msgstr "Placera redigeringsmarkör" + +#: ../editor_actions.cc:194 +msgid "Mute/Unmute Region" +msgstr "Tysta/stäng av tysta region" + +#: ../editor_actions.cc:196 +msgid "Set Playhead" +msgstr "Placera startmarkör" + +#: ../editor_actions.cc:198 +msgid "Split Region" +msgstr "Dela region" + +#: ../editor_actions.cc:200 +msgid "Set Region Sync Position" +msgstr "Definiera regionssynk.-position" + +#: ../editor_actions.cc:208 +msgid "Export Session" +msgstr "Exportera session" + +#: ../editor_actions.cc:210 +msgid "Export Range" +msgstr "Expoerta omfÃ¥ng" + +#. Note: for now, editor-delete does the exact same thing as editor-cut +#: ../editor_actions.cc:216 +msgid "Delete" +msgstr "Radera" + +#: ../editor_actions.cc:222 +msgid "Duplicate Region" +msgstr "Duplicera region" + +#: ../editor_actions.cc:224 +msgid "Duplicate Range" +msgstr "Duplicera omfÃ¥ng" + +#: ../editor_actions.cc:226 +msgid "Insert Region" +msgstr "Infoga region" + +#: ../editor_actions.cc:228 +msgid "Reverse Region" +msgstr "Motsatt riktning" + +#: ../editor_actions.cc:230 +msgid "Normalize Region" +msgstr "Normalisera region" + +#: ../editor_actions.cc:232 +msgid "crop" +msgstr "beskär" + +#: ../editor_actions.cc:234 +msgid "Insert Chunk" +msgstr "Infoga bit" + +#: ../editor_actions.cc:237 +msgid "Split at edit cursor" +msgstr "Dela vid redigeringsmarkör" + +#: ../editor_actions.cc:240 +msgid "Start Range" +msgstr "StartomfÃ¥ng" + +#: ../editor_actions.cc:242 +msgid "Finish Range" +msgstr "SlutomfÃ¥ng" + +#: ../editor_actions.cc:244 +msgid "Finish add Range" +msgstr "Lägg till slutomfÃ¥ng" + +#: ../editor_actions.cc:247 +msgid "Extend Range to End of Region" +msgstr "Utöka omfÃ¥ng till slutet av regionen" + +#: ../editor_actions.cc:249 +msgid "Extend Range to Start of Region" +msgstr "Utöka omfÃ¥ng till början av regionen" + +#: ../editor_actions.cc:252 +msgid "Follow Playhead" +msgstr "Följ startmarkören" + +#: ../editor_actions.cc:260 +msgid "Zoom Focus Left" +msgstr "Zoomfokus: vänster" + +#: ../editor_actions.cc:262 +msgid "Zoom Focus Right" +msgstr "Zoomfokus: höger" + +#: ../editor_actions.cc:264 +msgid "Zoom Focus Center" +msgstr "Zoomfokus: center" + +#: ../editor_actions.cc:266 +msgid "Zoom Focus Playhead" +msgstr "Zoomfokus: startmarkören" + +#: ../editor_actions.cc:268 +msgid "Zoom Focus Edit" +msgstr "Zoomfokus: redigeringsmarkör" + +#: ../editor_actions.cc:274 +msgid "Object Tool" +msgstr "Objektverktyg" + +#: ../editor_actions.cc:275 +msgid "Range Tool" +msgstr "OmfÃ¥ngsverktyg" + +#: ../editor_actions.cc:276 +msgid "Gain Tool" +msgstr "Volymverktyg" + +#: ../editor_actions.cc:277 +msgid "Zoom Tool" +msgstr "Zoomverktyg" + +#: ../editor_actions.cc:278 +msgid "Timefx Tool" +msgstr "TidsFX-verktyg" + +#: ../editor_actions.cc:285 +msgid "Snap to frame" +msgstr "Fäst mot frames" + +#: ../editor_actions.cc:286 +msgid "Snap to cd frame" +msgstr "Fäst mot CD-frames" + +#: ../editor_actions.cc:287 +msgid "Snap to SMPTE frame" +msgstr "Fäst mot SMPTE-frames" + +#: ../editor_actions.cc:288 +msgid "Snap to SMPTE seconds" +msgstr "Fäst mot SMPTE-sekunder" + +#: ../editor_actions.cc:289 +msgid "Snap to SMPTE minutes" +msgstr "Fäst mot SMPTE-minuter" + +#: ../editor_actions.cc:290 +msgid "Snap to seconds" +msgstr "Fäst mot sekunder" + +#: ../editor_actions.cc:291 +msgid "Snap to minutes" +msgstr "Fäst mot minuter" + +#: ../editor_actions.cc:292 +msgid "Snap to thirtyseconds" +msgstr "Fäst mot trettio sekunder" + +#: ../editor_actions.cc:293 +msgid "Snap to asixteenthbeat" +msgstr "Fäst mot en sextondel" + +#: ../editor_actions.cc:294 +msgid "Snap to eighths" +msgstr "Fäst mot Ã¥ttondelar" + +#: ../editor_actions.cc:295 +msgid "Snap to quarters" +msgstr "Fäst mot fjärdedelar" + +#: ../editor_actions.cc:296 +msgid "Snap to thirds" +msgstr "Fäst mot redjedelar" + +#: ../editor_actions.cc:297 +msgid "Snap to beat" +msgstr "Fäst mot slag" + +#: ../editor_actions.cc:298 +msgid "Snap to bar" +msgstr "Fäst mot takt" + +#: ../editor_actions.cc:299 +msgid "Snap to mark" +msgstr "Fäst mot markörer" + +#: ../editor_actions.cc:300 +msgid "Snap to edit cursor" +msgstr "Fäst mot redigeringsmarkören" + +#: ../editor_actions.cc:301 +msgid "Snap to region start" +msgstr "Fäst mot regionstart" + +#: ../editor_actions.cc:302 +msgid "Snap to region end" +msgstr "Fäst mot regionslut" + +#: ../editor_actions.cc:303 +msgid "Snap to region sync" +msgstr "Fäst mot regionssynk.-punkt" + +#: ../editor_actions.cc:304 +msgid "Snap to region boundary" +msgstr "Fäst mot regionsgräns" + +#. the region list popup menu +#: ../editor_actions.cc:313 +msgid "Sort" +msgstr "Sortera" + +#: ../editor_actions.cc:321 +msgid "Show all" +msgstr "Visa allt" + +#: ../editor_actions.cc:322 +msgid "Show automatic regions" +msgstr "Visa automatiska regioner" + +#: ../editor_actions.cc:324 +msgid "Ascending" +msgstr "Stigande" + +#: ../editor_actions.cc:326 +msgid "Descending" +msgstr "Fallande" + +#: ../editor_actions.cc:329 +msgid "By Region Name" +msgstr "utifrÃ¥n Regionsnamn" + +#: ../editor_actions.cc:331 +msgid "By Region Length" +msgstr "utifrÃ¥n Regionslängd" + +#: ../editor_actions.cc:333 +msgid "By Region Position" +msgstr "utifrÃ¥n Regionsposition" + +#: ../editor_actions.cc:335 +msgid "By Region Timestamp" +msgstr "utifrÃ¥n Regionstiddstämpel" + +#: ../editor_actions.cc:337 +msgid "By Region Start in File" +msgstr "utifrÃ¥n Regionens start i filen" + +#: ../editor_actions.cc:339 +msgid "By Region End in File" +msgstr "utifrÃ¥n Regionens slut i filen" + +#: ../editor_actions.cc:341 +msgid "By Source File Name" +msgstr "utifrÃ¥n Källfilnamn" + +#: ../editor_actions.cc:343 +msgid "By Source File Length" +msgstr "utifrÃ¥n Källfillängd" + +#: ../editor_actions.cc:345 +msgid "By Source File Creation Date" +msgstr "" + +#: ../editor_actions.cc:347 +msgid "By Source Filesystem" +msgstr "utifrÃ¥n Källfilsskapelsedatum" + +#. the next two are duplicate items with different names for use in two different contexts +#: ../editor_actions.cc:353 +msgid "Add External Audio" +msgstr "Lägg till ljudfil" + +#: ../editor_actions.cc:355 +msgid "as Region(s)" +msgstr "som region(er)" + +#: ../editor_actions.cc:357 +msgid "as Tracks" +msgstr "som spÃ¥r" + +#: gtk2_ardour/editor_actions.cc:360 +msgid "as Tape Tracks" +msgstr "som rullbandsspÃ¥r" + +#: ../editor_actions.cc:359 +msgid "to Tracks" +msgstr "till spÃ¥r" + +#: ../editor_actions.cc:362 +msgid "Show Waveforms" +msgstr "Visa vÃ¥gformer" + +#: ../editor_actions.cc:363 +msgid "Show Waveforms While Recording" +msgstr "Visa vÃ¥gformer vid inspelning" + +#: ../editor_actions.cc:364 +msgid "Show Measures" +msgstr "Visa rutnät" + +#: ../editor_actions.cc:377 ../editor_actions.cc:384 +msgid "Medium" +msgstr "" + +#: ../editor_actions.cc:379 +msgid "Faster" +msgstr "Snabbare" + +#: ../editor_actions.cc:385 +msgid "Long" +msgstr "LÃ¥ng" + +#: ../editor_actions.cc:389 +msgid "Later is Higher" +msgstr "Senare är högre" + +#: ../editor_actions.cc:390 +msgid "Most Recently Moved/Added is Higher" +msgstr "Senast flyttade/tillagda är högre" + +#: ../editor_actions.cc:391 +msgid "Most Recently Added is Higher" +msgstr "Senast tillagda är högre" + +#: ../editor_audio_import.cc:72 +msgid "You can't import or embed an audiofile until you have a session loaded." +msgstr "Du kan inte importera en ljudfil innan du har laddat en session." + +#: ../editor_audio_import.cc:77 +msgid "Add existing audio to session" +msgstr "Lägg till ljudfil(er) till sessionen" + +#: ../editor_audio_import.cc:142 +msgid "ardour: importing %1" +msgstr "ardour: importerar %1" + +#: ../editor_audio_import.cc:146 +msgid "Cancel Import" +msgstr "Avbryt importering" + +#: ../editor_audio_import.cc:224 +msgid "Editor: cannot open file \"%1\", (%2)" +msgstr "Redigerare: kan inte öppna filen \"%1\" (%2)" + +#: ../editor_audio_import.cc:232 +msgid "Cancel entire import" +msgstr "Avbryt hela importen" + +#: ../editor_audio_import.cc:233 +msgid "Don't embed it" +msgstr "Infoga inte" + +#: ../editor_audio_import.cc:234 +msgid "Embed all without questions" +msgstr "Infoga alla" + +#: ../editor_audio_import.cc:239 +msgid "Embed it anyway" +msgstr "Infoga ändÃ¥" + +#: ../editor_audio_import.cc:242 +msgid "" +"%1\n" +"This audiofile's sample rate doesn't match the session sample rate!" +msgstr "" +"%1\n" +"Denna ljudfils samplingsfrekvens matchar inte sessionens!" + +#: ../editor_audio_import.cc:275 +msgid "could not open %1" +msgstr "kunde inte öppna %1" + +#: ../editor_audio_import.cc:320 +msgid "insert sndfile" +msgstr "infoga ljudfil" + +#. stuff for the verbose canvas cursor +#: ../editor_canvas.cc:117 +msgid "VerboseCanvasCursor" +msgstr "" + +#: ../editor_edit_groups.cc:52 ../mixer_ui.cc:735 +msgid "Activate All" +msgstr "Aktivera alla" + +#: ../editor_edit_groups.cc:53 ../mixer_ui.cc:736 +msgid "Disable All" +msgstr "Avaktivera alla" + +#: ../editor_edit_groups.cc:55 ../mixer_ui.cc:738 +msgid "Add group" +msgstr "Lägg till grupp" + +#: ../editor_edit_groups.cc:228 ../mixer_ui.cc:969 +msgid "unnamed" +msgstr "namnlös" + +#: ../editor_edit_groups.cc:257 ../mixer_ui.cc:833 +msgid "-all-" +msgstr "-alla-" + +#: ../editor_export_audio.cc:64 +msgid "" +"There is no selection to export.\n" +"\n" +"Select a selection using the range mouse mode" +msgstr "" +"Det finns ingen markering att exportera.\n" +"\n" +"Välj en markering i omfÃ¥ngsläget" + +#: ../editor_export_audio.cc:109 +msgid "" +"There are no ranges to export.\n" +"\n" +"Create 1 or more ranges by dragging the mouse in the range bar" +msgstr "" +"TDet finns inga omfÃ¥ng att exportera.\n" +"\n" +"Skapa 1 eller flera omfÃ¥ng genom att dra musen i omfÃ¥ngs-fältet." + +#: ../editor_imageframe.cc:624 ../editor_imageframe.cc:654 +msgid "programming error: no ImageFrameView selected" +msgstr "" + +#: ../editor_imageframe.cc:847 ../editor_imageframe.cc:869 +msgid "programming error: no MarkerView selected" +msgstr "" + +#: ../editor_keyboard.cc:104 +msgid "mute region" +msgstr "tysta region" + +#: ../editor_keys.cc:45 +msgid "keyboard selection" +msgstr "tangentbordsmarkering" + +#: ../editor_markers.cc:291 ../editor_ops.cc:1291 ../editor_ops.cc:1304 +#: ../editor_ops.cc:1322 ../location_ui.cc:773 +msgid "add marker" +msgstr "" + +#: ../editor_markers.cc:306 ../editor_markers.cc:379 ../editor_markers.cc:551 +#: ../editor_markers.cc:569 ../editor_markers.cc:588 ../editor_markers.cc:607 +#: ../editor_markers.cc:637 ../editor_markers.cc:665 ../editor_markers.cc:693 +#: ../editor_markers.cc:731 ../editor_markers.cc:758 ../editor_markers.cc:781 +#: ../editor_markers.cc:800 ../editor_mouse.cc:2014 ../editor_mouse.cc:4274 +msgid "programming error: marker canvas item has no marker object pointer!" +msgstr "" + +#: ../editor_markers.cc:330 ../location_ui.cc:655 +msgid "remove marker" +msgstr "ta bort markör" + +#: ../editor_markers.cc:457 +msgid "Locate to Mark" +msgstr "Placera startmarkör här" + +#: ../editor_markers.cc:458 +msgid "Play from Mark" +msgstr "Spela from markör" + +#: ../editor_markers.cc:459 +msgid "Set Mark from Playhead" +msgstr "Placera markör frÃ¥n startmarkören" + +#: ../editor_markers.cc:463 +msgid "Rename Mark" +msgstr "Byt namn pÃ¥ markör" + +#: ../editor_markers.cc:464 +msgid "Hide Mark" +msgstr "Göm markör" + +#: ../editor_markers.cc:465 +msgid "Remove Mark" +msgstr "Ta bort markör" + +#: ../editor_markers.cc:478 ../editor_markers.cc:534 +msgid "Locate to Range Mark" +msgstr "Flytta starmarköer till omfÃ¥ngsmarkör" + +#: ../editor_markers.cc:479 ../editor_markers.cc:535 +msgid "Play from Range Mark" +msgstr "Spela frÃ¥n omfÃ¥ngmarkör" + +#: ../editor_markers.cc:480 +msgid "Loop Range" +msgstr "Loopa omfÃ¥ng" + +#: ../editor_markers.cc:481 ../editor_markers.cc:536 +msgid "Set Range Mark from Playhead" +msgstr "Placera omfÃ¥ngsmarkör frÃ¥n startmarkören" + +#: ../editor_markers.cc:482 ../editor_markers.cc:537 +msgid "Set Range from Range Selection" +msgstr "Sätt omfÃ¥ng frÃ¥n omfÃ¥ngsmarkering" + +#: ../editor_markers.cc:486 +msgid "Rename Range" +msgstr "Byt namn pÃ¥ omfÃ¥ng" + +#: ../editor_markers.cc:487 ../editor_markers.cc:539 +msgid "Hide Range" +msgstr "Göm omfÃ¥ng" + +#: ../editor_markers.cc:488 +msgid "Remove Range" +msgstr "Ta bort omfÃ¥ng" + +#: ../editor_markers.cc:492 ../editor_markers.cc:541 +msgid "Separate Regions in Range" +msgstr "Separera regioner i omfÃ¥nget" + +#: ../editor_markers.cc:493 ../editor_markers.cc:542 +msgid "Select All in Range" +msgstr "Välj allt i omfÃ¥nget" + +#: ../editor_markers.cc:519 +msgid "Set Loop Range" +msgstr "Sätt loop-omfÃ¥ng här" + +#: ../editor_markers.cc:520 +msgid "Set Punch Range" +msgstr "Sätt punch-omfÃ¥ng här" + +#: ../editor_markers.cc:814 +msgid "New Name:" +msgstr "Nytt namn:" + +#: ../editor_markers.cc:817 +msgid "ardour: rename mark" +msgstr "ardour: byt namn pÃ¥ markör" + +#: ../editor_markers.cc:819 +msgid "ardour: rename range" +msgstr "ardour: byt namn pÃ¥ omfÃ¥ng" + +#: ../editor_markers.cc:839 +msgid "rename marker" +msgstr "byt namn pÃ¥ markör" + +#: ../editor_markers.cc:864 +msgid "set loop range" +msgstr "ställ in loop-omfÃ¥ng" + +#: ../editor_markers.cc:890 +msgid "set punch range" +msgstr "ställ in punch-omfÃ¥ng" + +#: ../editor_mouse.cc:102 +msgid "Editor::event_frame() used on unhandled event type %1" +msgstr "" + +#: ../editor_mouse.cc:312 +msgid "select on click" +msgstr "" + +#: ../editor_mouse.cc:1589 +msgid "programming error: start_grab called without drag item" +msgstr "" + +#: ../editor_mouse.cc:1813 +msgid "change fade in length" +msgstr "ändra intoningslängd" + +#: ../editor_mouse.cc:1831 +msgid "programming error: fade out canvas item has no regionview data pointer!" +msgstr "" + +#: ../editor_mouse.cc:1905 +msgid "change fade out length" +msgstr "ändra uttoningslängd" + +#: ../editor_mouse.cc:1924 +msgid "programming error: cursor canvas item has no cursor data pointer!" +msgstr "" + +#: ../editor_mouse.cc:2141 +msgid "move marker" +msgstr "flytta markör" + +#: ../editor_mouse.cc:2164 ../editor_mouse.cc:2195 +#: ../editor_tempodisplay.cc:458 +msgid "" +"programming error: meter marker canvas item has no marker object pointer!" +msgstr "" + +#: ../editor_mouse.cc:2263 +msgid "copy meter mark" +msgstr "kopiera taktartsmarkör" + +#: ../editor_mouse.cc:2273 +msgid "move meter mark" +msgstr "flytta taktartsmarkör" + +#: ../editor_mouse.cc:2288 ../editor_mouse.cc:2321 +#: ../editor_tempodisplay.cc:330 ../editor_tempodisplay.cc:408 +#: ../editor_tempodisplay.cc:427 +msgid "" +"programming error: tempo marker canvas item has no marker object pointer!" +msgstr "" + +#: ../editor_mouse.cc:2293 ../editor_mouse.cc:2326 +#: ../editor_tempodisplay.cc:335 ../editor_tempodisplay.cc:413 +msgid "programming error: marker for tempo is not a tempo marker!" +msgstr "" + +#: ../editor_mouse.cc:2393 +msgid "copy tempo mark" +msgstr "kopiera tempomarkör" + +#: ../editor_mouse.cc:2403 +msgid "move tempo mark" +msgstr "flytta tempomarkör" + +#: ../editor_mouse.cc:2417 ../editor_mouse.cc:2436 ../editor_mouse.cc:2449 +msgid "" +"programming error: control point canvas item has no control point object " +"pointer!" +msgstr "" + +#: ../editor_mouse.cc:2554 +msgid "programming error: line canvas item has no line pointer!" +msgstr "" + +#: ../editor_mouse.cc:2663 +msgid "move region(s)" +msgstr "flytta region(er)" + +#: ../editor_mouse.cc:2726 +msgid "Drag region brush" +msgstr "Dra regionspensel" + +#. don't copy again +#. this is committed in the grab finished callback. +#: ../editor_mouse.cc:2750 +msgid "Drag region copy" +msgstr "Dra regionskopia" + +#. A selection grab currently creates two undo/redo operations, one for +#. creating the new region and another for moving it. +#. +#: ../editor_mouse.cc:3608 +msgid "selection grab" +msgstr "markeringsgrepp" + +#: ../editor_mouse.cc:3649 +msgid "cancel selection" +msgstr "avbryt markering" + +#: ../editor_mouse.cc:3759 +msgid "range selection" +msgstr "omfÃ¥ngsmarkering" + +#: ../editor_mouse.cc:3775 +msgid "trim selection start" +msgstr "beskär markerings början" + +#: ../editor_mouse.cc:3791 +msgid "trim selection end" +msgstr "beskär markerings slut" + +#: ../editor_mouse.cc:3808 +msgid "move selection" +msgstr "flytta markering" + +#: ../editor_mouse.cc:4194 +msgid "Start point trim" +msgstr "Beskär startpunkt" + +#: ../editor_mouse.cc:4222 +msgid "End point trim" +msgstr "Beskär slutpunkt" + +#: ../editor_mouse.cc:4261 +msgid "trimmed region" +msgstr "Beskuren region" + +#: ../editor_mouse.cc:4399 +msgid "new range marker" +msgstr "ny omfÃ¥ngsmarkör" + +#: ../editor_mouse.cc:4641 +msgid "select regions" +msgstr "välj regioner" + +#: ../editor_mouse.cc:4670 +msgid "Name for region:" +msgstr "Namnge region:" + +#: ../editor_mouse.cc:4734 +msgid "timestretch" +msgstr "tidstänjning" + +#: ../editor_ops.cc:196 +msgid "split" +msgstr "dela" + +#: ../editor_ops.cc:232 +msgid "remove region" +msgstr "ta bort region" + +#: ../editor_ops.cc:251 +msgid "" +" This is destructive, will possibly delete audio files\n" +"It cannot be undone\n" +"Do you really want to destroy %1 ?" +msgstr "" +" Detta är en destruktiv operation, kommer möjligt radera filer\n" +"Detta kan ej Ã¥ngras\n" +"Vill du verkligen radera %1 ?" + +#: ../editor_ops.cc:255 +msgid "these regions" +msgstr "dessa regioner" + +#: ../editor_ops.cc:255 +msgid "this region" +msgstr "denna region" + +#: ../editor_ops.cc:257 ../editor_ops.cc:3319 ../route_ui.cc:700 +#: ../visual_time_axis.cc:277 +msgid "No, do nothing." +msgstr "Nej, gör ingenting." + +#: ../editor_ops.cc:260 +msgid "Yes, destroy them." +msgstr "Ja, radera dem." + +#: ../editor_ops.cc:262 ../editor_ops.cc:3320 +msgid "Yes, destroy it." +msgstr "Ja, radera den." + +#: ../editor_ops.cc:353 ../editor_ops.cc:381 +msgid "extend selection" +msgstr "utöka markeringen" + +#: ../editor_ops.cc:397 ../editor_ops.cc:431 ../editor_ops.cc:475 +#: ../editor_ops.cc:501 +msgid "nudge forward" +msgstr "knuffa framÃ¥t" + +#: ../editor_ops.cc:565 +msgid "build_region_boundary_cache called with snap_type = %1" +msgstr "" + +#: ../editor_ops.cc:1421 +msgid "select all within" +msgstr "välj allt inom" + +#: ../editor_ops.cc:1453 +msgid "set selection from region" +msgstr "ställ in markering frÃ¥n region" + +#: ../editor_ops.cc:1486 +msgid "set selection from range" +msgstr "ställ markering frÃ¥n omfÃ¥ng" + +#: ../editor_ops.cc:1516 +msgid "select all from range" +msgstr "välj allt inom omfÃ¥ng" + +#: ../editor_ops.cc:1538 +msgid "select all from punch" +msgstr "välj allt frÃ¥n punch" + +#: ../editor_ops.cc:1560 +msgid "select all from loop" +msgstr "välj allt frÃ¥n loop" + +#: ../editor_ops.cc:1574 +msgid "select all after cursor" +msgstr "välj allt efter markör" + +#: ../editor_ops.cc:1579 +msgid "select all before cursor" +msgstr "välj allt före markör" + +#: ../editor_ops.cc:1609 +msgid "select all between cursors" +msgstr "välj allt mellan markörerna" + +#: ../editor_ops.cc:1740 +msgid "clear markers" +msgstr "rensa markörer" + +#: ../editor_ops.cc:1752 +msgid "clear ranges" +msgstr "rensa omfÃ¥ng" + +#: ../editor_ops.cc:1771 +msgid "clear locations" +msgstr "rensa platser" + +#: ../editor_ops.cc:1821 +msgid "insert dragged region" +msgstr "infoga dragen region" + +#: ../editor_ops.cc:1857 +msgid "insert region" +msgstr "infoga region" + +#: ../editor_ops.cc:2048 ../io_selector.cc:57 ../io_selector.cc:791 +msgid "OK" +msgstr "" + +#: ../editor_ops.cc:2055 +msgid "ardour: rename region" +msgstr "ardour: byt namn pÃ¥ region" + +#: ../editor_ops.cc:2278 ../editor_ops.cc:2327 +msgid "separate" +msgstr "separera" + +#: ../editor_ops.cc:2389 +msgid "trim to selection" +msgstr "beskär till markeringen" + +#: ../editor_ops.cc:2429 +msgid "region fill" +msgstr "regionsfyllning" + +#: ../editor_ops.cc:2488 +msgid "fill selection" +msgstr "fyll markeringen" + +#: ../editor_ops.cc:2509 +msgid "Programming error. that region doesn't cover that position" +msgstr "" + +#: ../editor_ops.cc:2512 +msgid "set region sync position" +msgstr "Ställ in regionssynk.-punkt" + +#: ../editor_ops.cc:2527 +msgid "Place the edit cursor at the desired sync point" +msgstr "Placera redigerinsmarkören pÃ¥ avsedd synk.-punkt" + +#: ../editor_ops.cc:2532 +msgid "set sync from edit cursor" +msgstr "ställ synk. frÃ¥n redigeringsmarkör" + +#: ../editor_ops.cc:2544 +msgid "remove sync" +msgstr "ta bort synk." + +#: ../editor_ops.cc:2558 +msgid "naturalize" +msgstr "naturalisera" + +#: ../editor_ops.cc:2622 +msgid "align selection (relative)" +msgstr "justera markering (relativt)" + +#: ../editor_ops.cc:2650 +msgid "align selection" +msgstr "justera markering" + +#: ../editor_ops.cc:2662 +msgid "align region" +msgstr "justera region" + +#: ../editor_ops.cc:2709 ../editor_ops.cc:2734 +msgid "trim to edit" +msgstr "beskär till redigering" + +#: ../editor_ops.cc:2785 +msgid "ardour: freeze" +msgstr "ardour: frys" + +#: ../editor_ops.cc:2790 +msgid "Cancel Freeze" +msgstr "Avbryt frysning" + +#: ../editor_ops.cc:2827 +msgid "bounce range" +msgstr "omfÃ¥ng till disk" + +#: ../editor_ops.cc:2880 +msgid "cut" +msgstr "klipp" + +#: ../editor_ops.cc:2883 +msgid "copy" +msgstr "kopiera" + +#: ../editor_ops.cc:2896 +msgid " objects" +msgstr " objekt" + +#: ../editor_ops.cc:2922 +msgid " range" +msgstr " omfÃ¥ng" + +#: ../editor_ops.cc:3079 +msgid "paste" +msgstr "klistra" + +#: ../editor_ops.cc:3117 +msgid "paste chunk" +msgstr "klistra bit" + +#. clear (below) will clear the argument list +#: ../editor_ops.cc:3158 +msgid "duplicate region" +msgstr "duplicera region" + +#: ../editor_ops.cc:3203 +msgid "duplicate selection" +msgstr "duplicera markering" + +#: ../editor_ops.cc:3260 +msgid "clear playlist" +msgstr "rensa spellista" + +#: ../editor_ops.cc:3289 +msgid "nudge track" +msgstr "knuffa spÃ¥r" + +#: ../editor_ops.cc:3316 +msgid "" +"Do you really want to destroy the last capture?\n" +"(This is destructive and cannot be undone)" +msgstr "" +"Vill du verkligen radera den senaste inspelningen?\n" +"(Detta är en destruktiv handling och kan ej Ã¥ngras)" + +#: ../editor_ops.cc:3344 +msgid "normalize" +msgstr "normalisera" + +#: ../editor_ops.cc:3391 +msgid "reverse regions" +msgstr "regioner till motsatt riktning" + +#: ../editor_region_list.cc:96 ../editor_region_list.cc:101 +#: ../editor_region_list.cc:104 ../location_ui.cc:55 +msgid "Hidden" +msgstr "Dold" + +#. added a new fresh one at the end +#: ../editor_route_list.cc:101 ../editor_route_list.cc:102 +#: ../editor_route_list.cc:246 +msgid "editor" +msgstr "redigerare" + +#: ../editor_route_list.cc:309 ../mixer_ui.cc:698 +msgid "Show All" +msgstr "Visa Alla" + +#: ../editor_route_list.cc:310 ../mixer_ui.cc:699 +msgid "Hide All" +msgstr "Dölj Alla" + +#: ../editor_route_list.cc:311 ../mixer_ui.cc:700 +msgid "Show All Audio Tracks" +msgstr "Visa alla spÃ¥r" + +#: ../editor_route_list.cc:312 ../mixer_ui.cc:701 +msgid "Hide All Audio Tracks" +msgstr "Dölj alla spÃ¥r" + +#: ../editor_route_list.cc:313 ../mixer_ui.cc:702 +msgid "Show All Audio Busses" +msgstr "Visa alla bussar" + +#: ../editor_route_list.cc:314 ../mixer_ui.cc:703 +msgid "Hide All Audio Busses" +msgstr "Dölj alla bussar" + +#: ../editor_rulers.cc:311 +msgid "New location marker" +msgstr "Ny platsmarkör" + +#: ../editor_rulers.cc:312 +msgid "Clear all locations" +msgstr "Rensa alla platsmarkörer" + +#. ruler_items.push_back (MenuElem (_("New Range"))); +#: ../editor_rulers.cc:317 +msgid "Clear all ranges" +msgstr "Rensa alla omfÃ¥ng" + +#: ../editor_rulers.cc:326 +msgid "New Tempo" +msgstr "Nytt tempo" + +#: ../editor_rulers.cc:327 +msgid "Clear tempo" +msgstr "Ta bort tempo" + +#: ../editor_rulers.cc:332 +msgid "New Meter" +msgstr "Ny taktart" + + +#: ../editor_rulers.cc:333 +msgid "Clear meter" +msgstr "Ta bort taktart" + +#: ../editor_rulers.cc:341 +msgid "Min:Secs" +msgstr "Min:Sek" + +#: ../editor_selection_list.cc:107 +msgid "Name for Chunk:" +msgstr "Namn för bit:" + +#: ../editor_selection_list.cc:110 +msgid "Create Chunk" +msgstr "Skapa bit" + +#: ../editor_selection_list.cc:110 +msgid "Forget it" +msgstr "Glöm det" + +#: ../editor_tempodisplay.cc:252 ../editor_tempodisplay.cc:292 +msgid "add" +msgstr "lägg till" + +#: ../editor_tempodisplay.cc:274 +msgid "add tempo mark" +msgstr "lägg till tempomarkör" + +#: ../editor_tempodisplay.cc:314 +msgid "add meter mark" +msgstr "lägg till taktartsmarkör" + +#: ../editor_tempodisplay.cc:347 ../editor_tempodisplay.cc:375 +msgid "done" +msgstr "klar" + +#: ../editor_tempodisplay.cc:365 ../editor_tempodisplay.cc:393 +msgid "replace tempo mark" +msgstr "ersätt tempomarkör" + +#: ../editor_tempodisplay.cc:432 ../editor_tempodisplay.cc:463 +msgid "programming error: marker for meter is not a meter marker!" +msgstr "" + +#: ../editor_tempodisplay.cc:442 ../editor_tempodisplay.cc:475 +msgid "remove tempo mark" +msgstr "ta bort tempomarkör" + +#: ../editor_timefx.cc:50 +msgid "Quick but Ugly" +msgstr "Snabbt men Fult" + +#: ../editor_timefx.cc:51 +msgid "Skip Anti-aliasing" +msgstr "Hoppa över Anti-aliasing" + +#: ../editor_timefx.cc:55 +msgid "ardour: timestretch" +msgstr "ardour: tidstänjning" + +#: ../editor_timefx.cc:56 +msgid "TimeStretchDialog" +msgstr "TidsTänjningsDialog" + +#: ../editor_timefx.cc:69 +msgid "Stretch/Shrink it" +msgstr "Förläng/Förkorta den" + +#: ../editor_timefx.cc:72 ../editor_timefx.cc:73 +msgid "TimeStretchButton" +msgstr "TidsTänjningsKnapp" + +#: ../editor_timefx.cc:74 +msgid "TimeStretchProgress" +msgstr "TidsTänjningsFörlopp" + +#: ../editor_timefx.cc:138 +msgid "timestretch cannot be started - thread creation error" +msgstr "tidstänjning kan inte startas - trÃ¥dskapningsfel" + +#: ../export_dialog.cc:58 ../export_dialog.cc:398 ../export_dialog.cc:1026 +#: ../export_dialog.cc:1194 +msgid "22.05kHz" +msgstr "" + +#: ../export_dialog.cc:59 ../export_dialog.cc:401 ../export_dialog.cc:416 +#: ../export_dialog.cc:1028 ../export_dialog.cc:1196 +msgid "44.1kHz" +msgstr "" + +#: ../export_dialog.cc:60 ../export_dialog.cc:404 ../export_dialog.cc:1030 +#: ../export_dialog.cc:1198 +msgid "48kHz" +msgstr "" + +#: ../export_dialog.cc:61 ../export_dialog.cc:407 ../export_dialog.cc:1032 +#: ../export_dialog.cc:1200 +msgid "88.2kHz" +msgstr "" + +#: ../export_dialog.cc:62 ../export_dialog.cc:410 ../export_dialog.cc:1034 +#: ../export_dialog.cc:1202 +msgid "96kHz" +msgstr "" + +#: ../export_dialog.cc:63 ../export_dialog.cc:413 ../export_dialog.cc:1036 +#: ../export_dialog.cc:1204 +msgid "192kHz" +msgstr "" + +#: ../export_dialog.cc:68 +msgid "best" +msgstr "bäst" + +#: ../export_dialog.cc:69 ../export_dialog.cc:1211 +msgid "fastest" +msgstr "snabbast" + +#: ../export_dialog.cc:70 ../export_dialog.cc:1213 +msgid "linear" +msgstr "linjär" + +#: ../export_dialog.cc:71 ../export_dialog.cc:1215 +msgid "better" +msgstr "bättre" + +#: ../export_dialog.cc:72 ../export_dialog.cc:1217 +msgid "intermediate" +msgstr "mellanliggande" + +#: ../export_dialog.cc:78 ../export_dialog.cc:1226 +msgid "Rectangular" +msgstr "Rektangulär" + +#: ../export_dialog.cc:79 +msgid "Shaped Noise" +msgstr "Format Oväsen" + +#: ../export_dialog.cc:80 ../export_dialog.cc:1228 +msgid "Triangular" +msgstr "Triangulär" + +#: ../export_dialog.cc:85 +msgid "stereo" +msgstr "" + +#. default is to use all +#: ../export_dialog.cc:86 ../export_dialog.cc:485 ../export_dialog.cc:1054 +#: ../export_dialog.cc:1176 +msgid "mono" +msgstr "" + +#: ../export_dialog.cc:92 +msgid "CUE" +msgstr "" + +#: ../export_dialog.cc:93 +msgid "TOC" +msgstr "" + +#: ../export_dialog.cc:101 +msgid "Format" +msgstr "" + +#: ../export_dialog.cc:102 +msgid "CD Marker File Type" +msgstr "CD-markörsfiltyp" + +#: ../export_dialog.cc:102 +msgid "Channels" +msgstr "Kanaler" + +#: ../export_dialog.cc:104 +msgid "File Type" +msgstr "Filtyp" + +#: ../export_dialog.cc:105 +msgid "Sample Format" +msgstr "Samplingsformat" + +#: ../export_dialog.cc:106 +msgid "Sample Endianness" +msgstr "Samplings-endian" + +#: ../export_dialog.cc:107 +msgid "Sample Rate" +msgstr "Samplingsfrekvens" + +#: ../export_dialog.cc:108 +msgid "Conversion Quality" +msgstr "Konverteringskvalitet" + +#: ../export_dialog.cc:109 +msgid "Dither Type" +msgstr "Dither-typ" + +#: ../export_dialog.cc:110 +msgid "Export CD Marker File Only" +msgstr "Expoertera endast CD-markörsfil" + +#: ../export_dialog.cc:111 +msgid "Export to File" +msgstr "Exportera till fil" + +#: ../export_dialog.cc:112 ../option_editor.cc:82 ../option_editor.cc:83 +msgid "Browse" +msgstr "Bläddra" + +#: ../export_dialog.cc:113 +msgid "Specific tracks ..." +msgstr "Enstaka spÃ¥r..." + +#: ../export_dialog.cc:124 +msgid "ardour: export" +msgstr "ardour: exportera" + +#: ../export_dialog.cc:125 +msgid "ardour_export" +msgstr "" + +#: ../export_dialog.cc:138 ../export_dialog.cc:154 ../mixer_strip.cc:123 +#: ../mixer_strip.cc:767 +msgid "Output" +msgstr "UtgÃ¥ng" + +#: ../export_dialog.cc:632 +msgid "Editor: cannot open \"%1\" as export file for CD toc file" +msgstr "Redigerare: kan ej öppna \"%1\" som exportfil för CD-TOC-fil" + +#: ../export_dialog.cc:758 +msgid "Editor: cannot open \"%1\" as export file for CD cue file" +msgstr "Redigerare: kan ej öppna \"%1\" som exportfil för CD-CUE-fil" + +#: ../export_dialog.cc:777 +msgid "WAV" +msgstr "" + +#: ../export_dialog.cc:911 +msgid "Stop Export" +msgstr "Avbryt Export" + +#: ../export_dialog.cc:1130 +msgid "Please enter a valid filename." +msgstr "Var vänlig använd ett giltigt filnamn." + +#: ../export_dialog.cc:1140 +msgid "Please specify a complete filename for the audio file." +msgstr "Var vänlig skriv in ett fullständigt filnamn för ljudfilen" + +#: ../export_dialog.cc:1146 +msgid "File already exists, do you want to overwrite it?" +msgstr "Filen existerar redan, vill du skriva över den?" + +#: ../export_dialog.cc:1158 ../export_range_markers_dialog.cc:152 +msgid "Cannot write file in: " +msgstr "Kan ej skriva till fil i: " + +#. warning dialog +#: ../export_range_markers_dialog.cc:134 +msgid "Please enter a valid target directory." +msgstr "Var vänlig välj en giltig katalog." + +#: ../export_range_markers_dialog.cc:142 +msgid "" +"Please select an existing target directory. Files\n" +"are not allowed!" +msgstr "" +"Var vänliga välj en existerande katalog. Filer\n" +"är inte tillÃ¥tna!" + +#: ../gain_automation_time_axis.cc:61 +msgid "add gain automation event" +msgstr "lägg till volymautomatiseringshändelse" + +#: ../gain_meter.cc:66 +msgid "cannot find images for fader slider" +msgstr "kan inte hitta bilder för reglage" + +#: ../gain_meter.cc:73 +msgid "cannot find images for fader rail" +msgstr "kan inte hitta bilder för reglageräcke" + +#: ../gain_meter.cc:129 ../gain_meter.cc:489 ../gain_meter.cc:534 +msgid "-inf" +msgstr "" + +#: ../gain_meter.cc:139 +msgid "Fader automation mode" +msgstr "Automatiseringsläge för reglage" + +#: ../gain_meter.cc:140 +msgid "Fader automation type" +msgstr "Automatiseringstyp för reglage" + +#. XXX it might different in different languages +#: ../gain_meter.cc:181 ../gain_meter.cc:812 ../panner_ui.cc:98 +#: ../panner_ui.cc:806 +msgid "Abs" +msgstr "" + +#: ../gain_meter.cc:467 +msgid "-Inf" +msgstr "" + +#: ../gain_meter.cc:776 ../mixer_strip.cc:770 ../panner_ui.cc:770 +msgid "O" +msgstr "" + +#: ../gain_meter.cc:779 ../panner_ui.cc:773 +msgid "P" +msgstr "" + +#: ../gain_meter.cc:782 ../panner_ui.cc:776 +msgid "T" +msgstr "" + +#: ../gain_meter.cc:785 ../panner_ui.cc:779 +msgid "W" +msgstr "" + +#: ../gtk-custom-ruler.c:126 +msgid "Lower" +msgstr "Lägre" + +#: ../gtk-custom-ruler.c:127 +msgid "Lower limit of ruler" +msgstr "Lägre gräns för räcke" + +#: ../gtk-custom-ruler.c:136 +msgid "Upper" +msgstr "Övre" + +#: ../gtk-custom-ruler.c:137 +msgid "Upper limit of ruler" +msgstr "Övre gräns för räcke" + +#: ../gtk-custom-ruler.c:146 +msgid "Position" +msgstr "" + +#: ../gtk-custom-ruler.c:147 +msgid "Position of mark on the ruler" +msgstr "Position för märke pÃ¥ räcke" + +#: ../gtk-custom-ruler.c:156 +msgid "Max Size" +msgstr "Max storlek" + +#: ../gtk-custom-ruler.c:157 +msgid "Maximum size of the ruler" +msgstr "Max storlek för räcket" + +#: ../gtk-custom-ruler.c:166 +msgid "Show Position" +msgstr "Visa position" + +#: ../gtk-custom-ruler.c:167 +msgid "Draw current ruler position" +msgstr "Rita upp räckets aktuellt position" + +#. end-of-file, other end closed or shutdown? +#: ../imageframe_socket_handler.cc:126 +msgid "Image Compositor Socket has been shutdown/closed" +msgstr "" + +#: ../imageframe_time_axis.cc:285 +msgid "0.5 seconds" +msgstr "0.5 sekunder" + +#: ../imageframe_time_axis.cc:286 ../marker_time_axis.cc:241 +msgid "1 seconds" +msgstr "1 sekund" + +#: ../imageframe_time_axis.cc:287 ../marker_time_axis.cc:242 +msgid "1.5 seconds" +msgstr "1.5 sekunder" + +#: ../imageframe_time_axis.cc:288 ../marker_time_axis.cc:243 +msgid "2 seconds" +msgstr "2 sekunder" + +#: ../imageframe_time_axis.cc:289 ../marker_time_axis.cc:244 +msgid "2.5 seconds" +msgstr "2.5 sekunder" + +#: ../imageframe_time_axis.cc:290 ../marker_time_axis.cc:245 +msgid "3 seconds" +msgstr "3 sekunder" + +#. duration_items.push_back(SeparatorElem()) ; +#. duration_items.push_back(MenuElem (_("custom"), mem_fun(*this, &ImageFrameTimeAxis::set_marker_duration_custom))) ; +#: ../imageframe_time_axis.cc:295 ../marker_time_axis.cc:250 +msgid "Duration (sec)" +msgstr "Varaktighet (sekunder)" + +#: ../imageframe_time_axis.cc:300 +msgid "Remove Frame" +msgstr "Ta bort ruta" + +#: ../imageframe_time_axis.cc:303 +msgid "Image Frame" +msgstr "Bildruta" + +#: ../imageframe_time_axis.cc:304 ../marker_time_axis.cc:256 +msgid "Rename Track" +msgstr "Döp om spÃ¥r" + +#: ../io_selector.cc:59 ../io_selector.cc:793 +msgid "Rescan" +msgstr "Uppdatera" + +#: ../io_selector.cc:67 +msgid "%1 input" +msgstr "%1-ingÃ¥ng" + +#: ../io_selector.cc:69 +msgid "%1 output" +msgstr "%1-utgÃ¥ng" + +#: ../io_selector.cc:141 ../route_params_ui.cc:106 +msgid "Inputs" +msgstr "IngÃ¥ngar" + +#: ../io_selector.cc:141 ../route_params_ui.cc:107 +msgid "Outputs" +msgstr "UtgÃ¥ngar" + +#: ../io_selector.cc:142 +msgid "Add Input" +msgstr "Lägg till ingÃ¥ng" + +#: ../io_selector.cc:142 +msgid "Add Output" +msgstr "Lägg till utgÃ¥ng" + +#: ../io_selector.cc:143 +msgid "Remove Input" +msgstr "Ta bort ingÃ¥ng" + +#: ../io_selector.cc:143 +msgid "Remove Output" +msgstr "Ta bort utgÃ¥ng" + +#: ../io_selector.cc:144 +msgid "Disconnect All" +msgstr "Koppla frÃ¥n alla" + +#: ../io_selector.cc:158 +msgid "Available connections" +msgstr "Tillgängliga anslutningar" + +#: ../io_selector.cc:554 ../io_selector.cc:573 +msgid "There are no more JACK ports available." +msgstr "Det finns inga fler JACK-portar tillgängliga" + +#: ../io_selector.cc:648 ../io_selector.cc:675 ../io_selector.cc:728 +msgid "port" +msgstr "" + +#: ../io_selector.cc:797 +msgid "ardour: " +msgstr "" + +#: ../keyboard.cc:297 +msgid "KeyboardTarget: keyname \"%1\" is unknown." +msgstr "KeyboardTarget: tangent \"%1\" är okänd." + +#: ../keyboard.cc:523 +msgid "" +"Your system is completely broken - NumLock uses \"%1\"as its modifier. This " +"is madness - see the man page for xmodmap to find out how to fix this." +msgstr "" +"Ditt system är totalt trasigt - NumLock använder \"%1\" som sin modifikator. " +"Detta är galenskap - se xmodmaps manualsida för att fixa detta." + +#: ../keyboard.cc:531 +msgid "" +"Your system generates \"%1\" when the NumLock key is pressed. This can cause " +"problems when editing so Ardour will use %2 to mean Meta rather than %1" +msgstr "" +"Ditt system genererar \"%1\" när NumLock trycks. Detta kan orsaka problem " +"vid redigering, sÃ¥ Ardour kommer att använda %2 som Meta snarare än %1" + +#: ../keyboard.cc:592 +msgid "You have %1 keys bound to \"mod1\"" +msgstr "Du har %1 tangenter bundna till \"mod1\"" + +#: ../keyboard.cc:607 +msgid "You have %1 keys bound to \"mod2\"" +msgstr "Du har %1 tangenter bundna till \"mod2\"" + +#: ../keyboard.cc:622 +msgid "You have %1 keys bound to \"mod3\"" +msgstr "Du har %1 tangenter bundna till \"mod3\"" + +#: ../keyboard.cc:637 +msgid "You have %1 keys bound to \"mod4\"" +msgstr "Du har %1 tangenter bundna till \"mod4\"" + +#: ../keyboard.cc:652 +msgid "You have %1 keys bound to \"mod5\"" +msgstr "Du har %1 tangenter bundna till \"mod5\"" + +#: ../location_ui.cc:47 ../location_ui.cc:50 +msgid "Set" +msgstr "Ställ in" + +#: ../location_ui.cc:48 ../location_ui.cc:51 +msgid "Go" +msgstr "GÃ¥ till" + +#: ../location_ui.cc:54 +msgid "CD" +msgstr "" + +#: ../location_ui.cc:57 +msgid "SCMS" +msgstr "" + +#: ../location_ui.cc:58 +msgid "Pre-Emphasis" +msgstr "" + +#: ../location_ui.cc:569 +msgid "Add New Location" +msgstr "Lägg till ny Plats" + +#: ../location_ui.cc:570 +msgid "Add New Range" +msgstr "Lägg till nytt OmfÃ¥ng" + +#: ../location_ui.cc:574 +msgid "ardour: locations" +msgstr "ardour: platser" + +#: ../location_ui.cc:575 +msgid "ardour_locations" +msgstr "" + +#: ../location_ui.cc:603 +msgid "Location (CD Index) Markers" +msgstr "Plats-markörer (CD-Index)" + +#: ../location_ui.cc:623 +msgid "Range (CD Track) Markers" +msgstr "OmfÃ¥ng-markörer (CD-spÃ¥r)" + +#: ../location_ui.cc:789 +msgid "add range marker" +msgstr "lägg till omfÃ¥ngsmarkör" + +#: ../main.cc:71 +msgid "ardour is killing itself for a clean exit\n" +msgstr "ardour dödar sig själv för ett rent avslut\n" + +#: ../main.cc:80 +msgid "stopping user interface\n" +msgstr "stoppar användargränssnittet\n" + +#. XXX its doubtful that snprintf() is async-safe +#: ../main.cc:99 +#, c-format +msgid "%d(%d): received signal %d\n" +msgstr "%d(%d): mottog signal %d\n" + +#: ../main.cc:185 +msgid "cannot become new process group leader (%1)" +msgstr "kan inte bli ny processgruppledare (%1)" + +#: ../main.cc:212 +msgid "cannot setup signal handling for %1" +msgstr "kan ej konfigurera signalhantering för %1" + +#: ../main.cc:223 +msgid "cannot set default signal mask (%1)" +msgstr "kan inte ställa in standardsignalmask (%1)" + +#: ../main.cc:253 +msgid "" +"Without a UI style file, ardour will look strange.\n" +" Please set ARDOUR2_UI_RC to point to a valid UI style file" +msgstr "" +"Utan en UI-stilfil kommer Ardour att se underligt ut.\n" +" Ställ in ARDOUR2_UI_RC sÃ¥ att det pekar till en giltig UI-stilfil" + +#: ../main.cc:275 +msgid "Ardour could not connect to JACK." +msgstr "Ardour kunde inte ansluta till JACK" + +#: ../main.cc:279 +msgid "" +"There are several possible reasons:\n" +"\n" +"1) JACK is not running.\n" +"2) JACK is running as another user, perhaps root.\n" +"3) There is already another client called \"ardour\".\n" +"\n" +"Please consider the possibilities, and perhaps (re)start JACK." +msgstr "" +"Det finns flera möjliga anledningar:\n" +"\n" +"1) JACK är inte igÃ¥ng.\n" +"2) JACK är startat av en annan användare, kanske root.\n" +"3) Det finns redan en annan klient som heter \"ardour\".\n" +"\n" +"Överväg dessa möjligheter, och starta mÃ¥hända (om) JACK." + +#: ../main.cc:309 +msgid "could not load command line session \"%1\"" +msgstr "kunde inte ladda kommandopromptssessionen \"%1\"" + +#. it wasn't new, but we require a new session +#: ../main.cc:329 +msgid "" +"\n" +"\n" +"A session named \"%1\" already exists.\n" +"To avoid this message, start ardour as \"ardour %1" +msgstr "" +"\n" +"\n" +"En session med namnet \"%1\" existerar redan.\n" +"För att undvika detta meddelande, starta Ardour som \"ardour %1" + +#: ../main.cc:340 +msgid "" +"\n" +"\n" +"No session named \"%1\" exists.\n" +"To create it from the command line, start ardour as \"ardour --new %1" +msgstr "" +"\n" +"\n" +"Ingen session med namnet \"%1\" existerar.\n" +"För att skapa den frÃ¥n kommandoprompten, starta Ardour som följer: \"ardour " +"--new %1" + +#: ../main.cc:395 +msgid "Ardour/GTK " +msgstr "" + +#: ../main.cc:397 +msgid "" +"\n" +" (built using " +msgstr "" +"\n" +" (kompilerat med " + +#: ../main.cc:401 +msgid " with libardour " +msgstr " med libardour" + +#: ../main.cc:406 +msgid " and GCC version " +msgstr " och GCC version " + +#: ../main.cc:416 +msgid "Copyright (C) 1999-2006 Paul Davis" +msgstr "" + +#: ../main.cc:417 +msgid "" +"Some portions Copyright (C) Steve Harris, Ari Johnson, Brett Viren, Joel " +"Baker" +msgstr "" +"Vissa delar Copyright (C) Steve Harris, Ari Johnson, Brett Viren, Joel " +"Baker" + +#: ../main.cc:419 +msgid "Ardour comes with ABSOLUTELY NO WARRANTY" +msgstr "" + +#: ../main.cc:420 +msgid "not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." +msgstr "" + +#: ../main.cc:421 +msgid "This is free software, and you are welcome to redistribute it " +msgstr "" + +#: ../main.cc:422 +msgid "under certain conditions; see the source for copying conditions." +msgstr "" + +#: ../main.cc:431 +msgid "could not create ARDOUR GUI" +msgstr "kunde inte skapa ARDOUR GUI" + +#: ../main.cc:449 +msgid "Could not connect to JACK server as \"%1\"" +msgstr "Kunde inte ansluta till JACK-servern som \"%1\"" + +#: ../main.cc:452 +msgid "could not initialize Ardour." +msgstr "kunde inte initialisera Ardour." + +#: ../marker.cc:244 +msgid "MarkerText" +msgstr "MarkörText" + +#: ../marker_time_axis.cc:253 +msgid "Remove Marker" +msgstr "Ta bort markör" + +#: ../marker_time_axis.cc:255 +msgid "Marker" +msgstr "Markör" + +#: ../meter_bridge.cc:77 +msgid "ardour: meter bridge" +msgstr "ardour: taktartsbrygga" + +#: ../meter_bridge.cc:78 +msgid "ardour_meter_bridge" +msgstr "" + +#: ../meter_bridge_strip.cc:79 ../meter_bridge_strip.cc:93 +#, c-format +msgid "# of %u-sample overs" +msgstr "# %u-samplings-över" + +#: ../meter_bridge_strip.cc:221 +msgid "New Name for Meter:" +msgstr "Nytt namn för taktart" + +#: ../mixer_strip.cc:94 ../mixer_strip.cc:140 ../mixer_strip.cc:1227 +msgid "pre" +msgstr "för" + +#: ../mixer_strip.cc:95 ../mixer_strip.cc:822 +msgid "Comments" +msgstr "Kommentarer" + +#: ../mixer_strip.cc:118 +msgid "Input" +msgstr "IngÃ¥ng" + +#: ../mixer_strip.cc:136 ../mixer_strip.cc:1223 +msgid "input" +msgstr "ingÃ¥ng" + +#: ../mixer_strip.cc:144 ../mixer_strip.cc:1231 +msgid "post" +msgstr "efter" + +#. TRANSLATORS: this string should be longest of the strings +#. used to describe meter points. In english, its "input". +#. +#: ../mixer_strip.cc:152 +msgid "tupni" +msgstr "gnÃ¥gni" + +#: ../mixer_strip.cc:207 +msgid "Varispeed" +msgstr "variabel hastighet" + +#: ../mixer_strip.cc:233 ../mixer_strip.cc:836 +msgid "Click to Add/Edit Comments" +msgstr "Klicka för att lägga till/redigera kommentarer" + +#: ../mixer_strip.cc:374 +msgid "unknown strip width \"%1\" in XML GUI information" +msgstr "okänd strip-bredd \"%1\" i XML-GUI-informationen" + +#: ../mixer_strip.cc:417 +msgid "record" +msgstr "spela in" + +#: ../mixer_strip.cc:418 ../region_editor.cc:46 +msgid "mute" +msgstr "tysta" + +#: ../mixer_strip.cc:419 +msgid "solo" +msgstr "" + +#: ../mixer_strip.cc:422 +msgid "comments" +msgstr "kommentarer" + +#: ../mixer_strip.cc:424 +msgid "*comments*" +msgstr "*kommentarer*" + +#: ../mixer_strip.cc:438 +msgid "Rec" +msgstr "Spela in" + +#: ../mixer_strip.cc:439 +msgid "M" +msgstr "" + +#: ../mixer_strip.cc:440 +msgid "S" +msgstr "" + +#: ../mixer_strip.cc:443 ../mixer_strip.cc:830 +msgid "Cmt" +msgstr "Kmt" + +#: ../mixer_strip.cc:445 ../mixer_strip.cc:828 +msgid "*Cmt*" +msgstr "*Kmt*" + +#: ../mixer_strip.cc:483 ../mixer_strip.cc:549 ../redirect_box.cc:1005 +msgid "Not connected to JACK - no I/O changes are possible" +msgstr "Inte ansluten till JACK - in/ut-ändringar är inte möjliga" + +#: ../mixer_strip.cc:560 +msgid "Track" +msgstr "SpÃ¥r" + +#: ../mixer_strip.cc:588 ../mixer_strip.cc:604 +msgid "could not register new ports required for that connection" +msgstr "kunde inte registrera nya porter nödvändiga för anslutningen" + +#: ../mixer_strip.cc:747 +msgid " Input" +msgstr " IngÃ¥ng" + +#: ../mixer_strip.cc:750 +msgid "I" +msgstr "" + +#: ../mixer_strip.cc:820 +msgid "*Comments*" +msgstr "*Kommentarer" + +#: ../mixer_strip.cc:859 +msgid ": comment editor" +msgstr "" + +#: ../mixer_strip.cc:953 +msgid "Grp" +msgstr "" + +#: ../mixer_strip.cc:956 +msgid "~G" +msgstr "" + +#: ../mixer_strip.cc:1004 +msgid "Invert Polarity" +msgstr "Invertera polaritet" + +#: ../mixer_ui.cc:84 +msgid "Strips" +msgstr "Remsor" + +#: ../mixer_ui.cc:109 +msgid "Group" +msgstr "Grupp" + +#: ../mixer_ui.cc:210 ../mixer_ui.cc:369 +msgid "ardour: mixer" +msgstr "" + +#: ../mixer_ui.cc:211 +msgid "ardour_mixer" +msgstr "" + +#: ../mixer_ui.cc:345 +msgid "ardour: mixer: " +msgstr "" + +#: ../mixer_ui.cc:572 +msgid "signal" +msgstr "" + +#: ../mixer_ui.cc:722 +msgid "track display list item for renamed strip not found!" +msgstr "hittade inte spÃ¥rvisningslisteobjekt för omdöpt remsor!" + +#: ../new_session_dialog.cc:39 +msgid "New Session Name :" +msgstr "Sessionens namn:" + +#: gtk2_ardour/new_session_dialog.cc:70 +msgid "Name :" +msgstr "Namn:" + +#: gtk2_ardour/new_session_dialog.cc:79 +msgid "Create Folder In :" +msgstr "Skapa katalog i:" + +#: gtk2_ardour/new_session_dialog.cc:72 +msgid "Template :" +msgstr "Använd mall:" + +#: ../new_session_dialog.cc:45 +msgid "Channel Count" +msgstr "Antal kanaler" + +#: ../new_session_dialog.cc:46 +msgid "Create Monitor Bus" +msgstr "Skapa medhörningsbuss" + +#: ../new_session_dialog.cc:53 +msgid "Create Master Bus" +msgstr "Skapa master-buss" + +#: ../new_session_dialog.cc:55 +msgid "Automatically Connect Inputs" +msgstr "Anslut automatiskt ingÃ¥ngar" + +#: gtk2_ardour/new_session_dialog.cc:84 gtk2_ardour/new_session_dialog.cc:97 +msgid "Use only" +msgstr "Använd endast" + +#: gtk2_ardour/new_session_dialog.cc:105 +msgid "... to Master Bus" +msgstr "...till Master-bussen" + +#: gtk2_ardour/new_session_dialog.cc:106 +msgid "... to Physical Outputs" +msgstr "...till fysiska utgÃ¥ngar" + + +#: ../new_session_dialog.cc:56 ../new_session_dialog.cc:67 +msgid "Port Limit" +msgstr "Portgräns" + +#: ../new_session_dialog.cc:64 +msgid "<b>Track/Bus Inputs</b>" +msgstr "<b>SpÃ¥r/bussingÃ¥ngar</b>" + +#: ../new_session_dialog.cc:66 +msgid "Automatically Connect Outputs" +msgstr "Anslut automatiskt utgÃ¥ngar" + +#: ../new_session_dialog.cc:75 +msgid "Connect to Master Bus" +msgstr "Anslut till master-bussen" + +#: gtk2_ardour/new_session_dialog.cc:83 +msgid "Automatically Connect to Physical Inputs" +msgstr "Anslut automatiskt till fysiska utgÃ¥ngar" + +#: ../new_session_dialog.cc:80 +msgid "<b>Track/Bus Outputs</b>" +msgstr "<b>SpÃ¥r/bussutgÃ¥ngar</b>" + +#: ../new_session_dialog.cc:83 +msgid "Advanced Options" +msgstr "Avancerade inställningar" + +#: gtk2_ardour/new_session_dialog.cc:66 +msgid "<b>Busses</b>" +msgstr "<b>Bussar</b>" + +#: gtk2_ardour/new_session_dialog.cc:67 +msgid "<b>Inputs</b>" +msgstr "<b>IngÃ¥ngar</b>" + +#: gtk2_ardour/new_session_dialog.cc:68 +msgid "<b>Outputs</b>" +msgstr "<b>UtgÃ¥ngar</b>" + + +#: gtk2_ardour/new_session_dialog.cc:120 +msgid "Recent:" +msgstr "Tidigare:" + +#: gtk2_ardour/new_session_dialog.cc:157 +msgid "Browse:" +msgstr "Bläddra:" + +#: ../new_session_dialog.cc:274 +msgid "New Session" +msgstr "Ny session" + +#: ../new_session_dialog.cc:276 +msgid "Open Session" +msgstr "Öppna session" + +#: ../new_session_dialog.cc:281 +msgid "ardour: session control" +msgstr "ardour: session" + +#: ../new_session_dialog.cc:305 +msgid "select template" +msgstr "välj mall" + +#: ../new_session_dialog.cc:311 +msgid "select session file" +msgstr "välj sessionsfil" + +#: ../new_session_dialog.cc:320 +msgid "select directory" +msgstr "välj katalog" + +#: ../option_editor.cc:75 +msgid "SMPTE offset is negative" +msgstr "SMPTE-förskjutning är negativ" + +#: ../option_editor.cc:101 +msgid "ardour: options editor" +msgstr "ardour: inställningar" + +#: ../option_editor.cc:102 +msgid "ardour_option_editor" +msgstr "" + +#: ../option_editor.cc:126 +msgid "Paths/Files" +msgstr "Sökvägar/filer" + +#: ../option_editor.cc:127 +msgid "Kbd/Mouse" +msgstr "Tangentbord/mus" + +#: ../option_editor.cc:130 +msgid "Layers & Fades" +msgstr "Lager & Toningar" + +#: ../option_editor.cc:134 +msgid "MIDI" +msgstr "" + +#: ../option_editor.cc:176 +msgid "24 FPS" +msgstr "" + +#: ../option_editor.cc:178 +msgid "25 FPS" +msgstr "" + +#: ../option_editor.cc:180 +msgid "30 FPS" +msgstr "" + +#: ../option_editor.cc:186 +msgid "30 FPS drop" +msgstr "30 FPS-drop" + +#: ../option_editor.cc:243 +msgid "session RAID path" +msgstr "Sessionens RAID-sökväg" + +#: ../option_editor.cc:248 +msgid "Soundfile Search Paths" +msgstr "Sökvägar för ljudfiler" + +#: ../option_editor.cc:253 +msgid "Paths" +msgstr "Sökvägar" + +#: ../option_editor.cc:267 ../option_editor.cc:273 ../option_editor.cc:722 +#: ../option_editor.cc:749 +msgid "internal" +msgstr "intern" + +#: ../option_editor.cc:286 +msgid "Short crossfade length (msecs)" +msgstr "Kort övertonings längd (msek)" + +#: ../option_editor.cc:298 +msgid "Destructive crossfade length (msecs)" +msgstr "Destruktiv övertonings längd (msek)" + +#: ../option_editor.cc:366 +msgid "SMPTE Frames/second" +msgstr "SMPTE-Frames/sekund" + +#: ../option_editor.cc:367 +msgid "SMPTE Offset" +msgstr "SMPTE-förskjutning" + +#: ../option_editor.cc:461 ../option_editor.cc:468 ../option_editor.cc:471 +#: ../option_editor.cc:617 +msgid "online" +msgstr "ansluten" + +#. remember, we have to handle the i18n case where the relative +#. lengths of the strings in language N is different than in english. +#. +#: ../option_editor.cc:468 ../option_editor.cc:469 ../option_editor.cc:614 +msgid "offline" +msgstr "frÃ¥nkopplad" + +#: ../option_editor.cc:669 +msgid "Choose Click" +msgstr "Välj klick" + +#: ../option_editor.cc:688 +msgid "Choose Click Emphasis" +msgstr "Välj klickbetoning" + +#: ../option_editor.cc:802 +msgid "Click audio file" +msgstr "Klickljudfil" + +#: ../option_editor.cc:808 +msgid "Click emphasis audiofile" +msgstr "Betoningsljudfil" + +#: ../option_editor.cc:845 +msgid "" +"The auditioner is a dedicated mixer strip used\n" +"for listening to specific regions outside the context\n" +"of the overall mix. It can be connected just like any\n" +"other mixer strip." +msgstr "" +"Avlyssnaren är en dedikerad mixerremsa som används\n" +"för att lyssna pÃ¥ specifika regioner utanför den\n" +"generalla mixen. Den kan anslutas precis som vilken\n" +"annan mixerremsa." + +#: ../option_editor.cc:918 +msgid "Edit using" +msgstr "Redigera med" + +#: ../option_editor.cc:925 ../option_editor.cc:952 +msgid "+ button" +msgstr "+ musknapp" + +#: ../option_editor.cc:945 +msgid "Delete using" +msgstr "Radera med" + +#: ../option_editor.cc:972 +msgid "Ignore snap using" +msgstr "Ignorera fästläge med" + +#: ../opts.cc:46 +msgid "Usage: " +msgstr "Användning: " + +#: ../opts.cc:47 +msgid " -v, --version Show version information\n" +msgstr " -v, --version Visa versionsinformation\n" + +#: ../opts.cc:48 +msgid " -h, --help Print this message\n" +msgstr " -h, --help Visa detta meddelande\n" + +#: ../opts.cc:49 +msgid "" +" -b, --bindings Print all possible keyboard binding " +"names\n" +msgstr "" +" -b, --bindings Visa alla möjliga kortkommandonamn\n" + +#: ../opts.cc:50 +msgid " -n, --show-splash Show splash screen\n" +msgstr " -n, --show-splash Visa splash-bilden\n" + +#: ../opts.cc:51 +msgid "" +" -c, --name name Use a specific jack client name, default " +"is ardour\n" +msgstr "" +" -c, --name name Använd ett specifikt jack-klientnamn, " +"standard är ardour\n" + +#: ../opts.cc:52 +msgid "" +" -N, --new session-name Create a new session from the command " +"line\n" +msgstr "" +" -N, --new session-name Skapa en ny session frÃ¥n kammando- " +"prompten\n" + +#: ../opts.cc:53 +msgid "" +" -o, --use-hw-optimizations Try to use h/w specific optimizations\n" +msgstr "" +" -o, --use-hw-optimizations Försök använda hÃ¥rdvaruspecifik optimering\n" + +#: ../opts.cc:55 +msgid " -V, --novst Do not use VST support\n" +msgstr " -V, --novst SlÃ¥ av VST-stödet\n" + +#: ../opts.cc:57 +msgid " [session-name] Name of session to load\n" +msgstr " [session-name] Namn för sessionen som ska laddas\n" + +#: ../opts.cc:58 +msgid " -C, --curvetest filename Curve algorithm debugger\n" +msgstr "" + +#: ../opts.cc:59 +msgid " -g, --gtktheme Allow GTK to load a theme\n" +msgstr " -g, --gtktheme TillÃ¥t GTK att ladda ett tema\n" + +#: ../pan_automation_time_axis.cc:59 +msgid "You can't graphically edit panning of more than stream" +msgstr "Du kan inte grafiskt redigera panorering för mer en än en ström" + +#: ../pan_automation_time_axis.cc:79 +msgid "add pan automation event" +msgstr "lägg till panoreringsautomatiseringshändelse" + +#: ../panner2d.cc:588 ../panner_ui.cc:434 ../plugin_ui.cc:833 +msgid "Bypass" +msgstr "FörbigÃ¥" + +#: ../panner_ui.cc:57 ../panner_ui.cc:224 +msgid "link" +msgstr "länka" + +#: ../panner_ui.cc:68 +msgid "Pan automation mode" +msgstr "panoreringsautomatiseringsläge" + +#: ../panner_ui.cc:69 +msgid "Pan automation type" +msgstr "panoreringsuatomtiseringstyp" + +#: ../panner_ui.cc:80 +msgid "panning link control" +msgstr "kontroll för panoreringslänkning" + +#: ../panner_ui.cc:82 +msgid "panning link direction" +msgstr "riktning för panoreringslänkning" + +#: ../panner_ui.cc:234 +msgid "L" +msgstr "V" + +#: ../panner_ui.cc:334 +#, c-format +msgid "panner for channel %lu" +msgstr "" + +#: ../panner_ui.cc:336 +#, c-format +msgid "panner for channel %u" +msgstr "panorering för kanal %u" + +#: ../panner_ui.cc:444 +msgid "Reset all" +msgstr "Nollställ alla" + +#: ../playlist_selector.cc:51 +msgid "ardour: playlists" +msgstr "ardour: spellistor" + +#: ../playlist_selector.cc:58 +msgid "Playlists grouped by track" +msgstr "Spellista grupperad utifrÃ¥n spÃ¥r" + +#: ../playlist_selector.cc:97 +msgid "ardour: playlist for " +msgstr "ardour: spellista för " + +#: ../playlist_selector.cc:113 +msgid "Other tracks" +msgstr "Andra spÃ¥r" + +#: ../playlist_selector.cc:129 +msgid "unassigned" +msgstr "otilldelad" + +#: ../plugin_selector.cc:42 +msgid "ardour: plugins" +msgstr "ardour: insticksprogram" + +#: ../plugin_selector.cc:55 +msgid "Available LADSPA Plugins" +msgstr "Tillgängliga LADSPA-insticksprogram" + +#: ../plugin_selector.cc:56 +msgid "Type" +msgstr "Typ" + +#: ../plugin_selector.cc:57 ../plugin_selector.cc:80 +msgid "# Inputs" +msgstr "# IngÃ¥ngar" + +#: ../plugin_selector.cc:58 ../plugin_selector.cc:81 +msgid "# Outputs" +msgstr "# UtÃ¥ngar" + +#: ../plugin_selector.cc:67 +msgid "Plugins to be Connected to Insert" +msgstr "Insticksprogram att anslutas till Anslutningspunkt" + +#: ../plugin_selector.cc:79 +msgid "Available plugins" +msgstr "Tillgänliga insticksprogram" + +#: ../plugin_selector.cc:97 +msgid "Add a plugin to the effect list" +msgstr "Lägg till ett insticksprogram till effektlistan" + +#: ../plugin_selector.cc:101 +msgid "Remove a plugin from the effect list" +msgstr "Ta bort ett insticksprogram frÃ¥n effektlistan" + +#: ../plugin_selector.cc:103 +msgid "Update available plugins" +msgstr "Uppdatera tillgängliga insticksprogram" + +#: ../plugin_selector.cc:125 +msgid "LADSPA" +msgstr "" + +#: ../plugin_selector.cc:128 +msgid "VST" +msgstr "" + +#: ../plugin_ui.cc:83 +msgid "" +"unknown type of editor-supplying plugin (note: no VST support in this " +"version of ardour)" +msgstr "" +"okänd typ av editor-levererande insticksprogram (N.B.: inget VST-stöd i " +"denna version av ardour)" + +#: ../plugin_ui.cc:138 +msgid "<span size=\"large\">Presets</span>" +msgstr "<span size=\"large\">Förinställningar</span>" + +#: ../plugin_ui.cc:229 +msgid "Controls" +msgstr "Kontroller" + +#: ../plugin_ui.cc:266 +msgid "Plugin Editor: could not build control element for port %1" +msgstr "" +"Insticksprogramsredigerare: kunde inte bygga kontrollelement för port%1" + +#: ../plugin_ui.cc:357 +msgid "Automation control" +msgstr "Automatiseringskontroll" + +#: ../plugin_ui.cc:853 +msgid "Plugin preset %1 not found" +msgstr "Insticksprogram-förinställning %1 hittades inte" + +#: ../plugin_ui.cc:863 +msgid "Name of New Preset:" +msgstr "Namn för insticksprogramsinställningar:" + +#: ../redirect_automation_line.cc:53 +msgid "redirect automation created for non-plugin" +msgstr "omdirigera automatisering skapa för icke-insticksprogram" + +#: ../redirect_automation_time_axis.cc:93 +msgid "add automation event to " +msgstr "lägg till automatiseringshändelse till" + +#: ../redirect_box.cc:222 +msgid "New send" +msgstr "Ny Sänd" + +#: ../redirect_box.cc:223 +msgid "Show send controls" +msgstr "msgstr Visa Sändkontroller" + +#: ../redirect_box.cc:382 +msgid "" +"You attempted to add a plugin (%1).\n" +"The plugin has %2 inputs\n" +"but at the insertion point, there are\n" +"%3 active signal streams.\n" +"\n" +"This makes no sense - you are throwing away\n" +"part of the signal." +msgstr "" +"Du försökte lägga till ett insticksprogram (%1).\n" +"Det har %2 ingÃ¥ngar\n" +"men vid punkten det infogades finns bara\n" +"%3 aktiva signalströmmar.\n" +"\n" +"Detta är orimligt - du slängers bort\n" +"en del av signalen." + +#: ../redirect_box.cc:394 +msgid "" +"You attempted to add a plugin (%1).\n" +"The plugin has %2 inputs\n" +"but at the insertion point there are\n" +"only %3 active signal streams.\n" +"\n" +"This makes no sense - unless the plugin supports\n" +"side-chain inputs. A future version of Ardour will\n" +"support this type of configuration." +msgstr "" +"Du försökte lägga till ett insticksprogram (%1).\n" +"Det har %2 ingÃ¥ngar\n" +"men vid punkten det infogades finns bara\n" +"%3 aktiva signalströmmar.\n" +"\n" +"Detta är orimligt - förutom om insticksprogrammet\n" +"stödjer sidokedjeingÃ¥ngar. Framtida versioner av\n" +"Ardour kommer att stödja detta." + +#: ../redirect_box.cc:407 +msgid "" +"You attempted to add a plugin (%1).\n" +"\n" +"The I/O configuration doesn't make sense:\n" +"\n" +"The plugin has %2 inputs and %3 outputs.\n" +"The track/bus has %4 inputs and %5 outputs.\n" +"The insertion point, has %6 active signals.\n" +"\n" +"Ardour does not understand what to do in such situations.\n" +msgstr "" +"Du försökte lägga till ett insticksprogram (%1).\n" +"\n" +"In/Ut-konfigurationen är orimlig:\n" +"\n" +"Insticksprogrammet har %2 ingÃ¥ngar och %3 ut.\n" +"SpÃ¥ret/bussen har %4 ingÃ¥ngar och %5 ut.\n" +"Infogningspunkten har %6 aktiva signaler.\n" +"\n" +"Ardour förstÃ¥r inte vad det ska göra i sÃ¥dana situationer.\n" + +#: ../redirect_box.cc:494 +msgid "Pre-fader inserts, sends & plugins:" +msgstr "För-nivÃ¥reglage-anslutningspunkter, sändningar & insticksprogram:" + +#: ../redirect_box.cc:497 +msgid "Post-fader inserts, sends & plugins:" +msgstr "Efter-nivÃ¥reglage-anslutningspunkter, sändningar & insticksprogram:" + +#: ../redirect_box.cc:643 +msgid "" +"You cannot reorder this set of redirects\n" +"in that way because the inputs and\n" +"outputs do not work correctly." +msgstr "" +"Du kan inte omarrangera dessa omdirigeringar\n" +"pÃ¥ det sättet eftersom ingÃ¥ngar och\n" +"utgÃ¥ngarna inte fungerar korrekt." + +#: ../redirect_box.cc:748 +msgid "rename redirect" +msgstr "döp om omdirigering" + +#: ../redirect_box.cc:825 ../redirect_box.cc:873 +msgid "" +"Copying the set of redirects on the clipboard failed,\n" +"probably because the I/O configuration of the plugins\n" +"could not match the configuration of this track." +msgstr "" +"Kopieringen av omdirigeringarna pÃ¥ klippbordet misslyckades,\n" +"förmodligen pÃ¥ grund av att I/O-konfiguration av insticksprogrammen\n" +"inte kunde matcha konfiurationen av detta spÃ¥ret." + +#: ../redirect_box.cc:895 +msgid "" +"Do you really want to remove all redirects from this track?\n" +"(this cannot be undone)" +msgstr "" +"Vill du verkligen radera alla omdirigeringar frÃ¥n detta spÃ¥ret?\n" +"(detta kan inte Ã¥ngras)" + +#: ../redirect_box.cc:898 +msgid "" +"Do you really want to remove all redirects from this bus?\n" +"(this cannot be undone)" +msgstr "" +"Vill du verkligen radera alla omdirigeringar frÃ¥n denna bussen?\n" +"(detta kan inte Ã¥ngras)" + +#: ../redirect_box.cc:903 +msgid "Yes, remove them all" +msgstr "Ja, ta bort alla" + +#: ../redirect_box.cc:939 +msgid "ardour: %1" +msgstr "" + +#: ../redirect_box.cc:981 +msgid "ardour: %1: %2 (by %3)" +msgstr "ardour: %1: %2 (av %3)" + +#. new stuff +#: ../redirect_box.cc:1053 +msgid "New Plugin ..." +msgstr "Nytt Insticksprogram..." + +#: ../redirect_box.cc:1054 +msgid "New Insert" +msgstr "Ny Anslutningspunkt" + +#: ../redirect_box.cc:1055 +msgid "New Send ..." +msgstr "Ny Sänd..." + +#: ../redirect_box.cc:1067 +msgid "Deselect All" +msgstr "Avmarkera allt" + +#: ../redirect_box.cc:1074 +msgid "Activate all" +msgstr "Aktivera alla" + +#: ../redirect_box.cc:1075 +msgid "Deactivate all" +msgstr "Aktivera alla" + +#: ../region_editor.cc:44 +msgid "NAME:" +msgstr "NAMN:" + +#: ../region_editor.cc:45 +msgid "lock" +msgstr "lÃ¥s" + +#: ../region_editor.cc:47 +msgid "opaque" +msgstr "ogenomskinlig" + +#: ../region_editor.cc:48 ../region_editor.cc:191 ../region_editor.cc:225 +msgid "active" +msgstr "aktivt" + +#: ../region_editor.cc:49 +msgid "visible" +msgstr "synligt" + +#: ../region_editor.cc:52 +msgid "Layer" +msgstr "Lager" + +#: ../region_editor.cc:53 +msgid "play" +msgstr "spela" + +#: ../region_editor.cc:60 +msgid "ENVELOPE" +msgstr "KONVOLUT" + +#: ../region_editor.cc:106 +msgid "mute this region" +msgstr "tysta denna region" + +#: ../region_editor.cc:107 +msgid "regions underneath this one cannot be heard" +msgstr "regoner under denna kan inte höras" + +#: ../region_editor.cc:108 +msgid "prevent any changes to this region" +msgstr "förhindra ändringar för denna region" + +#: ../region_editor.cc:109 +msgid "use the gain envelope during playback" +msgstr "använd volymkonvolutet under uppspelning" + +#: ../region_editor.cc:110 +msgid "show the gain envelope" +msgstr "visa volymkonvolutet" + +#: ../region_editor.cc:111 +msgid "use fade in curve during playback" +msgstr "använd intoningskurvan under uppspelning" + +#: ../region_editor.cc:112 +msgid "use fade out curve during playback" +msgstr "använd uttoningskurvan under uppspelning" + +#: ../region_editor.cc:113 +msgid "audition this region" +msgstr "avlyssna denna region" + +#: ../region_editor.cc:146 +msgid "START:" +msgstr "" + +#: ../region_editor.cc:148 +msgid "END:" +msgstr "SLUT:" + +#: ../region_editor.cc:150 +msgid "LENGTH:" +msgstr "LÄNGD:" + +#: ../region_editor.cc:190 +msgid "FADE IN" +msgstr "TONA IN" + +#: ../region_editor.cc:192 ../region_editor.cc:226 +msgid "msecs" +msgstr "" + +#: ../region_editor.cc:224 +msgid "FADE OUT" +msgstr "TONA UT" + +#: ../region_editor.cc:264 +msgid "ardour: region " +msgstr "" + +#: ../region_editor.cc:401 +msgid "fade in edit" +msgstr "intoningsredigering" + +#: ../region_editor.cc:413 +msgid "fade out edit" +msgstr "uttoningsredigering" + +#: ../regionview.cc:1144 +msgid "add gain control point" +msgstr "lägg till volymkontrollspunkt" + +#: ../route_params_ui.cc:88 +msgid "Tracks/Buses" +msgstr "SpÃ¥r/Bussar" + +#: ../route_params_ui.cc:108 +msgid "Pre-fader Redirects" +msgstr "För-omdirigeringar" + +#: ../route_params_ui.cc:109 +msgid "Post-fader Redirects" +msgstr "Efter-omdirigeringar" + +#: ../route_params_ui.cc:143 +msgid "ardour: track/bus inspector" +msgstr "ardour: spÃ¥r/buss-inspektör" + +#: ../route_params_ui.cc:144 +msgid "ardour_route_parameters" +msgstr "" + +#: ../route_params_ui.cc:201 +msgid "route display list item for renamed route not found!" +msgstr "ruttvisningslisteobjekt för omdöpt rutt hittades inte!" + +#: ../route_params_ui.cc:452 +msgid "NO TRACK" +msgstr "INGET SPÃ…R" + +#: ../route_params_ui.cc:694 +msgid "ardour: track/bus inspector: " +msgstr "ardour: spÃ¥r/buss-inspektör" + +#: ../route_params_ui.cc:698 +msgid "No Route Selected" +msgstr "Ingen Rutt Vald" + +#: ../route_params_ui.cc:699 +msgid "ardour: track/bus/inspector: no route selected" +msgstr "ardour: spÃ¥r/buss-inspektör: ingen rutt vald" + +#. ctrl-shift-click applies change to all routes +#: ../route_ui.cc:133 +msgid "mute change" +msgstr "ändra tystning" + +#. ctrl-shift-click applies change to all routes +#. ctrl-alt-click: exclusively solo this track, not a toggle */ +#: ../route_ui.cc:208 ../route_ui.cc:218 +msgid "solo change" +msgstr "ändra solo" + +#: ../route_ui.cc:281 +msgid "rec-enable change" +msgstr "ändra inspelningsläge" + +#: ../route_ui.cc:472 +msgid "Solo-safe" +msgstr "Solo-säker" + +#: ../route_ui.cc:480 ../route_ui.cc:523 +msgid "MIDI Bind" +msgstr "MIDI-bindning" + +#: ../route_ui.cc:494 +msgid "Pre Fader" +msgstr "Före-nivÃ¥reglage" + +#: ../route_ui.cc:501 +msgid "Post Fader" +msgstr "Efter-nivÃ¥reglage" + +#: ../route_ui.cc:508 +msgid "Control Outs" +msgstr "KontrollutgÃ¥ngar" + +#: ../route_ui.cc:515 +msgid "Main Outs" +msgstr "HuvudutgÃ¥ngar" + +#: ../route_ui.cc:552 +msgid "mix group solo change" +msgstr "mixgrupp-solo-ändring" + +#: ../route_ui.cc:586 +msgid "mix group mute change" +msgstr "mixgrupp-tystnings-ändring" + +#: ../route_ui.cc:602 +msgid "mix group rec-enable change" +msgstr "mixgrupp-inspelningsmöjliggörning-ändring" + +#: ../route_ui.cc:619 ../visual_time_axis.cc:236 +msgid "ardour: color selection" +msgstr "ardour: färgval" + +#: ../route_ui.cc:695 +msgid "" +"Do you really want to remove track \"%1\" ?\n" +"\n" +"You may also lose the playlist used by this track.\n" +"(cannot be undone)" +msgstr "" +"Vill du verkligen ta bort spÃ¥r \"%1\" ?\n" +"Du kanske ocksÃ¥ förlorar spellista använd av detta spÃ¥r.\n" +"(detta kan inte Ã¥ngras)" + +#: ../route_ui.cc:697 +msgid "" +"Do you really want to remove bus \"%1\" ?\n" +"(cannot be undone)" +msgstr "" +"Vill du verkligen ta bort buss \"%1\" ?\n" +"(detta kan inte Ã¥ngras)" + +#: ../route_ui.cc:701 ../visual_time_axis.cc:278 +msgid "Yes, remove it." +msgstr "Ja, ta bort den." + +#: ../route_ui.cc:730 +msgid "New Name: " +msgstr "Nytt namn: " + +#: ../sfdb_ui.cc:57 +msgid "Add Field..." +msgstr "Lägg till fält..." + +#: ../sfdb_ui.cc:58 +msgid "Remove Field" +msgstr "Ta bort fält" + +#: ../sfdb_ui.cc:61 +msgid "Soundfile Info" +msgstr "Ljudfilsinformation" + +#: ../sfdb_ui.cc:79 +msgid "Field" +msgstr "Fält" + +#: ../sfdb_ui.cc:80 +msgid "Value" +msgstr "Värde" + +#: ../sfdb_ui.cc:160 +msgid "channels" +msgstr "kanal(er)" + +#: ../sfdb_ui.cc:160 +msgid "samplerate" +msgstr "samplingsfrekvens" + +#: ../sfdb_ui.cc:161 +msgid "resolution" +msgstr "upplösning" + +#: ../sfdb_ui.cc:161 +msgid "format" +msgstr "format" + +#: ../sfdb_ui.cc:182 +msgid "Could not read file: %1 (%2)." +msgstr "Kunde inte läsa fil: %1 (%2)." + +#: ../sfdb_ui.cc:198 +msgid "Could not access soundfile: " +msgstr "Dela kanaler" + +#: ../sfdb_ui.cc:235 +msgid "Name for Field" +msgstr "Ange namn för fält" + +#: ../sfdb_ui.cc:334 +msgid "Split Channels" +msgstr "Dela kanaler" + +#: ../sfdb_ui.cc:341 +msgid "Create a region for each channel" +msgstr "Skapa en region för varje kanal" + +#: ../sfdb_ui.cc:343 +msgid "Embed" +msgstr "Infoga" + +#: ../sfdb_ui.cc:345 +msgid "Link to an external file" +msgstr "Länka till en extern fil" + +#: ../sfdb_ui.cc:347 +msgid "Import" +msgstr "Importera" + +#: ../sfdb_ui.cc:349 +msgid "Copy a file to the session folder" +msgstr "Kopiera en fil till sessionskatalogen" + +#: ../sfdb_ui.cc:413 +msgid "programming error: %1" +msgstr "" + +#: ../tempo_dialog.cc:17 ../tempo_dialog.cc:34 +msgid "Beats per minute" +msgstr "Slag per minut" + +#: ../tempo_dialog.cc:20 ../tempo_dialog.cc:37 ../tempo_dialog.cc:202 +#: ../tempo_dialog.cc:220 +msgid "Bar" +msgstr "Takt" + +#: ../tempo_dialog.cc:21 ../tempo_dialog.cc:38 ../tempo_dialog.cc:203 +#: ../tempo_dialog.cc:221 +msgid "Beat" +msgstr "Slag" + +#: ../tempo_dialog.cc:23 ../tempo_dialog.cc:40 ../tempo_dialog.cc:204 +#: ../tempo_dialog.cc:222 +msgid "Location" +msgstr "Plats" + +#: ../tempo_dialog.cc:198 ../tempo_dialog.cc:216 +msgid "Meter denominator" +msgstr "Taktartsnämnare" + +#: ../tempo_dialog.cc:199 ../tempo_dialog.cc:217 +msgid "Beats per bar" +msgstr "Slag per takt" + +#: ../tempo_dialog.cc:235 ../tempo_dialog.cc:246 +msgid "whole (1)" +msgstr "hel (1)" + +#: ../tempo_dialog.cc:236 ../tempo_dialog.cc:248 +msgid "second (2)" +msgstr "sekond (2)" + +#: ../tempo_dialog.cc:237 ../tempo_dialog.cc:250 +msgid "third (3)" +msgstr "ters (3)" + +#: ../tempo_dialog.cc:238 ../tempo_dialog.cc:252 ../tempo_dialog.cc:260 +msgid "quarter (4)" +msgstr "kvart (4)" + +#: ../tempo_dialog.cc:239 ../tempo_dialog.cc:254 +msgid "eighth (8)" +msgstr "Ã¥ttondel (8)" + +#: ../tempo_dialog.cc:240 ../tempo_dialog.cc:256 +msgid "sixteenth (16)" +msgstr "sextondel (16)" + +#: ../tempo_dialog.cc:241 ../tempo_dialog.cc:258 +msgid "thirty-second (32)" +msgstr "trettiotvÃ¥ondel (32)" + +#: ../tempo_dialog.cc:419 +msgid "garbaged note type entry (%1)" +msgstr "skräpad nottypsvärde (%1)" + +#: ../tempo_dialog.cc:429 +msgid "incomprehensible note type entry (%1)" +msgstr "orimlig nottypsvärde (%1)" + +#: ../time_axis_view.cc:111 +msgid "gTortnam" +msgstr "" + +#: ../time_axis_view.cc:548 +msgid "Largest" +msgstr "Störst" + +#: ../time_axis_view.cc:549 +msgid "Large" +msgstr "Större" + +#: ../time_axis_view.cc:550 +msgid "Larger" +msgstr "Stor" + +#: ../time_axis_view.cc:552 +msgid "Smaller" +msgstr "Mindre" + +#: ../time_axis_view.cc:553 +msgid "Small" +msgstr "Liten" + +#: ../time_axis_view.cc:869 +msgid "unknown track height name \"%1\" in XML GUI information" +msgstr "okänt spÃ¥rhöjdsnamn \"%1\" i XML-GUI-informationen" + +#. first constructed item sets up font info +#: ../time_axis_view_item.cc:78 +msgid "TimeAxisViewItemName" +msgstr "" + +#: ../time_axis_view_item.cc:297 +msgid "new duration %1 frames is out of bounds for %2" +msgstr "ny varaktighet %1 frames är utom räckvidd för %2" + +#: ../time_selection.cc:40 +msgid "programming error: request for non-existent audio range (%1)!" +msgstr "" + +#: ../utils.cc:106 ../utils.cc:149 +msgid "bad XPM header %1" +msgstr "" + +#: ../utils.cc:331 +msgid "missing RGBA style for \"%1\"" +msgstr "saknar RGBA-stil för \"%1\"" + +#: ../visual_time_axis.cc:275 +msgid "" +"Do you really want to remove track \"%1\" ?\n" +"(cannot be undone)" +msgstr "" +"Vill du verkligen ta bort spÃ¥r \"%1\" ?\n" +"(detta kan inte Ã¥ngras)" + + +#: ../visual_time_axis.cc:324 +msgid "new name: " +msgstr "nytt namn: " + +#: ../visual_time_axis.cc:335 +msgid "A track already exists with that name" +msgstr "Ett spÃ¥r med det namnet existerar redan" diff --git a/gtk2_ardour/public_editor.h b/gtk2_ardour/public_editor.h index 716f0b86d0..6039e089e9 100644 --- a/gtk2_ardour/public_editor.h +++ b/gtk2_ardour/public_editor.h @@ -16,6 +16,7 @@ #include "editing.h" #include "keyboard_target.h" #include "canvas.h" +#include "selection.h" namespace ARDOUR { class Session; @@ -54,7 +55,7 @@ class ImageFrameView; class ImageFrameTimeAxis; class MarkerView; -class PublicEditor : public Gtk::Window, public PBD::StatefulDestructible { +class PublicEditor : public Gtk::Window, public PBD::StatefulThingWithGoingAway { public: PublicEditor(); virtual ~PublicEditor(); @@ -86,7 +87,6 @@ class PublicEditor : public Gtk::Window, public PBD::StatefulDestructible { virtual void new_region_from_selection () = 0; virtual void separate_region_from_selection () = 0; virtual void toggle_playback (bool with_abort) = 0; - virtual void set_edit_menu (Gtk::Menu&) = 0; virtual nframes_t unit_to_frame (double unit) = 0; virtual double frame_to_unit (nframes_t frame) = 0; virtual double frame_to_unit (double frame) = 0; @@ -111,8 +111,10 @@ class PublicEditor : public Gtk::Window, public PBD::StatefulDestructible { virtual void new_playlists () = 0; virtual void copy_playlists () = 0; virtual void clear_playlists () = 0; + virtual bool set_selected_track (TimeAxisView&, Selection::Operation op = Selection::Set, bool no_remove = false) = 0; virtual void set_selected_mixer_strip (TimeAxisView&) = 0; virtual void hide_track_in_display (TimeAxisView& tv) = 0; + virtual void show_track_in_display (TimeAxisView& tv) = 0; virtual void set_follow_playhead (bool yn) = 0; virtual void toggle_follow_playhead () = 0; virtual bool follow_playhead() const = 0; diff --git a/gtk2_ardour/redirect_box.cc b/gtk2_ardour/redirect_box.cc index 35b96a410f..f2ee2a5b8f 100644 --- a/gtk2_ardour/redirect_box.cc +++ b/gtk2_ardour/redirect_box.cc @@ -923,7 +923,7 @@ RedirectBox::edit_redirect (boost::shared_ptr<Redirect> redirect) if ((insert = boost::dynamic_pointer_cast<Insert> (redirect)) == 0) { - /* its a send */ + /* it's a send */ if (!_session.engine().connected()) { return; @@ -967,30 +967,21 @@ RedirectBox::edit_redirect (boost::shared_ptr<Redirect> redirect) PluginUIWindow *plugin_ui; if (plugin_insert->get_gui() == 0) { - - string title; - string maker = plugin_insert->plugin()->maker(); - string::size_type email_pos; - - if ((email_pos = maker.find_first_of ('<')) != string::npos) { - maker = maker.substr (0, email_pos - 1); - } - - if (maker.length() > 32) { - maker = maker.substr (0, 32); - maker += " ..."; - } - - title = string_compose(_("ardour: %1: %2 (by %3)"), _route->name(), plugin_insert->name(), maker); - + plugin_ui = new PluginUIWindow (plugin_insert); + if (_owner_is_mixer) { ARDOUR_UI::instance()->the_mixer()->ensure_float (*plugin_ui); } else { ARDOUR_UI::instance()->the_editor().ensure_float (*plugin_ui); } - plugin_ui->set_title (title); + + plugin_ui->set_title (generate_redirect_title (plugin_insert)); plugin_insert->set_gui (plugin_ui); + + // change window title when route name is changed + _route->name_changed.connect (bind (mem_fun(*this, &RedirectBox::route_name_changed), plugin_ui, plugin_insert)); + } else { plugin_ui = reinterpret_cast<PluginUIWindow *> (plugin_insert->get_gui()); @@ -1069,8 +1060,12 @@ RedirectBox::register_actions () /* new stuff */ ActionManager::register_action (popup_act_grp, X_("newplugin"), _("New Plugin ..."), sigc::ptr_fun (RedirectBox::rb_choose_plugin)); - ActionManager::register_action (popup_act_grp, X_("newinsert"), _("New Insert"), sigc::ptr_fun (RedirectBox::rb_choose_insert)); - ActionManager::register_action (popup_act_grp, X_("newsend"), _("New Send ..."), sigc::ptr_fun (RedirectBox::rb_choose_send)); + + act = ActionManager::register_action (popup_act_grp, X_("newinsert"), _("New Insert"), sigc::ptr_fun (RedirectBox::rb_choose_insert)); + ActionManager::jack_sensitive_actions.push_back (act); + act = ActionManager::register_action (popup_act_grp, X_("newsend"), _("New Send ..."), sigc::ptr_fun (RedirectBox::rb_choose_send)); + ActionManager::jack_sensitive_actions.push_back (act); + ActionManager::register_action (popup_act_grp, X_("clear"), _("Clear"), sigc::ptr_fun (RedirectBox::rb_clear)); /* standard editing stuff */ @@ -1097,6 +1092,8 @@ RedirectBox::register_actions () ActionManager::plugin_selection_sensitive_actions.push_back(act); ActionManager::add_action_group (popup_act_grp); + + } void @@ -1242,3 +1239,29 @@ RedirectBox::rb_edit () _current_redirect_box->for_selected_redirects (&RedirectBox::edit_redirect); } +void +RedirectBox::route_name_changed (void* src, PluginUIWindow* plugin_ui, boost::shared_ptr<PluginInsert> pi) +{ + ENSURE_GUI_THREAD(bind (mem_fun (*this, &RedirectBox::route_name_changed), src, plugin_ui, pi)); + + plugin_ui->set_title (generate_redirect_title (pi)); +} + +string +RedirectBox::generate_redirect_title (boost::shared_ptr<PluginInsert> pi) +{ + string maker = pi->plugin()->maker(); + string::size_type email_pos; + + if ((email_pos = maker.find_first_of ('<')) != string::npos) { + maker = maker.substr (0, email_pos - 1); + } + + if (maker.length() > 32) { + maker = maker.substr (0, 32); + maker += " ..."; + } + + return string_compose(_("ardour: %1: %2 (by %3)"), _route->name(), pi->name(), maker); +} + diff --git a/gtk2_ardour/redirect_box.h b/gtk2_ardour/redirect_box.h index ead3b0dfb8..27ba950899 100644 --- a/gtk2_ardour/redirect_box.h +++ b/gtk2_ardour/redirect_box.h @@ -49,19 +49,20 @@ class MotionController; class PluginSelector; +class PluginUIWindow; class RouteRedirectSelection; namespace ARDOUR { + class Connection; + class Insert; + class Plugin; + class PluginInsert; + class PortInsert; class Route; class Send; - class Insert; class Session; - class PortInsert; - class Connection; - class Plugin; } - class RedirectBox : public Gtk::HBox { public: @@ -217,6 +218,9 @@ class RedirectBox : public Gtk::HBox static void rb_activate_all (); static void rb_deactivate_all (); static void rb_edit (); + + void route_name_changed (void* src, PluginUIWindow* plugin_ui, boost::shared_ptr<ARDOUR::PluginInsert> pi); + std::string generate_redirect_title (boost::shared_ptr<ARDOUR::PluginInsert> pi); }; #endif /* __ardour_gtk_redirect_box__ */ diff --git a/gtk2_ardour/region_gain_line.cc b/gtk2_ardour/region_gain_line.cc index 467f24bd94..3374d44655 100644 --- a/gtk2_ardour/region_gain_line.cc +++ b/gtk2_ardour/region_gain_line.cc @@ -50,7 +50,7 @@ AudioRegionGainLine::start_drag (ControlPoint* cp, float fraction) if (!rv.audio_region()->envelope_active()) { trackview.session().add_command(new MementoCommand<AudioRegion>(*(rv.audio_region().get()), &rv.audio_region()->get_state(), 0)); rv.audio_region()->set_envelope_active(false); - } + } } // This is an extended copy from AutomationList @@ -62,18 +62,18 @@ AudioRegionGainLine::remove_point (ControlPoint& cp) model_representation (cp, mr); trackview.editor.current_session()->begin_reversible_command (_("remove control point")); - XMLNode &before = get_state(); + XMLNode &before = alist.get_state(); if (!rv.audio_region()->envelope_active()) { - XMLNode &before = rv.audio_region()->get_state(); + XMLNode ®ion_before = rv.audio_region()->get_state(); rv.audio_region()->set_envelope_active(true); - XMLNode &after = rv.audio_region()->get_state(); - trackview.session().add_command(new MementoCommand<AudioRegion>(*(rv.audio_region().get()), &before, &after)); - } - + XMLNode ®ion_after = rv.audio_region()->get_state(); + trackview.session().add_command(new MementoCommand<AudioRegion>(*(rv.audio_region().get()), ®ion_before, ®ion_after)); + } + alist.erase (mr.start, mr.end); - trackview.editor.current_session()->add_command (new MementoCommand<AudioRegionGainLine>(*this, &before, &get_state())); + trackview.editor.current_session()->add_command (new MementoCommand<AutomationList>(alist, &before, &alist.get_state())); trackview.editor.current_session()->commit_reversible_command (); trackview.editor.current_session()->set_dirty (); } @@ -84,14 +84,8 @@ AudioRegionGainLine::end_drag (ControlPoint* cp) if (!rv.audio_region()->envelope_active()) { rv.audio_region()->set_envelope_active(true); trackview.session().add_command(new MementoCommand<AudioRegion>(*(rv.audio_region().get()), 0, &rv.audio_region()->get_state())); - } + } + AutomationLine::end_drag(cp); } - -// This is a copy from AutomationList -UndoAction -AudioRegionGainLine::get_memento () -{ - return alist.get_memento(); -} diff --git a/gtk2_ardour/region_selection.cc b/gtk2_ardour/region_selection.cc index d887021a42..a418b1de23 100644 --- a/gtk2_ardour/region_selection.cc +++ b/gtk2_ardour/region_selection.cc @@ -79,23 +79,19 @@ RegionSelection::clear_all() { clear(); _bylayer.clear(); + _current_start = 0; + _current_end = 0; } bool RegionSelection::contains (RegionView* rv) { - if (this->find (rv) != end()) { - return true; - } - else { - return false; - } - + return this->find (rv) != end(); } void RegionSelection::add (RegionView* rv, bool dosort) { - if (this->find (rv) != end()) { + if (contains (rv)) { /* we already have it */ return; } diff --git a/gtk2_ardour/region_view.cc b/gtk2_ardour/region_view.cc index 3fe7563602..49e7872f49 100644 --- a/gtk2_ardour/region_view.cc +++ b/gtk2_ardour/region_view.cc @@ -149,8 +149,6 @@ RegionView::~RegionView () { in_destructor = true; - RegionViewGoingAway (this); /* EMIT_SIGNAL */ - for (vector<GhostRegion*>::iterator g = ghosts.begin(); g != ghosts.end(); ++g) { delete *g; } @@ -407,6 +405,7 @@ RegionView::region_renamed () set_item_name (str, this); set_name_text (str); + reset_width_dependent_items (_pixel_width); } void diff --git a/gtk2_ardour/route_time_axis.cc b/gtk2_ardour/route_time_axis.cc index eb96791d28..7195c83a99 100644 --- a/gtk2_ardour/route_time_axis.cc +++ b/gtk2_ardour/route_time_axis.cc @@ -40,6 +40,7 @@ #include <gtkmm2ext/utils.h> #include <ardour/playlist.h> +#include <ardour/audioplaylist.h> #include <ardour/diskstream.h> #include <ardour/insert.h> #include <ardour/ladspa_plugin.h> @@ -116,7 +117,8 @@ RouteTimeAxisView::RouteTimeAxisView (PublicEditor& ed, Session& sess, boost::sh visual_button.set_name ("TrackVisualButton"); hide_button.set_name ("TrackRemoveButton"); - hide_button.add (*(manage (new Image (get_xpm("small_x.xpm"))))); + hide_button.add (*(manage (new Image (::get_icon("hide"))))); + hide_button.show_all (); edit_group_button.signal_button_release_event().connect (mem_fun(*this, &RouteTimeAxisView::edit_click), false); playlist_button.signal_clicked().connect (mem_fun(*this, &RouteTimeAxisView::playlist_click)); @@ -125,13 +127,26 @@ RouteTimeAxisView::RouteTimeAxisView (PublicEditor& ed, Session& sess, boost::sh visual_button.signal_clicked().connect (mem_fun(*this, &RouteTimeAxisView::visual_click)); hide_button.signal_clicked().connect (mem_fun(*this, &RouteTimeAxisView::hide_click)); - solo_button->signal_button_press_event().connect (mem_fun(*this, &RouteUI::solo_press), false); - solo_button->signal_button_release_event().connect (mem_fun(*this, &RouteUI::solo_release), false); - mute_button->signal_button_press_event().connect (mem_fun(*this, &RouteUI::mute_press), false); - mute_button->signal_button_release_event().connect (mem_fun(*this, &RouteUI::mute_release), false); + solo_button->signal_button_press_event().connect (mem_fun(*this, &RouteUI::solo_press)); + solo_button->signal_button_release_event().connect (mem_fun(*this, &RouteUI::solo_release)); + mute_button->signal_button_press_event().connect (mem_fun(*this, &RouteUI::mute_press)); + mute_button->signal_button_release_event().connect (mem_fun(*this, &RouteUI::mute_release)); if (is_track()) { - rec_enable_button->set_active (false); + + /* use icon */ + + rec_enable_button->remove (); + switch (track()->mode()) { + case ARDOUR::Normal: + rec_enable_button->add (*(manage (new Image (::get_icon (X_("record_normal_red")))))); + break; + case ARDOUR::Destructive: + rec_enable_button->add (*(manage (new Image (::get_icon (X_("record_tape_red")))))); + break; + } + rec_enable_button->show_all (); + rec_enable_button->set_name ("TrackRecordEnableButton"); rec_enable_button->signal_button_press_event().connect (mem_fun(*this, &RouteUI::rec_enable_press)); controls_table.attach (*rec_enable_button, 5, 6, 0, 1, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND, 0, 0); @@ -192,6 +207,7 @@ RouteTimeAxisView::RouteTimeAxisView (PublicEditor& ed, Session& sess, boost::sh if (is_track()) { + track()->TrackModeChanged.connect (mem_fun(*this, &RouteTimeAxisView::track_mode_changed)); track()->FreezeChange.connect (mem_fun(*this, &RouteTimeAxisView::map_frozen)); track()->DiskstreamChanged.connect (mem_fun(*this, &RouteTimeAxisView::diskstream_changed)); get_diskstream()->SpeedChanged.connect (mem_fun(*this, &RouteTimeAxisView::speed_changed)); @@ -286,8 +302,6 @@ RouteTimeAxisView::add_edit_group_menu_item (RouteGroup *eg, RadioMenuItem::Grou MenuList &items = edit_group_menu.items(); - cerr << "adding edit group " << eg->name() << endl; - items.push_back (RadioMenuElem (*group, eg->name(), bind (mem_fun(*this, &RouteTimeAxisView::set_edit_group_from_menu), eg))); if (_route->edit_group() == eg) { static_cast<RadioMenuItem*>(&items.back())->set_active (); @@ -296,19 +310,11 @@ RouteTimeAxisView::add_edit_group_menu_item (RouteGroup *eg, RadioMenuItem::Grou void RouteTimeAxisView::set_edit_group_from_menu (RouteGroup *eg) - { _route->set_edit_group (eg, this); } void -RouteTimeAxisView::playlist_state_changed (Change ignored) -{ - // ENSURE_GUI_THREAD (bind (mem_fun(*this, &RouteTimeAxisView::playlist_state_changed), ignored)); - // why are we here ? -} - -void RouteTimeAxisView::playlist_changed () { @@ -352,13 +358,15 @@ RouteTimeAxisView::playlist_click () { // always build a new action menu - if (playlist_action_menu == 0) { - playlist_action_menu = new Menu; - playlist_action_menu->set_name ("ArdourContextMenu"); - } - - build_playlist_menu(playlist_action_menu); + if (playlist_action_menu != 0) { + delete playlist_action_menu; + } + playlist_action_menu = new Menu; + playlist_action_menu->set_name ("ArdourContextMenu"); + + build_playlist_menu (playlist_action_menu); + editor.set_selected_track (*this, Selection::Add); playlist_action_menu->popup (1, 0); } @@ -371,6 +379,7 @@ RouteTimeAxisView::automation_click () */ build_display_menu (); } + editor.set_selected_track (*this, Selection::Add); automation_action_menu->popup (1, 0); } @@ -453,6 +462,24 @@ RouteTimeAxisView::build_display_menu () get_diskstream()->AlignmentStyleChanged.connect ( mem_fun(*this, &RouteTimeAxisView::align_style_changed)); + + RadioMenuItem::Group mode_group; + items.push_back (RadioMenuElem (mode_group, _("Normal mode"), + bind (mem_fun (*this, &RouteTimeAxisView::set_track_mode), ARDOUR::Normal))); + normal_track_mode_item = dynamic_cast<RadioMenuItem*>(&items.back()); + items.push_back (RadioMenuElem (mode_group, _("Tape mode"), + bind (mem_fun (*this, &RouteTimeAxisView::set_track_mode), ARDOUR::Destructive))); + destructive_track_mode_item = dynamic_cast<RadioMenuItem*>(&items.back()); + + + switch (track()->mode()) { + case ARDOUR::Destructive: + destructive_track_mode_item->set_active (); + break; + case ARDOUR::Normal: + normal_track_mode_item->set_active (); + break; + } } items.push_back (SeparatorElem()); @@ -464,6 +491,91 @@ RouteTimeAxisView::build_display_menu () items.push_back (MenuElem (_("Remove"), mem_fun(*this, &RouteUI::remove_this_route))); } +static bool __reset_item (RadioMenuItem* item) +{ + cerr << "reset item to true\n"; + item->set_active (); + return false; +} + +void +RouteTimeAxisView::set_track_mode (TrackMode mode) +{ + RadioMenuItem* item; + RadioMenuItem* other_item; + + switch (mode) { + case ARDOUR::Normal: + item = normal_track_mode_item; + other_item = destructive_track_mode_item; + break; + case ARDOUR::Destructive: + item = destructive_track_mode_item; + other_item = normal_track_mode_item; + break; + default: + fatal << string_compose (_("programming error: %1 %2"), "illegal track mode in RouteTimeAxisView::set_track_mode", mode) << endmsg; + /*NOTREACHED*/ + return; + } + + if (item->get_active () && track()->mode() != mode) { + _set_track_mode (track(), mode, other_item); + } +} + +void +RouteTimeAxisView::_set_track_mode (Track* track, TrackMode mode, RadioMenuItem* reset_item) +{ + bool needs_bounce; + + if (!track->can_use_mode (mode, needs_bounce)) { + + if (!needs_bounce) { + /* cannot be done */ + Glib::signal_idle().connect (bind (sigc::ptr_fun (__reset_item), reset_item)); + return; + } else { + cerr << "would bounce this one\n"; + return; + } + } + + track->set_mode (mode); + + rec_enable_button->remove (); + switch (mode) { + case ARDOUR::Normal: + rec_enable_button->add (*(manage (new Image (::get_icon (X_("record_normal_red")))))); + break; + case ARDOUR::Destructive: + rec_enable_button->add (*(manage (new Image (::get_icon (X_("record_tape_red")))))); + break; + } + rec_enable_button->show_all (); + +} + +void +RouteTimeAxisView::track_mode_changed () +{ + RadioMenuItem* item; + + switch (track()->mode()) { + case ARDOUR::Normal: + item = normal_track_mode_item; + break; + case ARDOUR::Destructive: + item = destructive_track_mode_item; + break; + default: + fatal << string_compose (_("programming error: %1 %2"), "illegal track mode in RouteTimeAxisView::set_track_mode", track()->mode()) << endmsg; + /*NOTREACHED*/ + return; + } + + item->set_active (); +} void RouteTimeAxisView::show_timestretch (nframes_t start, nframes_t end) @@ -710,7 +822,24 @@ RouteTimeAxisView::align_style_changed () void RouteTimeAxisView::set_align_style (AlignStyle style) { - get_diskstream()->set_align_style (style); + RadioMenuItem* item; + + switch (style) { + case ExistingMaterial: + item = align_existing_item; + break; + case CaptureTime: + item = align_capture_item; + break; + default: + fatal << string_compose (_("programming error: %1 %2"), "illegal align style in RouteTimeAxisView::set_align_style", style) << endmsg; + /*NOTREACHED*/ + return; + } + + if (item->get_active()) { + get_diskstream()->set_align_style (style); + } } void @@ -782,7 +911,7 @@ RouteTimeAxisView::use_copy_playlist (bool prompt) if (name.length()) { ds->use_copy_playlist (); - pl->set_name (name); + ds->playlist()->set_name (name); } } @@ -809,7 +938,7 @@ RouteTimeAxisView::use_new_playlist (bool prompt) prompter.set_initial_text (name); prompter.add_button (Gtk::Stock::NEW, Gtk::RESPONSE_ACCEPT); prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false); - + switch (prompter.run ()) { case Gtk::RESPONSE_ACCEPT: prompter.get_result (name); @@ -822,7 +951,7 @@ RouteTimeAxisView::use_new_playlist (bool prompt) if (name.length()) { ds->use_new_playlist (); - pl->set_name (name); + ds->playlist()->set_name (name); } } @@ -879,6 +1008,10 @@ RouteTimeAxisView::selection_click (GdkEventButton* ev) case Selection::Extend: /* not defined yet */ break; + + case Selection::Add: + editor.get_selection().add (*tracks); + break; } delete tracks; @@ -998,7 +1131,12 @@ RouteTimeAxisView::visual_click () void RouteTimeAxisView::hide_click () { + // LAME fix for hide_button refresh fix + hide_button.set_sensitive(false); + editor.hide_track_in_display (*this); + + hide_button.set_sensitive(true); } boost::shared_ptr<Region> @@ -1124,12 +1262,28 @@ RouteTimeAxisView::build_playlist_menu (Gtk::Menu * menu) if (playlist_menu) { delete playlist_menu; } + playlist_menu = new Menu; playlist_menu->set_name ("ArdourContextMenu"); - playlist_items.push_back (MenuElem (string_compose (_("Current: %1"), get_diskstream()->playlist()->name()))); - playlist_items.push_back (SeparatorElem()); + vector<Playlist*> playlists; + boost::shared_ptr<Diskstream> ds = get_diskstream(); + RadioMenuItem::Group playlist_group; + + _session.get_playlists (playlists); + for (vector<Playlist*>::iterator i = playlists.begin(); i != playlists.end(); ++i) { + + if ((*i)->get_orig_diskstream_id() == ds->id()) { + playlist_items.push_back (RadioMenuElem (playlist_group, (*i)->name(), bind (mem_fun (*this, &RouteTimeAxisView::use_playlist), (*i)))); + + if (ds->playlist()->id() == (*i)->id()) { + static_cast<RadioMenuItem*>(&playlist_items.back())->set_active(); + } + } + } + + playlist_items.push_back (SeparatorElem()); playlist_items.push_back (MenuElem (_("Rename"), mem_fun(*this, &RouteTimeAxisView::rename_current_playlist))); playlist_items.push_back (SeparatorElem()); @@ -1138,8 +1292,20 @@ RouteTimeAxisView::build_playlist_menu (Gtk::Menu * menu) playlist_items.push_back (SeparatorElem()); playlist_items.push_back (MenuElem (_("Clear Current"), mem_fun(editor, &PublicEditor::clear_playlists))); playlist_items.push_back (SeparatorElem()); - playlist_items.push_back (MenuElem(_("Select"), mem_fun(*this, &RouteTimeAxisView::show_playlist_selector))); + playlist_items.push_back (MenuElem(_("Select from all ..."), mem_fun(*this, &RouteTimeAxisView::show_playlist_selector))); +} + +void +RouteTimeAxisView::use_playlist (Playlist* pl) +{ + AudioPlaylist* apl = dynamic_cast<AudioPlaylist*> (pl); + + assert (is_track()); + + if (apl) { + get_diskstream()->use_playlist (apl); + } } void diff --git a/gtk2_ardour/route_time_axis.h b/gtk2_ardour/route_time_axis.h index 1eb0cea00b..cefe954c9a 100644 --- a/gtk2_ardour/route_time_axis.h +++ b/gtk2_ardour/route_time_axis.h @@ -134,14 +134,6 @@ protected: gint edit_click (GdkEventButton *); - void build_redirect_window (); - void redirect_click (); - void redirect_add (); - void redirect_remove (); - void redirect_edit (); - void redirect_relist (); - void redirect_row_selected (gint row, gint col, GdkEvent *ev); - void add_to_redirect_display (ARDOUR::Redirect *); void redirects_changed (void *); void add_redirect_to_subplugin_menu (boost::shared_ptr<ARDOUR::Redirect>); @@ -164,14 +156,10 @@ protected: void reset_redirect_automation_curves (); - void update_automation_view (ARDOUR::AutomationType); - void take_name_changed (void *); void route_name_changed (void *); void name_entry_changed (); - void on_area_realize (); - virtual void label_view (); void add_edit_group_menu_item (ARDOUR::RouteGroup *, Gtk::RadioMenuItem::Group*); @@ -192,10 +180,8 @@ protected: void playlist_click (); void show_playlist_selector (); void playlist_changed (); - void playlist_state_changed (ARDOUR::Change); void playlist_modified (); - void add_playlist_to_playlist_menu (ARDOUR::Playlist*); void rename_current_playlist (); void automation_click (); @@ -207,7 +193,6 @@ protected: void visual_click (); void hide_click (); - gint when_displayed (GdkEventAny*); void speed_changed (); @@ -238,12 +223,20 @@ protected: Gtk::Menu edit_group_menu; Gtk::RadioMenuItem* align_existing_item; Gtk::RadioMenuItem* align_capture_item; + Gtk::RadioMenuItem* normal_track_mode_item; + Gtk::RadioMenuItem* destructive_track_mode_item; Gtk::Menu* playlist_menu; Gtk::Menu* playlist_action_menu; Gtk::MenuItem* playlist_item; + void use_playlist (ARDOUR::Playlist*); + ArdourCanvas::SimpleRect* timestretch_rect; - + + void set_track_mode (ARDOUR::TrackMode); + void _set_track_mode (ARDOUR::Track* track, ARDOUR::TrackMode mode, Gtk::RadioMenuItem* reset_item); + void track_mode_changed (); + list<RedirectAutomationInfo*> redirect_automation; vector<RedirectAutomationLine*> redirect_automation_curves; diff --git a/gtk2_ardour/route_ui.cc b/gtk2_ardour/route_ui.cc index dc861fbbbb..851c45aaa0 100644 --- a/gtk2_ardour/route_ui.cc +++ b/gtk2_ardour/route_ui.cc @@ -36,6 +36,8 @@ #include "gui_thread.h" #include <ardour/route.h> +#include <ardour/session.h> +#include <ardour/audioengine.h> #include <ardour/audio_track.h> #include <ardour/audio_diskstream.h> #include <ardour/midi_track.h> @@ -72,8 +74,15 @@ RouteUI::RouteUI (boost::shared_ptr<ARDOUR::Route> rt, ARDOUR::Session& sess, co _route->active_changed.connect (mem_fun (*this, &RouteUI::route_active_changed)); - mute_button = manage (new BindableToggleButton (_route->mute_control(), m_name )); - solo_button = manage (new BindableToggleButton (_route->solo_control(), s_name )); + mute_button = manage (new BindableToggleButton (_route->mute_control(), m_name )); + solo_button = manage (new BindableToggleButton (_route->solo_control(), s_name )); + + // mute_button->unset_flags (Gtk::CAN_FOCUS); + // solo_button->unset_flags (Gtk::CAN_FOCUS); + + _route->mute_changed.connect (mem_fun(*this, &RouteUI::mute_changed)); + _route->solo_changed.connect (mem_fun(*this, &RouteUI::solo_changed)); + _route->solo_safe_changed.connect (mem_fun(*this, &RouteUI::solo_changed)); if (is_track()) { boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track>(_route); @@ -83,7 +92,6 @@ RouteUI::RouteUI (boost::shared_ptr<ARDOUR::Route> rt, ARDOUR::Session& sess, co _session.RecordStateChanged.connect (mem_fun (*this, &RouteUI::session_rec_enable_changed)); rec_enable_button = manage (new BindableToggleButton (t->rec_enable_control(), r_name )); - rec_enable_button->unset_flags (Gtk::CAN_FOCUS); update_rec_display (); @@ -114,7 +122,7 @@ RouteUI::mute_press(GdkEventButton* ev) build_mute_menu(); } - mute_menu->popup(0,0); + mute_menu->popup(0,ev->time); } else { @@ -124,6 +132,8 @@ RouteUI::mute_press(GdkEventButton* ev) if (!Keyboard::modifier_state_equals (ev->state, Keyboard::ModifierMask (Keyboard::Control))) { wait_for_release = true; + } else { + return false; } } @@ -189,7 +199,7 @@ RouteUI::solo_press(GdkEventButton* ev) build_solo_menu (); } - solo_menu->popup (1, 0); + solo_menu->popup (1, ev->time); } else { @@ -200,6 +210,8 @@ RouteUI::solo_press(GdkEventButton* ev) if (!Keyboard::modifier_state_equals (ev->state, Keyboard::ModifierMask (Keyboard::Control))) { wait_for_release = true; + } else { + return false; } } @@ -277,6 +289,12 @@ RouteUI::solo_release(GdkEventButton* ev) bool RouteUI::rec_enable_press(GdkEventButton* ev) { + if (!_session.engine().connected()) { + MessageDialog msg (_("Not connected to JACK - cannot engage record")); + msg.run (); + return true; + } + if (!ignore_toggle && is_track() && rec_enable_button) { if (ev->button == 2 && Keyboard::modifier_state_equals (ev->state, Keyboard::Control)) { @@ -489,7 +507,7 @@ RouteUI::build_solo_menu (void) items.push_back (CheckMenuElem(*check)); check->show_all(); - items.push_back (SeparatorElem()); + //items.push_back (SeparatorElem()); // items.push_back (MenuElem (_("MIDI Bind"), mem_fun (*mute_button, &BindableToggleButton::midi_learn))); } @@ -532,7 +550,7 @@ RouteUI::build_mute_menu(void) items.push_back (CheckMenuElem(*check)); check->show_all(); - items.push_back (SeparatorElem()); + //items.push_back (SeparatorElem()); // items.push_back (MenuElem (_("MIDI Bind"), mem_fun (*mute_button, &BindableToggleButton::midi_learn))); } diff --git a/gtk2_ardour/route_ui.h b/gtk2_ardour/route_ui.h index eace2c6c2a..bad47ac274 100644 --- a/gtk2_ardour/route_ui.h +++ b/gtk2_ardour/route_ui.h @@ -156,8 +156,6 @@ class RouteUI : public virtual AxisView void reversibly_apply_route_boolean (string name, void (ARDOUR::Route::*func)(bool, void*), bool, void *); void reversibly_apply_track_boolean (string name, void (ARDOUR::Track::*func)(bool, void*), bool, void *); - - sigc::signal<void> GoingAway; }; #endif /* __ardour_route_ui__ */ diff --git a/gtk2_ardour/selection.h b/gtk2_ardour/selection.h index a1b1ae0da3..c4336fba21 100644 --- a/gtk2_ardour/selection.h +++ b/gtk2_ardour/selection.h @@ -56,6 +56,7 @@ class Selection : public sigc::trackable enum Operation { Set, + Add, Toggle, Extend }; diff --git a/gtk2_ardour/sfdb_ui.cc b/gtk2_ardour/sfdb_ui.cc index 67084eb6a0..c4d6d7edfc 100644 --- a/gtk2_ardour/sfdb_ui.cc +++ b/gtk2_ardour/sfdb_ui.cc @@ -74,6 +74,7 @@ SoundFileBox::SoundFileBox () main_box.pack_start(format, false, false); main_box.pack_start(channels, false, false); main_box.pack_start(samplerate, false, false); + main_box.pack_start(timecode, false, false); main_box.pack_start(field_view, true, true); main_box.pack_start(top_box, false, false); main_box.pack_start(bottom_box, false, false); @@ -129,21 +130,25 @@ SoundFileBox::setup_labels (string filename) path = filename; string error_msg; + if(!AudioFileSource::get_soundfile_info (filename, sf_info, error_msg)) { return false; } length.set_alignment (0.0f, 0.0f); - length.set_text (string_compose("Length: %1", PBD::length2string(sf_info.length, sf_info.samplerate))); + length.set_text (string_compose(_("Length: %1"), PBD::length2string(sf_info.length, sf_info.samplerate))); format.set_alignment (0.0f, 0.0f); format.set_text (sf_info.format_name); channels.set_alignment (0.0f, 0.0f); - channels.set_text (string_compose("Channels: %1", sf_info.channels)); + channels.set_text (string_compose(_("Channels: %1"), sf_info.channels)); samplerate.set_alignment (0.0f, 0.0f); - samplerate.set_text (string_compose("Samplerate: %1", sf_info.samplerate)); + samplerate.set_text (string_compose(_("Samplerate: %1"), sf_info.samplerate)); + + timecode.set_alignment (0.0f, 0.0f); + timecode.set_text (string_compose (_("Timecode: %1"), PBD::length2string(sf_info.timecode, sf_info.samplerate))); setup_fields (); @@ -190,9 +195,11 @@ SoundFileBox::play_btn_clicked () return; } - static std::map<string, boost::shared_ptr<AudioRegion> > region_cache; + typedef std::map<string, boost::shared_ptr<AudioRegion> > RegionCache; + static RegionCache region_cache; + RegionCache::iterator the_region; - if (region_cache.find (path) == region_cache.end()) { + if ((the_region = region_cache.find (path)) == region_cache.end()) { SourceList srclist; boost::shared_ptr<AudioFileSource> afs; @@ -211,18 +218,27 @@ SoundFileBox::play_btn_clicked () return; } + string rname; + + _session->region_name (rname, Glib::path_get_basename(srclist[0]->name()), false); + pair<string,boost::shared_ptr<AudioRegion> > newpair; + pair<RegionCache::iterator,bool> res; + + newpair.first = path; + newpair.second = boost::dynamic_pointer_cast<AudioRegion> (RegionFactory::create (srclist, 0, srclist[0]->length(), rname, 0, Region::DefaultFlags, false)); - _session->region_name (newpair.first, Glib::path_get_basename(srclist[0]->name()), false); - newpair.second = boost::dynamic_pointer_cast<AudioRegion> (RegionFactory::create (srclist, 0, srclist[0]->length(), newpair.first, 0, Region::DefaultFlags, false)); - region_cache.insert (newpair); + res = region_cache.insert (newpair); + the_region = res.first; } play_btn.hide(); stop_btn.show(); - _session->audition_region(region_cache[path]); + boost::shared_ptr<Region> r = boost::static_pointer_cast<Region> (the_region->second); + + _session->audition_region(r); } void @@ -356,7 +372,7 @@ SoundFileOmega::SoundFileOmega (string title, ARDOUR::Session* s) split_check (_("Split Channels")) { if (mode_strings.empty()) { - mode_strings = PBD::internationalize (import_mode_strings); + mode_strings = I18N (import_mode_strings); } ARDOUR_UI::instance()->tooltips().set_tip(split_check, @@ -366,12 +382,12 @@ SoundFileOmega::SoundFileOmega (string title, ARDOUR::Session* s) ARDOUR_UI::instance()->tooltips().set_tip(*btn, _("Link to an external file")); + add_button (Gtk::Stock::CLOSE, Gtk::RESPONSE_CLOSE); + btn = add_button (_("Import"), ResponseImport); ARDOUR_UI::instance()->tooltips().set_tip(*btn, _("Copy a file to the session folder")); - add_button (Gtk::Stock::CLOSE, Gtk::RESPONSE_CLOSE); - Gtk::HBox *box = manage (new Gtk::HBox()); Gtkmm2ext::set_popdown_strings (mode_combo, mode_strings); diff --git a/gtk2_ardour/sfdb_ui.h b/gtk2_ardour/sfdb_ui.h index 8ef57d7b9f..d7c2c14014 100644 --- a/gtk2_ardour/sfdb_ui.h +++ b/gtk2_ardour/sfdb_ui.h @@ -77,6 +77,7 @@ class SoundFileBox : public Gtk::VBox Gtk::Label format; Gtk::Label channels; Gtk::Label samplerate; + Gtk::Label timecode; Gtk::TreeView field_view; Glib::RefPtr<Gtk::ListStore> fields; diff --git a/gtk2_ardour/streamview.cc b/gtk2_ardour/streamview.cc index 191a9ffb54..365cfea0d1 100644 --- a/gtk2_ardour/streamview.cc +++ b/gtk2_ardour/streamview.cc @@ -63,7 +63,7 @@ StreamView::StreamView (RouteTimeAxisView& tv) canvas_rect = new ArdourCanvas::SimpleRect (*canvas_group); canvas_rect->property_x1() = 0.0; canvas_rect->property_y1() = 0.0; - canvas_rect->property_x2() = 1000000.0; + canvas_rect->property_x2() = _trackview.editor.frame_to_pixel (max_frames); canvas_rect->property_y2() = (double) tv.height; canvas_rect->property_outline_what() = (guint32) (0x1|0x2|0x8); // outline ends and bottom // (Fill/Outline colours set in derived classes) diff --git a/gtk2_ardour/time_axis_view.cc b/gtk2_ardour/time_axis_view.cc index 2119efc722..ce0b6a4250 100644 --- a/gtk2_ardour/time_axis_view.cc +++ b/gtk2_ardour/time_axis_view.cc @@ -234,7 +234,7 @@ TimeAxisView::show_at (double y, int& nth, VBox *parent) if (canvas_item_visible ((*i)->canvas_display)) { ++nth; - effective_height += (*i)->show_at (y + effective_height, nth, parent); + effective_height += (*i)->show_at (y + 1 + effective_height, nth, parent); } } @@ -286,18 +286,8 @@ TimeAxisView::controls_ebox_button_release (GdkEventButton* ev) void TimeAxisView::selection_click (GdkEventButton* ev) { - if (Keyboard::modifier_state_contains (ev->state, Keyboard::Shift)) { - - if (editor.get_selection().selected (this)) { - editor.get_selection().remove (this); - } else { - editor.get_selection().add (this); - } - - } else { - - editor.get_selection().set (this); - } + Selection::Operation op = Keyboard::selection_type (ev->state); + editor.set_selected_track (*this, op, false); } void @@ -383,8 +373,48 @@ TimeAxisView::set_height_pixels (uint32_t h) bool TimeAxisView::name_entry_key_release (GdkEventKey* ev) { + PublicEditor::TrackViewList *allviews = 0; + PublicEditor::TrackViewList::iterator i; + switch (ev->keyval) { + case GDK_Escape: + name_entry.select_region (0,0); + controls_ebox.grab_focus (); + name_entry_changed (); + return true; + + /* Shift+Tab Keys Pressed. Note that for Shift+Tab, GDK actually + * generates a different ev->keyval, rather than setting + * ev->state. + */ + case GDK_ISO_Left_Tab: case GDK_Tab: + name_entry_changed (); + allviews = editor.get_valid_views (0); + if (allviews != 0) { + i = find (allviews->begin(), allviews->end(), this); + if (ev->keyval == GDK_Tab) { + if (i != allviews->end()) { + do { + if (++i == allviews->end()) { return true; } + } while((*i)->hidden()); + } + } else { + if (i != allviews->begin()) { + do { + if (--i == allviews->begin()) { return true; } + } while ((*i)->hidden()); + } + } + + if ((*i)->height_style == Small) { + (*i)->set_height(Smaller); + } + + (*i)->name_entry.grab_focus(); + } + return true; + case GDK_Up: case GDK_Down: name_entry_changed (); @@ -434,6 +464,7 @@ TimeAxisView::name_entry_focus_out (GdkEventFocus* ev) last_name_entry_key_press_event = 0; name_entry_key_timeout.disconnect (); name_entry.set_name ("EditorTrackNameDisplay"); + name_entry.select_region (0,0); /* do the real stuff */ @@ -485,12 +516,14 @@ TimeAxisView::popup_display_menu (guint32 when) if (display_menu == 0) { build_display_menu (); } + editor.set_selected_track (*this, Selection::Add); display_menu->popup (1, when); } gint TimeAxisView::size_click (GdkEventButton *ev) { + editor.set_selected_track (*this, Selection::Add); popup_size_menu (ev->time); return TRUE; } diff --git a/gtk2_ardour/utils.cc b/gtk2_ardour/utils.cc index 76b237713a..4d7c133770 100644 --- a/gtk2_ardour/utils.cc +++ b/gtk2_ardour/utils.cc @@ -359,12 +359,25 @@ key_press_focus_accelerator_handler (Gtk::Window& window, GdkEventKey* ev) GtkWidget* focus = gtk_window_get_focus (win); bool special_handling_of_unmodified_accelerators = false; +#undef DEBUG_ACCELERATOR_HANDLING +#ifdef DEBUG_ACCELERATOR_HANDLING + bool debug = (getenv ("ARDOUR_DEBUG_ACCELERATOR_HANDLING") != 0); +#endif + if (focus) { if (GTK_IS_ENTRY(focus)) { special_handling_of_unmodified_accelerators = true; - } + } } +#ifdef DEBUG_ACCELERATOR_HANDLING + if (debug) { + cerr << "Key event: code = " << ev->keyval << " state = " << hex << ev->state << dec << " focus is an entry ? " + << special_handling_of_unmodified_accelerators + << endl; + } +#endif + /* This exists to allow us to override the way GTK handles key events. The normal sequence is: @@ -441,20 +454,40 @@ key_press_focus_accelerator_handler (Gtk::Window& window, GdkEventKey* ev) /* no special handling or modifiers in effect: accelerate first */ +#ifdef DEBUG_ACCELERATOR_HANDLING + if (debug) { + cerr << "\tactivate, then propagate\n"; + } +#endif if (!gtk_window_activate_key (win, ev)) { return gtk_window_propagate_key_event (win, ev); } else { +#ifdef DEBUG_ACCELERATOR_HANDLING + if (debug) { + cerr << "\tnot handled\n"; + } +#endif return true; } } /* no modifiers, propagate first */ +#ifdef DEBUG_ACCELERATOR_HANDLING + if (debug) { + cerr << "\tactivate, then propagate\n"; + } +#endif if (!gtk_window_propagate_key_event (win, ev)) { return gtk_window_activate_key (win, ev); } +#ifdef DEBUG_ACCELERATOR_HANDLING + if (debug) { + cerr << "\tnot handled\n"; + } +#endif return true; } diff --git a/gtk2_ardour/visual_time_axis.cc b/gtk2_ardour/visual_time_axis.cc index fc71795a71..24cafdbe67 100644 --- a/gtk2_ardour/visual_time_axis.cc +++ b/gtk2_ardour/visual_time_axis.cc @@ -199,7 +199,12 @@ VisualTimeAxis::visual_click() void VisualTimeAxis::hide_click() { + // LAME fix for hide_button display refresh + hide_button.set_sensitive(false); + editor.hide_track_in_display (*this); + + hide_button.set_sensitive(true); } diff --git a/libs/ardour/SConscript b/libs/ardour/SConscript index 58a2bbf825..98a1b362bb 100644 --- a/libs/ardour/SConscript +++ b/libs/ardour/SConscript @@ -14,7 +14,7 @@ ardour = env.Copy() domain = 'libardour' -ardour.Append(DOMAIN = domain, MAJOR = 1, MINOR = 0, MICRO = 0) +ardour.Append(DOMAIN = domain, MAJOR = 2, MINOR = 0, MICRO = 0) ardour.Append(CXXFLAGS = "-DPACKAGE=\\\"" + domain + "\\\"") ardour.Append(CXXFLAGS="-DLIBSIGC_DISABLE_DEPRECATED") ardour.Append(PACKAGE = domain) @@ -44,6 +44,7 @@ buffer_set.cc meter.cc amp.cc panner.cc +destructive_filesource.cc audiofilesource.cc audiofilter.cc audioregion.cc @@ -64,7 +65,6 @@ crossfade.cc curve.cc cycle_timer.cc default_click.cc -destructive_filesource.cc gain.cc gdither.cc globals.cc @@ -105,7 +105,6 @@ sndfile_helpers.cc sndfilesource.cc source.cc source_factory.cc -state_manager.cc tempo.cc utils.cc version.cc @@ -242,7 +241,7 @@ ardour = conf.Finish () ardour.Merge ([ libraries['core'], libraries['xml'], - libraries['sndfile'], + libraries['sndfile-ardour'], libraries['raptor'], libraries['lrdf'], libraries['samplerate'], @@ -260,8 +259,6 @@ if ardour['LIBLO']: if ardour['COREAUDIO'] or ardour['AUDIOUNITS']: ardour.Merge ([ libraries['appleutility'] ]) -ardour.VersionBuild(['version.cc', 'ardour/version.h'], 'SConscript') - def SharedAsmObjectEmitter(target, source, env): for tgt in target: tgt.attributes.shared = 1 @@ -291,7 +288,9 @@ if env['NLS']: env.Alias('install', env.Install(os.path.join(install_prefix, 'lib/ardour2'), libardour)) - + +env.Alias('version', ardour.VersionBuild(['version.cc', 'ardour/version.h'], [])) + env.Alias('tarball', env.Distribute (env['DISTTREE'], [ 'SConscript', 'i18n.h', 'gettext.h', 'sse_functions.s', 'sse_functions_64bit.s' ] + ardour_files + osc_files + vst_files + coreaudio_files + audiounit_files + diff --git a/libs/ardour/ardour/audio_diskstream.h b/libs/ardour/ardour/audio_diskstream.h index 76b76b1061..4a95e094a9 100644 --- a/libs/ardour/ardour/audio_diskstream.h +++ b/libs/ardour/ardour/audio_diskstream.h @@ -77,6 +77,8 @@ class AudioDiskstream : public Diskstream } void set_record_enabled (bool yn); + int set_destructive (bool yn); + bool can_become_destructive (bool& requires_bounce) const; float peak_power(uint32_t n=0) { float x = channels[n].peak_power; diff --git a/libs/ardour/ardour/audio_track.h b/libs/ardour/ardour/audio_track.h index fdf373a1cb..e87434b0fb 100644 --- a/libs/ardour/ardour/audio_track.h +++ b/libs/ardour/ardour/audio_track.h @@ -37,6 +37,9 @@ class AudioTrack : public Track AudioTrack (Session&, const XMLNode&); ~AudioTrack (); + int set_mode (TrackMode m); + bool can_use_mode (TrackMode m, bool& bounce_required); + int roll (nframes_t nframes, nframes_t start_frame, nframes_t end_frame, nframes_t offset, int declick, bool can_record, bool rec_monitors_input); @@ -63,6 +66,8 @@ class AudioTrack : public Track protected: XMLNode& state (bool full); + + int _set_state (const XMLNode&, bool call_base); private: int set_diskstream (boost::shared_ptr<AudioDiskstream>, void *); diff --git a/libs/ardour/ardour/audio_unit.h b/libs/ardour/ardour/audio_unit.h index 8a51580f27..88591ab845 100644 --- a/libs/ardour/ardour/audio_unit.h +++ b/libs/ardour/ardour/audio_unit.h @@ -1,6 +1,6 @@ /* Copyright (C) 2006 Paul Davis - Written by Taybin Rutkin + Written by Taybin Rutkin 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 diff --git a/libs/ardour/ardour/audiofilesource.h b/libs/ardour/ardour/audiofilesource.h index af5f5cdb60..bd609a7d80 100644 --- a/libs/ardour/ardour/audiofilesource.h +++ b/libs/ardour/ardour/audiofilesource.h @@ -31,6 +31,7 @@ struct SoundFileInfo { uint16_t channels; int64_t length; std::string format_name; + int64_t timecode; }; class AudioFileSource : public AudioSource { @@ -81,6 +82,8 @@ class AudioFileSource : public AudioSource { void mark_take (string); string take_id() const { return _take_id; } + bool is_embedded() const { return _is_embedded; } + static void set_bwf_serial_number (int); static void set_search_path (string); @@ -93,6 +96,9 @@ class AudioFileSource : public AudioSource { XMLNode& get_state (); int set_state (const XMLNode&); + bool destructive() const { return (_flags & Destructive); } + virtual bool set_destructive (bool yn) { return false; } + /* this should really be protected, but C++ is getting stricter and creating slots from protected member functions is starting to cause issues. @@ -121,9 +127,12 @@ class AudioFileSource : public AudioSource { string _path; Flag _flags; string _take_id; - uint64_t timeline_position; + int64_t timeline_position; bool file_is_new; + bool _is_embedded; + static bool determine_embeddedness(string path); + static string peak_dir; static string search_path; @@ -133,7 +142,7 @@ class AudioFileSource : public AudioSource { static uint64_t header_position_offset; - virtual void set_timeline_position (nframes_t pos); + virtual void set_timeline_position (int64_t pos); virtual void set_header_timeline_position () = 0; bool find (std::string path, bool must_exist, bool& is_new); diff --git a/libs/ardour/ardour/audioregion.h b/libs/ardour/ardour/audioregion.h index e14cfd0180..53c7e68b82 100644 --- a/libs/ardour/ardour/audioregion.h +++ b/libs/ardour/ardour/audioregion.h @@ -110,6 +110,7 @@ class AudioRegion : public Region void set_fade_out (FadeShape, nframes_t); void set_envelope_active (bool yn); + void set_default_envelope (); int separate_by_channel (ARDOUR::Session&, vector<AudioRegion*>&) const; @@ -143,7 +144,6 @@ class AudioRegion : public Region void set_default_fades (); void set_default_fade_in (); void set_default_fade_out (); - void set_default_envelope (); void recompute_gain_at_end (); void recompute_gain_at_start (); @@ -157,8 +157,11 @@ class AudioRegion : public Region void recompute_at_start (); void recompute_at_end (); - void envelope_changed (Change); + void envelope_changed (); + void fade_in_changed (); + void fade_out_changed (); void source_offset_changed (); + void listen_to_my_curves (); mutable Curve _fade_in; FadeShape _fade_in_shape; @@ -171,6 +174,13 @@ class AudioRegion : public Region protected: int set_live_state (const XMLNode&, Change&, bool send); + + virtual bool verify_start (jack_nframes_t); + virtual bool verify_start_and_length (jack_nframes_t, jack_nframes_t); + virtual bool verify_start_mutable (jack_nframes_t&_start); + virtual bool verify_length (jack_nframes_t); + /*virtual void recompute_at_start () = 0; + virtual void recompute_at_end () = 0;*/ }; } /* namespace ARDOUR */ diff --git a/libs/ardour/ardour/audiosource.h b/libs/ardour/ardour/audiosource.h index db82acf894..2ada255236 100644 --- a/libs/ardour/ardour/audiosource.h +++ b/libs/ardour/ardour/audiosource.h @@ -70,7 +70,7 @@ const nframes_t frames_per_peak = 256; uint32_t read_data_count() const { return _read_data_count; } uint32_t write_data_count() const { return _write_data_count; } - int read_peaks (PeakData *peaks, nframes_t npeaks, nframes_t start, nframes_t cnt, double samples_per_unit) const; + virtual int read_peaks (PeakData *peaks, nframes_t npeaks, nframes_t start, nframes_t cnt, double samples_per_unit) const; int build_peaks (); bool peaks_ready (sigc::slot<void>, sigc::connection&) const; diff --git a/libs/ardour/ardour/automation_event.h b/libs/ardour/ardour/automation_event.h index 22ab706f82..e5c194e683 100644 --- a/libs/ardour/ardour/automation_event.h +++ b/libs/ardour/ardour/automation_event.h @@ -33,7 +33,6 @@ #include <pbd/statefuldestructible.h> #include <ardour/ardour.h> -#include <ardour/state_manager.h> namespace ARDOUR { @@ -54,14 +53,15 @@ struct ControlEvent { }; - class AutomationList : public StateManager, public PBD::StatefulDestructible +class AutomationList : public PBD::StatefulDestructible { public: typedef std::list<ControlEvent*> AutomationEventList; typedef AutomationEventList::iterator iterator; typedef AutomationEventList::const_iterator const_iterator; - AutomationList(double default_value, bool no_state = false); + AutomationList (double default_value); + AutomationList (const XMLNode&); ~AutomationList(); AutomationList (const AutomationList&); @@ -85,8 +85,9 @@ struct ControlEvent { void reposition_for_rt_add (double when); void rt_add (double when, double value); - iterator add (double when, double value, iterator, bool ignore_mode = false); - void add (double when, double value, bool for_loading = false); + void add (double when, double value); + /* this should be private but old-school automation loading needs it in IO/Redirect */ + void fast_simple_add (double when, double value); void reset_range (double start, double end); void erase_range (double start, double end); @@ -151,13 +152,12 @@ struct ControlEvent { (obj.*method)(*this); } - UndoAction get_memento () const; - - virtual void store_state (XMLNode& node) const; - virtual void load_state (const XMLNode&); + sigc::signal<void> StateChanged; - XMLNode &get_state(void); + XMLNode& get_state(void); int set_state (const XMLNode &s); + XMLNode& state (bool full); + XMLNode& serialize_events (); void set_max_xval (double); double get_max_xval() const { return max_xval; } @@ -188,12 +188,6 @@ struct ControlEvent { protected: - struct State : public ARDOUR::StateManager::State { - AutomationEventList events; - - State (std::string why) : ARDOUR::StateManager::State (why) {} - }; - AutomationEventList events; mutable Glib::Mutex lock; bool _frozen; @@ -215,7 +209,6 @@ struct ControlEvent { double min_yval; double max_yval; double default_value; - bool no_state; iterator rt_insertion_point; double rt_pos; @@ -242,14 +235,12 @@ struct ControlEvent { virtual double unlocked_eval (double where); - Change restore_state (StateManager::State&); - StateManager::State* state_factory (std::string why) const; - virtual ControlEvent* point_factory (double,double) const; virtual ControlEvent* point_factory (const ControlEvent&) const; - AutomationList* cut_copy_clear (double, double, int op); + + int deserialize_events (const XMLNode&); }; } // namespace diff --git a/libs/ardour/ardour/configuration_vars.h b/libs/ardour/ardour/configuration_vars.h index fe65e9d433..8044190066 100644 --- a/libs/ardour/ardour/configuration_vars.h +++ b/libs/ardour/ardour/configuration_vars.h @@ -80,7 +80,6 @@ CONFIG_VARIABLE (std::string, click_emphasis_sound, "click-emphasis-sound", "") CONFIG_VARIABLE (bool, auto_play, "auto-play", false) CONFIG_VARIABLE (bool, auto_return, "auto-return", false) CONFIG_VARIABLE (bool, auto_input, "auto-input", true) -CONFIG_VARIABLE (bool, auto_loop, "auto-loop", false) CONFIG_VARIABLE (bool, punch_in, "punch-in", false) CONFIG_VARIABLE (bool, punch_out, "punch-out", false) CONFIG_VARIABLE (bool, plugins_stop_with_transport, "plugins-stop-with-transport", false) diff --git a/libs/ardour/ardour/coreaudiosource.h b/libs/ardour/ardour/coreaudiosource.h index 668fe61102..bd69c78e18 100644 --- a/libs/ardour/ardour/coreaudiosource.h +++ b/libs/ardour/ardour/coreaudiosource.h @@ -38,6 +38,8 @@ class CoreAudioSource : public AudioFileSource { int flush_header () {return 0;}; void set_header_timeline_position () {}; + static int get_soundfile_info (string path, SoundFileInfo& _info, string& error_msg); + protected: nframes_t read_unlocked (Sample *dst, nframes_t start, nframes_t cnt) const; nframes_t write_unlocked (Sample *dst, nframes_t cnt) { return 0; } @@ -50,7 +52,7 @@ class CoreAudioSource : public AudioFileSource { mutable nframes_t tmpbufsize; mutable Glib::Mutex _tmpbuf_lock; - void init (const string &str); + void init (string str); }; }; /* namespace ARDOUR */ diff --git a/libs/ardour/ardour/curve.h b/libs/ardour/ardour/curve.h index 87893ca260..df984b74e0 100644 --- a/libs/ardour/ardour/curve.h +++ b/libs/ardour/ardour/curve.h @@ -51,9 +51,10 @@ class Curve : public AutomationList ~Curve (); Curve (const Curve& other); Curve (const Curve& other, double start, double end); + Curve (const XMLNode&); - bool rt_safe_get_vector (double x0, double x1, float *arg, size_t veclen); - void get_vector (double x0, double x1, float *arg, size_t veclen); + bool rt_safe_get_vector (double x0, double x1, float *arg, int32_t veclen); + void get_vector (double x0, double x1, float *arg, int32_t veclen); AutomationEventList::iterator closest_control_point_before (double xval); AutomationEventList::iterator closest_control_point_after (double xval); @@ -66,22 +67,20 @@ class Curve : public AutomationList ControlEvent* point_factory (double,double) const; ControlEvent* point_factory (const ControlEvent&) const; - Change restore_state (StateManager::State&); - private: AutomationList::iterator last_bound; double unlocked_eval (double where); double multipoint_eval (double x); - void _get_vector (double x0, double x1, float *arg, size_t veclen); + void _get_vector (double x0, double x1, float *arg, int32_t veclen); }; } // namespace ARDOUR extern "C" { - void curve_get_vector_from_c (void *arg, double, double, float*, size_t); + void curve_get_vector_from_c (void *arg, double, double, float*, int32_t); } #endif /* __ardour_curve_h__ */ diff --git a/libs/ardour/ardour/destructive_filesource.h b/libs/ardour/ardour/destructive_filesource.h index 1e75042ce9..2e6f5d0e57 100644 --- a/libs/ardour/ardour/destructive_filesource.h +++ b/libs/ardour/ardour/destructive_filesource.h @@ -48,6 +48,8 @@ class DestructiveFileSource : public SndFileSource { static void setup_standard_crossfades (nframes_t sample_rate); + int read_peaks (PeakData *peaks, nframes_t npeaks, nframes_t start, nframes_t cnt, double samples_per_unit) const; + protected: nframes_t write_unlocked (Sample *src, nframes_t cnt); @@ -66,7 +68,7 @@ class DestructiveFileSource : public SndFileSource { void init (); nframes_t crossfade (Sample* data, nframes_t cnt, int dir); - void set_timeline_position (nframes_t); + void set_timeline_position (int64_t); }; } diff --git a/libs/ardour/ardour/diskstream.h b/libs/ardour/ardour/diskstream.h index 7a779b69bf..eb6d936222 100644 --- a/libs/ardour/ardour/diskstream.h +++ b/libs/ardour/ardour/diskstream.h @@ -90,7 +90,8 @@ class IO; virtual void set_record_enabled (bool yn) = 0; bool destructive() const { return _flags & Destructive; } - virtual void set_destructive (bool yn); + virtual int set_destructive (bool yn) { return -1; } + virtual bool can_become_destructive (bool& requires_bounce) const { return false; } bool hidden() const { return _flags & Hidden; } bool recordable() const { return _flags & Recordable; } @@ -137,6 +138,8 @@ class IO; void handle_input_change (IOChange, void *src); + void remove_region_from_last_capture (boost::weak_ptr<Region> wregion); + sigc::signal<void> RecordEnableChanged; sigc::signal<void> SpeedChanged; sigc::signal<void> ReverseChanged; @@ -223,6 +226,7 @@ class IO; virtual bool realtime_set_speed (double, bool global_change); std::list<boost::shared_ptr<Region> > _last_capture_regions; + virtual int use_pending_capture_data (XMLNode& node) = 0; virtual void get_input_sources () = 0; diff --git a/libs/ardour/ardour/insert.h b/libs/ardour/ardour/insert.h index 5d917a8c2c..217fd89885 100644 --- a/libs/ardour/ardour/insert.h +++ b/libs/ardour/ardour/insert.h @@ -89,15 +89,6 @@ class PortInsert : public Insert int32_t compute_output_streams (int32_t cnt) const; }; -struct PluginInsertState : public RedirectState -{ - PluginInsertState (std::string why) - : RedirectState (why) {} - ~PluginInsertState() {} - - PluginState plugin_state; -}; - class PluginInsert : public Insert { public: @@ -112,9 +103,6 @@ class PluginInsert : public Insert XMLNode& get_state(void); int set_state(const XMLNode&); - StateManager::State* state_factory (std::string why) const; - Change restore_state (StateManager::State&); - void run (BufferSet& bufs, nframes_t start_frame, nframes_t end_frame, nframes_t nframes, nframes_t offset); void silence (nframes_t nframes, nframes_t offset); @@ -160,9 +148,7 @@ class PluginInsert : public Insert nframes_t latency(); void transport_stopped (nframes_t now); - - protected: - void store_state (PluginInsertState&) const; + void automation_snapshot (nframes_t now); private: diff --git a/libs/ardour/ardour/io.h b/libs/ardour/ardour/io.h index 56566149c0..f7e1993bb2 100644 --- a/libs/ardour/ardour/io.h +++ b/libs/ardour/ardour/io.h @@ -36,7 +36,6 @@ #include <ardour/ardour.h> #include <ardour/utils.h> -#include <ardour/state_manager.h> #include <ardour/curve.h> #include <ardour/types.h> #include <ardour/data_type.h> @@ -65,7 +64,7 @@ class BufferSet; * An IO can contain ports of varying types, making routes/inserts/etc with * varied combinations of types (eg MIDI and audio) possible. */ -class IO : public PBD::StatefulDestructible, public ARDOUR::StateManager +class IO : public PBD::StatefulDestructible { public: @@ -74,7 +73,9 @@ class IO : public PBD::StatefulDestructible, public ARDOUR::StateManager IO (Session&, string name, int input_min = -1, int input_max = -1, int output_min = -1, int output_max = -1, - DataType default_type = DataType::AUDIO); + DataType default_type = DataType::AUDIO); + + IO (Session&, const XMLNode&, DataType default_type = DataType::AUDIO); virtual ~IO(); @@ -82,18 +83,12 @@ class IO : public PBD::StatefulDestructible, public ARDOUR::StateManager ChanCount input_maximum() const { return _input_maximum; } ChanCount output_minimum() const { return _output_minimum; } ChanCount output_maximum() const { return _output_maximum; } - + void set_input_minimum (ChanCount n); void set_input_maximum (ChanCount n); void set_output_minimum (ChanCount n); void set_output_maximum (ChanCount n); - // Do not write any new code using these - void set_input_minimum (int n); - void set_input_maximum (int n); - void set_output_minimum (int n); - void set_output_maximum (int n); - DataType default_type() const { return _default_type; } void set_default_type(DataType t) { _default_type = t; } @@ -187,9 +182,6 @@ class IO : public PBD::StatefulDestructible, public ARDOUR::StateManager XMLNode& get_state (void); int set_state (const XMLNode&); - virtual UndoAction get_memento() const; - - static int disable_connecting (void); static int enable_connecting (void); @@ -224,6 +216,14 @@ public: /* automation */ + static void set_automation_interval (jack_nframes_t frames) { + _automation_interval = frames; + } + + static jack_nframes_t automation_interval() { + return _automation_interval; + } + void clear_automation (); bool gain_automation_recording() const { @@ -245,6 +245,7 @@ public: sigc::signal<void> gain_automation_style_changed; virtual void transport_stopped (nframes_t now); + void automation_snapshot (nframes_t now); ARDOUR::Curve& gain_automation_curve () { return _gain_automation_curve; } @@ -304,10 +305,8 @@ public: GainControllable _gain_control; - /* state management */ - - Change restore_state (State&); - StateManager::State* state_factory (std::string why) const; + nframes_t last_automation_snapshot; + static nframes_t _automation_interval; AutoState _gain_automation_state; AutoStyle _gain_automation_style; @@ -315,11 +314,12 @@ public: bool apply_gain_automation; Curve _gain_automation_curve; - int save_automation (const string&); - int load_automation (const string&); - Glib::Mutex automation_lock; + virtual int set_automation_state (const XMLNode&); + virtual XMLNode& get_automation_state (); + virtual int load_automation (std::string path); + /* AudioTrack::deprecated_use_diskstream_connections() needs these */ int set_inputs (const string& str); diff --git a/libs/ardour/ardour/location.h b/libs/ardour/ardour/location.h index 1f1c02d67c..94f70bb4e8 100644 --- a/libs/ardour/ardour/location.h +++ b/libs/ardour/ardour/location.h @@ -36,7 +36,6 @@ #include <pbd/statefuldestructible.h> #include <ardour/ardour.h> -#include <ardour/state_manager.h> using std::string; @@ -131,7 +130,7 @@ class Location : public PBD::StatefulDestructible bool set_flag_internal (bool yn, Flags flag); }; -class Locations : public StateManager, public PBD::StatefulDestructible +class Locations : public PBD::StatefulDestructible { public: typedef std::list<Location *> LocationList; @@ -169,6 +168,7 @@ class Locations : public StateManager, public PBD::StatefulDestructible sigc::signal<void> changed; sigc::signal<void,Location*> added; sigc::signal<void,Location*> removed; + sigc::signal<void,Change> StateChanged; template<class T> void apply (T& obj, void (T::*method)(LocationList&)) { Glib::Mutex::Lock lm (lock); @@ -180,26 +180,14 @@ class Locations : public StateManager, public PBD::StatefulDestructible (obj.*method)(locations, arg); } - UndoAction get_memento () const; - private: - struct State : public ARDOUR::StateManager::State { - LocationList locations; - LocationList states; - - State (std::string why) : ARDOUR::StateManager::State (why) {} - }; - LocationList locations; Location *current_location; mutable Glib::Mutex lock; int set_current_unlocked (Location *); void location_changed (Location*); - - Change restore_state (StateManager::State&); - StateManager::State* state_factory (std::string why) const; }; } // namespace ARDOUR diff --git a/libs/ardour/ardour/midi_diskstream.h b/libs/ardour/ardour/midi_diskstream.h index e62121672f..583cc23de5 100644 --- a/libs/ardour/ardour/midi_diskstream.h +++ b/libs/ardour/ardour/midi_diskstream.h @@ -87,7 +87,7 @@ class MidiDiskstream : public Diskstream boost::shared_ptr<SMFSource> write_source () { return _write_source; } - void set_destructive (bool yn); // doom! + int set_destructive (bool yn); // doom! protected: friend class Session; diff --git a/libs/ardour/ardour/midi_region.h b/libs/ardour/ardour/midi_region.h index a5c578b7cd..2fa39a37df 100644 --- a/libs/ardour/ardour/midi_region.h +++ b/libs/ardour/ardour/midi_region.h @@ -84,9 +84,6 @@ class MidiRegion : public Region friend class Playlist; private: - StateManager::State* state_factory (std::string why) const; - Change restore_state (StateManager::State&); - jack_nframes_t _read_at (const SourceList&, MidiRingBuffer& dst, jack_nframes_t position, jack_nframes_t dur, diff --git a/libs/ardour/ardour/midi_track.h b/libs/ardour/ardour/midi_track.h index 6cffe01318..0347df5669 100644 --- a/libs/ardour/ardour/midi_track.h +++ b/libs/ardour/ardour/midi_track.h @@ -58,7 +58,7 @@ public: int use_diskstream (string name); int use_diskstream (const PBD::ID& id); - void set_mode (TrackMode m); + int set_mode (TrackMode m); void set_latency_delay (jack_nframes_t); diff --git a/libs/ardour/ardour/panner.h b/libs/ardour/ardour/panner.h index 5231120840..79bff7d2a5 100644 --- a/libs/ardour/ardour/panner.h +++ b/libs/ardour/ardour/panner.h @@ -85,18 +85,18 @@ class StreamPanner : public sigc::trackable, public Stateful virtual Curve& automation() = 0; - virtual int load (istream&, string path, uint32_t&) = 0; - - virtual int save (ostream&) const = 0; - sigc::signal<void> Changed; /* for position */ sigc::signal<void> StateChanged; /* for mute */ int set_state (const XMLNode&); virtual XMLNode& state (bool full_state) = 0; - + Panner & get_parent() { return parent; } + /* old school automation loading */ + + virtual int load (istream&, string path, uint32_t&) = 0; + protected: friend class Panner; Panner& parent; @@ -145,8 +145,6 @@ class BaseStereoPanner : public StreamPanner void distribute (AudioBuffer& src, BufferSet& obufs, gain_t gain_coeff, nframes_t nframes); - int load (istream&, string path, uint32_t&); - int save (ostream&) const; void snapshot (nframes_t now); void transport_stopped (nframes_t frame); void set_automation_state (AutoState); @@ -154,6 +152,10 @@ class BaseStereoPanner : public StreamPanner Curve& automation() { return _automation; } + /* old school automation loading */ + + int load (istream&, string path, uint32_t&); + protected: float left; float right; @@ -207,10 +209,7 @@ class Multi2dPanner : public StreamPanner void distribute (AudioBuffer& src, BufferSet& obufs, gain_t gain_coeff, nframes_t nframes); void distribute_automated (AudioBuffer& src, BufferSet& obufs, - nframes_t start, nframes_t end, nframes_t nframes, pan_t** buffers); - - int load (istream&, string path, uint32_t&); - int save (ostream&) const; + nframes_t start, nframes_t end, nframes_t nframes, pan_t** buffers); static StreamPanner* factory (Panner&); static string name; @@ -219,6 +218,10 @@ class Multi2dPanner : public StreamPanner XMLNode& get_state (void); int set_state (const XMLNode&); + /* old school automation loading */ + + int load (istream&, string path, uint32_t&); + private: Curve _automation; void update (); @@ -244,8 +247,6 @@ class Panner : public std::vector<StreamPanner*>, public Stateful, public sigc:: /// The fundamental Panner function void distribute(BufferSet& src, BufferSet& dest, nframes_t start_frame, nframes_t end_frames, nframes_t nframes, nframes_t offset); - void set_name (string); - bool bypassed() const { return _bypassed; } void set_bypassed (bool yn); @@ -265,9 +266,6 @@ class Panner : public std::vector<StreamPanner*>, public Stateful, public sigc:: AutoStyle automation_style() const; bool touching() const; - int load (); - int save () const; - XMLNode& get_state (void); XMLNode& state (bool full); int set_state (const XMLNode&); @@ -304,12 +302,14 @@ class Panner : public std::vector<StreamPanner*>, public Stateful, public sigc:: void set_position (float x, StreamPanner& orig); void set_position (float x, float y, StreamPanner& orig); void set_position (float x, float y, float z, StreamPanner& orig); - + + /* old school automation */ + + int load (); + private: void distribute_no_automation(BufferSet& src, BufferSet& dest, nframes_t nframes, nframes_t offset, gain_t gain_coeff); - - string automation_path; Session& _session; uint32_t current_outs; bool _linked; @@ -317,6 +317,11 @@ class Panner : public std::vector<StreamPanner*>, public Stateful, public sigc:: LinkDirection _link_direction; static float current_automation_version_number; + + /* old school automation handling */ + + std::string automation_path; + void set_name (std::string); }; } // namespace ARDOUR diff --git a/libs/ardour/ardour/playlist.h b/libs/ardour/ardour/playlist.h index 93b30f42ef..831c9b3905 100644 --- a/libs/ardour/ardour/playlist.h +++ b/libs/ardour/ardour/playlist.h @@ -63,8 +63,8 @@ class Playlist : public PBD::StatefulDestructible { void unref(); uint32_t refcnt() const { return _refcnt; } - const string& name() const { return _name; } - void set_name (const string& str); + std::string name() const { return _name; } + void set_name (std::string str); const DataType& data_type() const { return _type; } @@ -73,6 +73,7 @@ class Playlist : public PBD::StatefulDestructible { bool hidden() const { return _hidden; } bool empty() const; + uint32_t n_regions() const; nframes_t get_maximum_extent () const; layer_t top_layer() const; @@ -91,19 +92,15 @@ class Playlist : public PBD::StatefulDestructible { void duplicate (boost::shared_ptr<Region>, nframes_t position, float times); void nudge_after (nframes_t start, nframes_t distance, bool forwards); - boost::shared_ptr<Region> find_region (const PBD::ID&) const; - Playlist* cut (list<AudioRange>&, bool result_is_hidden = true); Playlist* copy (list<AudioRange>&, bool result_is_hidden = true); int paste (Playlist&, nframes_t position, float times); - uint32_t read_data_count() { return _read_data_count; } - - RegionList* regions_at (nframes_t frame); - RegionList* regions_touched (nframes_t start, nframes_t end); + RegionList* regions_at (nframes_t frame); + RegionList* regions_touched (nframes_t start, nframes_t end); + boost::shared_ptr<Region> find_region (const PBD::ID&) const; boost::shared_ptr<Region> top_region_at (nframes_t frame); - - boost::shared_ptr<Region> find_next_region (nframes_t frame, RegionPoint point, int dir); + boost::shared_ptr<Region> find_next_region (nframes_t frame, RegionPoint point, int dir); template<class T> void foreach_region (T *t, void (T::*func)(boost::shared_ptr<Region>, void *), void *arg); template<class T> void foreach_region (T *t, void (T::*func)(boost::shared_ptr<Region>)); diff --git a/libs/ardour/ardour/redirect.h b/libs/ardour/ardour/redirect.h index ae58fa9b70..79ae4516c5 100644 --- a/libs/ardour/ardour/redirect.h +++ b/libs/ardour/ardour/redirect.h @@ -47,14 +47,6 @@ namespace ARDOUR { class Session; -struct RedirectState : public StateManager::State { - RedirectState (string why) - : StateManager::State (why) {} - ~RedirectState () {} - - bool active; -}; - class Redirect : public IO { public: @@ -99,9 +91,6 @@ class Redirect : public IO XMLNode& get_state (void); int set_state (const XMLNode&); - StateManager::State* state_factory (string why) const; - Change restore_state (StateManager::State&); - void *get_gui () const { return _gui; } void set_gui (void *p) { _gui = p; } @@ -110,9 +99,6 @@ class Redirect : public IO return 1.0f; } - int load_automation (string path); - int save_automation (string path); - void what_has_automation (set<uint32_t>&) const; void what_has_visible_automation (set<uint32_t>&) const; const set<uint32_t>& what_can_be_automated () const { return can_automate_list; } @@ -137,15 +123,19 @@ class Redirect : public IO void can_automate (uint32_t); set<uint32_t> can_automate_list; - void store_state (RedirectState&) const; - virtual void automation_list_creation_callback (uint32_t, AutomationList&) {} + int set_automation_state (const XMLNode&); + XMLNode& get_automation_state (); + private: bool _active; Placement _placement; uint32_t _sort_key; void* _gui; /* generic, we don't know or care what this is */ + + int old_set_automation_state (const XMLNode&); + int load_automation (std::string path); }; } // namespace ARDOUR diff --git a/libs/ardour/ardour/region.h b/libs/ardour/ardour/region.h index 627e556cad..88bb294e5d 100644 --- a/libs/ardour/ardour/region.h +++ b/libs/ardour/ardour/region.h @@ -144,6 +144,7 @@ class Region : public PBD::StatefulDestructible, public boost::enable_shared_fro void special_set_position (nframes_t); void nudge_position (long, void *src); + bool at_natural_position () const; void move_to_natural_position (void *src); void trim_start (nframes_t new_position, void *src); @@ -171,7 +172,7 @@ class Region : public PBD::StatefulDestructible, public boost::enable_shared_fro void set_playlist (ARDOUR::Playlist*); void source_deleted (boost::shared_ptr<Source>); - + boost::shared_ptr<Source> source (uint32_t n=0) const { return _sources[ (n < _sources.size()) ? n : 0 ]; } uint32_t n_channels() const { return _sources.size(); } @@ -185,7 +186,7 @@ class Region : public PBD::StatefulDestructible, public boost::enable_shared_fro virtual int set_state (const XMLNode&); virtual int set_live_state (const XMLNode&, Change&, bool send); - boost::shared_ptr<Region> get_parent(); + virtual boost::shared_ptr<Region> get_parent() const; uint64_t last_layer_op() const { return _last_layer_op; } void set_last_layer_op (uint64_t when); @@ -214,10 +215,10 @@ class Region : public PBD::StatefulDestructible, public boost::enable_shared_fro void maybe_uncopy (); void first_edit (); - bool verify_start (jack_nframes_t); - bool verify_start_and_length (jack_nframes_t, jack_nframes_t); - bool verify_start_mutable (jack_nframes_t&_start); - bool verify_length (jack_nframes_t); + virtual bool verify_start (jack_nframes_t); + virtual bool verify_start_and_length (jack_nframes_t, jack_nframes_t); + virtual bool verify_start_mutable (jack_nframes_t&_start); + virtual bool verify_length (jack_nframes_t); virtual void recompute_at_start () = 0; virtual void recompute_at_end () = 0; diff --git a/libs/ardour/ardour/route.h b/libs/ardour/ardour/route.h index 5c71bb16d3..6bc37ee51e 100644 --- a/libs/ardour/ardour/route.h +++ b/libs/ardour/ardour/route.h @@ -72,8 +72,7 @@ class Route : public IO Route (Session&, std::string name, int input_min, int input_max, int output_min, int output_max, Flag flags = Flag(0), DataType default_type = DataType::AUDIO); - - Route (Session&, const XMLNode&); + Route (Session&, const XMLNode&, DataType default_type = DataType::AUDIO); virtual ~Route(); std::string comment() { return _comment; } @@ -205,11 +204,6 @@ class Route : public IO sigc::signal<void,void*> SelectedChanged; - /* undo */ - - UndoAction get_memento() const; - void set_state (state_id_t); - int set_control_outs (const vector<std::string>& ports); IO* control_outs() { return _control_outs; } @@ -238,6 +232,7 @@ class Route : public IO return _mute_control; } + void automation_snapshot (nframes_t now); void protect_automation (); void set_remote_control_id (uint32_t id); @@ -317,13 +312,14 @@ class Route : public IO sigc::connection input_signal_connection; - state_id_t _current_state_id; ChanCount redirect_max_outs; uint32_t _remote_control_id; uint32_t pans_required() const; ChanCount n_process_buffers (); + virtual int _set_state (const XMLNode&, bool call_base); + private: void init (); diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h index f06c4117a6..039bf92362 100644 --- a/libs/ardour/ardour/session.h +++ b/libs/ardour/ardour/session.h @@ -359,7 +359,10 @@ class Session : public PBD::StatefulDestructible void request_bounded_roll (nframes_t start, nframes_t end); void request_stop (bool abort = false); void request_locate (nframes_t frame, bool with_roll = false); + void request_play_loop (bool yn); + bool get_play_loop () const { return play_loop; } + nframes_t last_transport_start() const { return _last_roll_location; } void goto_end () { request_locate (end_location->start(), false);} void goto_start () { request_locate (start_location->start(), false); } @@ -562,7 +565,8 @@ class Session : public PBD::StatefulDestructible string new_region_name (string); string path_from_region_name (string name, string identifier); - boost::shared_ptr<Region> find_whole_file_parent (Region&); + boost::shared_ptr<Region> find_whole_file_parent (boost::shared_ptr<Region const>); + void find_equivalent_playlist_regions (boost::shared_ptr<Region>, std::vector<boost::shared_ptr<Region> >& result); boost::shared_ptr<Region> XMLRegionFactory (const XMLNode&, bool full); @@ -646,6 +650,7 @@ class Session : public PBD::StatefulDestructible uint32_t n_playlists() const; template<class T> void foreach_playlist (T *obj, void (T::*func)(Playlist *)); + void get_playlists (std::vector<Playlist*>&); /* named selections */ @@ -757,16 +762,19 @@ class Session : public PBD::StatefulDestructible /* History (for editors, mixers, UIs etc.) */ void undo (uint32_t n) { - history.undo (n); + _history.undo (n); } + void redo (uint32_t n) { - history.redo (n); + _history.redo (n); } - uint32_t undo_depth() const { return history.undo_depth(); } - uint32_t redo_depth() const { return history.redo_depth(); } - string next_undo() const { return history.next_undo(); } - string next_redo() const { return history.next_redo(); } + UndoHistory& history() { return _history; } + + uint32_t undo_depth() const { return _history.undo_depth(); } + uint32_t redo_depth() const { return _history.redo_depth(); } + string next_undo() const { return _history.next_undo(); } + string next_redo() const { return _history.next_redo(); } void begin_reversible_command (string cmd_name); void commit_reversible_command (Command* cmd = 0); @@ -775,11 +783,11 @@ class Session : public PBD::StatefulDestructible current_trans->add_command (cmd); } - std::map<PBD::ID, PBD::StatefulDestructible*> registry; + std::map<PBD::ID, PBD::StatefulThingWithGoingAway*> registry; // these commands are implemented in libs/ardour/session_command.cc Command *memento_command_factory(XMLNode *n); - void register_with_memento_command_factory(PBD::ID, PBD::StatefulDestructible *); + void register_with_memento_command_factory(PBD::ID, PBD::StatefulThingWithGoingAway *); class GlobalSoloStateCommand : public Command { @@ -944,6 +952,8 @@ class Session : public PBD::StatefulDestructible private: int create (bool& new_session, string* mix_template, nframes_t initial_length); + nframes_t compute_initial_length (); + static const char* _template_suffix; static const char* _statefile_suffix; static const char* _pending_suffix; @@ -1566,7 +1576,7 @@ class Session : public PBD::StatefulDestructible void reverse_diskstream_buffers (); - UndoHistory history; + UndoHistory _history; UndoTransaction* current_trans; GlobalRouteBooleanState get_global_route_boolean (bool (Route::*method)(void) const); @@ -1658,7 +1668,7 @@ class Session : public PBD::StatefulDestructible void* ptr, float opt); - /* number of hardware audio ports we're using, + /* number of hardware ports we're using, based on max (requested,available) */ diff --git a/libs/ardour/ardour/sndfilesource.h b/libs/ardour/ardour/sndfilesource.h index 50fd5e6839..1d07f6888d 100644 --- a/libs/ardour/ardour/sndfilesource.h +++ b/libs/ardour/ardour/sndfilesource.h @@ -36,10 +36,7 @@ class SndFileSource : public AudioFileSource { /* constructor to be called for new in-session files */ SndFileSource (Session&, std::string path, SampleFormat samp_format, HeaderFormat hdr_format, nframes_t rate, - Flag flags = AudioFileSource::Flag (AudioFileSource::Writable| - AudioFileSource::Removable| - AudioFileSource::RemovableIfEmpty| - AudioFileSource::CanRename)); + Flag flags = SndFileSource::default_writable_flags); /* constructor to be called for existing in-session files */ @@ -53,6 +50,18 @@ class SndFileSource : public AudioFileSource { nframes_t natural_position () const; + nframes_t last_capture_start_frame() const; + void mark_capture_start (nframes_t); + void mark_capture_end (); + void clear_capture_marks(); + + bool set_destructive (bool yn); + + static void setup_standard_crossfades (nframes_t sample_rate); + static const AudioFileSource::Flag default_writable_flags; + + static int get_soundfile_info (string path, SoundFileInfo& _info, string& error_msg); + protected: void set_header_timeline_position (); @@ -69,10 +78,32 @@ class SndFileSource : public AudioFileSource { mutable float *interleave_buf; mutable nframes_t interleave_bufsize; - void init (const string &str); + void init (string str); int open(); void close(); int setup_broadcast_info (nframes_t when, struct tm&, time_t); + + /* destructive */ + + static nframes_t xfade_frames; + static gain_t* out_coefficient; + static gain_t* in_coefficient; + + bool _capture_start; + bool _capture_end; + nframes_t capture_start_frame; + nframes_t file_pos; // unit is frames + nframes_t xfade_out_count; + nframes_t xfade_in_count; + Sample* xfade_buf; + + nframes_t crossfade (Sample* data, nframes_t cnt, int dir); + void set_timeline_position (int64_t); + nframes_t destructive_write_unlocked (Sample *dst, nframes_t cnt); + nframes_t nondestructive_write_unlocked (Sample *dst, nframes_t cnt); + void handle_header_position_change (); + + static int64_t get_timecode_info (SNDFILE* sf, SF_BROADCAST_INFO* binfo, bool& exists); }; } // namespace ARDOUR diff --git a/libs/ardour/ardour/source.h b/libs/ardour/ardour/source.h index 8bf66f8b8d..e94b1af54f 100644 --- a/libs/ardour/ardour/source.h +++ b/libs/ardour/ardour/source.h @@ -22,6 +22,7 @@ #define __ardour_source_h__ #include <string> +#include <set> #include <sigc++/signal.h> @@ -33,6 +34,7 @@ namespace ARDOUR { class Session; +class Playlist; class Source : public PBD::StatefulDestructible { @@ -57,22 +59,34 @@ class Source : public PBD::StatefulDestructible virtual void mark_for_remove() = 0; virtual void mark_streaming_write_completed () = 0; - + XMLNode& get_state (); int set_state (const XMLNode&); + void use () { _in_use++; } + void disuse () { if (_in_use) { _in_use--; } } + + void add_playlist (ARDOUR::Playlist*); + void remove_playlist (ARDOUR::Playlist*); + + uint32_t used() const; + + static sigc::signal<void,Source*> SourceCreated; protected: void update_length (jack_nframes_t pos, jack_nframes_t cnt); - + Session& _session; string _name; DataType _type; time_t _timestamp; jack_nframes_t _length; + std::set<ARDOUR::Playlist*> _playlists; + private: + uint32_t _in_use; }; } diff --git a/libs/ardour/ardour/state_manager.h b/libs/ardour/ardour/state_manager.h deleted file mode 100644 index e123b2cb37..0000000000 --- a/libs/ardour/ardour/state_manager.h +++ /dev/null @@ -1,56 +0,0 @@ -#ifndef __ardour_state_manager_h__ -#define __ardour_state_manager_h__ - -#include <list> -#include <string> -#include <set> - -#include <sigc++/signal.h> - -#include <ardour/ardour.h> - -namespace ARDOUR { - -typedef uint32_t state_id_t; - -class StateManager : public virtual sigc::trackable -{ - public: - struct State { - std::string operation; - State (std::string why) : operation (why) {} - virtual ~State() {} - }; - - typedef std::list<State*> StateMap; - - StateManager (); - virtual ~StateManager (); - - virtual void drop_all_states (); - virtual void use_state (state_id_t); - virtual void save_state (std::string why); - - sigc::signal<void,Change> StateChanged; - - state_id_t _current_state_id; - - virtual bool should_save_state () const { return true; } - - static void prohibit_save (); - static void allow_save (const char* why, bool dosave); - - protected: - static bool _allow_save; - static sigc::signal<void,const char*> SaveAllowed; - - StateMap states; - - virtual Change restore_state (State&) = 0; - virtual State* state_factory (std::string why) const = 0; - virtual void send_state_changed (Change); -}; - -} // namespace ARDOUR - -#endif /* __ardour_state_manager_h__ */ diff --git a/libs/ardour/ardour/tempo.h b/libs/ardour/ardour/tempo.h index 7cdbe56cf2..f8751b5d2b 100644 --- a/libs/ardour/ardour/tempo.h +++ b/libs/ardour/ardour/tempo.h @@ -34,7 +34,6 @@ #include <sigc++/signal.h> #include <ardour/ardour.h> -#include <ardour/state_manager.h> class XMLNode; @@ -162,17 +161,7 @@ class TempoSection : public MetricSection, public Tempo { typedef list<MetricSection*> Metrics; -class TempoMapState : public StateManager::State { - public: - TempoMapState (std::string why) - : StateManager::State (why) { - metrics = new Metrics; - } - - Metrics *metrics; -}; - -class TempoMap : public StateManager, public PBD::StatefulDestructible +class TempoMap : public PBD::StatefulDestructible { public: @@ -246,8 +235,6 @@ class TempoMap : public StateManager, public PBD::StatefulDestructible void dump (std::ostream&) const; void clear (); - UndoAction get_memento() const; - /* this is a helper class that we use to be able to keep track of which meter *AND* tempo are in effect at a given point in time. @@ -279,6 +266,8 @@ class TempoMap : public StateManager, public PBD::StatefulDestructible Metric metric_at (nframes_t) const; void bbt_time_with_metric (nframes_t, BBT_Time&, const Metric&) const; + sigc::signal<void,ARDOUR::Change> StateChanged; + private: static Tempo _default_tempo; static Meter _default_meter; @@ -309,16 +298,6 @@ class TempoMap : public StateManager, public PBD::StatefulDestructible int move_metric_section (MetricSection&, const BBT_Time& to); void do_insert (MetricSection* section); - - Change restore_state (StateManager::State&); - StateManager::State* state_factory (std::string why) const; - - bool in_set_state; - - /* override state_manager::save_state so we can check in_set_state */ - - void save_state (std::string why); - }; }; /* namespace ARDOUR */ diff --git a/libs/ardour/ardour/track.h b/libs/ardour/ardour/track.h index 243d0db46d..d7a2da2f46 100644 --- a/libs/ardour/ardour/track.h +++ b/libs/ardour/ardour/track.h @@ -39,6 +39,11 @@ class Track : public Route int set_name (string str, void *src); + TrackMode mode () const { return _mode; } + virtual int set_mode (TrackMode m) { return false; } + virtual bool can_use_mode (TrackMode m, bool& bounce_required) { return false; } + sigc::signal<void> TrackModeChanged; + virtual int roll (nframes_t nframes, nframes_t start_frame, nframes_t end_frame, nframes_t offset, int declick, bool can_record, bool rec_monitors_input) = 0; @@ -57,9 +62,6 @@ class Track : public Route virtual int use_diskstream (string name) = 0; virtual int use_diskstream (const PBD::ID& id) = 0; - TrackMode mode() const { return _mode; } - void set_mode (TrackMode m); - nframes_t update_total_latency(); void set_latency_delay (nframes_t); @@ -88,7 +90,6 @@ class Track : public Route void set_meter_point (MeterPoint, void* src); - sigc::signal<void> ModeChanged; sigc::signal<void> DiskstreamChanged; sigc::signal<void> FreezeChange; diff --git a/libs/ardour/ardour/types.h b/libs/ardour/ardour/types.h index 61e5f35c95..1138b5208f 100644 --- a/libs/ardour/ardour/types.h +++ b/libs/ardour/ardour/types.h @@ -89,11 +89,17 @@ namespace ARDOUR { Play = 0x4 }; + std::string auto_state_to_string (AutoState); + AutoState string_to_auto_state (std::string); + enum AutoStyle { Absolute = 0x1, Trim = 0x2 }; + std::string auto_style_to_string (AutoStyle); + AutoStyle string_to_auto_style (std::string); + enum AlignStyle { CaptureTime, ExistingMaterial diff --git a/libs/ardour/ardour/vst_plugin.h b/libs/ardour/ardour/vst_plugin.h index 7b8246868c..8034341bcc 100644 --- a/libs/ardour/ardour/vst_plugin.h +++ b/libs/ardour/ardour/vst_plugin.h @@ -31,7 +31,6 @@ #include <sigc++/signal.h> #include <pbd/stateful.h> #include <jack/types.h> -#include <ardour/plugin_state.h> #include <ardour/plugin.h> using std::string; diff --git a/libs/ardour/audio_diskstream.cc b/libs/ardour/audio_diskstream.cc index f08d38a9b9..9c5f5233b7 100644 --- a/libs/ardour/audio_diskstream.cc +++ b/libs/ardour/audio_diskstream.cc @@ -383,7 +383,7 @@ AudioDiskstream::setup_destructive_playlist () void AudioDiskstream::use_destructive_playlist () { - /* this is called from the XML-based constructor. when its done, + /* this is called from the XML-based constructor or ::set_destructive. when called, we already have a playlist and a region, but we need to set up our sources for write. we use the sources associated with the (presumed single, full-extent) region. @@ -402,6 +402,10 @@ AudioDiskstream::use_destructive_playlist () throw failed_constructor(); } + /* be sure to stretch the region out to the maximum length */ + + region->set_length (max_frames - region->position(), this); + uint32_t n; ChannelList::iterator chan; @@ -409,6 +413,10 @@ AudioDiskstream::use_destructive_playlist () (*chan).write_source = boost::dynamic_pointer_cast<AudioFileSource>(region->source (n)); assert((*chan).write_source); (*chan).write_source->set_allow_remove_if_empty (false); + + /* this might be false if we switched modes, so force it */ + + (*chan).write_source->set_destructive (true); } /* the source list will never be reset for a destructive track */ @@ -1544,6 +1552,9 @@ AudioDiskstream::transport_stopped (struct tm& when, time_t twhen, bool abort_ca } else { + string whole_file_region_name; + whole_file_region_name = region_name_from_path (channels[0].write_source->name()); + /* Register a new region with the Session that describes the entire source. Do this first so that any sub-regions will obviously be @@ -1552,7 +1563,7 @@ AudioDiskstream::transport_stopped (struct tm& when, time_t twhen, bool abort_ca try { boost::shared_ptr<Region> rx (RegionFactory::create (srcs, channels[0].write_source->last_capture_start_frame(), total_capture, - region_name_from_path (channels[0].write_source->name()), + whole_file_region_name, 0, AudioRegion::Flag (AudioRegion::DefaultFlags|AudioRegion::Automatic|AudioRegion::WholeFile))); region = boost::dynamic_pointer_cast<AudioRegion> (rx); @@ -1575,7 +1586,8 @@ AudioDiskstream::transport_stopped (struct tm& when, time_t twhen, bool abort_ca for (buffer_position = channels[0].write_source->last_capture_start_frame(), ci = capture_info.begin(); ci != capture_info.end(); ++ci) { string region_name; - _session.region_name (region_name, channels[0].write_source->name(), false); + + _session.region_name (region_name, whole_file_region_name, false); // cerr << _name << ": based on ci of " << (*ci)->start << " for " << (*ci)->frames << " add region " << region_name << endl; @@ -1589,9 +1601,9 @@ AudioDiskstream::transport_stopped (struct tm& when, time_t twhen, bool abort_ca continue; /* XXX is this OK? */ } - _last_capture_regions.push_back (region); + region->GoingAway.connect (bind (mem_fun (*this, &Diskstream::remove_region_from_last_capture), boost::weak_ptr<Region>(region))); - // cerr << "add new region, buffer position = " << buffer_position << " @ " << (*ci)->start << endl; + _last_capture_regions.push_back (region); i_am_the_modifier++; _playlist->add_region (region, (*ci)->start); @@ -2234,3 +2246,70 @@ AudioDiskstream::use_pending_capture_data (XMLNode& node) return 0; } + +int +AudioDiskstream::set_destructive (bool yn) +{ + bool bounce_ignored; + + if (yn != destructive()) { + + if (yn) { + /* requestor should already have checked this and + bounced if necessary and desired + */ + if (!can_become_destructive (bounce_ignored)) { + return -1; + } + _flags |= Destructive; + use_destructive_playlist (); + } else { + _flags &= ~Destructive; + reset_write_sources (true, true); + } + } + + return 0; +} + +bool +AudioDiskstream::can_become_destructive (bool& requires_bounce) const +{ + if (!_playlist) { + requires_bounce = false; + return false; + } + + /* is there only one region ? */ + + if (_playlist->n_regions() != 1) { + requires_bounce = true; + return false; + } + + boost::shared_ptr<Region> first = _playlist->find_next_region (_session.current_start_frame(), Start, 1); + assert (first); + + /* do the source(s) for the region cover the session start position ? */ + + if (first->position() != _session.current_start_frame()) { + if (first->start() > _session.current_start_frame()) { + requires_bounce = true; + return false; + } + } + + /* is the source used by only 1 playlist ? */ + + boost::shared_ptr<AudioRegion> afirst = boost::dynamic_pointer_cast<AudioRegion> (first); + + assert (afirst); + + if (afirst->source()->used() > 1) { + requires_bounce = true; + return false; + } + + requires_bounce = false; + return true; +} diff --git a/libs/ardour/audio_playlist.cc b/libs/ardour/audio_playlist.cc index 94b80df178..335cb020ae 100644 --- a/libs/ardour/audio_playlist.cc +++ b/libs/ardour/audio_playlist.cc @@ -546,7 +546,7 @@ AudioPlaylist::set_state (const XMLNode& node) } thaw (); - in_set_state++; + in_set_state--; return 0; } @@ -639,12 +639,10 @@ AudioPlaylist::destroy_region (boost::shared_ptr<Region> region) { RegionLock rlock (this); - RegionList::iterator i; - RegionList::iterator tmp; - for (i = regions.begin(); i != regions.end(); ) { + for (RegionList::iterator i = regions.begin(); i != regions.end(); ) { - tmp = i; + RegionList::iterator tmp = i; ++tmp; if ((*i) == region) { @@ -654,6 +652,21 @@ AudioPlaylist::destroy_region (boost::shared_ptr<Region> region) i = tmp; } + + for (set<boost::shared_ptr<Region> >::iterator x = all_regions.begin(); x != all_regions.end(); ) { + + set<boost::shared_ptr<Region> >::iterator xtmp = x; + ++xtmp; + + if ((*x) == region) { + all_regions.erase (x); + changed = true; + } + + x = xtmp; + } + + region->set_playlist (0); } for (c = _crossfades.begin(); c != _crossfades.end(); ) { diff --git a/libs/ardour/audio_track.cc b/libs/ardour/audio_track.cc index a6cbce2c1e..f2681aceba 100644 --- a/libs/ardour/audio_track.cc +++ b/libs/ardour/audio_track.cc @@ -65,7 +65,7 @@ AudioTrack::AudioTrack (Session& sess, string name, Route::Flag flag, TrackMode AudioTrack::AudioTrack (Session& sess, const XMLNode& node) : Track (sess, node) { - set_state (node); + _set_state (node, false); } AudioTrack::~AudioTrack () @@ -73,6 +73,37 @@ AudioTrack::~AudioTrack () } int +AudioTrack::set_mode (TrackMode m) +{ + if (m != _mode) { + + if (_diskstream->set_destructive (m == Destructive)) { + return -1; + } + + _mode = m; + + TrackModeChanged (); /* EMIT SIGNAL */ + } + + return 0; +} + +bool +AudioTrack::can_use_mode (TrackMode m, bool& bounce_required) +{ + switch (m) { + case Normal: + bounce_required = false; + return true; + + case Destructive: + default: + return _diskstream->can_become_destructive (bounce_required); + } +} + +int AudioTrack::deprecated_use_diskstream_connections () { boost::shared_ptr<AudioDiskstream> diskstream = audio_diskstream(); @@ -88,10 +119,10 @@ AudioTrack::deprecated_use_diskstream_connections () diskstream->deprecated_io_node = 0; - set_input_minimum (-1); - set_input_maximum (-1); - set_output_minimum (-1); - set_output_maximum (-1); + set_input_minimum (ChanCount::ZERO); + set_input_maximum (ChanCount::INFINITE); + set_output_minimum (ChanCount::ZERO); + set_output_maximum (ChanCount::INFINITE); if ((prop = node.property ("gain")) != 0) { set_gain (atof (prop->value().c_str()), this); @@ -188,11 +219,19 @@ AudioTrack::audio_diskstream() const int AudioTrack::set_state (const XMLNode& node) { + return _set_state (node, true); +} + +int +AudioTrack::_set_state (const XMLNode& node, bool call_base) +{ const XMLProperty *prop; XMLNodeConstIterator iter; - if (Route::set_state (node)) { - return -1; + if (call_base) { + if (Route::_set_state (node, call_base)) { + return -1; + } } if ((prop = node.property (X_("mode"))) != 0) { @@ -494,6 +533,16 @@ AudioTrack::roll (nframes_t nframes, nframes_t start_frame, nframes_t end_frame, nframes_t transport_frame; boost::shared_ptr<AudioDiskstream> diskstream = audio_diskstream(); + { + Glib::RWLock::ReaderLock lm (redirect_lock, Glib::TRY_LOCK); + if (lm.locked()) { + // automation snapshot can also be called from the non-rt context + // and it uses the redirect list, so we take the lock out here + automation_snapshot (start_frame); + } + } + + if (n_outputs().get_total() == 0 && _redirects.empty()) { return 0; } @@ -761,7 +810,7 @@ AudioTrack::freeze (InterThreadInfo& itt) return; } - if (_session.write_one_audio_track (*this, 0, _session.current_end_frame(), true, srcs, itt)) { + if (_session.write_one_audio_track (*this, _session.current_start_frame(), _session.current_end_frame(), true, srcs, itt)) { return; } @@ -780,8 +829,7 @@ AudioTrack::freeze (InterThreadInfo& itt) FreezeRecordInsertInfo* frii = new FreezeRecordInsertInfo ((*r)->get_state(), insert); frii->id = insert->id(); - frii->memento = (*r)->get_memento(); - + _freeze_record.insert_info.push_back (frii); /* now deactivate the insert */ @@ -802,7 +850,7 @@ AudioTrack::freeze (InterThreadInfo& itt) false)); new_playlist->set_orig_diskstream_id (diskstream->id()); - new_playlist->add_region (region, 0); + new_playlist->add_region (region, _session.current_start_frame()); new_playlist->set_frozen (true); region->set_locked (true); diff --git a/libs/ardour/audioengine.cc b/libs/ardour/audioengine.cc index 70541fce55..b0cd64c8d1 100644 --- a/libs/ardour/audioengine.cc +++ b/libs/ardour/audioengine.cc @@ -21,6 +21,7 @@ #include <unistd.h> #include <cerrno> #include <vector> +#include <exception> #include <glibmm/timer.h> #include <pbd/pthread_utils.h> diff --git a/libs/ardour/audiofilesource.cc b/libs/ardour/audiofilesource.cc index 3078521466..16cb990ec2 100644 --- a/libs/ardour/audiofilesource.cc +++ b/libs/ardour/audiofilesource.cc @@ -36,7 +36,6 @@ #include <ardour/audiofilesource.h> #include <ardour/sndfile_helpers.h> #include <ardour/sndfilesource.h> -#include <ardour/destructive_filesource.h> #include <ardour/session.h> #include <ardour/source_factory.h> @@ -66,6 +65,7 @@ AudioFileSource::AudioFileSource (Session& s, string idstr, Flag flags) : AudioSource (s, idstr), _flags (flags) { /* constructor used for existing external to session files. file must exist already */ + _is_embedded = AudioFileSource::determine_embeddedness (idstr); if (init (idstr, true)) { throw failed_constructor (); @@ -77,6 +77,7 @@ AudioFileSource::AudioFileSource (Session& s, std::string path, Flag flags, Samp : AudioSource (s, path), _flags (flags) { /* constructor used for new internal-to-session files. file cannot exist */ + _is_embedded = false; if (init (path, false)) { throw failed_constructor (); @@ -106,6 +107,12 @@ AudioFileSource::~AudioFileSource () } bool +AudioFileSource::determine_embeddedness (std::string path) +{ + return (path.find("/") == 0); +} + +bool AudioFileSource::removable () const { return (_flags & Removable) && ((_flags & RemoveAtDestroy) || ((_flags & RemovableIfEmpty) && length() == 0)); @@ -170,80 +177,16 @@ bool AudioFileSource::get_soundfile_info (string path, SoundFileInfo& _info, string& error_msg) { #ifdef HAVE_COREAUDIO - OSStatus err = noErr; - FSRef ref; - ExtAudioFileRef af = 0; - size_t size; - CFStringRef name; - - err = FSPathMakeRef ((UInt8*)path.c_str(), &ref, 0); - if (err != noErr) { - ExtAudioFileDispose (af); - goto libsndfile; - } - - err = ExtAudioFileOpen(&ref, &af); - if (err != noErr) { - ExtAudioFileDispose (af); - goto libsndfile; + if (CoreAudioSource::get_soundfile_info (path, _info, error_msg) == 0) { + return true; } - - AudioStreamBasicDescription absd; - memset(&absd, 0, sizeof(absd)); - size = sizeof(AudioStreamBasicDescription); - err = ExtAudioFileGetProperty(af, - kExtAudioFileProperty_FileDataFormat, &size, &absd); - if (err != noErr) { - ExtAudioFileDispose (af); - goto libsndfile; - } - - _info.samplerate = absd.mSampleRate; - _info.channels = absd.mChannelsPerFrame; - - size = sizeof(_info.length); - err = ExtAudioFileGetProperty(af, kExtAudioFileProperty_FileLengthFrames, &size, &_info.length); - if (err != noErr) { - ExtAudioFileDispose (af); - goto libsndfile; - } - - size = sizeof(CFStringRef); - err = AudioFormatGetProperty( - kAudioFormatProperty_FormatName, sizeof(absd), &absd, &size, &name); - if (err != noErr) { - ExtAudioFileDispose (af); - goto libsndfile; - } - - _info.format_name = CFStringRefToStdString(name); - - ExtAudioFileDispose (af); - return true; - -libsndfile: #endif // HAVE_COREAUDIO - SNDFILE *sf; - SF_INFO sf_info; - - sf_info.format = 0; // libsndfile says to clear this before sf_open(). - - if ((sf = sf_open ((char*) path.c_str(), SFM_READ, &sf_info)) == 0) { - char errbuf[256]; - error_msg = sf_error_str (0, errbuf, sizeof (errbuf) - 1); - return false; + if (SndFileSource::get_soundfile_info (path, _info, error_msg) != 0) { + return true; } - sf_close (sf); - - _info.samplerate = sf_info.samplerate; - _info.channels = sf_info.channels; - _info.length = sf_info.frames; - _info.format_name = string_compose("Format: %1, %2", - sndfile_major_format(sf_info.format), - sndfile_minor_format(sf_info.format)); - return true; + return false; } XMLNode& @@ -277,6 +220,17 @@ AudioFileSource::set_state (const XMLNode& node) } + if ((prop = node.property (X_("name"))) != 0) { + _is_embedded = AudioFileSource::determine_embeddedness (prop->value()); + } else { + _is_embedded = false; + } + + if ((prop = node.property (X_("destructive"))) != 0) { + /* old style, from the period when we had DestructiveFileSource */ + _flags = Flag (_flags | Destructive); + } + return 0; } @@ -318,6 +272,11 @@ AudioFileSource::mark_take (string id) int AudioFileSource::move_to_trash (const string trash_dir_name) { + if (is_embedded()) { + cerr << "tried to move an embedded region to trash" << endl; + return -1; + } + string newpath; if (!writable()) { @@ -465,7 +424,11 @@ AudioFileSource::find (string pathstr, bool must_exist, bool& isnew) /* external files and/or very very old style sessions include full paths */ _path = pathstr; - _name = pathstr.substr (pathstr.find_last_of ('/') + 1); + if (is_embedded()) { + _name = pathstr; + } else { + _name = pathstr.substr (pathstr.find_last_of ('/') + 1); + } if (access (_path.c_str(), R_OK) != 0) { @@ -521,7 +484,7 @@ AudioFileSource::handle_header_position_change () } void -AudioFileSource::set_timeline_position (nframes_t pos) +AudioFileSource::set_timeline_position (int64_t pos) { timeline_position = pos; } diff --git a/libs/ardour/audioregion.cc b/libs/ardour/audioregion.cc index 0f4e3807b1..939f9c02dd 100644 --- a/libs/ardour/audioregion.cc +++ b/libs/ardour/audioregion.cc @@ -75,7 +75,7 @@ AudioRegion::AudioRegion (boost::shared_ptr<AudioSource> src, nframes_t start, n set_default_fades (); set_default_envelope (); - _envelope.StateChanged.connect (mem_fun (*this, &AudioRegion::envelope_changed)); + listen_to_my_curves (); } /* Basic AudioRegion constructor (one channel) */ @@ -95,7 +95,7 @@ AudioRegion::AudioRegion (boost::shared_ptr<AudioSource> src, nframes_t start, n set_default_fades (); set_default_envelope (); - _envelope.StateChanged.connect (mem_fun (*this, &AudioRegion::envelope_changed)); + listen_to_my_curves (); } /* Basic AudioRegion constructor (many channels) */ @@ -110,7 +110,7 @@ AudioRegion::AudioRegion (SourceList& srcs, nframes_t start, nframes_t length, c set_default_fades (); set_default_envelope (); - _envelope.StateChanged.connect (mem_fun (*this, &AudioRegion::envelope_changed)); + listen_to_my_curves (); } @@ -148,7 +148,7 @@ AudioRegion::AudioRegion (boost::shared_ptr<const AudioRegion> other, nframes_t _scale_amplitude = other->_scale_amplitude; - _envelope.StateChanged.connect (mem_fun (*this, &AudioRegion::envelope_changed)); + listen_to_my_curves (); assert(_type == DataType::AUDIO); } @@ -165,7 +165,7 @@ AudioRegion::AudioRegion (boost::shared_ptr<const AudioRegion> other) _fade_in_disabled = 0; _fade_out_disabled = 0; - _envelope.StateChanged.connect (mem_fun (*this, &AudioRegion::envelope_changed)); + listen_to_my_curves (); assert(_type == DataType::AUDIO); } @@ -187,7 +187,7 @@ AudioRegion::AudioRegion (boost::shared_ptr<AudioSource> src, const XMLNode& nod throw failed_constructor(); } - _envelope.StateChanged.connect (mem_fun (*this, &AudioRegion::envelope_changed)); + listen_to_my_curves (); assert(_type == DataType::AUDIO); } @@ -205,16 +205,69 @@ AudioRegion::AudioRegion (SourceList& srcs, const XMLNode& node) throw failed_constructor(); } - _envelope.StateChanged.connect (mem_fun (*this, &AudioRegion::envelope_changed)); + listen_to_my_curves (); assert(_type == DataType::AUDIO); } AudioRegion::~AudioRegion () { - cerr << "====== " << _name << " DESTRUCTOR @ " << this << endl; - notify_callbacks (); - GoingAway (); /* EMIT SIGNAL */ +} + +void +AudioRegion::listen_to_my_curves () +{ + _envelope.StateChanged.connect (mem_fun (*this, &AudioRegion::envelope_changed)); + _fade_in.StateChanged.connect (mem_fun (*this, &AudioRegion::fade_in_changed)); + _fade_out.StateChanged.connect (mem_fun (*this, &AudioRegion::fade_out_changed)); +} + +bool +AudioRegion::verify_length (nframes_t len) +{ + boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(source()); + + if (afs && afs->destructive()) { + return true; + } else { + return Region::verify_length(len); + } +} + +bool +AudioRegion::verify_start_and_length (nframes_t new_start, nframes_t new_length) +{ + boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(source()); + + if (afs && afs->destructive()) { + return true; + } else { + return verify_start_and_length(new_start, new_length); + } +} + +bool +AudioRegion::verify_start (nframes_t pos) +{ + boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(source()); + + if (afs && afs->destructive()) { + return true; + } else { + return verify_start(pos); + } +} + +bool +AudioRegion::verify_start_mutable (nframes_t& new_start) +{ + boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(source()); + + if (afs && afs->destructive()) { + return true; + } else { + return verify_start_mutable(new_start); + } } void @@ -239,7 +292,7 @@ AudioRegion::read_peaks (PeakData *buf, nframes_t npeaks, nframes_t offset, nfra if (chan_n >= _sources.size()) { return 0; } - + if (audio_source(chan_n)->read_peaks (buf, npeaks, offset, cnt, samples_per_unit)) { return 0; } else { @@ -450,7 +503,7 @@ AudioRegion::state (bool full) if ((_flags & DefaultFadeIn)) { child->add_property (X_("default"), X_("yes")); } else { - _fade_in.store_state (*child); + child->add_child_nocopy (_fade_in.get_state ()); } child->add_property (X_("active"), _fade_in_disabled ? X_("no") : X_("yes")); @@ -460,9 +513,9 @@ AudioRegion::state (bool full) if ((_flags & DefaultFadeOut)) { child->add_property (X_("default"), X_("yes")); } else { - _fade_out.store_state (*child); + child->add_child_nocopy (_fade_out.get_state ()); } - + child->add_property (X_("active"), _fade_out_disabled ? X_("no") : X_("yes")); } @@ -473,6 +526,7 @@ AudioRegion::state (bool full) // If there are only two points, the points are in the start of the region and the end of the region // so, if they are both at 1.0f, that means the default region. + if (_envelope.size() == 2 && _envelope.front()->value == 1.0f && _envelope.back()->value==1.0f) { @@ -484,7 +538,7 @@ AudioRegion::state (bool full) if (default_env) { child->add_property ("default", "yes"); } else { - _envelope.store_state (*child); + child->add_child_nocopy (_envelope.get_state ()); } } else { @@ -545,34 +599,28 @@ AudioRegion::set_live_state (const XMLNode& node, Change& what_changed, bool sen _envelope.clear (); - if ((prop = child->property ("default")) != 0) { + if ((prop = child->property ("default")) != 0 || _envelope.set_state (*child)) { set_default_envelope (); - } else { - _envelope.load_state (*child); } _envelope.set_max_xval (_length); _envelope.truncate_end (_length); - + } else if (child->name() == "FadeIn") { _fade_in.clear (); - if ((prop = child->property ("default")) != 0 || (prop = child->property ("steepness")) != 0) { + if ((prop = child->property ("default")) != 0 || (prop = child->property ("steepness")) != 0 || _fade_in.set_state (*child)) { set_default_fade_in (); - } else { - _fade_in.load_state (*child); - } + } } else if (child->name() == "FadeOut") { _fade_out.clear (); - if ((prop = child->property ("default")) != 0 || (prop = child->property ("steepness")) != 0) { + if ((prop = child->property ("default")) != 0 || (prop = child->property ("steepness")) != 0 || _fade_out.set_state (*child)) { set_default_fade_out (); - } else { - _fade_out.load_state (*child); - } + } } } @@ -1030,7 +1078,19 @@ AudioRegion::normalize_to (float target_dB) } void -AudioRegion::envelope_changed (Change ignored) +AudioRegion::fade_in_changed () +{ + send_change (FadeInChanged); +} + +void +AudioRegion::fade_out_changed () +{ + send_change (FadeOutChanged); +} + +void +AudioRegion::envelope_changed () { send_change (EnvelopeChanged); } @@ -1083,8 +1143,10 @@ AudioRegion::speed_mismatch (float sr) const void AudioRegion::source_offset_changed () { - if (boost::dynamic_pointer_cast<DestructiveFileSource>(_sources.front())) { - set_start (source()->natural_position(), this); + boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(_sources.front()); + + if (afs && afs->destructive()) { + // set_start (source()->natural_position(), this); set_position (source()->natural_position(), this); } } diff --git a/libs/ardour/audiosource.cc b/libs/ardour/audiosource.cc index 419fe9240c..93165b7fe4 100644 --- a/libs/ardour/audiosource.cc +++ b/libs/ardour/audiosource.cc @@ -368,26 +368,29 @@ AudioSource::initialize_peakfile (bool newfile, string audio_path) error << string_compose(_("AudioSource: cannot stat peakfile \"%1\""), peakpath) << endmsg; return -1; } - } else { - /* we found it in the peaks dir */ - } - - if (statbuf.st_size == 0) { _peaks_built = false; + } else { - // Check if the audio file has changed since the peakfile was built. - struct stat stat_file; - int err = stat (audio_path.c_str(), &stat_file); - if (!err && stat_file.st_mtime > statbuf.st_mtime){ + /* we found it in the peaks dir, so check it out */ + + if (statbuf.st_size == 0) { _peaks_built = false; } else { - _peaks_built = true; + // Check if the audio file has changed since the peakfile was built. + struct stat stat_file; + int err = stat (audio_path.c_str(), &stat_file); + + if (!err && stat_file.st_mtime > statbuf.st_mtime){ + _peaks_built = false; + } else { + _peaks_built = true; + } } } } - + if (!newfile && !_peaks_built && _build_missing_peakfiles && _build_peakfiles) { build_peaks_from_scratch (); } diff --git a/libs/ardour/automation_event.cc b/libs/ardour/automation_event.cc index f286b11607..5cc2f50e38 100644 --- a/libs/ardour/automation_event.cc +++ b/libs/ardour/automation_event.cc @@ -22,9 +22,11 @@ #include <climits> #include <float.h> #include <cmath> +#include <sstream> #include <algorithm> #include <sigc++/bind.h> #include <ardour/automation_event.h> +#include <pbd/convert.h> #include "i18n.h" @@ -46,14 +48,13 @@ static void dumpit (const AutomationList& al, string prefix = "") } #endif -AutomationList::AutomationList (double defval, bool with_state) +AutomationList::AutomationList (double defval) { _frozen = false; changed_when_thawed = false; _state = Off; _style = Absolute; _touching = false; - no_state = with_state; min_yval = FLT_MIN; max_yval = FLT_MAX; max_xval = 0; // means "no limit" @@ -63,10 +64,6 @@ AutomationList::AutomationList (double defval, bool with_state) lookup_cache.left = -1; lookup_cache.range.first = events.end(); - if (!no_state) { - save_state (_("initial")); - } - AutomationListCreated(this); } @@ -83,7 +80,6 @@ AutomationList::AutomationList (const AutomationList& other) _touching = other._touching; _dirty = false; rt_insertion_point = events.end(); - no_state = other.no_state; lookup_cache.left = -1; lookup_cache.range.first = events.end(); @@ -111,7 +107,6 @@ AutomationList::AutomationList (const AutomationList& other, double start, doubl _touching = other._touching; _dirty = false; rt_insertion_point = events.end(); - no_state = other.no_state; lookup_cache.left = -1; lookup_cache.range.first = events.end(); @@ -128,32 +123,36 @@ AutomationList::AutomationList (const AutomationList& other, double start, doubl delete section; mark_dirty (); + AutomationListCreated(this); } -AutomationList::~AutomationList() +AutomationList::AutomationList (const XMLNode& node) { - std::set<ControlEvent*> all_events; - AutomationList::State* asp; + _frozen = false; + changed_when_thawed = false; + _touching = false; + min_yval = FLT_MIN; + max_yval = FLT_MAX; + max_xval = 0; // means "no limit" + _dirty = false; + _state = Off; + _style = Absolute; + rt_insertion_point = events.end(); + lookup_cache.left = -1; + lookup_cache.range.first = events.end(); + + set_state (node); - GoingAway (); + AutomationListCreated(this); +} +AutomationList::~AutomationList() +{ + GoingAway (); + for (AutomationEventList::iterator x = events.begin(); x != events.end(); ++x) { - all_events.insert (*x); - } - - for (StateMap::iterator i = states.begin(); i != states.end(); ++i) { - - if ((asp = dynamic_cast<AutomationList::State*> (*i)) != 0) { - - for (AutomationEventList::iterator x = asp->events.begin(); x != asp->events.end(); ++x) { - all_events.insert (*x); - } - } - } - - for (std::set<ControlEvent*>::iterator i = all_events.begin(); i != all_events.end(); ++i) { - delete (*i); + delete (*x); } } @@ -194,7 +193,7 @@ AutomationList::maybe_signal_changed () if (_frozen) { changed_when_thawed = true; } else { - StateChanged (Change (0)); + StateChanged (); } } @@ -236,9 +235,6 @@ AutomationList::clear () { Glib::Mutex::Lock lm (lock); events.clear (); - if (!no_state) { - save_state (_("cleared")); - } mark_dirty (); } @@ -270,7 +266,6 @@ void AutomationList::_x_scale (double factor) (*i)->when = floor ((*i)->when * factor); } - save_state ("x-scaled"); mark_dirty (); } @@ -370,12 +365,19 @@ AutomationList::rt_add (double when, double value) maybe_signal_changed (); } +void +AutomationList::fast_simple_add (double when, double value) +{ + /* to be used only for loading pre-sorted data from saved state */ + events.insert (events.end(), point_factory (when, value)); +} + #undef last_rt_insertion_point void -AutomationList::add (double when, double value, bool for_loading) +AutomationList::add (double when, double value) { - /* this is for graphical editing and loading data from storage */ + /* this is for graphical editing */ { Glib::Mutex::Lock lm (lock); @@ -407,15 +409,9 @@ AutomationList::add (double when, double value, bool for_loading) } mark_dirty (); - - if (!no_state && !for_loading) { - save_state (_("added event")); - } } - if (!for_loading) { - maybe_signal_changed (); - } + maybe_signal_changed (); } void @@ -425,9 +421,6 @@ AutomationList::erase (AutomationList::iterator i) Glib::Mutex::Lock lm (lock); events.erase (i); reposition_for_rt_add (0); - if (!no_state) { - save_state (_("removed event")); - } mark_dirty (); } maybe_signal_changed (); @@ -440,9 +433,6 @@ AutomationList::erase (AutomationList::iterator start, AutomationList::iterator Glib::Mutex::Lock lm (lock); events.erase (start, end); reposition_for_rt_add (0); - if (!no_state) { - save_state (_("removed multiple events")); - } mark_dirty (); } maybe_signal_changed (); @@ -471,10 +461,6 @@ AutomationList::reset_range (double start, double endt) reset = true; - if (!no_state) { - save_state (_("removed range")); - } - mark_dirty (); } } @@ -502,9 +488,6 @@ AutomationList::erase_range (double start, double endt) events.erase (s, e); reposition_for_rt_add (0); erased = true; - if (!no_state) { - save_state (_("removed range")); - } mark_dirty (); } @@ -532,10 +515,6 @@ AutomationList::move_range (iterator start, iterator end, double xdelta, double ++start; } - if (!no_state) { - save_state (_("event range adjusted")); - } - mark_dirty (); } @@ -554,10 +533,6 @@ AutomationList::modify (iterator iter, double when, double val) Glib::Mutex::Lock lm (lock); (*iter)->when = when; (*iter)->value = val; - if (!no_state) { - save_state (_("event adjusted")); - } - mark_dirty (); } @@ -609,44 +584,10 @@ AutomationList::thaw () { _frozen = false; if (changed_when_thawed) { - StateChanged(Change(0)); /* EMIT SIGNAL */ + StateChanged(); /* EMIT SIGNAL */ } } -StateManager::State* -AutomationList::state_factory (std::string why) const -{ - State* state = new State (why); - - for (AutomationEventList::const_iterator x = events.begin(); x != events.end(); ++x) { - state->events.push_back (point_factory (**x)); - } - - return state; -} - -Change -AutomationList::restore_state (StateManager::State& state) -{ - { - Glib::Mutex::Lock lm (lock); - State* lstate = dynamic_cast<State*> (&state); - - events.clear (); - for (AutomationEventList::const_iterator x = lstate->events.begin(); x != lstate->events.end(); ++x) { - events.push_back (point_factory (**x)); - } - } - - return Change (0); -} - -UndoAction -AutomationList::get_memento () const -{ - return sigc::bind (mem_fun (*(const_cast<AutomationList*> (this)), &StateManager::use_state), _current_state_id); -} - void AutomationList::set_max_xval (double x) { @@ -670,10 +611,6 @@ AutomationList::truncate_end (double last_coordinate) double last_val; if (events.empty()) { - fatal << _("programming error:") - << "AutomationList::truncate_end() called on an empty list" - << endmsg; - /*NOTREACHED*/ return; } @@ -1083,9 +1020,6 @@ AutomationList::cut_copy_clear (double start, double end, int op) if (changed) { reposition_for_rt_add (0); - if (!no_state) { - save_state (_("cut/copy/clear")); - } } mark_dirty (); @@ -1115,10 +1049,6 @@ AutomationList::copy (iterator start, iterator end) x = tmp; } - - if (!no_state) { - save_state (_("copy")); - } } return nal; @@ -1183,11 +1113,6 @@ AutomationList::paste (AutomationList& alist, double pos, float times) } reposition_for_rt_add (0); - - if (!no_state) { - save_state (_("paste")); - } - mark_dirty (); } @@ -1207,64 +1132,220 @@ AutomationList::point_factory (const ControlEvent& other) const return new ControlEvent (other); } -void -AutomationList::store_state (XMLNode& node) const +XMLNode& +AutomationList::get_state () { + return state (true); +} + +XMLNode& +AutomationList::state (bool full) +{ + XMLNode* root = new XMLNode (X_("AutomationList")); + char buf[64]; LocaleGuard lg (X_("POSIX")); - for (const_iterator i = const_begin(); i != const_end(); ++i) { - char buf[64]; - - XMLNode *pointnode = new XMLNode ("point"); - - snprintf (buf, sizeof (buf), "%" PRIu32, (nframes_t) floor ((*i)->when)); - pointnode->add_property ("x", buf); - snprintf (buf, sizeof (buf), "%.12g", (*i)->value); - pointnode->add_property ("y", buf); + root->add_property ("id", _id.to_s()); - node.add_child_nocopy (*pointnode); + snprintf (buf, sizeof (buf), "%.12g", default_value); + root->add_property ("default", buf); + snprintf (buf, sizeof (buf), "%.12g", min_yval); + root->add_property ("min_yval", buf); + snprintf (buf, sizeof (buf), "%.12g", max_yval); + root->add_property ("max_yval", buf); + snprintf (buf, sizeof (buf), "%.12g", max_xval); + root->add_property ("max_xval", buf); + + if (full) { + root->add_property ("state", auto_state_to_string (_state)); + } else { + /* never save anything but Off for automation state to a template */ + root->add_property ("state", auto_state_to_string (Off)); } + + root->add_property ("style", auto_style_to_string (_style)); + + if (!events.empty()) { + root->add_child_nocopy (serialize_events()); + } + + return *root; } -void -AutomationList::load_state (const XMLNode& node) +XMLNode& +AutomationList::serialize_events () { - const XMLNodeList& elist = node.children(); - XMLNodeConstIterator i; - XMLProperty* prop; - nframes_t x; - double y; + XMLNode* node = new XMLNode (X_("events")); + stringstream str; + + for (iterator xx = events.begin(); xx != events.end(); ++xx) { + str << (double) (*xx)->when; + str << ' '; + str <<(double) (*xx)->value; + str << '\n'; + } + + /* XML is a bit wierd */ + + XMLNode* content_node = new XMLNode (X_("foo")); /* it gets renamed by libxml when we set content */ + content_node->set_content (str.str()); + + node->add_child_nocopy (*content_node); + + return *node; +} + +int +AutomationList::deserialize_events (const XMLNode& node) +{ + if (node.children().empty()) { + return -1; + } + + XMLNode* content_node = node.children().front(); + if (content_node->content().empty()) { + return -1; + } + + freeze (); clear (); - for (i = elist.begin(); i != elist.end(); ++i) { - - if ((prop = (*i)->property ("x")) == 0) { - error << _("automation list: no x-coordinate stored for control point (point ignored)") << endmsg; - continue; + stringstream str (content_node->content()); + + double x; + double y; + bool ok = true; + + while (str) { + str >> x; + if (!str) { + break; } - x = atoi (prop->value().c_str()); - - if ((prop = (*i)->property ("y")) == 0) { - error << _("automation list: no y-coordinate stored for control point (point ignored)") << endmsg; - continue; + str >> y; + if (!str) { + ok = false; + break; } - y = atof (prop->value().c_str()); - - add (x, y); + fast_simple_add (x, y); + } + + if (!ok) { + clear (); + error << _("automation list: cannot load coordinates from XML, all points ignored") << endmsg; + } else { + mark_dirty (); + reposition_for_rt_add (0); + maybe_signal_changed (); } -} -XMLNode &AutomationList::get_state () -{ - XMLNode *node = new XMLNode("AutomationList"); - store_state(*node); - return *node; + thaw (); + return 0; } -int AutomationList::set_state(const XMLNode &s) +int +AutomationList::set_state (const XMLNode& node) { - load_state(s); - return 0; + XMLNodeList nlist = node.children(); + XMLNode* nsos; + XMLNodeIterator niter; + const XMLProperty* prop; + + if (node.name() == X_("events")) { + /* partial state setting*/ + return deserialize_events (node); + } + + if (node.name() == X_("Envelope") || node.name() == X_("FadeOut") || node.name() == X_("FadeIn")) { + + if ((nsos = node.child (X_("AutomationList")))) { + /* new school in old school clothing */ + return set_state (*nsos); + } + + /* old school */ + + const XMLNodeList& elist = node.children(); + XMLNodeConstIterator i; + XMLProperty* prop; + jack_nframes_t x; + double y; + + clear (); + + for (i = elist.begin(); i != elist.end(); ++i) { + + if ((prop = (*i)->property ("x")) == 0) { + error << _("automation list: no x-coordinate stored for control point (point ignored)") << endmsg; + continue; + } + x = atoi (prop->value().c_str()); + + if ((prop = (*i)->property ("y")) == 0) { + error << _("automation list: no y-coordinate stored for control point (point ignored)") << endmsg; + continue; + } + y = atof (prop->value().c_str()); + + add (x, y); + } + + return 0; + } + + if (node.name() != X_("AutomationList") ) { + error << string_compose (_("AutomationList: passed XML node called %1, not \"AutomationList\" - ignored"), node.name()) << endmsg; + return -1; + } + + if ((prop = node.property ("id")) != 0) { + _id = prop->value (); + /* update session AL list */ + AutomationListCreated(this); + } + + if ((prop = node.property (X_("default"))) != 0){ + default_value = atof (prop->value()); + } else { + default_value = 0.0; + } + + if ((prop = node.property (X_("style"))) != 0) { + _style = string_to_auto_style (prop->value()); + } else { + _style = Absolute; + } + + if ((prop = node.property (X_("state"))) != 0) { + _state = string_to_auto_state (prop->value()); + } else { + _state = Off; + } + + if ((prop = node.property (X_("min_yval"))) != 0) { + min_yval = atof (prop->value ()); + } else { + min_yval = FLT_MIN; + } + + if ((prop = node.property (X_("max_yval"))) != 0) { + max_yval = atof (prop->value ()); + } else { + max_yval = FLT_MAX; + } + + if ((prop = node.property (X_("max_xval"))) != 0) { + max_xval = atof (prop->value ()); + } else { + max_xval = 0; // means "no limit ; + } + + for (niter = nlist.begin(); niter != nlist.end(); ++niter) { + if ((*niter)->name() == X_("events")) { + deserialize_events (*(*niter)); + } + } + + return 0; } diff --git a/libs/ardour/control_protocol_manager.cc b/libs/ardour/control_protocol_manager.cc index 1ff6c28ef3..a715254747 100644 --- a/libs/ardour/control_protocol_manager.cc +++ b/libs/ardour/control_protocol_manager.cc @@ -36,6 +36,13 @@ ControlProtocolManager::~ControlProtocolManager() } control_protocols.clear (); + + + for (list<ControlProtocolInfo*>::iterator p = control_protocol_info.begin(); p != control_protocol_info.end(); ++p) { + delete (*p); + } + + control_protocol_info.clear(); } @@ -68,6 +75,12 @@ ControlProtocolManager::drop_session () delete *p; } control_protocols.clear (); + + for (list<ControlProtocolInfo*>::iterator p = control_protocol_info.begin(); p != control_protocol_info.end(); ++p) { + delete *p; + } + + control_protocol_info.clear(); } } @@ -122,6 +135,15 @@ ControlProtocolManager::teardown (ControlProtocolInfo& cpi) list<ControlProtocol*>::iterator p = find (control_protocols.begin(), control_protocols.end(), cpi.protocol); if (p != control_protocols.end()) { control_protocols.erase (p); + } else { + cerr << "Programming error: ControlProtocolManager::teardown() called for " << cpi.name << ", but it was not found in control_protocols" << endl; + } + + list<ControlProtocolInfo*>::iterator p2 = find (control_protocol_info.begin(), control_protocol_info.end(), &cpi); + if (p2 != control_protocol_info.end()) { + control_protocol_info.erase (p2); + } else { + cerr << "Programming error: ControlProtocolManager::teardown() called for " << cpi.name << ", but it was not found in control_protocol_info" << endl; } } diff --git a/libs/ardour/coreaudiosource.cc b/libs/ardour/coreaudiosource.cc index c8cbb7a40d..3c81b18fd4 100644 --- a/libs/ardour/coreaudiosource.cc +++ b/libs/ardour/coreaudiosource.cc @@ -43,7 +43,7 @@ CoreAudioSource::CoreAudioSource (Session& s, const string& idstr, Flag flags) } void -CoreAudioSource::init (const string& idstr) +CoreAudioSource::init (string idstr) { string::size_type pos; @@ -84,10 +84,6 @@ CoreAudioSource::init (const string& idstr) error << string_compose ("CoreAudioSource: %1 (%2)", cax.mOperation, name()) << endmsg; throw failed_constructor (); } - - if (_build_peakfiles) { - _need_peakfile = true; - } } CoreAudioSource::~CoreAudioSource () @@ -189,3 +185,53 @@ CoreAudioSource::update_header (nframes_t when, struct tm&, time_t) { return 0; } + +int +CoreAudioSource::get_soundfile_info (string path, SoundFileInfo& _info, string& error_msg) +{ + FSRef ref; + ExtAudioFileRef af = 0; + size_t size; + CFStringRef name; + int ret = -1; + + if (FSPathMakeRef ((UInt8*)path.c_str(), &ref, 0) != noErr) { + goto out; + } + + if (ExtAudioFileOpen(&ref, &af) != noErr) { + goto out; + } + + AudioStreamBasicDescription absd; + memset(&absd, 0, sizeof(absd)); + size = sizeof(AudioStreamBasicDescription); + if (ExtAudioFileGetProperty (af, kExtAudioFileProperty_FileDataFormat, &size, &absd) != noErr) { + goto out; + } + + _info.samplerate = absd.mSampleRate; + _info.channels = absd.mChannelsPerFrame; + + size = sizeof(_info.length); + if (ExtAudioFileGetProperty(af, kExtAudioFileProperty_FileLengthFrames, &size, &_info.length) != noErr) { + goto out; + } + + size = sizeof(CFStringRef); + if (AudioFormatGetProperty(kAudioFormatProperty_FormatName, sizeof(absd), &absd, &size, &name) != noErr) { + goto out; + } + + _info.format_name = CFStringRefToStdString(name); + + // XXX it would be nice to find a way to get this information if it exists + + _info.timecode = 0; + ret = 0; + + out: + ExtAudioFileDispose (af); + return ret; + +} diff --git a/libs/ardour/curve.cc b/libs/ardour/curve.cc index 7d62c5bc94..8465094775 100644 --- a/libs/ardour/curve.cc +++ b/libs/ardour/curve.cc @@ -40,14 +40,11 @@ using namespace ARDOUR; using namespace sigc; using namespace PBD; -sigc::signal<void, Curve*> Curve::CurveCreated; - Curve::Curve (double minv, double maxv, double canv, bool nostate) - : AutomationList (canv, nostate) + : AutomationList (canv) { min_yval = minv; max_yval = maxv; - CurveCreated(this); } Curve::Curve (const Curve& other) @@ -55,7 +52,6 @@ Curve::Curve (const Curve& other) { min_yval = other.min_yval; max_yval = other.max_yval; - CurveCreated(this); } Curve::Curve (const Curve& other, double start, double end) @@ -63,7 +59,11 @@ Curve::Curve (const Curve& other, double start, double end) { min_yval = other.min_yval; max_yval = other.max_yval; - CurveCreated(this); +} + +Curve::Curve (const XMLNode& node) + : AutomationList (node) +{ } Curve::~Curve () @@ -73,7 +73,7 @@ Curve::~Curve () void Curve::solve () { - size_t npoints; + uint32_t npoints; if (!_dirty) { return; @@ -88,7 +88,7 @@ Curve::solve () double x[npoints]; double y[npoints]; - size_t i; + uint32_t i; AutomationEventList::iterator xx; for (i = 0, xx = events.begin(); xx != events.end(); ++xx, ++i) { @@ -207,7 +207,7 @@ Curve::solve () } bool -Curve::rt_safe_get_vector (double x0, double x1, float *vec, size_t veclen) +Curve::rt_safe_get_vector (double x0, double x1, float *vec, int32_t veclen) { Glib::Mutex::Lock lm (lock, Glib::TRY_LOCK); @@ -220,19 +220,19 @@ Curve::rt_safe_get_vector (double x0, double x1, float *vec, size_t veclen) } void -Curve::get_vector (double x0, double x1, float *vec, size_t veclen) +Curve::get_vector (double x0, double x1, float *vec, int32_t veclen) { Glib::Mutex::Lock lm (lock); _get_vector (x0, x1, vec, veclen); } void -Curve::_get_vector (double x0, double x1, float *vec, size_t veclen) +Curve::_get_vector (double x0, double x1, float *vec, int32_t veclen) { double rx, dx, lx, hx, max_x, min_x; - size_t i; - size_t original_veclen; - size_t npoints; + int32_t i; + int32_t original_veclen; + int32_t npoints; if ((npoints = events.size()) == 0) { for (i = 0; i < veclen; ++i) { @@ -263,7 +263,7 @@ Curve::_get_vector (double x0, double x1, float *vec, size_t veclen) */ double frac = (min_x - x0) / (x1 - x0); - size_t subveclen = (size_t) floor (veclen * frac); + int32_t subveclen = (int32_t) floor (veclen * frac); subveclen = min (subveclen, veclen); @@ -281,7 +281,7 @@ Curve::_get_vector (double x0, double x1, float *vec, size_t veclen) double frac = (x1 - max_x) / (x1 - x0); - size_t subveclen = lrintf (original_veclen * frac); + int32_t subveclen = (int32_t) floor (original_veclen * frac); float val; @@ -435,18 +435,10 @@ Curve::point_factory (const ControlEvent& other) const return new CurvePoint (other.when, other.value); } -Change -Curve::restore_state (StateManager::State& state) -{ - mark_dirty (); - return AutomationList::restore_state (state); -} - - extern "C" { void -curve_get_vector_from_c (void *arg, double x0, double x1, float* vec, size_t vecsize) +curve_get_vector_from_c (void *arg, double x0, double x1, float* vec, int32_t vecsize) { static_cast<Curve*>(arg)->get_vector (x0, x1, vec, vecsize); } diff --git a/libs/ardour/destructive_filesource.cc b/libs/ardour/destructive_filesource.cc index e160ffd608..fcd85bfe8f 100644 --- a/libs/ardour/destructive_filesource.cc +++ b/libs/ardour/destructive_filesource.cc @@ -55,8 +55,10 @@ typedef off_t off64_t; #include <fcntl.h> #include <pbd/error.h> +#include <pbd/stacktrace.h> #include <ardour/destructive_filesource.h> #include <ardour/utils.h> +#include <ardour/session.h> #include "i18n.h" @@ -289,7 +291,7 @@ DestructiveFileSource::write_unlocked (Sample* data, nframes_t cnt) _capture_end = false; /* move to the correct location place */ - file_pos = capture_start_frame; + file_pos = capture_start_frame - timeline_position; // split cnt in half nframes_t subcnt = cnt / 2; @@ -343,17 +345,16 @@ DestructiveFileSource::write_unlocked (Sample* data, nframes_t cnt) } else { /* in the middle of recording */ - if (write_float (data, file_pos, cnt) != cnt) { return 0; } } - + old_file_pos = file_pos; update_length (file_pos, cnt); file_pos += cnt; - + if (_build_peakfiles) { PeakBuildRecord *pbr = 0; @@ -409,7 +410,15 @@ DestructiveFileSource::handle_header_position_change () } void -DestructiveFileSource::set_timeline_position (nframes_t pos) +DestructiveFileSource::set_timeline_position (int64_t) { //destructive track timeline postion does not change except at instantion or when header_position_offset (session start) changes } + +int +DestructiveFileSource::read_peaks (PeakData *peaks, nframes_t npeaks, nframes_t start, nframes_t cnt, double samples_per_unit) const +{ + // cerr << _name << " read peaks at " << start << " for " << cnt << " tpos = " << timeline_position << endl; + return AudioFileSource::read_peaks (peaks, npeaks, start, cnt, samples_per_unit); +} + diff --git a/libs/ardour/diskstream.cc b/libs/ardour/diskstream.cc index e9f8499981..5f6f3956cf 100644 --- a/libs/ardour/diskstream.cc +++ b/libs/ardour/diskstream.cc @@ -390,14 +390,14 @@ Diskstream::set_name (string str) } void -Diskstream::set_destructive (bool yn) +Diskstream::remove_region_from_last_capture (boost::weak_ptr<Region> wregion) { - if (yn != destructive()) { - reset_write_sources (true, true); - if (yn) { - _flags |= Destructive; - } else { - _flags &= ~Destructive; - } + boost::shared_ptr<Region> region (wregion.lock()); + + if (!region) { + return; } + + _last_capture_regions.remove (region); } + diff --git a/libs/ardour/globals.cc b/libs/ardour/globals.cc index 9b5bea9d3a..f92660470c 100644 --- a/libs/ardour/globals.cc +++ b/libs/ardour/globals.cc @@ -128,6 +128,8 @@ setup_midi (AudioEngine& engine ) } MIDI::Manager::instance()->add_port (request); + + nports++; } if (nports > 1) { diff --git a/libs/ardour/i18n.h b/libs/ardour/i18n.h index 71a3dccab8..5d68c79edd 100644 --- a/libs/ardour/i18n.h +++ b/libs/ardour/i18n.h @@ -2,6 +2,7 @@ #define __i18n_h__ #include <pbd/compose.h> +#include <pbd/convert.h> #include "gettext.h" #include <vector> @@ -10,5 +11,6 @@ #define _(Text) dgettext (PACKAGE,Text) #define N_(Text) gettext_noop (Text) #define X_(Text) Text +#define I18N(Array) PBD::internationalize (PACKAGE, Array) #endif // __i18n_h__ diff --git a/libs/ardour/insert.cc b/libs/ardour/insert.cc index b557017ec7..034b043763 100644 --- a/libs/ardour/insert.cc +++ b/libs/ardour/insert.cc @@ -85,8 +85,6 @@ PluginInsert::PluginInsert (Session& s, boost::shared_ptr<Plugin> plug, Placemen init (); - save_state (_("initial state")); - { Glib::Mutex::Lock em (_session.engine().process_lock()); IO::MoreChannels (max(input_streams(), output_streams())); @@ -104,8 +102,6 @@ PluginInsert::PluginInsert (Session& s, const XMLNode& node) set_automatable (); - save_state (_("initial state")); - _plugins[0]->ParameterChanged.connect (mem_fun (*this, &PluginInsert::parameter_changed)); { @@ -129,8 +125,6 @@ PluginInsert::PluginInsert (const PluginInsert& other) init (); - save_state (_("initial state")); - RedirectCreated (this); /* EMIT SIGNAL */ } @@ -325,6 +319,23 @@ PluginInsert::connect_and_run (BufferSet& bufs, nframes_t nframes, nframes_t off } void +PluginInsert::automation_snapshot (nframes_t now) +{ + map<uint32_t,AutomationList*>::iterator li; + + for (li = parameter_automation.begin(); li != parameter_automation.end(); ++li) { + + AutomationList *alist = ((*li).second); + if (alist != 0 && alist->automation_write ()) { + + float val = _plugins[0]->get_parameter ((*li).first); + alist->rt_add (now, val); + last_automation_snapshot = now; + } + } +} + +void PluginInsert::transport_stopped (nframes_t now) { map<uint32_t,AutomationList*>::iterator li; @@ -785,35 +796,6 @@ PluginInsert::latency() return _plugins[0]->latency (); } -void -PluginInsert::store_state (PluginInsertState& state) const -{ - Redirect::store_state (state); - _plugins[0]->store_state (state.plugin_state); -} - -Change -PluginInsert::restore_state (StateManager::State& state) -{ - PluginInsertState* pistate = dynamic_cast<PluginInsertState*> (&state); - - Redirect::restore_state (state); - - _plugins[0]->restore_state (pistate->plugin_state); - - return Change (0); -} - -StateManager::State* -PluginInsert::state_factory (std::string why) const -{ - PluginInsertState* state = new PluginInsertState (why); - - store_state (*state); - - return state; -} - ARDOUR::PluginType PluginInsert::type () { @@ -851,7 +833,6 @@ PortInsert::PortInsert (Session& s, Placement p) : Insert (s, p, 1, -1, 1, -1) { init (); - save_state (_("initial state")); RedirectCreated (this); /* EMIT SIGNAL */ } @@ -859,7 +840,6 @@ PortInsert::PortInsert (const PortInsert& other) : Insert (other._session, other.placement(), 1, -1, 1, -1) { init (); - save_state (_("initial state")); RedirectCreated (this); /* EMIT SIGNAL */ } @@ -1013,10 +993,10 @@ PortInsert::configure_io (int32_t ignored_magic, int32_t in, int32_t out) to the number of input ports we need. */ - set_output_maximum (in); - set_output_minimum (in); - set_input_maximum (out); - set_input_minimum (out); + set_output_maximum (ChanCount(_default_type, in)); + set_output_minimum (ChanCount(_default_type, in)); + set_input_maximum (ChanCount(_default_type, out)); + set_input_minimum (ChanCount(_default_type, out)); if (in < 0) { in = n_outputs ().get(_default_type); @@ -1026,8 +1006,7 @@ PortInsert::configure_io (int32_t ignored_magic, int32_t in, int32_t out) out = n_inputs ().get(_default_type); } - // FIXME - return ensure_io (ChanCount(_default_type, in), ChanCount(_default_type, out), false, this); + return ensure_io (ChanCount(_default_type, out), ChanCount(_default_type, in), false, this); } int32_t diff --git a/libs/ardour/io.cc b/libs/ardour/io.cc index af5473368b..60e7ec3f42 100644 --- a/libs/ardour/io.cc +++ b/libs/ardour/io.cc @@ -60,7 +60,7 @@ using namespace std; using namespace ARDOUR; using namespace PBD; -static float current_automation_version_number = 1.0; +nframes_t IO::_automation_interval = 0; const string IO::state_node_name = "IO"; bool IO::connecting_legal = false; @@ -137,6 +137,8 @@ IO::IO (Session& s, string name, apply_gain_automation = false; + last_automation_snapshot = 0; + _gain_automation_state = Off; _gain_automation_style = Absolute; @@ -149,6 +151,43 @@ IO::IO (Session& s, string name, // Connect to our own MoreChannels signal to connect output buffers IO::MoreChannels.connect (mem_fun (*this, &IO::attach_buffers)); + + _session.add_controllable (&_gain_control); +} + +IO::IO (Session& s, const XMLNode& node, DataType dt) + : _session (s), + _output_buffers(new BufferSet()), + _default_type (dt), + _gain_control (X_("gaincontrol"), *this), + _gain_automation_curve (0, 0, 0) // all reset in set_state() +{ + // FIXME: hack + _meter = new PeakMeter (_session); + + _panner = 0; + deferred_state = 0; + no_panner_reset = false; + _desired_gain = 1.0; + _gain = 1.0; + _input_connection = 0; + _output_connection = 0; + + apply_gain_automation = false; + + set_state (node); + + { + // IO::Meter is emitted from another thread so the + // Meter signal must be protected. + Glib::Mutex::Lock guard (m_meter_signal_lock); + m_meter_connection = Meter.connect (mem_fun (*this, &IO::meter)); + } + + // Connect to our own MoreChannels signal to connect output buffers + IO::MoreChannels.connect (mem_fun (*this, &IO::attach_buffers)); + + _session.add_controllable (&_gain_control); } IO::~IO () @@ -1234,67 +1273,21 @@ IO::state (bool full_state) /* automation */ if (full_state) { + + XMLNode* autonode = new XMLNode (X_("Automation")); + autonode->add_child_nocopy (get_automation_state()); + node->add_child_nocopy (*autonode); + snprintf (buf, sizeof (buf), "0x%x", (int) _gain_automation_curve.automation_state()); } else { /* never store anything except Off for automation state in a template */ snprintf (buf, sizeof (buf), "0x%x", ARDOUR::Off); } - node->add_property ("automation-state", buf); - snprintf (buf, sizeof (buf), "0x%x", (int) _gain_automation_curve.automation_style()); - node->add_property ("automation-style", buf); - - /* XXX same for pan etc. */ return *node; } int -IO::connecting_became_legal () -{ - int ret; - - if (pending_state_node == 0) { - fatal << _("IO::connecting_became_legal() called without a pending state node") << endmsg; - /*NOTREACHED*/ - return -1; - } - - connection_legal_c.disconnect (); - - ret = make_connections (*pending_state_node); - - if (ports_legal) { - delete pending_state_node; - pending_state_node = 0; - } - - return ret; -} - -int -IO::ports_became_legal () -{ - int ret; - - if (pending_state_node == 0) { - fatal << _("IO::ports_became_legal() called without a pending state node") << endmsg; - /*NOTREACHED*/ - return -1; - } - - port_legal_c.disconnect (); - - ret = create_ports (*pending_state_node); - - if (connecting_legal) { - delete pending_state_node; - pending_state_node = 0; - } - - return ret; -} - -int IO::set_state (const XMLNode& node) { const XMLProperty* prop; @@ -1312,7 +1305,7 @@ IO::set_state (const XMLNode& node) if ((prop = node.property ("name")) != 0) { _name = prop->value(); - _panner->set_name (_name); + /* used to set panner name with this, but no more */ } if ((prop = node.property ("id")) != 0) { @@ -1338,32 +1331,29 @@ IO::set_state (const XMLNode& node) _gain = _desired_gain; } + if ((prop = node.property ("automation-state")) != 0 || (prop = node.property ("automation-style")) != 0) { + /* old school automation handling */ + } + for (iter = node.children().begin(); iter != node.children().end(); ++iter) { if ((*iter)->name() == "Panner") { + if (_panner == 0) { + _panner = new Panner (_name, _session); + } _panner->set_state (**iter); } + if ((*iter)->name() == X_("Automation")) { + + set_automation_state (*(*iter)->children().front()); + } + if ((*iter)->name() == X_("gaincontrol")) { _gain_control.set_state (**iter); - _session.add_controllable (&_gain_control); } } - if ((prop = node.property ("automation-state")) != 0) { - - long int x; - x = strtol (prop->value().c_str(), 0, 16); - set_gain_automation_state (AutoState (x)); - } - - if ((prop = node.property ("automation-style")) != 0) { - - long int x; - x = strtol (prop->value().c_str(), 0, 16); - set_gain_automation_style (AutoStyle (x)); - } - if (ports_legal) { if (create_ports (node)) { @@ -1396,10 +1386,147 @@ IO::set_state (const XMLNode& node) pending_state_node = new XMLNode (node); } + last_automation_snapshot = 0; + return 0; } int +IO::set_automation_state (const XMLNode& node) +{ + return _gain_automation_curve.set_state (node); +} + +XMLNode& +IO::get_automation_state () +{ + return (_gain_automation_curve.get_state ()); +} + +int +IO::load_automation (string path) +{ + string fullpath; + ifstream in; + char line[128]; + uint32_t linecnt = 0; + float version; + LocaleGuard lg (X_("POSIX")); + + fullpath = _session.automation_dir(); + fullpath += path; + + in.open (fullpath.c_str()); + + if (!in) { + fullpath = _session.automation_dir(); + fullpath += _session.snap_name(); + fullpath += '-'; + fullpath += path; + + in.open (fullpath.c_str()); + + if (!in) { + error << string_compose(_("%1: cannot open automation event file \"%2\""), _name, fullpath) << endmsg; + return -1; + } + } + + clear_automation (); + + while (in.getline (line, sizeof(line), '\n')) { + char type; + jack_nframes_t when; + double value; + + if (++linecnt == 1) { + if (memcmp (line, "version", 7) == 0) { + if (sscanf (line, "version %f", &version) != 1) { + error << string_compose(_("badly formed version number in automation event file \"%1\""), path) << endmsg; + return -1; + } + } else { + error << string_compose(_("no version information in automation event file \"%1\""), path) << endmsg; + return -1; + } + + continue; + } + + if (sscanf (line, "%c %" PRIu32 " %lf", &type, &when, &value) != 3) { + warning << string_compose(_("badly formatted automation event record at line %1 of %2 (ignored)"), linecnt, path) << endmsg; + continue; + } + + switch (type) { + case 'g': + _gain_automation_curve.fast_simple_add (when, value); + break; + + case 's': + break; + + case 'm': + break; + + case 'p': + /* older (pre-1.0) versions of ardour used this */ + break; + + default: + warning << _("dubious automation event found (and ignored)") << endmsg; + } + } + + return 0; +} + +int +IO::connecting_became_legal () +{ + int ret; + + if (pending_state_node == 0) { + fatal << _("IO::connecting_became_legal() called without a pending state node") << endmsg; + /*NOTREACHED*/ + return -1; + } + + connection_legal_c.disconnect (); + + ret = make_connections (*pending_state_node); + + if (ports_legal) { + delete pending_state_node; + pending_state_node = 0; + } + + return ret; +} +int +IO::ports_became_legal () +{ + int ret; + + if (pending_state_node == 0) { + fatal << _("IO::ports_became_legal() called without a pending state node") << endmsg; + /*NOTREACHED*/ + return -1; + } + + port_legal_c.disconnect (); + + ret = create_ports (*pending_state_node); + + if (connecting_legal) { + delete pending_state_node; + pending_state_node = 0; + } + + return ret; +} + +int IO::create_ports (const XMLNode& node) { const XMLProperty* prop; @@ -1702,42 +1829,6 @@ IO::set_name (string name, void* src) } void -IO::set_input_minimum (int n) -{ - if (n < 0) - _input_minimum = ChanCount::ZERO; - else - _input_minimum = ChanCount(_default_type, n); -} - -void -IO::set_input_maximum (int n) -{ - if (n < 0) - _input_maximum = ChanCount::INFINITE; - else - _input_maximum = ChanCount(_default_type, n); -} - -void -IO::set_output_minimum (int n) -{ - if (n < 0) - _output_minimum = ChanCount::ZERO; - else - _output_minimum = ChanCount(_default_type, n); -} - -void -IO::set_output_maximum (int n) -{ - if (n < 0) - _output_maximum = ChanCount::INFINITE; - else - _output_maximum = ChanCount(_default_type, n); -} - -void IO::set_input_minimum (ChanCount n) { _input_minimum = n; @@ -2046,25 +2137,6 @@ IO::GainControllable::get_value (void) const return direct_gain_to_control (io.effective_gain()); } -UndoAction -IO::get_memento() const -{ - return sigc::bind (mem_fun (*(const_cast<IO *>(this)), &StateManager::use_state), _current_state_id); -} - -Change -IO::restore_state (StateManager::State& state) -{ - return Change (0); -} - -StateManager::State* -IO::state_factory (std::string why) const -{ - StateManager::State* state = new StateManager::State (why); - return state; -} - void IO::setup_peak_meters() { @@ -2096,118 +2168,6 @@ IO::meter () _meter->meter(); } -int -IO::save_automation (const string& path) -{ - string fullpath; - ofstream out; - - fullpath = _session.automation_dir(); - fullpath += path; - - out.open (fullpath.c_str()); - - if (!out) { - error << string_compose(_("%1: could not open automation event file \"%2\""), _name, fullpath) << endmsg; - return -1; - } - - out << X_("version ") << current_automation_version_number << endl; - - /* XXX use apply_to_points to get thread safety */ - - for (AutomationList::iterator i = _gain_automation_curve.begin(); i != _gain_automation_curve.end(); ++i) { - out << "g " << (nframes_t) floor ((*i)->when) << ' ' << (*i)->value << endl; - } - - _panner->save (); - - return 0; -} - -int -IO::load_automation (const string& path) -{ - string fullpath; - ifstream in; - char line[128]; - uint32_t linecnt = 0; - float version; - LocaleGuard lg (X_("POSIX")); - - fullpath = _session.automation_dir(); - fullpath += path; - - in.open (fullpath.c_str()); - - if (!in) { - fullpath = _session.automation_dir(); - fullpath += _session.snap_name(); - fullpath += '-'; - fullpath += path; - in.open (fullpath.c_str()); - if (!in) { - error << string_compose(_("%1: cannot open automation event file \"%2\" (%2)"), _name, fullpath, strerror (errno)) << endmsg; - return -1; - } - } - - clear_automation (); - - while (in.getline (line, sizeof(line), '\n')) { - char type; - nframes_t when; - double value; - - if (++linecnt == 1) { - if (memcmp (line, "version", 7) == 0) { - if (sscanf (line, "version %f", &version) != 1) { - error << string_compose(_("badly formed version number in automation event file \"%1\""), path) << endmsg; - return -1; - } - } else { - error << string_compose(_("no version information in automation event file \"%1\""), path) << endmsg; - return -1; - } - - if (version != current_automation_version_number) { - error << string_compose(_("mismatched automation event file version (%1)"), version) << endmsg; - return -1; - } - - continue; - } - - if (sscanf (line, "%c %" PRIu32 " %lf", &type, &when, &value) != 3) { - warning << string_compose(_("badly formatted automation event record at line %1 of %2 (ignored)"), linecnt, path) << endmsg; - continue; - } - - switch (type) { - case 'g': - _gain_automation_curve.add (when, value, true); - break; - - case 's': - break; - - case 'm': - break; - - case 'p': - /* older (pre-1.0) versions of ardour used this */ - break; - - default: - warning << _("dubious automation event found (and ignored)") << endmsg; - } - } - - _gain_automation_curve.save_state (_("loaded from disk")); - - return 0; -} - void IO::clear_automation () { @@ -2226,6 +2186,7 @@ IO::set_gain_automation_state (AutoState state) if (state != _gain_automation_curve.automation_state()) { changed = true; + last_automation_snapshot = 0; _gain_automation_curve.set_automation_state (state); if (state != Off) { @@ -2324,16 +2285,27 @@ IO::end_pan_touch (uint32_t which) } void +IO::automation_snapshot (nframes_t now) +{ + if (last_automation_snapshot > now || (now - last_automation_snapshot) > _automation_interval) { + + if (gain_automation_recording()) { + _gain_automation_curve.rt_add (now, gain()); + } + + _panner->snapshot (now); + + last_automation_snapshot = now; + } +} + +void IO::transport_stopped (nframes_t frame) { _gain_automation_curve.reposition_for_rt_add (frame); if (_gain_automation_curve.automation_state() != Off) { - if (gain_automation_recording()) { - _gain_automation_curve.save_state (_("automation write/touch")); - } - /* the src=0 condition is a special signal to not propagate automation gain changes into the mix group when locating. */ diff --git a/libs/ardour/location.cc b/libs/ardour/location.cc index 39331cfda6..e09a59d42f 100644 --- a/libs/ardour/location.cc +++ b/libs/ardour/location.cc @@ -372,27 +372,16 @@ Locations::Locations () { current_location = 0; - save_state (_("initial")); } Locations::~Locations () { - std::set<Location*> all_locations; - - for (StateMap::iterator siter = states.begin(); siter != states.end(); ++siter) { - - State* lstate = dynamic_cast<State*> (*siter); - - for (LocationList::iterator liter = lstate->locations.begin(); liter != lstate->locations.end(); ++liter) { - all_locations.insert (*liter); - } - - for (LocationList::iterator siter = lstate->states.begin(); siter != lstate->states.end(); ++siter) { - all_locations.insert (*siter); - } + for (LocationList::iterator i = locations.begin(); i != locations.end(); ) { + LocationList::iterator tmp = i; + ++tmp; + delete *i; + i = tmp; } - - set_delete (&all_locations); } int @@ -431,22 +420,22 @@ Locations::clear () { { Glib::Mutex::Lock lm (lock); - LocationList::iterator tmp; + for (LocationList::iterator i = locations.begin(); i != locations.end(); ) { - tmp = i; + + LocationList::iterator tmp = i; ++tmp; + if (!(*i)->is_end() && !(*i)->is_start()) { locations.erase (i); } + i = tmp; } - locations.clear (); current_location = 0; } - save_state (_("clear")); - changed (); /* EMIT SIGNAL */ current_changed (0); /* EMIT SIGNAL */ } @@ -470,8 +459,6 @@ Locations::clear_markers () } } - save_state (_("clear markers")); - changed (); /* EMIT SIGNAL */ } @@ -498,8 +485,6 @@ Locations::clear_ranges () current_location = 0; } - save_state (_("clear ranges")); - changed (); /* EMIT SIGNAL */ current_changed (0); /* EMIT SIGNAL */ } @@ -516,8 +501,6 @@ Locations::add (Location *loc, bool make_current) } } - save_state (_("add")); - added (loc); /* EMIT SIGNAL */ if (make_current) { @@ -554,9 +537,8 @@ Locations::remove (Location *loc) } if (was_removed) { - save_state (_("remove")); - - removed (loc); /* EMIT SIGNAL */ + + removed (loc); /* EMIT SIGNAL */ if (was_current) { current_changed (0); /* EMIT SIGNAL */ @@ -569,7 +551,6 @@ Locations::remove (Location *loc) void Locations::location_changed (Location* loc) { - save_state (X_("location changed")); changed (); /* EMIT SIGNAL */ } @@ -599,7 +580,10 @@ Locations::set_state (const XMLNode& node) } nlist = node.children(); - + + locations.clear (); + current_location = 0; + { Glib::Mutex::Lock lm (lock); @@ -809,45 +793,6 @@ Locations::auto_punch_location () const return 0; } -StateManager::State* -Locations::state_factory (std::string why) const -{ - State* state = new State (why); - - state->locations = locations; - - for (LocationList::const_iterator i = locations.begin(); i != locations.end(); ++i) { - state->states.push_back (new Location (**i)); - } - - return state; -} - -Change -Locations::restore_state (StateManager::State& state) -{ - { - Glib::Mutex::Lock lm (lock); - State* lstate = dynamic_cast<State*> (&state); - - locations = lstate->locations; - LocationList& states = lstate->states; - LocationList::iterator l, s; - - for (l = locations.begin(), s = states.begin(); s != states.end(); ++s, ++l) { - (*l) = (*s); - } - } - - return Change (0); -} - -UndoAction -Locations::get_memento () const -{ - return sigc::bind (mem_fun (*(const_cast<Locations*> (this)), &StateManager::use_state), _current_state_id); -} - uint32_t Locations::num_range_markers () const { diff --git a/libs/ardour/midi_diskstream.cc b/libs/ardour/midi_diskstream.cc index 8247aac217..b1ec7da965 100644 --- a/libs/ardour/midi_diskstream.cc +++ b/libs/ardour/midi_diskstream.cc @@ -295,11 +295,12 @@ MidiDiskstream::use_copy_playlist () /** Overloaded from parent to die horribly */ -void +int MidiDiskstream::set_destructive (bool yn) { assert( ! destructive()); assert( ! yn); + return -1; } void diff --git a/libs/ardour/midi_region.cc b/libs/ardour/midi_region.cc index 36e5e05116..d33d19ce67 100644 --- a/libs/ardour/midi_region.cc +++ b/libs/ardour/midi_region.cc @@ -106,7 +106,6 @@ MidiRegion::MidiRegion (SourceList& srcs, const XMLNode& node) MidiRegion::~MidiRegion () { - GoingAway (); /* EMIT SIGNAL */ } jack_nframes_t diff --git a/libs/ardour/midi_track.cc b/libs/ardour/midi_track.cc index f6d0a22019..a18d0c20ce 100644 --- a/libs/ardour/midi_track.cc +++ b/libs/ardour/midi_track.cc @@ -619,14 +619,21 @@ MidiTrack::unfreeze () FreezeChange (); /* EMIT SIGNAL */ } -void +int MidiTrack::set_mode (TrackMode m) { - if (_diskstream) { - if (_mode != m) { - _mode = m; - _diskstream->set_destructive (m == Destructive); - ModeChanged(); + assert(_diskstream); + + if (m != _mode) { + + if (_diskstream->set_destructive (m == Destructive)) { + return -1; } + + _mode = m; + + TrackModeChanged (); /* EMIT SIGNAL */ } + + return 0; } diff --git a/libs/ardour/panner.cc b/libs/ardour/panner.cc index 0f6e78f84b..ee8e100e4a 100644 --- a/libs/ardour/panner.cc +++ b/libs/ardour/panner.cc @@ -75,6 +75,8 @@ StreamPanner::StreamPanner (Panner& p) { _muted = false; + parent.session().add_controllable (&_control); + x = 0.5; y = 0.5; z = 0.5; @@ -210,11 +212,6 @@ BaseStereoPanner::transport_stopped (nframes_t frame) _automation.reposition_for_rt_add (frame); if (_automation.automation_state() != Off) { - - if (_automation.automation_write()) { - _automation.save_state (_("automation write pass")); - } - set_position (_automation.eval (frame)); } } @@ -239,29 +236,6 @@ BaseStereoPanner::set_automation_state (AutoState state) } int -BaseStereoPanner::save (ostream& out) const -{ - LocaleGuard lg (X_("POSIX")); - - /* force a single format for numeric data to ease session interchange - across national boundaries. - */ - - out << "begin" << endl; - - for (AutomationList::const_iterator i = _automation.const_begin(); i != _automation.const_end(); ++i) { - out << '\t' << (nframes_t) floor ((*i)->when) << ' ' << (*i)->value << endl; - if (!out) { - error << string_compose (_("error writing pan automation file (%s)"), strerror (errno)) << endmsg; - return -1; - } - } - out << "end" << endl; - - return 0; -} - -int BaseStereoPanner::load (istream& in, string path, uint32_t& linecnt) { char line[128]; @@ -270,7 +244,7 @@ BaseStereoPanner::load (istream& in, string path, uint32_t& linecnt) _automation.clear (); while (in.getline (line, sizeof (line), '\n')) { - nframes_t when; + jack_nframes_t when; double value; ++linecnt; @@ -284,13 +258,12 @@ BaseStereoPanner::load (istream& in, string path, uint32_t& linecnt) continue; } - _automation.add (when, value, true); + _automation.fast_simple_add (when, value); } /* now that we are done loading */ - _automation.save_state (_("loaded from disk")); - _automation.StateChanged (Change (0)); + _automation.StateChanged (); return 0; } @@ -543,17 +516,13 @@ EqualPowerStereoPanner::state (bool full_state) snprintf (buf, sizeof (buf), "%.12g", x); root->add_property (X_("x"), buf); root->add_property (X_("type"), EqualPowerStereoPanner::name); - if (full_state) { - snprintf (buf, sizeof (buf), "0x%x", _automation.automation_state()); - } else { - /* never store automation states other than off in a template */ - snprintf (buf, sizeof (buf), "0x%x", ARDOUR::Off); - } - root->add_property (X_("automation-state"), buf); - snprintf (buf, sizeof (buf), "0x%x", _automation.automation_style()); - root->add_property (X_("automation-style"), buf); + + XMLNode* autonode = new XMLNode (X_("Automation")); + autonode->add_child_nocopy (_automation.state (full_state)); + root->add_child_nocopy (*autonode); StreamPanner::add_state (*root); + root->add_child_nocopy (_control.get_state ()); return *root; @@ -563,7 +532,6 @@ int EqualPowerStereoPanner::set_state (const XMLNode& node) { const XMLProperty* prop; - int x; float pos; LocaleGuard lg (X_("POSIX")); @@ -572,29 +540,24 @@ EqualPowerStereoPanner::set_state (const XMLNode& node) set_position (pos, true); } - if ((prop = node.property (X_("automation-state")))) { - sscanf (prop->value().c_str(), "0x%x", &x); - _automation.set_automation_state ((AutoState) x); - - if (x != Off) { - set_position (_automation.eval (parent.session().transport_frame())); - } - } - - if ((prop = node.property (X_("automation-style")))) { - sscanf (prop->value().c_str(), "0x%x", &x); - _automation.set_automation_style ((AutoStyle) x); - } - StreamPanner::set_state (node); for (XMLNodeConstIterator iter = node.children().begin(); iter != node.children().end(); ++iter) { + if ((*iter)->name() == X_("panner")) { + _control.set_state (**iter); - parent.session().add_controllable (&_control); + + } else if ((*iter)->name() == X_("Automation")) { + + _automation.set_state (*((*iter)->children().front())); + + if (_automation.automation_state() != Off) { + set_position (_automation.eval (parent.session().transport_frame())); + } } } - + return 0; } @@ -765,12 +728,6 @@ Multi2dPanner::load (istream& in, string path, uint32_t& linecnt) return 0; } -int -Multi2dPanner::save (ostream& out) const -{ - return 0; -} - XMLNode& Multi2dPanner::get_state (void) { @@ -790,6 +747,8 @@ Multi2dPanner::state (bool full_state) root->add_property (X_("y"), buf); root->add_property (X_("type"), Multi2dPanner::name); + /* XXX no meaningful automation yet */ + return *root; } @@ -827,6 +786,7 @@ Panner::Panner (string name, Session& s) : _session (s) { set_name (name); + _linked = false; _link_direction = SameDirection; _bypassed = false; @@ -857,17 +817,6 @@ Panner::set_link_direction (LinkDirection ld) } void -Panner::set_name (string str) -{ - automation_path = _session.automation_dir(); - automation_path += _session.snap_name(); - automation_path += "-pan-"; - automation_path += legalize_for_path (str); - automation_path += ".automation"; -} - - -void Panner::set_bypassed (bool yn) { if (yn != _bypassed) { @@ -883,7 +832,6 @@ Panner::reset (uint32_t nouts, uint32_t npans) uint32_t n; bool changed = false; - if (nouts < 2 || (nouts == outputs.size() && npans == size())) { return; } @@ -1095,102 +1043,6 @@ Panner::clear_automation () _session.set_dirty (); } -int -Panner::save () const -{ - ofstream out (automation_path.c_str()); - - if (!out) { - error << string_compose (_("cannot open pan automation file \"%1\" for saving (%2)"), automation_path, strerror (errno)) - << endmsg; - return -1; - } - - out << X_("version ") << current_automation_version_number << endl; - - for (vector<StreamPanner*>::const_iterator i = begin(); i != end(); ++i) { - if ((*i)->save (out)) { - return -1; - } - } - - return 0; -} - -int -Panner::load () -{ - char line[128]; - uint32_t linecnt = 0; - float version; - iterator sp; - LocaleGuard lg (X_("POSIX")); - - if (automation_path.length() == 0) { - return 0; - } - - if (access (automation_path.c_str(), F_OK)) { - return 0; - } - - ifstream in (automation_path.c_str()); - - if (!in) { - error << string_compose (_("cannot open pan automation file %1 (%2)"), - automation_path, strerror (errno)) - << endmsg; - return -1; - } - - sp = begin(); - - while (in.getline (line, sizeof(line), '\n')) { - - if (++linecnt == 1) { - if (memcmp (line, X_("version"), 7) == 0) { - if (sscanf (line, "version %f", &version) != 1) { - error << string_compose(_("badly formed version number in pan automation event file \"%1\""), automation_path) << endmsg; - return -1; - } - } else { - error << string_compose(_("no version information in pan automation event file \"%1\" (first line = %2)"), - automation_path, line) << endmsg; - return -1; - } - - if (version != current_automation_version_number) { - error << string_compose(_("mismatched pan automation event file version (%1)"), version) << endmsg; - return -1; - } - - continue; - } - - if (strlen (line) == 0 || line[0] == '#') { - continue; - } - - if (strcmp (line, "begin") == 0) { - - if (sp == end()) { - error << string_compose (_("too many panner states found in pan automation file %1"), - automation_path) - << endmsg; - return -1; - } - - if ((*sp)->load (in, automation_path, linecnt)) { - return -1; - } - - ++sp; - } - } - - return 0; -} - struct PanPlugins { string name; uint32_t nouts; @@ -1215,10 +1067,6 @@ Panner::state (bool full) XMLNode* root = new XMLNode (X_("Panner")); char buf[32]; - for (iterator p = begin(); p != end(); ++p) { - root->add_child_nocopy ((*p)->state (full)); - } - root->add_property (X_("linked"), (_linked ? "yes" : "no")); snprintf (buf, sizeof (buf), "%d", _link_direction); root->add_property (X_("link_direction"), buf); @@ -1235,10 +1083,8 @@ Panner::state (bool full) root->add_child_nocopy (*onode); } - if (full) { - if (save () == 0) { - root->add_property (X_("automation"), Glib::path_get_basename (automation_path)); - } + for (vector<StreamPanner*>::const_iterator i = begin(); i != end(); ++i) { + root->add_child_nocopy ((*i)->state (full)); } return *root; @@ -1329,7 +1175,7 @@ Panner::set_state (const XMLNode& node) } } - /* don't try to load automation if it wasn't marked as existing */ + /* don't try to do old-school automation loading if it wasn't marked as existing */ if ((prop = node.property (X_("automation")))) { @@ -1629,3 +1475,83 @@ Panner::distribute (BufferSet& inbufs, BufferSet& outbufs, nframes_t start_frame } } +/* old school automation handling */ + +void +Panner::set_name (string str) +{ + automation_path = _session.automation_dir(); + automation_path += _session.snap_name(); + automation_path += "-pan-"; + automation_path += legalize_for_path (str); + automation_path += ".automation"; +} + +int +Panner::load () +{ + char line[128]; + uint32_t linecnt = 0; + float version; + iterator sp; + LocaleGuard lg (X_("POSIX")); + + if (automation_path.length() == 0) { + return 0; + } + + if (access (automation_path.c_str(), F_OK)) { + return 0; + } + + ifstream in (automation_path.c_str()); + + if (!in) { + error << string_compose (_("cannot open pan automation file %1 (%2)"), + automation_path, strerror (errno)) + << endmsg; + return -1; + } + + sp = begin(); + + while (in.getline (line, sizeof(line), '\n')) { + + if (++linecnt == 1) { + if (memcmp (line, X_("version"), 7) == 0) { + if (sscanf (line, "version %f", &version) != 1) { + error << string_compose(_("badly formed version number in pan automation event file \"%1\""), automation_path) << endmsg; + return -1; + } + } else { + error << string_compose(_("no version information in pan automation event file \"%1\" (first line = %2)"), + automation_path, line) << endmsg; + return -1; + } + + continue; + } + + if (strlen (line) == 0 || line[0] == '#') { + continue; + } + + if (strcmp (line, "begin") == 0) { + + if (sp == end()) { + error << string_compose (_("too many panner states found in pan automation file %1"), + automation_path) + << endmsg; + return -1; + } + + if ((*sp)->load (in, automation_path, linecnt)) { + return -1; + } + + ++sp; + } + } + + return 0; +} diff --git a/libs/ardour/playlist.cc b/libs/ardour/playlist.cc index ee60a53d66..d439cf1265 100644 --- a/libs/ardour/playlist.cc +++ b/libs/ardour/playlist.cc @@ -90,10 +90,8 @@ Playlist::Playlist (Session& sess, const XMLNode& node, DataType type, bool hide init (hide); _name = "unnamed"; /* reset by set_state */ - - if (set_state (node)) { - throw failed_constructor(); - } + + /* derived class calls set_state() */ } Playlist::Playlist (const Playlist& other, string namestr, bool hide) @@ -264,11 +262,19 @@ Playlist::Playlist (Playlist& pl) Playlist::~Playlist () { + { + RegionLock rl (this); + + for (set<boost::shared_ptr<Region> >::iterator i = all_regions.begin(); i != all_regions.end(); ++i) { + (*i)->set_playlist (0); + } + } + /* GoingAway must be emitted by derived classes */ } void -Playlist::set_name (const string& str) +Playlist::set_name (string str) { /* in a typical situation, a playlist is being used by one diskstream and also is referenced by the @@ -563,8 +569,6 @@ Playlist::remove_region_internal (boost::shared_ptr<Region>region, bool delay_so RegionList::iterator i; nframes_t old_length = 0; - cerr << "removing region " << region->name() << " holding = " << holding_state() << endl; - if (!holding_state()) { old_length = _get_maximum_extent(); } @@ -1140,6 +1144,7 @@ Playlist::region_changed_proxy (Change what_changed, boost::weak_ptr<Region> wea return; } + /* this makes a virtual call to the right kind of playlist ... */ region_changed (what_changed, region); @@ -1259,6 +1264,7 @@ Playlist::find_next_region (nframes_t frame, RegionPoint point, int dir) boost::shared_ptr<Region> ret; nframes_t closest = max_frames; + for (RegionList::iterator i = regions.begin(); i != regions.end(); ++i) { nframes_t distance; @@ -1280,7 +1286,7 @@ Playlist::find_next_region (nframes_t frame, RegionPoint point, int dir) switch (dir) { case 1: /* forwards */ - if (pos > frame) { + if (pos >= frame) { if ((distance = pos - frame) < closest) { closest = distance; ret = r; @@ -1291,7 +1297,7 @@ Playlist::find_next_region (nframes_t frame, RegionPoint point, int dir) default: /* backwards */ - if (pos < frame) { + if (pos <= frame) { if ((distance = frame - pos) < closest) { closest = distance; ret = r; @@ -1455,13 +1461,21 @@ Playlist::state (bool full_state) bool Playlist::empty() const { + RegionLock rlock (const_cast<Playlist *>(this), false); return regions.empty(); } -ARDOUR::nframes_t +uint32_t +Playlist::n_regions() const +{ + RegionLock rlock (const_cast<Playlist *>(this), false); + return regions.size(); +} + +nframes_t Playlist::get_maximum_extent () const { - RegionLock rlock (const_cast<Playlist *>(this)); + RegionLock rlock (const_cast<Playlist *>(this), false); return _get_maximum_extent (); } @@ -1488,7 +1502,7 @@ Playlist::bump_name (string name, Session &session) do { newname = Playlist::bump_name_once (newname); - } while (session.playlist_by_name(newname)!=NULL); + } while (session.playlist_by_name (newname)!=NULL); return newname; } diff --git a/libs/ardour/plugin_manager.cc b/libs/ardour/plugin_manager.cc index bdd4d0ada6..b24b2619d3 100644 --- a/libs/ardour/plugin_manager.cc +++ b/libs/ardour/plugin_manager.cc @@ -86,7 +86,6 @@ PluginManager::PluginManager () } refresh (); - if (_manager == 0) { _manager = this; } @@ -109,7 +108,7 @@ PluginManager::ladspa_refresh () _ladspa_plugin_info.clear (); if (ladspa_path.length() == 0) { - ladspa_path = "/usr/local/lib/ladspa:/usr/lib/ladspa"; + ladspa_path = "/usr/local/lib64/ladspa:/usr/local/lib/ladspa:/usr/lib64/ladspa:/usr/lib/ladspa:/Library/Audio/Plug-Ins/LADSPA"; } ladspa_discover_from_path (ladspa_path); diff --git a/libs/ardour/po/sv_SE.po b/libs/ardour/po/sv_SE.po new file mode 100644 index 0000000000..ddc7f108bb --- /dev/null +++ b/libs/ardour/po/sv_SE.po @@ -0,0 +1,2025 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR "Paul Davis" +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: ardour\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2006-10-03 00:39+0200\n" +"PO-Revision-Date: 2006-10-03 01:09+GMT+1\n" +"Last-Translator: Petter Sundlöf <petter.sundlof@findus.dhs.org>\n" +"Language-Team: Swedish <sv@li.org>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: libs/ardour/diskstream.cc:258 +msgid "Location \"%1\" not valid for track loop (start >= end)" +msgstr "" + +#: libs/ardour/audio_diskstream.cc:298 +msgid "AudioDiskstream: Playlist \"%1\" isn't an audio playlist" +msgstr "" + +#: libs/ardour/audio_diskstream.cc:349 +msgid "AudioDiskstream %1: there is no existing playlist to make a copy of!" +msgstr "" + +#: libs/ardour/audio_diskstream.cc:924 libs/ardour/audio_diskstream.cc:935 +msgid "" +"AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3" +msgstr "" + +#: libs/ardour/audio_diskstream.cc:1069 +msgid "AudioDiskstream %1: cannot read %2 from playlist at frame %3" +msgstr "" + +#: libs/ardour/audio_diskstream.cc:1412 libs/ardour/audio_diskstream.cc:1429 +msgid "AudioDiskstream %1: cannot write to disk" +msgstr "" + +#: libs/ardour/audio_diskstream.cc:1473 +msgid "AudioDiskstream \"%1\": cannot flush captured data to disk!" +msgstr "" + +#: libs/ardour/audio_diskstream.cc:1563 +msgid "%1: could not create region for complete audio file" +msgstr "" + +#: libs/ardour/audio_diskstream.cc:1587 +msgid "AudioDiskstream: could not create region for captured audio!" +msgstr "" + +#: libs/ardour/audio_diskstream.cc:1643 +msgid "programmer error: %1" +msgstr "" + +#: libs/ardour/audio_diskstream.cc:1929 +msgid "AudioDiskstream: channel %1 out of range" +msgstr "" + +#: libs/ardour/audio_diskstream.cc:1952 +msgid "%1:%2 new capture file not initialized correctly" +msgstr "" + +#: libs/ardour/audio_diskstream.cc:2178 +msgid "%1: cannot restore pending capture source file %2" +msgstr "" + +#: libs/ardour/audio_diskstream.cc:2200 +msgid "%1: incorrect number of pending sources listed - ignoring them all" +msgstr "" + +#: libs/ardour/audio_diskstream.cc:2215 +msgid "%1: cannot create whole-file region from pending capture sources" +msgstr "" + +#: libs/ardour/audio_diskstream.cc:2227 +msgid "%1: cannot create region from pending capture sources" +msgstr "" + +#: libs/ardour/audio_library.cc:92 +msgid "channels" +msgstr "" + +#: libs/ardour/audio_library.cc:93 +msgid "samplerate" +msgstr "" + +#: libs/ardour/audio_library.cc:94 +msgid "resolution" +msgstr "" + +#: libs/ardour/audio_library.cc:95 +msgid "format" +msgstr "" + +#: libs/ardour/audio_library.cc:102 +msgid "Could not open %1. Audio Library not saved" +msgstr "" + +#: libs/ardour/audio_playlist.cc:53 libs/ardour/audio_playlist.cc:63 +#: libs/ardour/audio_playlist.cc:74 libs/ardour/audio_playlist.cc:121 +#: libs/ardour/insert.cc:84 libs/ardour/insert.cc:103 +#: libs/ardour/insert.cc:128 libs/ardour/insert.cc:862 +#: libs/ardour/insert.cc:870 libs/ardour/send.cc:39 libs/ardour/send.cc:53 +#: libs/ardour/send.cc:62 libs/ardour/session_state.cc:1128 +#: libs/ardour/session_state.cc:1170 +msgid "initial state" +msgstr "" + +#: libs/ardour/audio_playlist.cc:261 libs/ardour/audio_playlist.cc:743 +msgid "" +"programming error: non-audio Region passed to remove_overlap in audio " +"playlist" +msgstr "" + +#: libs/ardour/audio_playlist.cc:388 +msgid "" +"programming error: non-audio Region tested for overlap in audio playlist" +msgstr "" + +#: libs/ardour/audio_playlist.cc:851 +msgid "xfade change" +msgstr "" + +#: libs/ardour/audio_playlist.cc:874 +msgid "region modified" +msgstr "" + +#: libs/ardour/audio_track.cc:105 libs/ardour/io.cc:1696 +#: libs/ardour/io.cc:1762 +msgid "Unknown connection \"%1\" listed for input of %2" +msgstr "" + +#: libs/ardour/audio_track.cc:107 libs/ardour/io.cc:1698 +#: libs/ardour/io.cc:1764 +msgid "in 1" +msgstr "" + +#: libs/ardour/audio_track.cc:108 libs/ardour/io.cc:1699 +#: libs/ardour/io.cc:1765 +msgid "No input connections available as a replacement" +msgstr "" + +#: libs/ardour/audio_track.cc:112 libs/ardour/io.cc:1703 +#: libs/ardour/io.cc:1769 +msgid "Connection %1 was not available - \"in 1\" used instead" +msgstr "" + +#: libs/ardour/audio_track.cc:121 libs/ardour/io.cc:1778 +msgid "improper input channel list in XML node (%1)" +msgstr "" + +#: libs/ardour/audio_track.cc:162 libs/ardour/audio_track.cc:175 +msgid "AudioTrack: audio diskstream \"%1\" not known by session" +msgstr "" + +#: libs/ardour/audio_track.cc:216 +msgid "programming error: AudioTrack given state without diskstream!" +msgstr "" + +#: libs/ardour/audioengine.cc:146 +msgid "cannot activate JACK client" +msgstr "" + +#: libs/ardour/audioengine.cc:421 +msgid "register input port called before engine was started" +msgstr "" + +#: libs/ardour/audioengine.cc:457 +msgid "register output port called before engine was started" +msgstr "" + +#: libs/ardour/audioengine.cc:539 +msgid "connect called before engine was started" +msgstr "" + +#: libs/ardour/audioengine.cc:555 +msgid "AudioEngine: cannot connect %1 (%2) to %3 (%4)" +msgstr "" + +#: libs/ardour/audioengine.cc:568 libs/ardour/audioengine.cc:597 +msgid "disconnect called before engine was started" +msgstr "" + +#: libs/ardour/audioengine.cc:655 +msgid "get_port_by_name() called before engine was started" +msgstr "" + +#: libs/ardour/audioengine.cc:699 +msgid "get_ports called before engine was started" +msgstr "" + +#: libs/ardour/audioengine.cc:817 +msgid "get_nth_physical called before engine was started" +msgstr "" + +#: libs/ardour/audioengine.cc:845 +msgid "get_port_total_latency() called with no JACK client connection" +msgstr "" + +#: libs/ardour/audioengine.cc:851 +msgid "get_port_total_latency() called before engine was started" +msgstr "" + +#: libs/ardour/audioengine.cc:982 +msgid "Unable to connect to JACK server" +msgstr "" + +#: libs/ardour/audioengine.cc:985 +msgid "Could not connect to JACK server as \"%1\"" +msgstr "" + +#: libs/ardour/audioengine.cc:990 +msgid "JACK server started" +msgstr "" + +#: libs/ardour/audioengine.cc:1024 +msgid "cannot shutdown connection to JACK" +msgstr "" + +#: libs/ardour/audioengine.cc:1049 +msgid "failed to connect to JACK" +msgstr "" + +#: libs/ardour/audioengine.cc:1067 +msgid "could not reregister %1" +msgstr "" + +#: libs/ardour/audioengine.cc:1125 +msgid "could not reconnect %1 and %2 (err = %3)" +msgstr "" + +#: libs/ardour/audiofilesource.cc:355 libs/ardour/session_state.cc:2575 +msgid "" +"there are already 1000 files with names like %1; versioning discontinued" +msgstr "" + +#: libs/ardour/audiofilesource.cc:369 libs/ardour/session_state.cc:2589 +msgid "cannot rename audio file source from %1 to %2 (%3)" +msgstr "" + +#: libs/ardour/audiofilesource.cc:376 libs/ardour/session_state.cc:2604 +msgid "cannot remove peakfile %1 for %2 (%3)" +msgstr "" + +#: libs/ardour/audiofilesource.cc:420 +msgid "FileSource: search path not set" +msgstr "" + +#: libs/ardour/audiofilesource.cc:444 +msgid "" +"FileSource: \"%1\" is ambigous when searching %2\n" +"\t" +msgstr "" + +#: libs/ardour/audiofilesource.cc:450 +msgid "Filesource: cannot find required file (%1): while searching %2" +msgstr "" + +#: libs/ardour/audiofilesource.cc:473 +msgid "Filesource: cannot find required file (%1): %2" +msgstr "" + +#: libs/ardour/audiofilesource.cc:478 +msgid "Filesource: cannot check for existing file (%1): %2" +msgstr "" + +#: libs/ardour/audiofilesource.cc:534 libs/ardour/insert.cc:532 +#: libs/ardour/session.cc:1967 libs/ardour/sndfilesource.cc:109 +msgid "programming error: %1" +msgstr "" + +#: libs/ardour/audiofilesource.cc:540 +msgid "" +"Programming error! Ardour tried to rename a file over another file! It's " +"safe to continue working, but please report this to the developers." +msgstr "" + +#: libs/ardour/audiofilesource.cc:545 +msgid "cannot rename audio file for %1 to %2" +msgstr "" + +#: libs/ardour/audiofilter.cc:47 +msgid "audiofilter: error creating name for new audio file based on %1" +msgstr "" + +#: libs/ardour/audiofilter.cc:57 +msgid "audiofilter: error creating new audio file %1 (%2)" +msgstr "" + +#: libs/ardour/audioregion.cc:888 libs/ardour/audioregion.cc:950 +msgid "fade in change" +msgstr "" + +#: libs/ardour/audioregion.cc:1321 +#, c-format +msgid "normalized to %.2fdB" +msgstr "" + +#: libs/ardour/audioregion.cc:1339 +msgid "envelope change" +msgstr "" + +#: libs/ardour/audiosource.cc:144 +msgid "poll on peak request pipe failed (%1)" +msgstr "" + +#: libs/ardour/audiosource.cc:151 +msgid "Error on peak thread request pipe" +msgstr "" + +#: libs/ardour/audiosource.cc:184 +msgid "Error reading from peak request pipe" +msgstr "" + +#: libs/ardour/audiosource.cc:216 libs/ardour/session_butler.cc:80 +#: libs/ardour/session_midi.cc:1073 +msgid "Cannot create transport request signal pipe (%1)" +msgstr "" + +#: libs/ardour/audiosource.cc:221 libs/ardour/audiosource.cc:226 +msgid "UI: cannot set O_NONBLOCK on peak request pipe (%1)" +msgstr "" + +#: libs/ardour/audiosource.cc:231 +msgid "AudioSource: could not create peak thread" +msgstr "" + +#: libs/ardour/audiosource.cc:326 +msgid "cannot rename peakfile for %1 from %2 to %3 (%4)" +msgstr "" + +#: libs/ardour/audiosource.cc:368 +msgid "AudioSource: cannot stat peakfile \"%1\"" +msgstr "" + +#: libs/ardour/audiosource.cc:466 +msgid "cannot read sample data for unscaled peak computation" +msgstr "" + +#: libs/ardour/audiosource.cc:486 libs/ardour/audiosource.cc:557 +#: libs/ardour/audiosource.cc:793 libs/ardour/audiosource.cc:882 +msgid "AudioSource: cannot open peakpath \"%1\" (%2)" +msgstr "" + +#: libs/ardour/audiosource.cc:657 +msgid "AudioSource[%1]: peak read - cannot read %2 samples at offset %3" +msgstr "" + +#: libs/ardour/audiosource.cc:804 +msgid "%1: could not write read raw data for peak computation (%2)" +msgstr "" + +#: libs/ardour/audiosource.cc:829 +msgid "%1: could not write peak file data (%2)" +msgstr "" + +#: libs/ardour/auditioner.cc:118 +msgid "Auditioning of non-audio regions not yet supported" +msgstr "" + +#: libs/ardour/automation_event.cc:67 libs/ardour/location.cc:375 +#: libs/ardour/tempo.cc:226 +msgid "initial" +msgstr "" + +#: libs/ardour/automation_event.cc:240 +msgid "cleared" +msgstr "" + +#: libs/ardour/automation_event.cc:412 +msgid "added event" +msgstr "" + +#: libs/ardour/automation_event.cc:429 +msgid "removed event" +msgstr "" + +#: libs/ardour/automation_event.cc:444 +msgid "removed multiple events" +msgstr "" + +#: libs/ardour/automation_event.cc:475 libs/ardour/automation_event.cc:506 +msgid "removed range" +msgstr "" + +#: libs/ardour/automation_event.cc:536 +msgid "event range adjusted" +msgstr "" + +#: libs/ardour/automation_event.cc:558 +msgid "event adjusted" +msgstr "" + +#: libs/ardour/automation_event.cc:673 libs/ardour/automation_event.cc:778 +#: libs/ardour/panner.cc:889 +msgid "programming error:" +msgstr "" + +#: libs/ardour/automation_event.cc:1087 +msgid "cut/copy/clear" +msgstr "" + +#: libs/ardour/automation_event.cc:1120 +msgid "copy" +msgstr "" + +#: libs/ardour/automation_event.cc:1188 libs/ardour/playlist.cc:960 +msgid "paste" +msgstr "" + +#: libs/ardour/automation_event.cc:1243 +msgid "" +"automation list: no x-coordinate stored for control point (point ignored)" +msgstr "" + +#: libs/ardour/automation_event.cc:1249 +msgid "" +"automation list: no y-coordinate stored for control point (point ignored)" +msgstr "" + +#: libs/ardour/configuration.cc:87 +msgid "loading system configuration file %1" +msgstr "" + +#: libs/ardour/configuration.cc:90 +msgid "Ardour: cannot read system configuration file \"%1\"" +msgstr "" + +#: libs/ardour/configuration.cc:97 +msgid "Ardour: system configuration file \"%1\" not loaded successfully." +msgstr "" + +#: libs/ardour/configuration.cc:111 +msgid "loading user configuration file %1" +msgstr "" + +#: libs/ardour/configuration.cc:114 +msgid "Ardour: cannot read configuration file \"%1\"" +msgstr "" + +#: libs/ardour/configuration.cc:121 +msgid "Ardour: user configuration file \"%1\" not loaded successfully." +msgstr "" + +#: libs/ardour/configuration.cc:141 +msgid "Config file %1 not saved" +msgstr "" + +#: libs/ardour/configuration.cc:226 +msgid "ill-formed MIDI port specification in ardour rcfile (ignored)" +msgstr "" + +#: libs/ardour/connection.cc:183 +msgid "Node for Connection has no \"name\" property" +msgstr "" + +#: libs/ardour/connection.cc:191 +msgid "Node for Connection has no \"connections\" property" +msgstr "" + +#: libs/ardour/connection.cc:227 libs/ardour/io.cc:1838 +msgid "IO: badly formed string in XML node for inputs \"%1\"" +msgstr "" + +#: libs/ardour/connection.cc:232 libs/ardour/io.cc:1843 +msgid "bad input string in XML node \"%1\"" +msgstr "" + +#: libs/ardour/control_protocol_manager.cc:84 +msgid "control protocol name \"%1\" has no descriptor" +msgstr "" + +#: libs/ardour/control_protocol_manager.cc:89 +msgid "control protocol name \"%1\" could not be initialized" +msgstr "" + +#: libs/ardour/control_protocol_manager.cc:145 +msgid "Instantiating mandatory control protocol %1" +msgstr "" + +#: libs/ardour/control_protocol_manager.cc:179 +msgid "Control protocol %1 not usable" +msgstr "" + +#: libs/ardour/control_protocol_manager.cc:192 +msgid "Control surface protocol discovered: \"%1\"" +msgstr "" + +#: libs/ardour/control_protocol_manager.cc:210 +msgid "ControlProtocolManager: cannot load module \"%1\" (%2)" +msgstr "" + +#: libs/ardour/control_protocol_manager.cc:218 +msgid "ControlProtocolManager: module \"%1\" has no descriptor function." +msgstr "" + +#: libs/ardour/crossfade.cc:120 +msgid "Crossfade: no \"in\" region in state" +msgstr "" + +#: libs/ardour/crossfade.cc:127 +msgid "Crossfade: no \"in\" region %1 found in playlist %2" +msgstr "" + +#: libs/ardour/crossfade.cc:137 +msgid "Crossfade: no \"out\" region in state" +msgstr "" + +#: libs/ardour/crossfade.cc:144 +msgid "Crossfade: no \"out\" region %1 found in playlist %2" +msgstr "" + +#: libs/ardour/crossfade.cc:491 +msgid "active changed" +msgstr "" + +#: libs/ardour/crossfade.cc:740 +msgid "old-style crossfade information - no position information" +msgstr "" + +#: libs/ardour/curve.cc:117 libs/ardour/globals.cc:348 +#: libs/ardour/insert.cc:454 libs/ardour/session.cc:2432 +#: libs/ardour/session.cc:2486 +msgid "programming error: " +msgstr "" + +#: libs/ardour/cycle_timer.cc:37 +msgid "CycleTimer::get_mhz(): can't open /proc/cpuinfo" +msgstr "" + +#: libs/ardour/cycle_timer.cc:49 +msgid "CycleTimer::get_mhz(): cannot locate cpu MHz in /proc/cpuinfo" +msgstr "" + +#: libs/ardour/cycle_timer.cc:72 +msgid "cannot locate cpu MHz in /proc/cpuinfo" +msgstr "" + +#: libs/ardour/destructive_filesource.cc:200 +msgid "DestructiveFileSource: \"%1\" bad read retval: %2 of %5 (%3: %4)" +msgstr "" + +#: libs/ardour/destructive_filesource.cc:213 +#: libs/ardour/destructive_filesource.cc:258 +#: libs/ardour/destructive_filesource.cc:265 +msgid "DestructiveFileSource: \"%1\" bad write (%2)" +msgstr "" + +#: libs/ardour/destructive_filesource.cc:403 +msgid "" +"Filesource: start time is already set for existing file (%1): Cannot change " +"start time." +msgstr "" + +#: libs/ardour/globals.cc:110 +msgid "no MIDI ports specified: no MMC or MTC control possible" +msgstr "" + +#: libs/ardour/globals.cc:125 +msgid "MIDI port specifications for \"%1\" are not understandable." +msgstr "" + +#: libs/ardour/globals.cc:138 libs/ardour/globals.cc:142 +#: libs/ardour/globals.cc:146 +msgid "default" +msgstr "" + +#: libs/ardour/globals.cc:174 +msgid "No MMC control (MIDI port \"%1\" not available)" +msgstr "" + +#: libs/ardour/globals.cc:180 +msgid "No MTC support (MIDI port \"%1\" not available)" +msgstr "" + +#: libs/ardour/globals.cc:185 +msgid "No MIDI parameter support (MIDI port \"%1\" not available)" +msgstr "" + +#: libs/ardour/import.cc:77 +msgid "Import: cannot open input sound file \"%1\"" +msgstr "" + +#: libs/ardour/import.cc:82 +msgid "resampling audio" +msgstr "" + +#: libs/ardour/import.cc:86 +msgid "Import: cannot open converted sound file \"%1\"" +msgstr "" + +#: libs/ardour/import.cc:91 +msgid "Import: error while resampling sound file \"%1\"" +msgstr "" + +#: libs/ardour/import.cc:145 +msgid "Session::import_audiofile: cannot open new file source for channel %1" +msgstr "" + +#: libs/ardour/import.cc:163 +msgid "converting audio" +msgstr "" + +#: libs/ardour/import.cc:195 +msgid "building region" +msgstr "" + +#: libs/ardour/import.cc:197 +msgid "building regions" +msgstr "" + +#: libs/ardour/import.cc:309 +msgid "Import/SRC: could not open input file: %1" +msgstr "" + +#: libs/ardour/import.cc:317 +msgid "Import/SRC: could not open output file: %1" +msgstr "" + +#: libs/ardour/import.cc:326 +msgid "Import: src_new() failed : %1" +msgstr "" + +#: libs/ardour/import.cc:354 +msgid "Import: %1" +msgstr "" + +#: libs/ardour/insert.cc:651 libs/ardour/insert.cc:960 +msgid "XML node describing insert is missing the `type' field" +msgstr "" + +#: libs/ardour/insert.cc:660 +msgid "unknown plugin type %1 in plugin insert state" +msgstr "" + +#: libs/ardour/insert.cc:672 +msgid "XML node describing insert is missing the `id' field" +msgstr "" + +#: libs/ardour/insert.cc:685 +msgid "" +"Found a reference to a plugin (\"%1\") that is unknown.\n" +"Perhaps it was removed or moved since it was last used." +msgstr "" + +#: libs/ardour/insert.cc:723 libs/ardour/insert.cc:977 +msgid "XML node describing insert is missing a Redirect node" +msgstr "" + +#: libs/ardour/insert.cc:728 +msgid "XML node describing a plugin insert is missing the `%1' information" +msgstr "" + +#: libs/ardour/insert.cc:752 +msgid "PluginInsert: Auto: no ladspa port number" +msgstr "" + +#: libs/ardour/insert.cc:759 +msgid "PluginInsert: Auto: port id out of range" +msgstr "" + +#: libs/ardour/insert.cc:775 +msgid "XML node describing a port automation is missing the `%1' information" +msgstr "" + +#: libs/ardour/insert.cc:878 +msgid "PortInsert: cannot add input port" +msgstr "" + +#: libs/ardour/insert.cc:883 +msgid "PortInsert: cannot add output port" +msgstr "" + +#: libs/ardour/insert.cc:965 +msgid "non-port insert XML used for port plugin insert" +msgstr "" + +#: libs/ardour/io.cc:603 +msgid "IO: cannot disconnect input port %1 from %2" +msgstr "" + +#: libs/ardour/io.cc:671 +msgid "IO: cannot disconnect output port %1 from %2" +msgstr "" + +#: libs/ardour/io.cc:822 libs/ardour/io.cc:1177 libs/ardour/io.cc:1303 +#, c-format +msgid "%s/out" +msgstr "" + +#: libs/ardour/io.cc:824 libs/ardour/io.cc:1179 libs/ardour/io.cc:1305 +#: libs/ardour/io.cc:2688 +#, c-format +msgid "%s/out %u" +msgstr "" + +#: libs/ardour/io.cc:828 libs/ardour/io.cc:1184 libs/ardour/io.cc:1309 +msgid "IO: cannot register output port %1" +msgstr "" + +#: libs/ardour/io.cc:934 libs/ardour/io.cc:1037 libs/ardour/io.cc:1143 +#, c-format +msgid "%s/in" +msgstr "" + +#: libs/ardour/io.cc:936 libs/ardour/io.cc:1040 libs/ardour/io.cc:1146 +#: libs/ardour/io.cc:2658 +#, c-format +msgid "%s/in %u" +msgstr "" + +#: libs/ardour/io.cc:940 libs/ardour/io.cc:1046 libs/ardour/io.cc:1151 +msgid "IO: cannot register input port %1" +msgstr "" + +#: libs/ardour/io.cc:1551 +msgid "IO::connecting_became_legal() called without a pending state node" +msgstr "" + +#: libs/ardour/io.cc:1574 +msgid "IO::ports_became_legal() called without a pending state node" +msgstr "" + +#: libs/ardour/io.cc:1603 +msgid "incorrect XML node \"%1\" passed to IO object" +msgstr "" + +#: libs/ardour/io.cc:1719 libs/ardour/io.cc:1787 +msgid "Unknown connection \"%1\" listed for output of %2" +msgstr "" + +#: libs/ardour/io.cc:1721 libs/ardour/io.cc:1789 +msgid "out 1" +msgstr "" + +#: libs/ardour/io.cc:1722 libs/ardour/io.cc:1790 +msgid "No output connections available as a replacement" +msgstr "" + +#: libs/ardour/io.cc:1726 libs/ardour/io.cc:1794 +msgid "Connection %1 was not available - \"out 1\" used instead" +msgstr "" + +#: libs/ardour/io.cc:1740 +msgid "%1: cannot create I/O ports" +msgstr "" + +#: libs/ardour/io.cc:1803 +msgid "improper output channel list in XML node (%1)" +msgstr "" + +#: libs/ardour/io.cc:1888 +msgid "IO: badly formed string in XML node for outputs \"%1\"" +msgstr "" + +#: libs/ardour/io.cc:1893 +msgid "IO: bad output string in XML node \"%1\"" +msgstr "" + +#: libs/ardour/io.cc:2391 +msgid "%1: could not open automation event file \"%2\"" +msgstr "" + +#: libs/ardour/io.cc:2430 +msgid "%1: cannot open automation event file \"%2\" (%2)" +msgstr "" + +#: libs/ardour/io.cc:2445 +msgid "badly formed version number in automation event file \"%1\"" +msgstr "" + +#: libs/ardour/io.cc:2449 +msgid "no version information in automation event file \"%1\"" +msgstr "" + +#: libs/ardour/io.cc:2454 +msgid "mismatched automation event file version (%1)" +msgstr "" + +#: libs/ardour/io.cc:2462 +msgid "badly formatted automation event record at line %1 of %2 (ignored)" +msgstr "" + +#: libs/ardour/io.cc:2482 +msgid "dubious automation event found (and ignored)" +msgstr "" + +#: libs/ardour/io.cc:2486 libs/ardour/panner.cc:288 +#: libs/ardour/redirect.cc:148 +msgid "loaded from disk" +msgstr "" + +#: libs/ardour/io.cc:2630 +msgid "automation write/touch" +msgstr "" + +#: libs/ardour/ladspa_plugin.cc:87 +msgid "LADSPA: module has no descriptor function." +msgstr "" + +#: libs/ardour/ladspa_plugin.cc:92 +msgid "LADSPA: plugin has gone away since discovery!" +msgstr "" + +#: libs/ardour/ladspa_plugin.cc:99 +msgid "LADSPA: \"%1\" cannot be used, since it cannot do inplace processing" +msgstr "" + +#: libs/ardour/ladspa_plugin.cc:315 +msgid "" +"illegal parameter number used with plugin \"%1\". This mayindicate a change " +"in the plugin design, and presets may beinvalid" +msgstr "" + +#: libs/ardour/ladspa_plugin.cc:394 +msgid "Bad node sent to LadspaPlugin::set_state" +msgstr "" + +#: libs/ardour/ladspa_plugin.cc:407 +msgid "LADSPA: no ladspa port number" +msgstr "" + +#: libs/ardour/ladspa_plugin.cc:413 +msgid "LADSPA: no ladspa port data" +msgstr "" + +#: libs/ardour/ladspa_plugin.cc:653 +msgid "LADSPA: cannot load module from \"%1\"" +msgstr "" + +#: libs/ardour/location.cc:295 +msgid "incorrect XML node passed to Location::set_state" +msgstr "" + +#: libs/ardour/location.cc:300 +msgid "XML node for Location has no ID information" +msgstr "" + +#: libs/ardour/location.cc:306 +msgid "XML node for Location has no name information" +msgstr "" + +#: libs/ardour/location.cc:313 +msgid "XML node for Location has no start information" +msgstr "" + +#: libs/ardour/location.cc:324 +msgid "XML node for Location has no end information" +msgstr "" + +#: libs/ardour/location.cc:333 +msgid "XML node for Location has no flags information" +msgstr "" + +#: libs/ardour/location.cc:421 +msgid "Locations: attempt to use unknown location as selected location" +msgstr "" + +#: libs/ardour/location.cc:448 libs/ardour/playlist.cc:1204 +msgid "clear" +msgstr "" + +#: libs/ardour/location.cc:473 +msgid "clear markers" +msgstr "" + +#: libs/ardour/location.cc:501 +msgid "clear ranges" +msgstr "" + +#: libs/ardour/location.cc:519 +msgid "add" +msgstr "" + +#: libs/ardour/location.cc:557 +msgid "remove" +msgstr "" + +#: libs/ardour/location.cc:597 +msgid "incorrect XML mode passed to Locations::set_state" +msgstr "" + +#: libs/ardour/location.cc:615 +msgid "could not load location from session file - ignored" +msgstr "" + +#: libs/ardour/mtc_slave.cc:196 +msgid "MTC Slave: atomic read of current time failed, sleeping!" +msgstr "" + +#: libs/ardour/named_selection.cc:77 +msgid "Chunk %1 uses an unknown playlist \"%2\"" +msgstr "" + +#: libs/ardour/named_selection.cc:80 +msgid "Chunk %1 contains misformed playlist information" +msgstr "" + +#: libs/ardour/panner.cc:211 +msgid "automation write pass" +msgstr "" + +#: libs/ardour/panner.cc:251 +#, c-format +msgid "error writing pan automation file (%s)" +msgstr "" + +#: libs/ardour/panner.cc:279 +msgid "" +"badly formatted pan automation event record at line %1 of %2 (ignored) [%3]" +msgstr "" + +#: libs/ardour/panner.cc:794 +msgid "badly-formed positional data for Multi2dPanner - ignored" +msgstr "" + +#: libs/ardour/panner.cc:1083 +msgid "cannot open pan automation file \"%1\" for saving (%2)" +msgstr "" + +#: libs/ardour/panner.cc:1119 +msgid "cannot open pan automation file %1 (%2)" +msgstr "" + +#: libs/ardour/panner.cc:1132 +msgid "badly formed version number in pan automation event file \"%1\"" +msgstr "" + +#: libs/ardour/panner.cc:1136 +msgid "" +"no version information in pan automation event file \"%1\" (first line = %2)" +msgstr "" + +#: libs/ardour/panner.cc:1142 +msgid "mismatched pan automation event file version (%1)" +msgstr "" + +#: libs/ardour/panner.cc:1156 +msgid "too many panner states found in pan automation file %1" +msgstr "" + +#: libs/ardour/panner.cc:1297 +msgid "Unknown panner plugin \"%1\" found in pan state - ignored" +msgstr "" + +#: libs/ardour/panner.cc:1303 +msgid "panner plugin node has no type information!" +msgstr "" + +#: libs/ardour/playlist.cc:251 +msgid "playlist const copy constructor called" +msgstr "" + +#: libs/ardour/playlist.cc:257 +msgid "playlist non-const copy constructor called" +msgstr "" + +#: libs/ardour/playlist.cc:498 +msgid "add region" +msgstr "" + +#: libs/ardour/playlist.cc:550 +msgid "replace region" +msgstr "" + +#: libs/ardour/playlist.cc:563 +msgid "remove region" +msgstr "" + +#: libs/ardour/playlist.cc:635 +msgid "separate" +msgstr "" + +#: libs/ardour/playlist.cc:899 +msgid "cut" +msgstr "" + +#: libs/ardour/playlist.cc:989 +msgid "duplicate" +msgstr "" + +#: libs/ardour/playlist.cc:1044 +msgid "split" +msgstr "" + +#: libs/ardour/playlist.cc:1121 +msgid "%1: bounds changed received for region (%2)not in playlist" +msgstr "" + +#: libs/ardour/playlist.cc:1377 +msgid "Playlist: cannot create region from state file" +msgstr "" + +#: libs/ardour/playlist.cc:1737 +msgid "nudged" +msgstr "" + +#: libs/ardour/playlist_factory.cc:40 +msgid "" +"programming error: Playlist::copyPlaylist called with unknown Playlist type" +msgstr "" + +#: libs/ardour/plugin.cc:218 +msgid "Could not locate HOME. Preset not saved." +msgstr "" + +#: libs/ardour/plugin.cc:228 libs/ardour/plugin.cc:234 +msgid "Could not create %1. Preset not saved. (%2)" +msgstr "" + +#: libs/ardour/plugin.cc:239 +msgid "Error saving presets file %1." +msgstr "" + +#: libs/ardour/plugin_manager.cc:192 +msgid "Could not parse rdf file: %1" +msgstr "" + +#: libs/ardour/plugin_manager.cc:232 +msgid "LADSPA: cannot load module \"%1\" (%2)" +msgstr "" + +#: libs/ardour/plugin_manager.cc:239 +msgid "LADSPA: module \"%1\" has no descriptor function." +msgstr "" + +#: libs/ardour/plugin_manager.cc:295 libs/ardour/plugin_manager.cc:307 +msgid "Unknown" +msgstr "" + +#: libs/ardour/plugin_manager.cc:380 +msgid "" +"VST plugin %1 does not support processReplacing, and so cannot be used in " +"ardour at this time" +msgstr "" + +#: libs/ardour/recent_sessions.cc:44 +msgid "cannot open recent session file %1 (%2)" +msgstr "" + +#: libs/ardour/redirect.cc:77 +msgid "programming error: unknown Redirect type in Redirect::Clone!\n" +msgstr "" + +#: libs/ardour/redirect.cc:102 libs/ardour/utils.cc:194 +msgid "pre" +msgstr "" + +#: libs/ardour/redirect.cc:104 libs/ardour/utils.cc:197 +msgid "post" +msgstr "" + +#: libs/ardour/redirect.cc:107 +msgid "Redirect: unknown placement string \"%1\" (ignored)" +msgstr "" + +#: libs/ardour/redirect.cc:125 +msgid "%1: cannot open %2 to load automation data (%3)" +msgstr "" + +#: libs/ardour/redirect.cc:154 +msgid "%1: cannot load automation data from %2" +msgstr "" + +#: libs/ardour/redirect.cc:175 +msgid "%1: cannot open %2 to store automation data (%3)" +msgstr "" + +#: libs/ardour/redirect.cc:194 libs/ardour/redirect.cc:201 +msgid "%1: could not save automation state to %2" +msgstr "" + +#: libs/ardour/redirect.cc:246 +msgid "Could not get state from Redirect (%1). Problem with save_automation" +msgstr "" + +#: libs/ardour/redirect.cc:296 +msgid "incorrect XML node \"%1\" passed to Redirect object" +msgstr "" + +#: libs/ardour/redirect.cc:318 +msgid "%1: Automation node has no path property" +msgstr "" + +#: libs/ardour/redirect.cc:343 +msgid "XML node describing an IO is missing an IO node" +msgstr "" + +#: libs/ardour/redirect.cc:348 +msgid "XML node describing a redirect is missing the `active' field" +msgstr "" + +#: libs/ardour/redirect.cc:358 +msgid "XML node describing a redirect is missing the `placement' field" +msgstr "" + +#: libs/ardour/redirect.cc:467 +msgid "active_changed" +msgstr "" + +#: libs/ardour/region.cc:901 +msgid "Session: XMLNode describing a Region is incomplete (no id)" +msgstr "" + +#: libs/ardour/region.cc:908 +msgid "Session: XMLNode describing a Region is incomplete (no name)" +msgstr "" + +#: libs/ardour/region_factory.cc:53 libs/ardour/region_factory.cc:70 +msgid "" +"programming error: RegionFactory::create() called with unknown Region type" +msgstr "" + +#: libs/ardour/route.cc:81 libs/ardour/session.cc:1434 +#: libs/ardour/session.cc:1440 libs/ardour/session.cc:3064 +msgid "signal" +msgstr "" + +#: libs/ardour/route.cc:1407 +msgid "Could not get state of route. Problem with save_automation" +msgstr "" + +#: libs/ardour/route.cc:1459 +msgid "Send construction failed" +msgstr "" + +#: libs/ardour/route.cc:1481 +msgid "unknown Insert type \"%1\"; ignored" +msgstr "" + +#: libs/ardour/route.cc:1487 +msgid "Insert XML node has no type property" +msgstr "" + +#: libs/ardour/route.cc:1492 +msgid "insert could not be created. Ignored." +msgstr "" + +#: libs/ardour/route.cc:1508 +msgid "Bad node sent to Route::set_state() [%1]" +msgstr "" + +#: libs/ardour/route.cc:1572 +msgid "Route %1: unknown edit group \"%2 in saved state (ignored)" +msgstr "" + +#: libs/ardour/route.cc:1588 libs/ardour/route.cc:1592 +msgid "badly formed order key string in state file! [%1] ... ignored." +msgstr "" + +#: libs/ardour/route.cc:1673 libs/ardour/route.cc:1761 +msgid "[control]" +msgstr "" + +#: libs/ardour/route.cc:1693 +msgid "Route %1: unknown mix group \"%2 in saved state (ignored)" +msgstr "" + +#: libs/ardour/send.cc:99 +msgid "XML node describing a send is missing a Redirect node" +msgstr "" + +#: libs/ardour/session.cc:111 +msgid "Could not resolve path: %1 (%2)" +msgstr "" + +#: libs/ardour/session.cc:123 +msgid "cannot check session path %1 (%2)" +msgstr "" + +#: libs/ardour/session.cc:153 +msgid "cannot check statefile %1 (%2)" +msgstr "" + +#: libs/ardour/session.cc:189 +msgid "%1 is not an Ardour snapshot file" +msgstr "" + +#: libs/ardour/session.cc:206 +msgid "cannot determine current working directory (%1)" +msgstr "" + +#: libs/ardour/session.cc:223 +msgid "unknown file type for session %1" +msgstr "" + +#: libs/ardour/session.cc:343 +msgid "monitor" +msgstr "" + +#: libs/ardour/session.cc:351 +msgid "master" +msgstr "" + +#: libs/ardour/session.cc:633 +msgid "could not setup Click I/O" +msgstr "" + +#: libs/ardour/session.cc:654 +msgid "cannot setup Click I/O" +msgstr "" + +#: libs/ardour/session.cc:676 +msgid "cannot create Auditioner: no auditioning of regions possible" +msgstr "" + +#: libs/ardour/session.cc:688 +#, c-format +msgid "out %<PRIu32>" +msgstr "" + +#: libs/ardour/session.cc:700 +#, c-format +msgid "in %<PRIu32>" +msgstr "" + +#: libs/ardour/session.cc:714 +#, c-format +msgid "out %<PRIu32>+%<PRIu32>" +msgstr "" + +#: libs/ardour/session.cc:728 +#, c-format +msgid "in %<PRIu32>+%<PRIu32>" +msgstr "" + +#: libs/ardour/session.cc:761 +msgid "cannot setup master inputs" +msgstr "" + +#: libs/ardour/session.cc:769 +msgid "cannot setup master outputs" +msgstr "" + +#: libs/ardour/session.cc:780 +msgid "Master Out" +msgstr "" + +#: libs/ardour/session.cc:852 +msgid "cannot setup control inputs" +msgstr "" + +#: libs/ardour/session.cc:860 +msgid "cannot set up master outputs" +msgstr "" + +#: libs/ardour/session.cc:1043 +msgid "Session: you can't use that location for auto punch (start <= end)" +msgstr "" + +#: libs/ardour/session.cc:1080 +msgid "Session: you can't use a mark for auto loop" +msgstr "" + +#: libs/ardour/session.cc:1452 +msgid "feedback loop setup between %1 and %2" +msgstr "" + +#: libs/ardour/session.cc:1629 libs/ardour/session.cc:1750 +msgid "cannot configure %1 in/%2 out configuration for new audio track" +msgstr "" + +#: libs/ardour/session.cc:1687 +msgid "Session: could not create new audio track." +msgstr "" + +#: libs/ardour/session.cc:1800 +msgid "Session: could not create new audio route." +msgstr "" + +#: libs/ardour/session.cc:2319 +msgid "cannot create new name for region \"%1\"" +msgstr "" + +#: libs/ardour/session.cc:2383 +msgid "too many regions with names like %1" +msgstr "" + +#: libs/ardour/session.cc:2883 +msgid "There are already %1 recordings for %2, which I consider too many." +msgstr "" + +#: libs/ardour/session.cc:3085 +msgid "Cannot compile tape track regexp for use (%1)" +msgstr "" + +#: libs/ardour/session.cc:3232 +msgid "programming error: unknown type of Insert created!" +msgstr "" + +#: libs/ardour/session.cc:3238 +msgid "programming error: unknown type of Redirect created!" +msgstr "" + +#: libs/ardour/session.cc:3261 +msgid "programming error: unknown type of Insert deleted!" +msgstr "" + +#: libs/ardour/session.cc:3267 +msgid "programming error: unknown type of Redirect deleted!" +msgstr "" + +#: libs/ardour/session.cc:3573 +msgid "too many bounced versions of playlist \"%1\"" +msgstr "" + +#: libs/ardour/session.cc:3582 +msgid "cannot create new audio file \"%1\" for %2" +msgstr "" + +#: libs/ardour/session_butler.cc:85 libs/ardour/session_butler.cc:90 +msgid "UI: cannot set O_NONBLOCK on butler request pipe (%1)" +msgstr "" + +#: libs/ardour/session_butler.cc:95 +msgid "Session: could not create butler thread" +msgstr "" + +#: libs/ardour/session_butler.cc:183 +msgid "poll on butler request pipe failed (%1)" +msgstr "" + +#: libs/ardour/session_butler.cc:190 +msgid "Error on butler thread request pipe: fd=%1 err=%2" +msgstr "" + +#: libs/ardour/session_butler.cc:231 +msgid "Error reading from butler request pipe" +msgstr "" + +#: libs/ardour/session_butler.cc:268 +msgid "Butler read ahead failure on dstream %1" +msgstr "" + +#: libs/ardour/session_butler.cc:311 +msgid "Butler write-behind failure on dstream %1" +msgstr "" + +#: libs/ardour/session_click.cc:160 +msgid "cannot open click soundfile %1 (%2)" +msgstr "" + +#: libs/ardour/session_click.cc:169 +msgid "cannot read data from click soundfile" +msgstr "" + +#: libs/ardour/session_click.cc:196 +msgid "cannot open click emphasis soundfile %1 (%2)" +msgstr "" + +#: libs/ardour/session_click.cc:204 +msgid "cannot read data from click emphasis soundfile" +msgstr "" + +#: libs/ardour/session_command.cc:49 +msgid "Tried to reconstitute a MementoCommand with no contents, failing. id=" +msgstr "" + +#: libs/ardour/session_command.cc:95 +msgid "could not reconstitute MementoCommand from XMLNode. id=" +msgstr "" + +#: libs/ardour/session_events.cc:161 +msgid "Session: cannot have two events of type %1 at the same frame (%2)." +msgstr "" + +#: libs/ardour/session_events.cc:422 +msgid "Programming error: illegal event type in process_event (%1)" +msgstr "" + +#: libs/ardour/session_export.cc:63 +msgid "Export: no output file specified" +msgstr "" + +#: libs/ardour/session_export.cc:164 libs/ardour/session_export.cc:169 +msgid "illegal frame range in export specification" +msgstr "" + +#: libs/ardour/session_export.cc:174 +msgid "Bad data width size. Report me!" +msgstr "" + +#: libs/ardour/session_export.cc:204 +msgid "Export: cannot open output file \"%1\" (%2)" +msgstr "" + +#: libs/ardour/session_export.cc:214 +msgid "cannot initialize sample rate conversion: %1" +msgstr "" + +#: libs/ardour/session_export.cc:316 +msgid "an error occured during sample rate conversion: %1" +msgstr "" + +#: libs/ardour/session_export.cc:327 +msgid "warning, leftover frames overflowed, glitches might occur in output" +msgstr "" + +#: libs/ardour/session_export.cc:418 +msgid "Export: could not write data to output file (%1)" +msgstr "" + +#: libs/ardour/session_export.cc:502 +msgid "%1: cannot seek to %2 for export" +msgstr "" + +#: libs/ardour/session_midi.cc:95 +msgid "Ardour is slaved to MTC - port cannot be reset" +msgstr "" + +#: libs/ardour/session_midi.cc:110 +msgid "unknown port %1 requested for MTC" +msgstr "" + +#: libs/ardour/session_midi.cc:435 +msgid "Error reading from MIDI port %1" +msgstr "" + +#: libs/ardour/session_midi.cc:804 +msgid "Session: could not send full MIDI time code" +msgstr "" + +#: libs/ardour/session_midi.cc:863 +msgid "Session: cannot send quarter-frame MTC message (%1)" +msgstr "" + +#: libs/ardour/session_midi.cc:971 +msgid "MMC: cannot send command %1%2%3" +msgstr "" + +#: libs/ardour/session_midi.cc:1078 +msgid "UI: cannot set O_NONBLOCK on signal read pipe (%1)" +msgstr "" + +#: libs/ardour/session_midi.cc:1083 +msgid "UI: cannot set O_NONBLOCK on signal write pipe (%1)" +msgstr "" + +#: libs/ardour/session_midi.cc:1088 +msgid "Session: could not create transport thread" +msgstr "" + +#: libs/ardour/session_midi.cc:1117 +msgid "cannot send signal to midi thread! (%1)" +msgstr "" + +#: libs/ardour/session_midi.cc:1212 +msgid "MIDI thread poll failed (%1)" +msgstr "" + +#: libs/ardour/session_midi.cc:1224 +msgid "Error on transport thread request pipe" +msgstr "" + +#: libs/ardour/session_midi.cc:1251 +msgid "Error reading from transport request pipe" +msgstr "" + +#: libs/ardour/session_process.cc:104 +msgid "Session: error in no roll for %1" +msgstr "" + +#: libs/ardour/session_state.cc:103 +msgid "Could not use path %1 (%s)" +msgstr "" + +#: libs/ardour/session_state.cc:131 +msgid "end" +msgstr "" + +#: libs/ardour/session_state.cc:132 +msgid "start" +msgstr "" + +#: libs/ardour/session_state.cc:443 +msgid "Session: cannot create session dir \"%1\" (%2)" +msgstr "" + +#: libs/ardour/session_state.cc:450 +msgid "Session: cannot create session peakfile dir \"%1\" (%2)" +msgstr "" + +#: libs/ardour/session_state.cc:457 +msgid "Session: cannot create session sounds dir \"%1\" (%2)" +msgstr "" + +#: libs/ardour/session_state.cc:464 +msgid "Session: cannot create session dead sounds dir \"%1\" (%2)" +msgstr "" + +#: libs/ardour/session_state.cc:471 +msgid "Session: cannot create session automation dir \"%1\" (%2)" +msgstr "" + +#: libs/ardour/session_state.cc:500 +msgid "Could not open %1 for writing mix template" +msgstr "" + +#: libs/ardour/session_state.cc:506 +msgid "Could not open mix template %1 for reading" +msgstr "" + +#: libs/ardour/session_state.cc:548 +msgid "Session: could not load diskstream via XML state" +msgstr "" + +#: libs/ardour/session_state.cc:597 +msgid "could not backup old state file, current state not saved." +msgstr "" + +#: libs/ardour/session_state.cc:612 +msgid "state could not be saved to %1" +msgstr "" + +#: libs/ardour/session_state.cc:619 +msgid "could not remove corrupt state file %1" +msgstr "" + +#: libs/ardour/session_state.cc:623 +msgid "could not restore state file from backup %1" +msgstr "" + +#: libs/ardour/session_state.cc:693 +msgid "%1: session state information file \"%2\" doesn't exist!" +msgstr "" + +#: libs/ardour/session_state.cc:704 libs/ardour/session_state.cc:2824 +msgid "Could not understand ardour file %1" +msgstr "" + +#: libs/ardour/session_state.cc:988 +msgid "programming error: Session: incorrect XML node sent to set_state()" +msgstr "" + +#: libs/ardour/session_state.cc:1047 +msgid "Session: XML state has no options section" +msgstr "" + +#: libs/ardour/session_state.cc:1051 +msgid "Session: XML state has no sources section" +msgstr "" + +#: libs/ardour/session_state.cc:1058 +msgid "Session: XML state has no Regions section" +msgstr "" + +#: libs/ardour/session_state.cc:1065 +msgid "Session: XML state has no playlists section" +msgstr "" + +#: libs/ardour/session_state.cc:1084 +msgid "Session: XML state has no diskstreams section" +msgstr "" + +#: libs/ardour/session_state.cc:1091 +msgid "Session: XML state has no connections section" +msgstr "" + +#: libs/ardour/session_state.cc:1098 +msgid "Session: XML state has no locations section" +msgstr "" + +#: libs/ardour/session_state.cc:1131 +msgid "Session: XML state has no edit groups section" +msgstr "" + +#: libs/ardour/session_state.cc:1138 +msgid "Session: XML state has no mix groups section" +msgstr "" + +#: libs/ardour/session_state.cc:1145 +msgid "Session: XML state has no Tempo Map section" +msgstr "" + +#: libs/ardour/session_state.cc:1152 +msgid "Session: XML state has no routes section" +msgstr "" + +#: libs/ardour/session_state.cc:1159 +msgid "Session: XML state has no click section" +msgstr "" + +#: libs/ardour/session_state.cc:1202 +msgid "Session: cannot create Route from XML description." +msgstr "" + +#: libs/ardour/session_state.cc:1243 +msgid "Session: cannot create Region from XML description." +msgstr "" + +#: libs/ardour/session_state.cc:1271 +msgid "Session: XMLNode describing a AudioRegion is incomplete (no source)" +msgstr "" + +#: libs/ardour/session_state.cc:1279 libs/ardour/session_state.cc:1300 +msgid "" +"Session: XMLNode describing a AudioRegion references an unknown source id =%1" +msgstr "" + +#: libs/ardour/session_state.cc:1285 libs/ardour/session_state.cc:1306 +msgid "" +"Session: XMLNode describing a AudioRegion references a non-audio source id =%" +"1" +msgstr "" + +#: libs/ardour/session_state.cc:1377 +msgid "Session: cannot create Source from XML description." +msgstr "" + +#: libs/ardour/session_state.cc:1396 +msgid "" +"Found a sound file that cannot be used by Ardour. Talk to the progammers." +msgstr "" + +#: libs/ardour/session_state.cc:1418 +msgid "Could not create mix templates directory \"%1\" (%2)" +msgstr "" + +#: libs/ardour/session_state.cc:1432 +msgid "Template \"%1\" already exists - new version not created" +msgstr "" + +#: libs/ardour/session_state.cc:1439 +msgid "mix template not saved" +msgstr "" + +#: libs/ardour/session_state.cc:1498 +msgid "cannot create session directory \"%1\"; ignored" +msgstr "" + +#: libs/ardour/session_state.cc:1509 +msgid "cannot create sounds directory \"%1\"; ignored" +msgstr "" + +#: libs/ardour/session_state.cc:1518 +msgid "cannot create dead sounds directory \"%1\"; ignored" +msgstr "" + +#: libs/ardour/session_state.cc:1527 +msgid "cannot create peak file directory \"%1\"; ignored" +msgstr "" + +#: libs/ardour/session_state.cc:1659 libs/ardour/session_state.cc:1680 +msgid "Session: cannot create Playlist from XML description." +msgstr "" + +#: libs/ardour/session_state.cc:1719 +msgid "Session: cannot create Named Selection from XML description." +msgstr "" + +#: libs/ardour/session_state.cc:1872 +msgid "Unknown node \"%1\" found in Connections list from state file" +msgstr "" + +#: libs/ardour/session_state.cc:2677 +msgid "cannot remove dead sound file %1 (%2)" +msgstr "" + +#: libs/ardour/session_state.cc:2778 +msgid "could not backup old history file, current history not saved." +msgstr "" + +#: libs/ardour/session_state.cc:2786 +msgid "history could not be saved to %1" +msgstr "" + +#: libs/ardour/session_state.cc:2794 +msgid "could not remove corrupt history file %1" +msgstr "" + +#: libs/ardour/session_state.cc:2798 +msgid "could not restore history file from backup %1" +msgstr "" + +#: libs/ardour/session_state.cc:2816 +msgid "Loading history from '%1'." +msgstr "" + +#: libs/ardour/session_state.cc:2819 +msgid "%1: session history file \"%2\" doesn't exist!" +msgstr "" + +#: libs/ardour/session_state.cc:2861 +msgid "Couldn't figure out how to make a Command out of a %1 XMLNode." +msgstr "" + +#: libs/ardour/session_time.cc:370 +msgid "Unknown JACK transport state %1 in sync callback" +msgstr "" + +#: libs/ardour/session_timefx.cc:79 +msgid "tempoize: error creating name for new audio file based on %1" +msgstr "" + +#: libs/ardour/session_timefx.cc:88 +msgid "tempoize: error creating new audio file %1 (%2)" +msgstr "" + +#: libs/ardour/session_timefx.cc:113 +msgid "tempoize: error reading data from %1" +msgstr "" + +#: libs/ardour/session_timefx.cc:126 libs/ardour/session_timefx.cc:138 +msgid "error writing tempo-adjusted data to %1" +msgstr "" + +#: libs/ardour/session_timefx.cc:144 +msgid "timefx code failure. please notify ardour-developers." +msgstr "" + +#: libs/ardour/session_transport.cc:117 +msgid "Cannot loop - no loop range defined" +msgstr "" + +#: libs/ardour/session_transport.cc:474 +msgid "" +"Seamless looping cannot be supported while Ardour is using JACK transport.\n" +"Recommend changing the configured options" +msgstr "" + +#: libs/ardour/session_transport.cc:743 +msgid "" +"Global varispeed cannot be supported while Ardour is connected to JACK " +"transport control" +msgstr "" + +#: libs/ardour/session_transport.cc:933 +msgid "please stop the transport before adjusting slave settings" +msgstr "" + +#: libs/ardour/session_transport.cc:966 +msgid "No MTC port defined: MTC slaving is impossible." +msgstr "" + +#: libs/ardour/sndfile_helpers.cc:15 +msgid "WAV" +msgstr "" + +#: libs/ardour/sndfile_helpers.cc:16 +msgid "AIFF" +msgstr "" + +#: libs/ardour/sndfile_helpers.cc:17 +msgid "raw (no header)" +msgstr "" + +#: libs/ardour/sndfile_helpers.cc:18 +msgid "PAF (Ensoniq Paris)" +msgstr "" + +#: libs/ardour/sndfile_helpers.cc:19 +msgid "AU (Sun/NeXT)" +msgstr "" + +#: libs/ardour/sndfile_helpers.cc:20 +msgid "IRCAM" +msgstr "" + +#: libs/ardour/sndfile_helpers.cc:21 +msgid "W64 (64 bit WAV)" +msgstr "" + +#: libs/ardour/sndfile_helpers.cc:26 +msgid ".wav" +msgstr "" + +#: libs/ardour/sndfile_helpers.cc:27 +msgid ".aiff" +msgstr "" + +#: libs/ardour/sndfile_helpers.cc:28 +msgid ".raw" +msgstr "" + +#: libs/ardour/sndfile_helpers.cc:29 +msgid ".paf" +msgstr "" + +#: libs/ardour/sndfile_helpers.cc:30 +msgid ".au" +msgstr "" + +#: libs/ardour/sndfile_helpers.cc:31 +msgid ".ircam" +msgstr "" + +#: libs/ardour/sndfile_helpers.cc:32 +msgid ".w64" +msgstr "" + +#: libs/ardour/sndfile_helpers.cc:47 +msgid "16 bit" +msgstr "" + +#: libs/ardour/sndfile_helpers.cc:48 +msgid "24 bit" +msgstr "" + +#: libs/ardour/sndfile_helpers.cc:49 +msgid "32 bit" +msgstr "" + +#: libs/ardour/sndfile_helpers.cc:50 +msgid "8 bit" +msgstr "" + +#: libs/ardour/sndfile_helpers.cc:51 +msgid "float" +msgstr "" + +#: libs/ardour/sndfile_helpers.cc:64 +msgid "Little-endian (Intel)" +msgstr "" + +#: libs/ardour/sndfile_helpers.cc:65 +msgid "Big-endian (Mac)" +msgstr "" + +#: libs/ardour/sndfilesource.cc:143 +msgid "FileSource: cannot get host information for BWF header (%1)" +msgstr "" + +#: libs/ardour/sndfilesource.cc:167 +msgid "" +"cannot set broadcast info for audio file %1 (%2); dropping broadcast info " +"for this file" +msgstr "" + +#: libs/ardour/sndfilesource.cc:216 +msgid "SndFileSource: cannot open file \"%1\" for %2 (%3)" +msgstr "" + +#: libs/ardour/sndfilesource.cc:222 +msgid "" +"SndFileSource: file only contains %1 channels; %2 is invalid as a channel " +"number" +msgstr "" + +#: libs/ardour/sndfilesource.cc:327 +msgid "SndFileSource: could not seek to frame %1 within %2 (%3)" +msgstr "" + +#: libs/ardour/sndfilesource.cc:378 +msgid "programming error: %1 %2" +msgstr "" + +#: libs/ardour/sndfilesource.cc:486 libs/ardour/sndfilesource.cc:507 +msgid "" +"cannot set broadcast info for audio file %1; Dropping broadcast info for " +"this file" +msgstr "" + +#: libs/ardour/sndfilesource.cc:521 +msgid "%1: cannot seek to %2" +msgstr "" + +#: libs/ardour/state_manager.cc:47 +msgid "cleared history" +msgstr "" + +#: libs/ardour/state_manager.cc:60 +msgid "" +"programming error: illegal state ID (%1) passed to StateManager::set_state() " +"(range = 0-%2)" +msgstr "" + +#: libs/ardour/tempo.cc:67 +msgid "TempoSection XML node has no \"start\" property" +msgstr "" + +#: libs/ardour/tempo.cc:75 +msgid "TempoSection XML node has an illegal \"start\" value" +msgstr "" + +#: libs/ardour/tempo.cc:82 +msgid "TempoSection XML node has no \"beats-per-minute\" property" +msgstr "" + +#: libs/ardour/tempo.cc:87 +msgid "TempoSection XML node has an illegal \"beats_per_minute\" value" +msgstr "" + +#: libs/ardour/tempo.cc:92 +msgid "TempoSection XML node has no \"movable\" property" +msgstr "" + +#: libs/ardour/tempo.cc:131 +msgid "MeterSection XML node has no \"start\" property" +msgstr "" + +#: libs/ardour/tempo.cc:139 +msgid "MeterSection XML node has an illegal \"start\" value" +msgstr "" + +#: libs/ardour/tempo.cc:146 +msgid "MeterSection XML node has no \"beats-per-bar\" property" +msgstr "" + +#: libs/ardour/tempo.cc:151 +msgid "MeterSection XML node has an illegal \"beats-per-bar\" value" +msgstr "" + +#: libs/ardour/tempo.cc:156 +msgid "MeterSection XML node has no \"note-type\" property" +msgstr "" + +#: libs/ardour/tempo.cc:161 +msgid "MeterSection XML node has an illegal \"note-type\" value" +msgstr "" + +#: libs/ardour/tempo.cc:166 +msgid "MeterSection XML node has no \"movable\" property" +msgstr "" + +#: libs/ardour/tempo.cc:259 +msgid "move metric" +msgstr "" + +#: libs/ardour/tempo.cc:330 +msgid "metric removed" +msgstr "" + +#: libs/ardour/tempo.cc:373 +msgid "add tempo" +msgstr "" + +#: libs/ardour/tempo.cc:402 +msgid "replace tempo" +msgstr "" + +#: libs/ardour/tempo.cc:435 +msgid "add meter" +msgstr "" + +#: libs/ardour/tempo.cc:463 +msgid "replaced meter" +msgstr "" + +#: libs/ardour/tempo.cc:483 libs/ardour/tempo.cc:499 +msgid "programming error: no tempo section in tempo map!" +msgstr "" + +#: libs/ardour/tempo.cc:538 +msgid "programming error: unhandled MetricSection type" +msgstr "" + +#: libs/ardour/tempo.cc:1265 libs/ardour/tempo.cc:1277 +msgid "Tempo map: could not set new state, restoring old one." +msgstr "" + +#: libs/ardour/tempo.cc:1301 +msgid "load XML data" +msgstr "" + +#: libs/ardour/utils.cc:237 +msgid "illegal or badly-formed string used for path (%1)" +msgstr "" + +#: libs/ardour/utils.cc:242 +msgid "path (%1) is ambiguous" +msgstr "" + +#: libs/ardour/utils.cc:304 libs/ardour/utils.cc:323 +msgid "Splice Edit" +msgstr "Fogredigering" + +#: libs/ardour/utils.cc:306 libs/ardour/utils.cc:319 +msgid "Slide Edit" +msgstr "Glidredigering" + +#: libs/ardour/utils.cc:309 +msgid "programming error: unknown edit mode string \"%1\"" +msgstr "" + +#: libs/ardour/utils.cc:330 libs/ardour/utils.cc:359 +msgid "Internal" +msgstr "Intern" + +#: libs/ardour/utils.cc:334 libs/ardour/utils.cc:355 +msgid "MTC" +msgstr "" + +#: libs/ardour/utils.cc:338 libs/ardour/utils.cc:352 +msgid "JACK" +msgstr "" + +#: libs/ardour/utils.cc:342 +msgid "programming error: unknown slave source string \"%1\"" +msgstr "" + +#: libs/ardour/vst_plugin.cc:178 +msgid "cannot create VST chunk directory: %1" +msgstr "" + +#: libs/ardour/vst_plugin.cc:186 +msgid "cannot check VST chunk directory: %1" +msgstr "" + +#: libs/ardour/vst_plugin.cc:193 +msgid "%1 exists but is not a directory" +msgstr "" + +#: libs/ardour/vst_plugin.cc:231 +msgid "Bad node sent to VSTPlugin::set_state" +msgstr "" + +#: libs/ardour/vst_plugin.cc:334 libs/ardour/vst_plugin.cc:345 +msgid "no support for presets using chunks at this time" +msgstr "" + +#: libs/ardour/vst_plugin.cc:495 +msgid "VST: cannot load module from \"%1\"" +msgstr "" + +#: libs/ardour/vst_plugin.cc:500 +msgid "You asked ardour to not use any VST plugins" +msgstr "" + +#: libs/ardour/audio_unit.cc:48 +msgid "AudioUnit: Could not convert CAComponent to CAAudioUnit" +msgstr "" diff --git a/libs/ardour/redirect.cc b/libs/ardour/redirect.cc index 09d650b069..adad79e2a3 100644 --- a/libs/ardour/redirect.cc +++ b/libs/ardour/redirect.cc @@ -108,101 +108,77 @@ Redirect::set_placement (const string& str, void *src) } } +/* NODE STRUCTURE + + <Automation [optionally with visible="...." ]> + <parameter-N> + <AutomationList id=N> + <events> + X1 Y1 + X2 Y2 + .... + </events> + </parameter-N> + <Automation> +*/ + int -Redirect::load_automation (string path) -{ - string fullpath; +Redirect::set_automation_state (const XMLNode& node) +{ + Glib::Mutex::Lock lm (_automation_lock); - if (path[0] == '/') { // legacy - fullpath = path; - } else { - fullpath = _session.automation_dir(); - fullpath += path; - } - ifstream in (fullpath.c_str()); + parameter_automation.clear (); - if (!in) { - warning << string_compose(_("%1: cannot open %2 to load automation data (%3)"), _name, fullpath, strerror (errno)) << endmsg; - return 1; - } + XMLNodeList nlist = node.children(); + XMLNodeIterator niter; - Glib::Mutex::Lock lm (_automation_lock); - set<uint32_t> tosave; - parameter_automation.clear (); + for (niter = nlist.begin(); niter != nlist.end(); ++niter) { + uint32_t param; - while (in) { - double when; - double value; - uint32_t port; + if (sscanf ((*niter)->name().c_str(), "parameter-%" PRIu32, ¶m) != 1) { + error << string_compose (_("%2: badly formatted node name in XML automation state, ignored"), _name) << endmsg; + continue; + } - in >> port; if (!in) break; - in >> when; if (!in) goto bad; - in >> value; if (!in) goto bad; - - AutomationList& al = automation_list (port); - al.add (when, value); - tosave.insert (port); - } - - for (set<uint32_t>::iterator i = tosave.begin(); i != tosave.end(); ++i) { - automation_list (*i).save_state (_("loaded from disk")); + AutomationList& al = automation_list (param); + if (al.set_state (*(*niter)->children().front())) { + goto bad; + } } - + return 0; bad: - error << string_compose(_("%1: cannot load automation data from %2"), _name, fullpath) << endmsg; + error << string_compose(_("%1: cannot load automation data from XML"), _name) << endmsg; parameter_automation.clear (); return -1; } -int -Redirect::save_automation (string path) +XMLNode& +Redirect::get_automation_state () { Glib::Mutex::Lock lm (_automation_lock); + XMLNode* node = new XMLNode (X_("Automation")); string fullpath; if (parameter_automation.empty()) { - return 1; - } - - fullpath = _session.automation_dir(); - fullpath += path; - - ofstream out (fullpath.c_str()); - - if (!out) { - error << string_compose(_("%1: cannot open %2 to store automation data (%3)"), _name, fullpath, strerror (errno)) << endmsg; - return -1; + return *node; } - AutomationList::const_iterator i; map<uint32_t,AutomationList*>::iterator li; for (li = parameter_automation.begin(); li != parameter_automation.end(); ++li) { - for (i = (*li).second->begin(); i != (*li).second->end(); ++i) { - - out << (*li).first << ' ' << (*i)->when << ' ' << (*i)->value << endl; - - if (!out) { - break; - } - } + + XMLNode* child; - if (i != (*li).second->end()) { - unlink (fullpath.c_str()); - error << string_compose(_("%1: could not save automation state to %2"), _name, fullpath) << endmsg; - return -1; - } - } - - if (li != parameter_automation.end()) { - unlink (fullpath.c_str()); - error << string_compose(_("%1: could not save automation state to %2"), _name, fullpath) << endmsg; - return -1; + char buf[64]; + stringstream str; + snprintf (buf, sizeof (buf), "parameter-%" PRIu32, li->first); + child = new XMLNode (buf); + child->add_child_nocopy (li->second->get_state ()); } - return 0; + return *node; } XMLNode& @@ -214,7 +190,6 @@ Redirect::get_state (void) XMLNode& Redirect::state (bool full_state) { - char buf[64]; XMLNode* node = new XMLNode (state_node_name); stringstream sstr; @@ -228,65 +203,24 @@ Redirect::state (bool full_state) if (full_state) { - string path; - string legal_name; + XMLNode& automation = get_automation_state(); - path = _session.snap_name(); - path += "-redirect-"; - id().print (buf, sizeof (buf)); - path += buf; - path += ".automation"; - - /* XXX we didn't ask for a state save, we asked for the current state. - FIX ME! - */ - - switch (save_automation (path)) { - case -1: - error << string_compose(_("Could not get state from Redirect (%1). Problem with save_automation"), _name) << endmsg; - break; - - case 0: - XMLNode *aevents = node->add_child("Automation"); - - for (set<uint32_t>::iterator x = visible_parameter_automation.begin(); x != visible_parameter_automation.end(); ++x) { - if (x != visible_parameter_automation.begin()) { - sstr << ' '; - } - sstr << *x; + for (set<uint32_t>::iterator x = visible_parameter_automation.begin(); x != visible_parameter_automation.end(); ++x) { + if (x != visible_parameter_automation.begin()) { + sstr << ' '; } - - aevents->add_property ("path", path); - aevents->add_property ("visible", sstr.str()); - break; + sstr << *x; } - } - return *node; -} + automation.add_property ("visible", sstr.str()); -void -Redirect::what_has_automation (set<uint32_t>& s) const -{ - Glib::Mutex::Lock lm (_automation_lock); - map<uint32_t,AutomationList*>::const_iterator li; - - for (li = parameter_automation.begin(); li != parameter_automation.end(); ++li) { - s.insert ((*li).first); + node->add_child_nocopy (automation); } -} -void -Redirect::what_has_visible_automation (set<uint32_t>& s) const -{ - Glib::Mutex::Lock lm (_automation_lock); - set<uint32_t>::const_iterator li; - - for (li = visible_parameter_automation.begin(); li != visible_parameter_automation.end(); ++li) { - s.insert (*li); - } + return *node; } + int Redirect::set_state (const XMLNode& node) { @@ -308,14 +242,15 @@ Redirect::set_state (const XMLNode& node) IO::set_state (**niter); have_io = true; - } else if ((*niter)->name() == "Automation") { + } else if ((*niter)->name() == X_("Automation")) { + XMLProperty *prop; if ((prop = (*niter)->property ("path")) != 0) { - load_automation (prop->value()); + old_set_automation_state (*(*niter)); } else { - warning << string_compose(_("%1: Automation node has no path property"), _name) << endmsg; + set_automation_state (*(*niter)); } if ((prop = (*niter)->property ("visible")) != 0) { @@ -364,6 +299,102 @@ Redirect::set_state (const XMLNode& node) return 0; } +int +Redirect::old_set_automation_state (const XMLNode& node) +{ + const XMLProperty *prop; + + if ((prop = node.property ("path")) != 0) { + load_automation (prop->value()); + } else { + warning << string_compose(_("%1: Automation node has no path property"), _name) << endmsg; + } + + if ((prop = node.property ("visible")) != 0) { + uint32_t what; + stringstream sstr; + + visible_parameter_automation.clear (); + + sstr << prop->value(); + while (1) { + sstr >> what; + if (sstr.fail()) { + break; + } + mark_automation_visible (what, true); + } + } + + return 0; +} + +int +Redirect::load_automation (string path) +{ + string fullpath; + + if (path[0] == '/') { // legacy + fullpath = path; + } else { + fullpath = _session.automation_dir(); + fullpath += path; + } + ifstream in (fullpath.c_str()); + + if (!in) { + warning << string_compose(_("%1: cannot open %2 to load automation data (%3)"), _name, fullpath, strerror (errno)) << endmsg; + return 1; + } + + Glib::Mutex::Lock lm (_automation_lock); + set<uint32_t> tosave; + parameter_automation.clear (); + + while (in) { + double when; + double value; + uint32_t port; + + in >> port; if (!in) break; + in >> when; if (!in) goto bad; + in >> value; if (!in) goto bad; + + AutomationList& al = automation_list (port); + al.add (when, value); + tosave.insert (port); + } + + return 0; + + bad: + error << string_compose(_("%1: cannot load automation data from %2"), _name, fullpath) << endmsg; + parameter_automation.clear (); + return -1; +} + + +void +Redirect::what_has_automation (set<uint32_t>& s) const +{ + Glib::Mutex::Lock lm (_automation_lock); + map<uint32_t,AutomationList*>::const_iterator li; + + for (li = parameter_automation.begin(); li != parameter_automation.end(); ++li) { + s.insert ((*li).first); + } +} + +void +Redirect::what_has_visible_automation (set<uint32_t>& s) const +{ + Glib::Mutex::Lock lm (_automation_lock); + set<uint32_t>::const_iterator li; + + for (li = visible_parameter_automation.begin(); li != visible_parameter_automation.end(); ++li) { + s.insert (*li); + } +} AutomationList& Redirect::automation_list (uint32_t parameter) { @@ -437,34 +468,9 @@ Redirect::find_next_event (nframes_t now, nframes_t end, ControlEvent& next_even } void -Redirect::store_state (RedirectState& state) const -{ - state.active = _active; -} - -Change -Redirect::restore_state (StateManager::State& state) -{ - RedirectState* rstate = dynamic_cast<RedirectState*> (&state); - set_active (rstate->active, this); - return Change (0); -} - -StateManager::State* -Redirect::state_factory (std::string why) const -{ - RedirectState* state = new RedirectState (why); - - store_state (*state); - - return state; -} - -void Redirect::set_active (bool yn, void* src) { _active = yn; - save_state (_("active_changed")); active_changed (this, src); _session.set_dirty (); } diff --git a/libs/ardour/region.cc b/libs/ardour/region.cc index 3853559e10..6d8c71b563 100644 --- a/libs/ardour/region.cc +++ b/libs/ardour/region.cc @@ -265,13 +265,43 @@ Region::Region (boost::shared_ptr<Source> src, const XMLNode& node) Region::~Region () { - /* derived classes must call notify_callbacks() and then emit GoingAway */ + if (_playlist) { + for (SourceList::const_iterator i = _sources.begin(); i != _sources.end(); ++i) { + (*i)->remove_playlist (_playlist); + } + } + + notify_callbacks (); + GoingAway (); /* EMIT SIGNAL */ } void Region::set_playlist (Playlist* pl) { - _playlist = pl; + if (pl == _playlist) { + return; + } + + Playlist* old_playlist = _playlist; + + if (pl) { + if (old_playlist) { + for (SourceList::const_iterator i = _sources.begin(); i != _sources.end(); ++i) { + (*i)->remove_playlist (old_playlist); + (*i)->add_playlist (_playlist); + } + } else { + for (SourceList::const_iterator i = _sources.begin(); i != _sources.end(); ++i) { + (*i)->add_playlist (_playlist); + } + } + } else { + if (old_playlist) { + for (SourceList::const_iterator i = _sources.begin(); i != _sources.end(); ++i) { + (*i)->remove_playlist (old_playlist); + } + } + } } void @@ -337,6 +367,24 @@ Region::first_edit () } } +bool +Region::at_natural_position () const +{ + if (!_playlist) { + return false; + } + + boost::shared_ptr<Region> whole_file_region = get_parent(); + + if (whole_file_region) { + if (_position == whole_file_region->position() + _start) { + return true; + } + } + + return false; +} + void Region::move_to_natural_position (void *src) { @@ -1180,14 +1228,17 @@ Region::verify_start_mutable (jack_nframes_t& new_start) } boost::shared_ptr<Region> -Region::get_parent() +Region::get_parent() const { - boost::shared_ptr<Region> r; - if (_playlist) { - r = _playlist->session().find_whole_file_parent (*this); + boost::shared_ptr<Region> r; + boost::shared_ptr<Region const> grrr2 = boost::dynamic_pointer_cast<Region const> (shared_from_this()); + + if (grrr2 && (r = _playlist->session().find_whole_file_parent (grrr2))) { + return boost::static_pointer_cast<Region> (r); + } } - return r; + return boost::shared_ptr<Region>(); } diff --git a/libs/ardour/route.cc b/libs/ardour/route.cc index 308dbb57cb..5314c99632 100644 --- a/libs/ardour/route.cc +++ b/libs/ardour/route.cc @@ -63,13 +63,13 @@ Route::Route (Session& sess, string name, int input_min, int input_max, int outp init (); } -Route::Route (Session& sess, const XMLNode& node) - : IO (sess, "route"), +Route::Route (Session& sess, const XMLNode& node, DataType default_type) + : IO (sess, *node.child ("IO"), default_type), _solo_control (X_("solo"), *this, ToggleControllable::SoloControl), _mute_control (X_("mute"), *this, ToggleControllable::MuteControl) { init (); - set_state (node); + _set_state (node, false); } void @@ -1313,7 +1313,6 @@ XMLNode& Route::state(bool full_state) { XMLNode *node = new XMLNode("Route"); - XMLNode *aevents; RedirectList:: iterator i; char buf[32]; @@ -1374,26 +1373,6 @@ Route::state(bool full_state) cmt->add_content (_comment); } - if (full_state) { - string path; - - path = _session.snap_name(); - path += "-gain-"; - path += legalize_for_path (_name); - path += ".automation"; - - /* XXX we didn't ask for a state save, we asked for the current state. - FIX ME! - */ - - if (save_automation (path)) { - error << _("Could not get state of route. Problem with save_automation") << endmsg; - } - - aevents = node->add_child ("Automation"); - aevents->add_property ("path", path); - } - for (i = _redirects.begin(); i != _redirects.end(); ++i) { node->add_child_nocopy((*i)->state (full_state)); } @@ -1481,6 +1460,12 @@ Route::add_redirect_from_xml (const XMLNode& node) int Route::set_state (const XMLNode& node) { + return _set_state (node, true); +} + +int +Route::_set_state (const XMLNode& node, bool call_base) +{ XMLNodeList nlist; XMLNodeConstIterator niter; XMLNode *child; @@ -1492,7 +1477,7 @@ Route::set_state (const XMLNode& node) return -1; } - if ((prop = node.property ("flags")) != 0) { + if ((prop = node.property (X_("flags"))) != 0) { int x; sscanf (prop->value().c_str(), "0x%x", &x); _flags = Flag (x); @@ -1500,20 +1485,20 @@ Route::set_state (const XMLNode& node) _flags = Flag (0); } - if ((prop = node.property ("default-type")) != 0) { + if ((prop = node.property (X_("default-type"))) != 0) { _default_type = DataType(prop->value()); assert(_default_type != DataType::NIL); } - if ((prop = node.property ("phase-invert")) != 0) { + if ((prop = node.property (X_("phase-invert"))) != 0) { set_phase_invert(prop->value()=="yes"?true:false, this); } - if ((prop = node.property ("active")) != 0) { + if ((prop = node.property (X_("active"))) != 0) { set_active (prop->value() == "yes"); } - if ((prop = node.property ("muted")) != 0) { + if ((prop = node.property (X_("muted"))) != 0) { bool yn = prop->value()=="yes"?true:false; /* force reset of mute status */ @@ -1523,7 +1508,7 @@ Route::set_state (const XMLNode& node) mute_gain = desired_mute_gain; } - if ((prop = node.property ("soloed")) != 0) { + if ((prop = node.property (X_("soloed"))) != 0) { bool yn = prop->value()=="yes"?true:false; /* force reset of solo status */ @@ -1533,23 +1518,23 @@ Route::set_state (const XMLNode& node) solo_gain = desired_solo_gain; } - if ((prop = node.property ("mute-affects-pre-fader")) != 0) { + if ((prop = node.property (X_("mute-affects-pre-fader"))) != 0) { _mute_affects_pre_fader = (prop->value()=="yes")?true:false; } - if ((prop = node.property ("mute-affects-post-fader")) != 0) { + if ((prop = node.property (X_("mute-affects-post-fader"))) != 0) { _mute_affects_post_fader = (prop->value()=="yes")?true:false; } - if ((prop = node.property ("mute-affects-control-outs")) != 0) { + if ((prop = node.property (X_("mute-affects-control-outs"))) != 0) { _mute_affects_control_outs = (prop->value()=="yes")?true:false; } - if ((prop = node.property ("mute-affects-main-outs")) != 0) { + if ((prop = node.property (X_("mute-affects-main-outs"))) != 0) { _mute_affects_main_outs = (prop->value()=="yes")?true:false; } - if ((prop = node.property ("edit-group")) != 0) { + if ((prop = node.property (X_("edit-group"))) != 0) { RouteGroup* edit_group = _session.edit_group_by_name(prop->value()); if(edit_group == 0) { error << string_compose(_("Route %1: unknown edit group \"%2 in saved state (ignored)"), _name, prop->value()) << endmsg; @@ -1558,7 +1543,7 @@ Route::set_state (const XMLNode& node) } } - if ((prop = node.property ("order-keys")) != 0) { + if ((prop = node.property (X_("order-keys"))) != 0) { long n; @@ -1595,7 +1580,7 @@ Route::set_state (const XMLNode& node) delete deferred_state; } - deferred_state = new XMLNode("deferred state"); + deferred_state = new XMLNode(X_("deferred state")); /* set parent class properties before anything else */ @@ -1603,7 +1588,7 @@ Route::set_state (const XMLNode& node) child = *niter; - if (child->name() == IO::state_node_name) { + if (child->name() == IO::state_node_name && call_base) { IO::set_state (*child); break; @@ -1614,7 +1599,7 @@ Route::set_state (const XMLNode& node) child = *niter; - if (child->name() == "Send") { + if (child->name() == X_("Send")) { if (!IO::ports_legal) { @@ -1625,7 +1610,7 @@ Route::set_state (const XMLNode& node) add_redirect_from_xml (*child); } - } else if (child->name() == "Insert") { + } else if (child->name() == X_("Insert")) { if (!IO::ports_legal) { @@ -1636,21 +1621,13 @@ Route::set_state (const XMLNode& node) add_redirect_from_xml (*child); } - } else if (child->name() == "Automation") { - - XMLPropertyList plist; - XMLPropertyConstIterator piter; - XMLProperty *prop; + } else if (child->name() == X_("Automation")) { - plist = child->properties(); - for (piter = plist.begin(); piter != plist.end(); ++piter) { - prop = *piter; - if (prop->name() == "path") { - load_automation (prop->value()); - } + if ((prop = child->property (X_("path"))) != 0) { + load_automation (prop->value()); } - } else if (child->name() == "ControlOuts") { + } else if (child->name() == X_("ControlOuts")) { string coutname = _name; coutname += _("[control]"); @@ -1658,25 +1635,25 @@ Route::set_state (const XMLNode& node) _control_outs = new IO (_session, coutname); _control_outs->set_state (**(child->children().begin())); - } else if (child->name() == "Comment") { + } else if (child->name() == X_("Comment")) { /* XXX this is a terrible API design in libxml++ */ XMLNode *cmt = *(child->children().begin()); _comment = cmt->content(); - } else if (child->name() == "extra") { + } else if (child->name() == X_("extra")) { _extra_xml = new XMLNode (*child); - } else if (child->name() == "solo") { + } else if (child->name() == X_("solo")) { _solo_control.set_state (*child); _session.add_controllable (&_solo_control); - } else if (child->name() == "mute") { + } else if (child->name() == X_("mute")) { _mute_control.set_state (*child); _session.add_controllable (&_mute_control); } } - if ((prop = node.property ("mix-group")) != 0) { + if ((prop = node.property (X_("mix-group"))) != 0) { RouteGroup* mix_group = _session.mix_group_by_name(prop->value()); if (mix_group == 0) { error << string_compose(_("Route %1: unknown mix group \"%2 in saved state (ignored)"), _name, prop->value()) << endmsg; @@ -1936,6 +1913,10 @@ Route::handle_transport_stopped (bool abort_ignored, bool did_locate, bool can_f { Glib::RWLock::ReaderLock lm (redirect_lock); + if (!did_locate) { + automation_snapshot (now); + } + for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) { if (Config->get_plugins_stop_with_transport() && can_flush_redirects) { @@ -1952,19 +1933,6 @@ Route::handle_transport_stopped (bool abort_ignored, bool did_locate, bool can_f _roll_delay = _initial_delay; } -UndoAction -Route::get_memento() const -{ - void (Route::*pmf)(state_id_t) = &Route::set_state; - return sigc::bind (mem_fun (*(const_cast<Route *>(this)), pmf), _current_state_id); -} - -void -Route::set_state (state_id_t id) -{ - return; -} - void Route::input_change_handler (IOChange change, void *ignored) { @@ -2048,6 +2016,15 @@ int Route::roll (nframes_t nframes, nframes_t start_frame, nframes_t end_frame, nframes_t offset, int declick, bool can_record, bool rec_monitors_input) { + { + Glib::RWLock::ReaderLock lm (redirect_lock, Glib::TRY_LOCK); + if (lm.locked()) { + // automation snapshot can also be called from the non-rt context + // and it uses the redirect list, so we take the lock out here + automation_snapshot (_session.transport_frame()); + } + } + if ((n_outputs().get_total() == 0 && _redirects.empty()) || n_inputs().get_total() == 0 || !_active) { silence (nframes, offset); return 0; @@ -2181,6 +2158,16 @@ Route::set_latency_delay (nframes_t longest_session_latency) } } +void +Route::automation_snapshot (nframes_t now) +{ + IO::automation_snapshot (now); + + for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) { + (*i)->automation_snapshot (now); + } +} + Route::ToggleControllable::ToggleControllable (std::string name, Route& s, ToggleType tp) : Controllable (name), route (s), type(tp) { diff --git a/libs/ardour/send.cc b/libs/ardour/send.cc index 2c2a152416..73dbf11ad5 100644 --- a/libs/ardour/send.cc +++ b/libs/ardour/send.cc @@ -37,7 +37,6 @@ Send::Send (Session& s, Placement p) : Redirect (s, s.next_send_name(), p) { _metering = false; - save_state (_("initial state")); RedirectCreated (this); /* EMIT SIGNAL */ } @@ -50,7 +49,6 @@ Send::Send (Session& s, const XMLNode& node) throw failed_constructor(); } - save_state (_("initial state")); RedirectCreated (this); /* EMIT SIGNAL */ } @@ -58,7 +56,6 @@ Send::Send (const Send& other) : Redirect (other._session, other._session.next_send_name(), other.placement()) { _metering = false; - save_state (_("initial state")); RedirectCreated (this); /* EMIT SIGNAL */ } @@ -77,7 +74,7 @@ XMLNode& Send::state(bool full) { XMLNode *node = new XMLNode("Send"); - node->add_child_nocopy (Redirect::state(full)); + node->add_child_nocopy (Redirect::state (full)); return *node; } @@ -86,11 +83,15 @@ Send::set_state(const XMLNode& node) { XMLNodeList nlist = node.children(); XMLNodeIterator niter; - + + /* Send has regular IO automation (gain, pan) */ + for (niter = nlist.begin(); niter != nlist.end(); ++niter) { if ((*niter)->name() == Redirect::state_node_name) { Redirect::set_state (**niter); break; + } else if ((*niter)->name() == X_("Automation")) { + IO::set_automation_state (*(*niter)); } } diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc index 11cb658008..1b7c3be6dd 100644 --- a/libs/ardour/session.cc +++ b/libs/ardour/session.cc @@ -288,7 +288,7 @@ Session::Session (AudioEngine &eng, new_session = !g_file_test (_path.c_str(), GFileTest (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR)); if (new_session) { - if (create (new_session, mix_template, _engine.frame_rate() * 60 * 5)) { + if (create (new_session, mix_template, compute_initial_length())) { cerr << "create failed\n"; throw failed_constructor (); } @@ -342,12 +342,21 @@ Session::Session (AudioEngine &eng, cerr << "Loading session " << fullpath << " using snapshot " << snapshot_name << " (2)" << endl; - n_physical_outputs = max (requested_physical_out, _engine.n_physical_outputs()); - n_physical_inputs = max (requested_physical_in, _engine.n_physical_inputs()); + n_physical_outputs = _engine.n_physical_outputs(); + n_physical_inputs = _engine.n_physical_inputs(); + + if (n_physical_inputs) { + n_physical_inputs = max (requested_physical_in, n_physical_inputs); + } + + if (n_physical_outputs) { + n_physical_outputs = max (requested_physical_out, n_physical_outputs); + } first_stage_init (fullpath, snapshot_name); new_session = !g_file_test (_path.c_str(), GFileTest (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR)); + if (new_session) { if (create (new_session, 0, initial_length)) { throw failed_constructor (); @@ -410,7 +419,7 @@ Session::~Session () /* clear history so that no references to objects are held any more */ - history.clear (); + _history.clear (); /* clear state tree so that no references to objects are held any more */ @@ -1331,8 +1340,10 @@ Session::set_frame_rate (nframes_t frames_per_second) sync_time_vars(); + Route::set_automation_interval ((jack_nframes_t) ceil ((double) frames_per_second * 0.25)); + // XXX we need some equivalent to this, somehow - // DestructiveFileSource::setup_standard_crossfades (frames_per_second); + // SndFileSource::setup_standard_crossfades (frames_per_second); set_dirty(); @@ -1824,12 +1835,12 @@ Session::new_audio_route (int input_channels, int output_channels, uint32_t how_ << endmsg; } - for (uint32_t x = 0; x < bus->n_inputs().get(DataType::AUDIO); ++x) { + for (uint32_t x = 0; n_physical_inputs && x < bus->n_inputs().get(DataType::AUDIO); ++x) { port = ""; - + if (Config->get_input_auto_connect() & AutoConnectPhysical) { - port = physinputs[((n+x)%n_physical_inputs)]; + port = physinputs[((n+x)%n_physical_inputs)]; } if (port.length() && bus->connect_input (bus->input (x), port, this)) { @@ -1837,7 +1848,7 @@ Session::new_audio_route (int input_channels, int output_channels, uint32_t how_ } } - for (uint32_t x = 0; x < bus->n_outputs().get(DataType::AUDIO); ++x) { + for (uint32_t x = 0; n_physical_outputs && x < bus->n_outputs().get(DataType::AUDIO); ++x) { port = ""; @@ -1950,8 +1961,9 @@ Session::remove_route (shared_ptr<Route> route) { RCUWriter<RouteList> writer (routes); shared_ptr<RouteList> rs = writer.get_copy (); - rs->remove (route); + rs->remove (route); + /* deleting the master out seems like a dumb idea, but its more of a UI policy issue than our concern. @@ -2564,7 +2576,7 @@ Session::remove_region (boost::weak_ptr<Region> weak_region) } boost::shared_ptr<Region> -Session::find_whole_file_parent (Region& child) +Session::find_whole_file_parent (boost::shared_ptr<Region const> child) { RegionList::iterator i; boost::shared_ptr<Region> region; @@ -2577,13 +2589,13 @@ Session::find_whole_file_parent (Region& child) if (region->whole_file()) { - if (child.source_equivalent (region)) { + if (child->source_equivalent (region)) { return region; } } } - return boost::shared_ptr<AudioRegion> (); + return boost::shared_ptr<Region> (); } void @@ -2596,32 +2608,38 @@ Session::find_equivalent_playlist_regions (boost::shared_ptr<Region> region, vec int Session::destroy_region (boost::shared_ptr<Region> region) { - boost::shared_ptr<AudioRegion> aregion; - - if ((aregion = boost::dynamic_pointer_cast<AudioRegion> (region)) == 0) { - return 0; - } - - if (aregion->playlist()) { - aregion->playlist()->destroy_region (region); - } - vector<boost::shared_ptr<Source> > srcs; - - for (uint32_t n = 0; n < aregion->n_channels(); ++n) { - srcs.push_back (aregion->source (n)); + + { + boost::shared_ptr<AudioRegion> aregion; + + if ((aregion = boost::dynamic_pointer_cast<AudioRegion> (region)) == 0) { + return 0; + } + + if (aregion->playlist()) { + aregion->playlist()->destroy_region (region); + } + + for (uint32_t n = 0; n < aregion->n_channels(); ++n) { + srcs.push_back (aregion->source (n)); + } } + region->drop_references (); + for (vector<boost::shared_ptr<Source> >::iterator i = srcs.begin(); i != srcs.end(); ++i) { - - if ((*i).use_count() == 1) { - boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*i); + if (!(*i)->used()) { + boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*i); + if (afs) { (afs)->mark_for_remove (); } (*i)->drop_references (); + + cerr << "source was not used by any playlist\n"; } } @@ -3198,6 +3216,20 @@ Session::add_playlist (Playlist* playlist) } void +Session::get_playlists (vector<Playlist*>& s) +{ + { + Glib::Mutex::Lock lm (playlist_lock); + for (PlaylistList::iterator i = playlists.begin(); i != playlists.end(); ++i) { + s.push_back (*i); + } + for (PlaylistList::iterator i = unused_playlists.begin(); i != unused_playlists.end(); ++i) { + s.push_back (*i); + } + } +} + +void Session::track_playlist (Playlist* pl, bool inuse) { PlaylistList::iterator x; @@ -3970,13 +4002,14 @@ Session::nbusses () const } void -Session::add_curve(Curve *curve) +Session::add_automation_list(AutomationList *al) { - curves[curve->id()] = curve; + automation_lists[al->id()] = al; } -void -Session::add_automation_list(AutomationList *al) +nframes_t +Session::compute_initial_length () { - automation_lists[al->id()] = al; + return _engine.frame_rate() * 60 * 5; } + diff --git a/libs/ardour/session_click.cc b/libs/ardour/session_click.cc index 5fd6d70983..f09c7232d7 100644 --- a/libs/ardour/session_click.cc +++ b/libs/ardour/session_click.cc @@ -84,7 +84,7 @@ Session::click (nframes_t start, nframes_t nframes, nframes_t offset) break; } } - + run_clicks: memset (buf, 0, sizeof (Sample) * nframes); diff --git a/libs/ardour/session_command.cc b/libs/ardour/session_command.cc index d71ba34fc7..5816f1c6b7 100644 --- a/libs/ardour/session_command.cc +++ b/libs/ardour/session_command.cc @@ -3,9 +3,13 @@ #include <pbd/memento_command.h> #include <ardour/diskstream.h> #include <ardour/playlist.h> +#include <ardour/audioplaylist.h> +#include <ardour/audio_track.h> #include <ardour/tempo.h> #include <ardour/audiosource.h> #include <ardour/audioregion.h> +#include <ardour/midi_source.h> +#include <ardour/midi_region.h> #include <pbd/error.h> using namespace PBD; #include "i18n.h" @@ -13,7 +17,7 @@ using namespace PBD; namespace ARDOUR { -void Session::register_with_memento_command_factory(PBD::ID id, StatefulDestructible *ptr) +void Session::register_with_memento_command_factory(PBD::ID id, PBD::StatefulThingWithGoingAway *ptr) { registry[id] = ptr; } @@ -49,41 +53,37 @@ Command *Session::memento_command_factory(XMLNode *n) { error << _("Tried to reconstitute a MementoCommand with no contents, failing. id=") << id.to_s() << endmsg; return 0; - } - - - /* create command */ - string obj_T = n->children().front()->name(); - if (obj_T == "AudioRegion" || obj_T == "MidiRegion" || obj_T == "Region") { + } + + /* create command */ + string obj_T = n->property ("type_name")->value(); + if (obj_T == typeid (AudioRegion).name() || obj_T == typeid (MidiRegion).name() || obj_T == typeid (Region).name()) { if (regions.count(id)) return new MementoCommand<Region>(*regions[id], before, after); - } else if (obj_T == "AudioSource" || obj_T == "MidiSource") { + } else if (obj_T == typeid (AudioSource).name() || obj_T == typeid (MidiSource).name()) { if (sources.count(id)) return new MementoCommand<Source>(*sources[id], before, after); - } else if (obj_T == "Location") { + } else if (obj_T == typeid (Location).name()) { return new MementoCommand<Location>(*_locations.get_location_by_id(id), before, after); - } else if (obj_T == "Locations") { + } else if (obj_T == typeid (Locations).name()) { return new MementoCommand<Locations>(_locations, before, after); - } else if (obj_T == "TempoMap") { + } else if (obj_T == typeid (TempoMap).name()) { return new MementoCommand<TempoMap>(*_tempo_map, before, after); - } else if (obj_T == "Playlist" || obj_T == "AudioPlaylist") { + } else if (obj_T == typeid (Playlist).name() || obj_T == typeid (AudioPlaylist).name()) { if (Playlist *pl = playlist_by_name(child->property("name")->value())) return new MementoCommand<Playlist>(*pl, before, after); - } else if (obj_T == "Route") { // includes AudioTrack + } else if (obj_T == typeid (Route).name() || obj_T == typeid (AudioTrack).name()) { return new MementoCommand<Route>(*route_by_id(id), before, after); - } else if (obj_T == "Curve") { - if (curves.count(id)) - return new MementoCommand<Curve>(*curves[id], before, after); - } else if (obj_T == "AutomationList") { + } else if (obj_T == typeid (Curve).name() || obj_T == typeid (AutomationList).name()) { if (automation_lists.count(id)) return new MementoCommand<AutomationList>(*automation_lists[id], before, after); } else if (registry.count(id)) { // For Editor and AutomationLine which are off-limits here - return new MementoCommand<StatefulDestructible>(*registry[id], before, after); + return new MementoCommand<PBD::StatefulThingWithGoingAway>(*registry[id], before, after); } /* we failed */ - error << _("could not reconstitute MementoCommand from XMLNode. id=") << id.to_s() << endmsg; - return 0; + error << string_compose (_("could not reconstitute MementoCommand from XMLNode. object type = %1 id = %2"), obj_T, id.to_s()) << endmsg; + return 0 ; } // solo diff --git a/libs/ardour/session_state.cc b/libs/ardour/session_state.cc index ff79a47e6b..bcc9b730ba 100644 --- a/libs/ardour/session_state.cc +++ b/libs/ardour/session_state.cc @@ -195,7 +195,7 @@ Session::first_stage_init (string fullpath, string snapshot_name) /* default short fade = 15ms */ Crossfade::set_short_xfade_length ((nframes_t) floor (Config->get_short_xfade_seconds() * frame_rate())); - DestructiveFileSource::setup_standard_crossfades (frame_rate()); + SndFileSource::setup_standard_crossfades (frame_rate()); last_mmc_step.tv_sec = 0; last_mmc_step.tv_usec = 0; @@ -250,10 +250,9 @@ Session::first_stage_init (string fullpath, string snapshot_name) Playlist::PlaylistCreated.connect (mem_fun (*this, &Session::add_playlist)); Redirect::RedirectCreated.connect (mem_fun (*this, &Session::add_redirect)); NamedSelection::NamedSelectionCreated.connect (mem_fun (*this, &Session::add_named_selection)); - Curve::CurveCreated.connect (mem_fun (*this, &Session::add_curve)); AutomationList::AutomationListCreated.connect (mem_fun (*this, &Session::add_automation_list)); - Controllable::GoingAway.connect (mem_fun (*this, &Session::remove_controllable)); + Controllable::Destroyed.connect (mem_fun (*this, &Session::remove_controllable)); IO::MoreChannels.connect (mem_fun (*this, &Session::ensure_buffers)); @@ -533,7 +532,6 @@ Session::create (bool& new_session, string* mix_template, nframes_t initial_leng _state_of_the_state = Clean; if (save_state (_current_snapshot_name)) { - save_history (_current_snapshot_name); return -1; } @@ -858,13 +856,15 @@ Session::state(bool full_state) boost::shared_ptr<AudioFileSource> fs; if ((fs = boost::dynamic_pointer_cast<AudioFileSource> (siter->second)) != 0) { - boost::shared_ptr<DestructiveFileSource> dfs = boost::dynamic_pointer_cast<DestructiveFileSource> (fs); /* Don't save sources that are empty, unless they're destructive (which are OK if they are empty, because we will re-use them every time.) */ - if ( ! dfs && siter->second->length() == 0) { - continue; + + if (!fs->destructive()) { + if (fs->length() == 0) { + continue; + } } } @@ -898,7 +898,20 @@ Session::state(bool full_state) } } - node->add_child_nocopy (_locations.get_state()); + if (full_state) { + node->add_child_nocopy (_locations.get_state()); + } else { + // for a template, just create a new Locations, populate it + // with the default start and end, and get the state for that. + Locations loc; + Location* start = new Location(0, 0, _("start"), Location::Flags ((Location::IsMark|Location::IsStart))); + Location* end = new Location(0, 0, _("end"), Location::Flags ((Location::IsMark|Location::IsEnd))); + start->set_end(0); + loc.add (start); + end->set_end(compute_initial_length()); + loc.add (end); + node->add_child_nocopy (loc.get_state()); + } child = node->add_child ("Connections"); { @@ -1026,8 +1039,6 @@ Session::set_state (const XMLNode& node) return -1; } - StateManager::prohibit_save (); - if ((prop = node.property ("name")) != 0) { _name = prop->value (); } @@ -1058,11 +1069,11 @@ Session::set_state (const XMLNode& node) Path extra Options/Config + Locations Sources AudioRegions AudioDiskstreams Connections - Locations Routes EditGroups MixGroups @@ -1085,6 +1096,39 @@ Session::set_state (const XMLNode& node) error << _("Session: XML state has no options section") << endmsg; } + if ((child = find_named_node (node, "Locations")) == 0) { + error << _("Session: XML state has no locations section") << endmsg; + goto out; + } else if (_locations.set_state (*child)) { + goto out; + } + + Location* location; + + if ((location = _locations.auto_loop_location()) != 0) { + set_auto_loop_location (location); + } + + if ((location = _locations.auto_punch_location()) != 0) { + set_auto_punch_location (location); + } + + if ((location = _locations.end_location()) == 0) { + _locations.add (end_location); + } else { + delete end_location; + end_location = location; + } + + if ((location = _locations.start_location()) == 0) { + _locations.add (start_location); + } else { + delete start_location; + start_location = location; + } + + AudioFileSource::set_header_position_offset (start_location->start()); + if ((child = find_named_node (node, "Sources")) == 0) { error << _("Session: XML state has no sources section") << endmsg; goto out; @@ -1132,39 +1176,6 @@ Session::set_state (const XMLNode& node) goto out; } - if ((child = find_named_node (node, "Locations")) == 0) { - error << _("Session: XML state has no locations section") << endmsg; - goto out; - } else if (_locations.set_state (*child)) { - goto out; - } - - Location* location; - - if ((location = _locations.auto_loop_location()) != 0) { - set_auto_loop_location (location); - } - - if ((location = _locations.auto_punch_location()) != 0) { - set_auto_punch_location (location); - } - - if ((location = _locations.end_location()) == 0) { - _locations.add (end_location); - } else { - delete end_location; - end_location = location; - } - - if ((location = _locations.start_location()) == 0) { - _locations.add (start_location); - } else { - delete start_location; - start_location = location; - } - - _locations.save_state (_("initial state")); - if ((child = find_named_node (node, "EditGroups")) == 0) { error << _("Session: XML state has no edit groups section") << endmsg; goto out; @@ -1209,8 +1220,6 @@ Session::set_state (const XMLNode& node) _state_of_the_state = Clean; - StateManager::allow_save (_("initial state"), true); - if (state_was_pending) { save_state (_current_snapshot_name); remove_pending_capture_state (); @@ -1220,8 +1229,6 @@ Session::set_state (const XMLNode& node) return 0; out: - /* we failed, re-enable state saving but don't actually save internal state */ - StateManager::allow_save (X_("ignored"), false); return ret; } @@ -2210,7 +2217,7 @@ Session::commit_reversible_command (Command *cmd) gettimeofday (&now, 0); current_trans->set_timestamp (now); - history.add (current_trans); + _history.add (current_trans); } Session::GlobalRouteBooleanState @@ -2568,6 +2575,8 @@ Session::cleanup_sources (Session::cleanup_report& rep) capture files. */ + cerr << "checking out source " << i->second->name() << " use_count = " << i->second.use_count() << endl; + if (i->second.use_count() == 1 && i->second->length() > 0) { dead_sources.push_back (i->second); @@ -2757,7 +2766,7 @@ Session::cleanup_sources (Session::cleanup_report& rep) /* dump the history list */ - history.clear (); + _history.clear (); /* save state so we don't end up a session file referring to non-existent sources. @@ -2908,7 +2917,7 @@ Session::save_history (string snapshot_name) string xml_path; string bak_path; - tree.set_root (&history.get_state()); + tree.set_root (&_history.get_state()); if (snapshot_name.empty()) { snapshot_name = _current_snapshot_name; @@ -2935,14 +2944,13 @@ Session::save_history (string snapshot_name) * possible to fix. */ - if (unlink (xml_path.c_str())) - { - error << string_compose (_("could not remove corrupt history file %1"), xml_path) << endmsg; + if (unlink (xml_path.c_str())) { + error << string_compose (_("could not remove corrupt history file %1"), xml_path) << endmsg; } else { - if (rename (bak_path.c_str(), xml_path.c_str())) - { - error << string_compose (_("could not restore history file from backup %1"), bak_path) << endmsg; - } + if (rename (bak_path.c_str(), xml_path.c_str())) + { + error << string_compose (_("could not restore history file from backup %1"), bak_path) << endmsg; + } } return -1; @@ -2972,7 +2980,7 @@ Session::restore_history (string snapshot_name) } /* replace history */ - history.clear(); + _history.clear(); for (XMLNodeConstIterator it = tree.root()->children().begin(); it != tree.root()->children().end(); it++) { @@ -3005,7 +3013,7 @@ Session::restore_history (string snapshot_name) } } - history.add (ut); + _history.add (ut); } return 0; @@ -3137,6 +3145,10 @@ Session::config_changed (const char* parameter_name) if (_mtc_port != 0) { session_send_mtc = Config->get_send_mtc(); + if (session_send_mtc) { + /* mark us ready to send */ + next_quarter_frame_to_send = 0; + } } } else if (PARAM_IS ("send-mmc")) { diff --git a/libs/ardour/session_transport.cc b/libs/ardour/session_transport.cc index 004261fe8e..e9c4e3785f 100644 --- a/libs/ardour/session_transport.cc +++ b/libs/ardour/session_transport.cc @@ -125,7 +125,7 @@ Session::request_play_loop (bool yn) if (!yn && Config->get_seamless_loop() && transport_rolling()) { // request an immediate locate to refresh the diskstreams // after disabling looping - request_locate (_transport_frame-1, true); + request_locate (_transport_frame-1, false); } } @@ -377,9 +377,6 @@ Session::non_realtime_stop (bool abort) } } } - - //FIXME - //deliver_mmc (MIDI::MachineControl::cmdLocate, _transport_frame); #ifdef LEAVE_TRANSPORT_UNADJUSTED } diff --git a/libs/ardour/sndfile_helpers.cc b/libs/ardour/sndfile_helpers.cc index b308a74c36..4cf644e0e0 100644 --- a/libs/ardour/sndfile_helpers.cc +++ b/libs/ardour/sndfile_helpers.cc @@ -106,11 +106,11 @@ sndfile_endian_format_from_string (string str) string sndfile_file_ending_from_string (string str) -{ +{ static vector<string> file_endings; if (file_endings.empty()) { - file_endings = PBD::internationalize((const char **) sndfile_file_endings_strings); + file_endings = I18N((const char **) sndfile_file_endings_strings); } for (int n = 0; sndfile_header_formats_strings[n]; ++n) { diff --git a/libs/ardour/sndfilesource.cc b/libs/ardour/sndfilesource.cc index fcc6a33d81..a30bfcf49b 100644 --- a/libs/ardour/sndfilesource.cc +++ b/libs/ardour/sndfilesource.cc @@ -28,6 +28,8 @@ #include <glibmm/miscutils.h> #include <ardour/sndfilesource.h> +#include <ardour/sndfile_helpers.h> +#include <ardour/utils.h> #include "i18n.h" @@ -35,6 +37,14 @@ using namespace std; using namespace ARDOUR; using namespace PBD; +gain_t* SndFileSource::out_coefficient = 0; +gain_t* SndFileSource::in_coefficient = 0; +nframes_t SndFileSource::xfade_frames = 64; +const AudioFileSource::Flag SndFileSource::default_writable_flags = AudioFileSource::Flag (AudioFileSource::Writable| + AudioFileSource::Removable| + AudioFileSource::RemovableIfEmpty| + AudioFileSource::CanRename); + SndFileSource::SndFileSource (Session& s, const XMLNode& node) : AudioFileSource (s, node) { @@ -164,22 +174,32 @@ SndFileSource::SndFileSource (Session& s, string idstr, SampleFormat sfmt, Heade } void -SndFileSource::init (const string& idstr) +SndFileSource::init (string idstr) { string::size_type pos; string file; + // lets try to keep the object initalizations here at the top + xfade_buf = 0; interleave_buf = 0; interleave_bufsize = 0; sf = 0; _broadcast_info = 0; + string tmp_name; + if ((pos = idstr.find_last_of (':')) == string::npos) { channel = 0; - _name = Glib::path_get_basename (idstr); + tmp_name = idstr; } else { channel = atoi (idstr.substr (pos+1).c_str()); - _name = Glib::path_get_basename (idstr.substr (0, pos)); + tmp_name = idstr.substr (0, pos); + } + + if (is_embedded()) { + _name = tmp_name; + } else { + _name = Glib::path_get_basename (tmp_name); } /* although libsndfile says we don't need to set this, @@ -187,6 +207,17 @@ SndFileSource::init (const string& idstr) */ memset (&_info, 0, sizeof(_info)); + + _capture_start = false; + _capture_end = false; + file_pos = 0; + + if (destructive()) { + xfade_buf = new Sample[xfade_frames]; + timeline_position = header_position_offset; + } + + AudioFileSource::HeaderPositionOffsetChanged.connect (mem_fun (*this, &SndFileSource::handle_header_position_change)); } int @@ -212,27 +243,14 @@ SndFileSource::open () _broadcast_info = new SF_BROADCAST_INFO; memset (_broadcast_info, 0, sizeof (*_broadcast_info)); - /* lookup broadcast info */ - - if (sf_command (sf, SFC_GET_BROADCAST_INFO, _broadcast_info, sizeof (*_broadcast_info)) != SF_TRUE) { - - /* if the file has data but no broadcast info, then clearly, there is no broadcast info */ - - if (_length) { - delete _broadcast_info; - _broadcast_info = 0; - _flags = Flag (_flags & ~Broadcast); - } - - set_timeline_position (header_position_offset); + bool timecode_info_exists; - } else { - - /* XXX 64 bit alert: when JACK switches to a 64 bit frame count, this needs to use the high bits - of the time reference. - */ + set_timeline_position (get_timecode_info (sf, _broadcast_info, timecode_info_exists)); - set_timeline_position ( _broadcast_info->time_reference_low ); + if (!timecode_info_exists) { + delete _broadcast_info; + _broadcast_info = 0; + _flags = Flag (_flags & ~Broadcast); } if (writable()) { @@ -266,6 +284,10 @@ SndFileSource::~SndFileSource () if (_broadcast_info) { delete _broadcast_info; } + + if (xfade_buf) { + delete [] xfade_buf; + } } float @@ -352,6 +374,16 @@ SndFileSource::read_unlocked (Sample *dst, nframes_t start, nframes_t cnt) const nframes_t SndFileSource::write_unlocked (Sample *data, nframes_t cnt) { + if (destructive()) { + return destructive_write_unlocked (data, cnt); + } else { + return nondestructive_write_unlocked (data, cnt); + } +} + +nframes_t +SndFileSource::nondestructive_write_unlocked (Sample *data, nframes_t cnt) +{ if (!writable()) { return 0; } @@ -403,6 +435,117 @@ SndFileSource::write_unlocked (Sample *data, nframes_t cnt) return cnt; } +nframes_t +SndFileSource::destructive_write_unlocked (Sample* data, nframes_t cnt) +{ + nframes_t old_file_pos; + + if (!writable()) { + return 0; + } + + if (_capture_start && _capture_end) { + + /* start and end of capture both occur within the data we are writing, + so do both crossfades. + */ + + _capture_start = false; + _capture_end = false; + + /* move to the correct location place */ + file_pos = capture_start_frame - timeline_position; + + // split cnt in half + nframes_t subcnt = cnt / 2; + nframes_t ofilepos = file_pos; + + // fade in + if (crossfade (data, subcnt, 1) != subcnt) { + return 0; + } + + file_pos += subcnt; + Sample * tmpdata = data + subcnt; + + // fade out + subcnt = cnt - subcnt; + if (crossfade (tmpdata, subcnt, 0) != subcnt) { + return 0; + } + + file_pos = ofilepos; // adjusted below + + } else if (_capture_start) { + + /* start of capture both occur within the data we are writing, + so do the fade in + */ + + _capture_start = false; + _capture_end = false; + + /* move to the correct location place */ + file_pos = capture_start_frame - timeline_position; + + if (crossfade (data, cnt, 1) != cnt) { + return 0; + } + + } else if (_capture_end) { + + /* end of capture both occur within the data we are writing, + so do the fade out + */ + + _capture_start = false; + _capture_end = false; + + if (crossfade (data, cnt, 0) != cnt) { + return 0; + } + + } else { + + /* in the middle of recording */ + + if (write_float (data, file_pos, cnt) != cnt) { + return 0; + } + } + + old_file_pos = file_pos; + update_length (file_pos, cnt); + file_pos += cnt; + + if (_build_peakfiles) { + PeakBuildRecord *pbr = 0; + + if (pending_peak_builds.size()) { + pbr = pending_peak_builds.back(); + } + + if (pbr && pbr->frame + pbr->cnt == old_file_pos) { + + /* the last PBR extended to the start of the current write, + so just extend it again. + */ + + pbr->cnt += cnt; + } else { + pending_peak_builds.push_back (new PeakBuildRecord (old_file_pos, cnt)); + } + + _peaks_built = false; + } + + if (_build_peakfiles) { + queue_for_peaks (shared_from_this ()); + } + + return cnt; +} + int SndFileSource::update_header (nframes_t when, struct tm& now, time_t tnow) { @@ -499,8 +642,10 @@ SndFileSource::set_header_timeline_position () nframes_t SndFileSource::write_float (Sample* data, nframes_t frame_pos, nframes_t cnt) { - if (sf_seek (sf, frame_pos, SEEK_SET|SFM_WRITE) != frame_pos) { - error << string_compose (_("%1: cannot seek to %2"), _path, frame_pos) << endmsg; + if (sf_seek (sf, frame_pos, SEEK_SET|SFM_WRITE) < 0) { + char errbuf[256]; + sf_error_str (0, errbuf, sizeof (errbuf) - 1); + error << string_compose (_("%1: cannot seek to %2 (libsndfile error: %3"), _path, frame_pos, errbuf) << endmsg; return 0; } @@ -516,3 +661,286 @@ SndFileSource::natural_position() const { return timeline_position; } + +bool +SndFileSource::set_destructive (bool yn) +{ + if (yn) { + _flags = Flag (_flags | Destructive); + if (!xfade_buf) { + xfade_buf = new Sample[xfade_frames]; + } + clear_capture_marks (); + timeline_position = header_position_offset; + } else { + _flags = Flag (_flags & ~Destructive); + timeline_position = 0; + /* leave xfade buf alone in case we need it again later */ + } + + return true; +} + +void +SndFileSource::clear_capture_marks () +{ + _capture_start = false; + _capture_end = false; +} + +void +SndFileSource::mark_capture_start (nframes_t pos) +{ + if (destructive()) { + if (pos < timeline_position) { + _capture_start = false; + } else { + _capture_start = true; + capture_start_frame = pos; + } + } +} + +void +SndFileSource::mark_capture_end() +{ + if (destructive()) { + _capture_end = true; + } +} + +nframes_t +SndFileSource::crossfade (Sample* data, nframes_t cnt, int fade_in) +{ + nframes_t xfade = min (xfade_frames, cnt); + nframes_t nofade = cnt - xfade; + Sample* fade_data = 0; + nframes_t fade_position = 0; // in frames + ssize_t retval; + nframes_t file_cnt; + + if (fade_in) { + fade_position = file_pos; + fade_data = data; + } else { + fade_position = file_pos + nofade; + fade_data = data + nofade; + } + + if (fade_position > _length) { + + /* read starts beyond end of data, just memset to zero */ + + file_cnt = 0; + + } else if (fade_position + xfade > _length) { + + /* read ends beyond end of data, read some, memset the rest */ + + file_cnt = _length - fade_position; + + } else { + + /* read is entirely within data */ + + file_cnt = xfade; + } + + if (file_cnt) { + + if ((retval = read_unlocked (xfade_buf, fade_position, file_cnt)) != (ssize_t) file_cnt) { + if (retval >= 0 && errno == EAGAIN) { + /* XXX - can we really trust that errno is meaningful here? yes POSIX, i'm talking to you. + * short or no data there */ + memset (xfade_buf, 0, xfade * sizeof(Sample)); + } else { + error << string_compose(_("SndFileSource: \"%1\" bad read retval: %2 of %5 (%3: %4)"), _path, retval, errno, strerror (errno), xfade) << endmsg; + return 0; + } + } + } + + if (file_cnt != xfade) { + nframes_t delta = xfade - file_cnt; + memset (xfade_buf+file_cnt, 0, sizeof (Sample) * delta); + } + + if (nofade && !fade_in) { + if (write_float (data, file_pos, nofade) != nofade) { + error << string_compose(_("SndFileSource: \"%1\" bad write (%2)"), _path, strerror (errno)) << endmsg; + return 0; + } + } + + if (xfade == xfade_frames) { + + nframes_t n; + + /* use the standard xfade curve */ + + if (fade_in) { + + /* fade new material in */ + + for (n = 0; n < xfade; ++n) { + xfade_buf[n] = (xfade_buf[n] * out_coefficient[n]) + (fade_data[n] * in_coefficient[n]); + } + + } else { + + + /* fade new material out */ + + for (n = 0; n < xfade; ++n) { + xfade_buf[n] = (xfade_buf[n] * in_coefficient[n]) + (fade_data[n] * out_coefficient[n]); + } + } + + } else if (xfade < xfade_frames) { + + gain_t in[xfade]; + gain_t out[xfade]; + + /* short xfade, compute custom curve */ + + compute_equal_power_fades (xfade, in, out); + + for (nframes_t n = 0; n < xfade; ++n) { + xfade_buf[n] = (xfade_buf[n] * out[n]) + (fade_data[n] * in[n]); + } + + } else if (xfade) { + + /* long xfade length, has to be computed across several calls */ + + } + + if (xfade) { + if (write_float (xfade_buf, fade_position, xfade) != xfade) { + error << string_compose(_("SndFileSource: \"%1\" bad write (%2)"), _path, strerror (errno)) << endmsg; + return 0; + } + } + + if (fade_in && nofade) { + if (write_float (data + xfade, file_pos + xfade, nofade) != nofade) { + error << string_compose(_("SndFileSource: \"%1\" bad write (%2)"), _path, strerror (errno)) << endmsg; + return 0; + } + } + + return cnt; +} + +nframes_t +SndFileSource::last_capture_start_frame () const +{ + if (destructive()) { + return capture_start_frame; + } else { + return 0; + } +} + +void +SndFileSource::handle_header_position_change () +{ + if (destructive()) { + if ( _length != 0 ) { + error << string_compose(_("Filesource: start time is already set for existing file (%1): Cannot change start time."), _path ) << endmsg; + //in the future, pop up a dialog here that allows user to regenerate file with new start offset + } else if (writable()) { + timeline_position = header_position_offset; + set_header_timeline_position (); //this will get flushed if/when the file is recorded to + } + } +} + +void +SndFileSource::setup_standard_crossfades (nframes_t rate) +{ + /* This static method is assumed to have been called by the Session + before any DFS's are created. + */ + + xfade_frames = (nframes_t) floor ((Config->get_destructive_xfade_msecs () / 1000.0) * rate); + + if (out_coefficient) { + delete [] out_coefficient; + } + + if (in_coefficient) { + delete [] in_coefficient; + } + + out_coefficient = new gain_t[xfade_frames]; + in_coefficient = new gain_t[xfade_frames]; + + compute_equal_power_fades (xfade_frames, in_coefficient, out_coefficient); +} + +void +SndFileSource::set_timeline_position (int64_t pos) +{ + // destructive track timeline postion does not change + // except at instantion or when header_position_offset + // (session start) changes + + if (!destructive()) { + AudioFileSource::set_timeline_position (pos); + } +} + +int +SndFileSource::get_soundfile_info (string path, SoundFileInfo& info, string& error_msg) +{ + SNDFILE *sf; + SF_INFO sf_info; + SF_BROADCAST_INFO binfo; + bool timecode_exists; + + sf_info.format = 0; // libsndfile says to clear this before sf_open(). + + if ((sf = sf_open ((char*) path.c_str(), SFM_READ, &sf_info)) == 0) { + char errbuf[256]; + error_msg = sf_error_str (0, errbuf, sizeof (errbuf) - 1); + return false; + } + + info.samplerate = sf_info.samplerate; + info.channels = sf_info.channels; + info.length = sf_info.frames; + info.format_name = string_compose("Format: %1, %2", + sndfile_major_format(sf_info.format), + sndfile_minor_format(sf_info.format)); + + memset (&binfo, 0, sizeof (binfo)); + info.timecode = get_timecode_info (sf, &binfo, timecode_exists); + + if (!timecode_exists) { + info.timecode = 0; + } + + sf_close (sf); + + return true; +} + +int64_t +SndFileSource::get_timecode_info (SNDFILE* sf, SF_BROADCAST_INFO* binfo, bool& exists) +{ + if (sf_command (sf, SFC_GET_BROADCAST_INFO, binfo, sizeof (*binfo)) != SF_TRUE) { + exists = false; + return (header_position_offset); + } + + /* XXX 64 bit alert: when JACK switches to a 64 bit frame count, this needs to use the high bits + of the time reference. + */ + + exists = true; + int64_t ret = (uint32_t) binfo->time_reference_high; + ret <<= 32; + ret |= (uint32_t) binfo->time_reference_low; + return ret; +} diff --git a/libs/ardour/source.cc b/libs/ardour/source.cc index 86ca0c55f2..8f0afd3507 100644 --- a/libs/ardour/source.cc +++ b/libs/ardour/source.cc @@ -34,6 +34,7 @@ #include <pbd/pthread_utils.h> #include <ardour/source.h> +#include <ardour/playlist.h> #include "i18n.h" @@ -51,6 +52,7 @@ Source::Source (Session& s, string name, DataType type) _name = name; _timestamp = 0; _length = 0; + _in_use = 0; } Source::Source (Session& s, const XMLNode& node) @@ -59,6 +61,7 @@ Source::Source (Session& s, const XMLNode& node) { _timestamp = 0; _length = 0; + _in_use = 0; if (set_state (node) || _type == DataType::NIL) { throw failed_constructor(); @@ -127,3 +130,24 @@ Source::update_length (jack_nframes_t pos, jack_nframes_t cnt) } } +void +Source::add_playlist (Playlist* pl) +{ + _playlists.insert (pl); +} + +void +Source::remove_playlist (Playlist* pl) +{ + std::set<Playlist*>::iterator x; + + if ((x = _playlists.find (pl)) != _playlists.end()) { + _playlists.erase (x); + } +} + +uint32_t +Source::used () const +{ + return _playlists.size(); +} diff --git a/libs/ardour/source_factory.cc b/libs/ardour/source_factory.cc index e9564a6193..001af609dc 100644 --- a/libs/ardour/source_factory.cc +++ b/libs/ardour/source_factory.cc @@ -110,7 +110,7 @@ SourceFactory::create (Session& s, const XMLNode& node) return ret; } - + return boost::shared_ptr<Source>(); } @@ -163,7 +163,6 @@ SourceFactory::create (Session& s, const XMLNode& node) boost::shared_ptr<Source> SourceFactory::createReadable (DataType type, Session& s, string idstr, AudioFileSource::Flag flags, bool announce) { -<<<<<<< .working if (type == DataType::AUDIO) { if (flags & Destructive) { boost::shared_ptr<Source> ret (new DestructiveFileSource (s, idstr, flags)); @@ -197,7 +196,7 @@ SourceFactory::createReadable (DataType type, Session& s, string idstr, AudioFil return ret; } - + return boost::shared_ptr<Source>(); } @@ -220,9 +219,6 @@ SourceFactory::createReadable (DataType type, Session& s, string idstr, AudioFil } else if (type == DataType::MIDI) { boost::shared_ptr<Source> ret (new SMFSource (s, idstr, SMFSource::Flag(0))); // FIXME: flags? - if (setup_peakfile (ret)) { - return boost::shared_ptr<Source>(); - } if (announce) { SourceCreated (ret); } @@ -239,7 +235,6 @@ boost::shared_ptr<Source> SourceFactory::createWritable (DataType type, Session& s, std::string path, bool destructive, nframes_t rate, bool announce) { /* this might throw failed_constructor(), which is OK */ - if (type == DataType::AUDIO) { if (destructive) { diff --git a/libs/ardour/sse_functions_64bit.s b/libs/ardour/sse_functions_64bit.s index 997852eb5b..0242db3e77 100644 --- a/libs/ardour/sse_functions_64bit.s +++ b/libs/ardour/sse_functions_64bit.s @@ -602,3 +602,8 @@ x86_sse_compute_peak: .size x86_sse_compute_peak, .-x86_sse_compute_peak #; end proc + +#ifdef __ELF__ +.section .note.GNU-stack,"",%progbits +#endif + diff --git a/libs/ardour/state_manager.cc b/libs/ardour/state_manager.cc deleted file mode 100644 index 153773ed30..0000000000 --- a/libs/ardour/state_manager.cc +++ /dev/null @@ -1,91 +0,0 @@ -#include <pbd/error.h> -#include <ardour/state_manager.h> - -#include "i18n.h" - -using namespace ARDOUR; -using namespace std; -using namespace PBD; - -bool StateManager::_allow_save = true; -sigc::signal<void,const char*> StateManager::SaveAllowed; - -StateManager::StateManager () -{ - _current_state_id = 0; -} - -StateManager::~StateManager() -{ -} - -void -StateManager::prohibit_save () -{ - _allow_save = false; -} - -void -StateManager::allow_save (const char* why, bool do_save) -{ - _allow_save = true; - if (do_save) { - SaveAllowed (why); - SaveAllowed.slots().erase (SaveAllowed.slots().begin(), SaveAllowed.slots().end()); - } -} - -void -StateManager::drop_all_states () -{ - for (StateMap::iterator i = states.begin(); i != states.end(); ++i) { - delete *i; - } - - states.clear (); - - save_state (_("cleared history")); -} - -void -StateManager::use_state (state_id_t id) -{ - Change what_changed; - state_id_t n; - StateMap::iterator i; - - for (n = 0, i = states.begin(); n < id && i != states.end(); ++n, ++i); - - if (n != id || i == states.end()) { - fatal << string_compose (_("programming error: illegal state ID (%1) passed to " - "StateManager::set_state() (range = 0-%2)"), id, states.size()-1) - << endmsg; - /*NOTREACHED*/ - return; - } - - what_changed = restore_state (**i); - _current_state_id = id; - send_state_changed (what_changed); -} - -void -StateManager::save_state (std::string why) -{ - if (!should_save_state()) - return; - - if (!_allow_save) { - SaveAllowed.connect (mem_fun (*this, &StateManager::save_state)); - return; - } - - states.push_back (state_factory (why)); - _current_state_id = states.size() - 1; -} - -void -StateManager::send_state_changed (Change what_changed) -{ - StateChanged (what_changed); -} diff --git a/libs/ardour/tempo.cc b/libs/ardour/tempo.cc index 3cc5420c67..0ff94324bb 100644 --- a/libs/ardour/tempo.cc +++ b/libs/ardour/tempo.cc @@ -206,7 +206,6 @@ TempoMap::TempoMap (nframes_t fr) _frame_rate = fr; last_bbt_valid = false; BBT_Time start; - in_set_state = false; start.bars = 1; start.beats = 1; @@ -222,8 +221,6 @@ TempoMap::TempoMap (nframes_t fr) metrics->push_back (t); metrics->push_back (m); - - save_state (_("initial")); } TempoMap::~TempoMap () @@ -256,7 +253,6 @@ TempoMap::move_metric_section (MetricSection& section, const BBT_Time& when) section.set_start (corrected); metrics->sort (cmp); timestamp_metrics (); - save_state (_("move metric")); return 0; } @@ -265,7 +261,7 @@ void TempoMap::move_tempo (TempoSection& tempo, const BBT_Time& when) { if (move_metric_section (tempo, when) == 0) { - send_state_changed (Change (0)); + StateChanged (Change (0)); } } @@ -273,7 +269,7 @@ void TempoMap::move_meter (MeterSection& meter, const BBT_Time& when) { if (move_metric_section (meter, when) == 0) { - send_state_changed (Change (0)); + StateChanged (Change (0)); } } @@ -301,7 +297,7 @@ TempoMap::remove_tempo (const TempoSection& tempo) } if (removed) { - send_state_changed (Change (0)); + StateChanged (Change (0)); } } @@ -325,14 +321,10 @@ TempoMap::remove_meter (const MeterSection& tempo) } } } - - if (removed) { - save_state (_("metric removed")); - } } if (removed) { - send_state_changed (Change (0)); + StateChanged (Change (0)); } } @@ -369,11 +361,9 @@ TempoMap::add_tempo (const Tempo& tempo, BBT_Time where) where.ticks = 0; do_insert (new TempoSection (where, tempo.beats_per_minute())); - - save_state (_("add tempo")); } - send_state_changed (Change (0)); + StateChanged (Change (0)); } void @@ -397,14 +387,10 @@ TempoMap::replace_tempo (TempoSection& existing, const Tempo& replacement) break; } } - - if (replaced) { - save_state (_("replace tempo")); - } } if (replaced) { - send_state_changed (Change (0)); + StateChanged (Change (0)); } } @@ -431,11 +417,9 @@ TempoMap::add_meter (const Meter& meter, BBT_Time where) where.ticks = 0; do_insert (new MeterSection (where, meter.beats_per_bar(), meter.note_divisor())); - - save_state (_("add meter")); } - send_state_changed (Change (0)); + StateChanged (Change (0)); } void @@ -458,14 +442,10 @@ TempoMap::replace_meter (MeterSection& existing, const Meter& replacement) break; } } - - if (replaced) { - save_state (_("replaced meter")); - } } if (replaced) { - send_state_changed (Change (0)); + StateChanged (Change (0)); } } @@ -1071,6 +1051,9 @@ TempoMap::get_points (nframes_t lower, nframes_t upper) const double beat_frame; double beat_frames; double frames_per_bar; + double delta_bars; + double delta_beats; + double dummy; nframes_t limit; meter = &first_meter (); @@ -1100,6 +1083,10 @@ TempoMap::get_points (nframes_t lower, nframes_t upper) const Now start generating points. */ + beats_per_bar = meter->beats_per_bar (); + frames_per_bar = meter->frames_per_bar (*tempo, _frame_rate); + beat_frames = tempo->frames_per_beat (_frame_rate); + if (meter->frame() > tempo->frame()) { bar = meter->start().bars; beat = meter->start().beats; @@ -1110,12 +1097,21 @@ TempoMap::get_points (nframes_t lower, nframes_t upper) const current = tempo->frame(); } + /* initialize current to point to the bar/beat just prior to the + lower frame bound passed in. assumes that current is initialized + above to be on a beat. + */ + + delta_bars = (lower-current) / frames_per_bar; + delta_beats = modf(delta_bars, &dummy) * beats_per_bar; + current += (floor(delta_bars) * frames_per_bar) + (floor(delta_beats) * beat_frames); + + // adjust bars and beats too + bar += (uint32_t) (floor(delta_bars)); + beat += (uint32_t) (floor(delta_beats)); + points = new BBTPointList; - beats_per_bar = meter->beats_per_bar (); - frames_per_bar = meter->frames_per_bar (*tempo, _frame_rate); - beat_frames = tempo->frames_per_beat (_frame_rate); - do { if (i == metrics->end()) { @@ -1197,6 +1193,10 @@ TempoMap::get_points (nframes_t lower, nframes_t upper) const beat = 1; } + beats_per_bar = meter->beats_per_bar (); + frames_per_bar = meter->frames_per_bar (*tempo, _frame_rate); + beat_frames = tempo->frames_per_beat (_frame_rate); + ++i; } @@ -1246,8 +1246,6 @@ TempoMap::set_state (const XMLNode& node) XMLNodeConstIterator niter; Metrics old_metrics (*metrics); - in_set_state = true; - metrics->clear(); nlist = node.children(); @@ -1287,20 +1285,9 @@ TempoMap::set_state (const XMLNode& node) metrics->sort (cmp); timestamp_metrics (); } - - in_set_state = false; } - /* This state needs to be saved. This string will never be a part of the - object's history though, because the allow_save flag is false during - session load. This state will eventually be tagged "initial state", - by a call to StateManager::allow_save from Session::set_state. - - If this state is not saved, there is no way to reach it through undo actions. - */ - save_state(_("load XML data")); - - send_state_changed (Change (0)); + StateChanged (Change (0)); return 0; } @@ -1323,65 +1310,3 @@ TempoMap::dump (std::ostream& o) const } } -UndoAction -TempoMap::get_memento () const -{ - return sigc::bind (mem_fun (*(const_cast<TempoMap *> (this)), &StateManager::use_state), _current_state_id); -} - -Change -TempoMap::restore_state (StateManager::State& state) -{ - Glib::RWLock::ReaderLock lm (lock); - - TempoMapState* tmstate = dynamic_cast<TempoMapState*> (&state); - - /* We can't just set the metrics pointer to the address of the metrics list - stored in the state, cause this would ruin this state for restoring in - the future. If they have the same address, they are the same list. - Thus we need to copy all the elements from the state metrics list to the - current metrics list. - */ - metrics->clear(); - for (Metrics::iterator i = tmstate->metrics->begin(); i != tmstate->metrics->end(); ++i) { - TempoSection *ts; - MeterSection *ms; - - if ((ts = dynamic_cast<TempoSection*>(*i)) != 0) { - metrics->push_back (new TempoSection (*ts)); - } else if ((ms = dynamic_cast<MeterSection*>(*i)) != 0) { - metrics->push_back (new MeterSection (*ms)); - } - } - - last_bbt_valid = false; - - return Change (0); -} - -StateManager::State* -TempoMap::state_factory (std::string why) const -{ - TempoMapState* state = new TempoMapState (why); - - for (Metrics::iterator i = metrics->begin(); i != metrics->end(); ++i) { - TempoSection *ts; - MeterSection *ms; - - if ((ts = dynamic_cast<TempoSection*>(*i)) != 0) { - state->metrics->push_back (new TempoSection (*ts)); - } else if ((ms = dynamic_cast<MeterSection*>(*i)) != 0) { - state->metrics->push_back (new MeterSection (*ms)); - } - } - - return state; -} - -void -TempoMap::save_state (std::string why) -{ - if (!in_set_state) { - StateManager::save_state (why); - } -} diff --git a/libs/ardour/track.cc b/libs/ardour/track.cc index 053a866256..a5484813f9 100644 --- a/libs/ardour/track.cc +++ b/libs/ardour/track.cc @@ -50,8 +50,8 @@ Track::Track (Session& sess, string name, Route::Flag flag, TrackMode mode, Data } Track::Track (Session& sess, const XMLNode& node, DataType default_type) - : Route (sess, "to be renamed", 0, 0, -1, -1, Route::Flag(0), default_type) - , _rec_enable_control (*this) + : Route (sess, node), + _rec_enable_control (*this) { _freeze_record.state = NoFreeze; _declickable = true; @@ -183,18 +183,6 @@ Track::set_record_enable (bool yn, void *src) _rec_enable_control.Changed (); } -void -Track::set_mode (TrackMode m) -{ - if (_diskstream) { - if (_mode != m) { - _mode = m; - _diskstream->set_destructive (m == Destructive); - ModeChanged(); - } - } -} - int Track::set_name (string str, void *src) { diff --git a/libs/ardour/utils.cc b/libs/ardour/utils.cc index 9a841e81b4..9c94d32241 100644 --- a/libs/ardour/utils.cc +++ b/libs/ardour/utils.cc @@ -38,6 +38,7 @@ #endif #include <pbd/error.h> +#include <pbd/stacktrace.h> #include <pbd/xml++.h> #include <ardour/utils.h> @@ -221,7 +222,7 @@ region_name_from_path (string path) /* remove any "?R", "?L" or "?[a-z]" channel identifier */ string::size_type len = path.length(); - + if (len > 3 && (path[len-2] == '%' || path[len-2] == '?') && (path[len-1] == 'R' || path[len-1] == 'L' || (islower (path[len-1])))) { @@ -299,7 +300,7 @@ compute_equal_power_fades (nframes_t nframes, float* in, float* out) const float pan_law_attenuation = -3.0f; const float scale = 2.0f - 4.0f * powf (10.0f,pan_law_attenuation/20.0f); - for (unsigned long n = 0; n < nframes; ++n) { + for (nframes_t n = 0; n < nframes; ++n) { float inVal = in[n]; float outVal = 1 - inVal; out[n] = outVal * (scale * outVal + 1.0f - scale); @@ -407,3 +408,82 @@ meter_hold_to_float (MeterHold hold) return 200.0f; } } + +AutoState +ARDOUR::string_to_auto_state (std::string str) +{ + if (str == X_("Off")) { + return Off; + } else if (str == X_("Play")) { + return Play; + } else if (str == X_("Write")) { + return Write; + } else if (str == X_("Touch")) { + return Touch; + } + + fatal << string_compose (_("programming error: %1 %2"), "illegal AutoState string: ", str) << endmsg; + /*NOTREACHED*/ + return Touch; +} + +string +ARDOUR::auto_state_to_string (AutoState as) +{ + /* to be used only for XML serialization, no i18n done */ + + switch (as) { + case Off: + return X_("Off"); + break; + case Play: + return X_("Play"); + break; + case Write: + return X_("Write"); + break; + case Touch: + return X_("Touch"); + } + + fatal << string_compose (_("programming error: %1 %2"), "illegal AutoState type: ", as) << endmsg; + /*NOTREACHED*/ + return ""; +} + +AutoStyle +ARDOUR::string_to_auto_style (std::string str) +{ + if (str == X_("Absolute")) { + return Absolute; + } else if (str == X_("Trim")) { + return Trim; + } + + fatal << string_compose (_("programming error: %1 %2"), "illegal AutoStyle string: ", str) << endmsg; + /*NOTREACHED*/ + return Trim; +} + +string +ARDOUR::auto_style_to_string (AutoStyle as) +{ + /* to be used only for XML serialization, no i18n done */ + + switch (as) { + case Absolute: + return X_("Absolute"); + break; + case Trim: + return X_("Trim"); + break; + } + + fatal << string_compose (_("programming error: %1 %2"), "illegal AutoStyle type: ", as) << endmsg; + /*NOTREACHED*/ + return ""; +} + +extern "C" { + void c_stacktrace() { stacktrace (cerr); } +} diff --git a/libs/ardour/vst_plugin.cc b/libs/ardour/vst_plugin.cc index 800c5a9856..5d7a303fc6 100644 --- a/libs/ardour/vst_plugin.cc +++ b/libs/ardour/vst_plugin.cc @@ -110,16 +110,6 @@ VSTPlugin::set_block_size (nframes_t nframes) activate (); } -void -VSTPlugin::store_state (PluginState& state) -{ -} - -void -VSTPlugin::restore_state (PluginState& state) -{ -} - float VSTPlugin::default_value (uint32_t port) { diff --git a/libs/clearlooks/SConscript b/libs/clearlooks/SConscript new file mode 100644 index 0000000000..0df20efe56 --- /dev/null +++ b/libs/clearlooks/SConscript @@ -0,0 +1,23 @@ +import os.path + +Import ('env install_prefix') + +clearlooks = env.Copy() + +clearlooks.Replace(CCFLAGS = ' `pkg-config --cflags gtk+-2.0` ', + LINKFLAGS = ' `pkg-config --libs gtk+-2.0` ') + +libclearlooks = clearlooks.SharedLibrary('clearlooks', [ + 'clearlooks_draw.c', + 'clearlooks_rc_style.c', + 'clearlooks_style.c', + 'clearlooks_theme_main.c', + 'support.c' +]) + +usable_libclearlooks = clearlooks.Install ('engines', libclearlooks) +Default (usable_libclearlooks) + +env.Alias('install', + env.Install(os.path.join(install_prefix,'lib/ardour2/engines'), + libclearlooks)) diff --git a/libs/clearlooks/bits.c b/libs/clearlooks/bits.c new file mode 100644 index 0000000000..1e871bc5d3 --- /dev/null +++ b/libs/clearlooks/bits.c @@ -0,0 +1,121 @@ +static unsigned char dot_intensity[] = { +0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e, +0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e, +0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e, +0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e, +0x6e,0x6e,0x6e,0x6e,0x98,0xb9,0xc6,0xb9,0x91,0x6e,0x6e,0x6e,0x6e, +0x6e,0x6e,0x6e,0x6e,0xb9,0xbd,0xac,0x9e,0x65,0x6e,0x6e,0x6e,0x6e, +0x6e,0x6e,0x6e,0x6e,0xc6,0xac,0x9e,0x96,0x5c,0x6e,0x6e,0x6e,0x6e, +0x6e,0x6e,0x6e,0x6e,0xb9,0x9e,0x96,0x62,0x55,0x6e,0x6e,0x6e,0x6e, +0x6e,0x6e,0x6e,0x6e,0x91,0x65,0x5c,0x55,0x68,0x6e,0x6e,0x6e,0x6e, +0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e, +0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e, +0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e, +0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e, +}; +static unsigned char dot_alpha[] = { +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x66,0xc4,0xff,0xc4,0x66,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x66,0xdf,0xff,0xff,0xff,0xdf,0x66,0x00,0x00,0x00, +0x00,0x00,0x00,0xc4,0xff,0xff,0xff,0xff,0xff,0xc4,0x00,0x00,0x00, +0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00, +0x00,0x00,0x00,0xc4,0xff,0xff,0xff,0xff,0xff,0xc4,0x00,0x00,0x00, +0x00,0x00,0x00,0x66,0xdf,0xff,0xff,0xff,0xdf,0x66,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x66,0xc4,0xff,0xc4,0x66,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +}; + +static unsigned char circle_alpha[] = { +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x23,0x62,0x92,0xb3,0xb2,0x95,0x2b,0x00,0x00,0x00, +0x00,0x00,0x3e,0xab,0xc9,0xeb,0xf9,0xf5,0xfd,0xff,0x57,0x00,0x00, +0x00,0x1f,0xb5,0xd8,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0x2b,0x00, +0x00,0x67,0xb9,0xf2,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x9c,0x00, +0x00,0x9a,0xe2,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe5,0x00, +0x00,0xba,0xeb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00, +0x00,0xc0,0xfa,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe5,0x00, +0x00,0x9b,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x9c,0x00, +0x00,0x2b,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x2b,0x00, +0x00,0x00,0x57,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x57,0x00,0x00, +0x00,0x00,0x00,0x2b,0x9c,0xe5,0xff,0xe5,0x9c,0x2b,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +}; +static unsigned char outline_alpha[] = { +0x00,0x00,0x00,0x4a,0xac,0xe9,0xff,0xe9,0xac,0x4a,0x00,0x00,0x00, +0x00,0x00,0x98,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x98,0x00,0x00, +0x00,0x98,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x98,0x00, +0x4a,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x4a, +0xac,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xac, +0xe9,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe9, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xe9,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe9, +0xac,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xac, +0x4a,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x4a, +0x00,0x98,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x98,0x00, +0x00,0x00,0x98,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x98,0x00,0x00, +0x00,0x00,0x00,0x4a,0xac,0xe9,0xff,0xe9,0xac,0x4a,0x00,0x00,0x00, +}; +static unsigned char inconsistent_alpha[] = { +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00, +0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00, +0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xf8,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +}; +static unsigned char check_base_alpha[] = { +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0xea,0xea,0xea,0xea,0xea,0xea,0xea,0xea,0xea,0xea,0xea,0x00, +0x00,0xea,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00, +0x00,0xea,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00, +0x00,0xea,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00, +0x00,0xea,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00, +0x00,0xea,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00, +0x00,0xea,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00, +0x00,0xea,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00, +0x00,0xea,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00, +0x00,0xea,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00, +0x00,0xea,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +}; +static unsigned char check_alpha[] = { +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 11, 137, 151,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00, 9, 183, 172, 7,0x00,0x00, +0x00,0x00, 12, 18,0x00,0x00, 3, 161, 233, 27,0x00,0x00,0x00, +0x00,0x00, 199, 239, 101,0x00, 85, 253, 108,0x00,0x00,0x00,0x00, +0x00,0x00, 83, 245, 250, 75, 206, 230, 8,0x00,0x00,0x00,0x00, +0x00,0x00,0x00, 104, 252, 243, 253, 124,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00, 2, 162, 255, 241, 28,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, 18, 228, 163,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00, 78, 62,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +}; +static unsigned char check_inconsistent_alpha[] = { +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00, +0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00, +0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +}; diff --git a/libs/clearlooks/clearlooks_draw.c b/libs/clearlooks/clearlooks_draw.c new file mode 100644 index 0000000000..144be35152 --- /dev/null +++ b/libs/clearlooks/clearlooks_draw.c @@ -0,0 +1,1293 @@ +#include "clearlooks_draw.h" +#include "clearlooks_style.h" + +#include "support.h" + +/** WANTED: + FASTER GRADIENT FILL FUNCTION, POSSIBLY USING XRENDER. **/ + +static void cl_draw_borders (GdkWindow *window, GtkWidget *widget, GtkStyle *style, + int x, int y, int width, int height, CLRectangle *r); + +static void cl_draw_line (GdkWindow *window, GtkWidget *widget, GtkStyle *style, + int x1, int y1, int x2, int y2, CLBorderType border, + CLRectangle *r); + +static void cl_draw_corner (GdkWindow *window, GtkWidget *widget, GtkStyle *style, + int x, int y, int width, int height, + CLRectangle *r, CLCornerSide corner); + +static void cl_draw_fill (GdkWindow *window, GtkWidget *widget, GtkStyle *style, + int x, int y, int width, int height, CLRectangle *r); + +void cl_draw_rectangle (GdkWindow *window, GtkWidget *widget, GtkStyle *style, + int x, int y, int width, int height, CLRectangle *r) +{ + if (r->fillgc) + { + cl_draw_fill(window, widget, style, x, y, width, height, r); + } + + if (r->bordergc) + { + cl_draw_borders(window, widget, style, x, y, width, height, r); + } +} + + +static void cl_get_coords ( CLBorderType border, + int x, int y, int width, int height, + CLRectangle *r, int *x1, int *y1, int *x2, int *y2) +{ + switch (border) + { + case CL_BORDER_TOP: + *x1 = x + r->corners[CL_CORNER_TOPLEFT]; + *x2 = *x1 + width - r->corners[CL_CORNER_TOPLEFT] - r->corners[CL_CORNER_TOPRIGHT] - 1; + *y1 = *y2 = y; + break; + case CL_BORDER_BOTTOM: + *x1 = x + r->corners[CL_CORNER_BOTTOMLEFT]; + *x2 = *x1 + width - r->corners[CL_CORNER_BOTTOMLEFT] - r->corners[CL_CORNER_BOTTOMRIGHT] - 1; + *y1 = *y2 = y + height - 1; + break; + case CL_BORDER_LEFT: + *x1 = *x2 = x; + *y1 = y + r->corners[CL_CORNER_TOPLEFT]; + *y2 = *y1 + height - r->corners[CL_CORNER_TOPLEFT] - r->corners[CL_CORNER_BOTTOMLEFT] - 1; + break; + case CL_BORDER_RIGHT: + *x1 = *x2 = x + width - 1; + *y1 = y + r->corners[CL_CORNER_TOPRIGHT]; + *y2 = *y1 + height - r->corners[CL_CORNER_TOPRIGHT] - r->corners[CL_CORNER_BOTTOMRIGHT] - 1; + break; + } +} + +void cl_draw_borders (GdkWindow *window, GtkWidget *widget, GtkStyle *style, + int x, int y, int width, int height, CLRectangle *r) +{ + int x1, y1, x2, y2, i; + + if (r->bordergc == NULL) + return; + + for ( i=0; i<4; i++) /* draw all four borders + corners */ + { + cl_get_coords (i, x, y, width, height, r, &x1, &y1, &x2, &y2); + cl_draw_line (window, widget, style, x1, y1, x2, y2, i, r); + cl_draw_corner (window, widget, style, x, y, width, height, r, i ); + } +} + + +static GdkColor cl_gc_get_foreground(GdkGC *gc) +{ + GdkGCValues values; + gdk_gc_get_values (gc, &values); + return values.foreground; +} + +static void cl_draw_line (GdkWindow *window, GtkWidget *widget, GtkStyle *style, + int x1, int y1, int x2, int y2, CLBorderType border, + CLRectangle *r) +{ + if (r->gradient_type == CL_GRADIENT_NONE || + r->border_gradient.from == NULL || r->border_gradient.to == NULL ) + { + gdk_draw_line (window, r->bordergc, x1, y1, x2, y2); + } + else if (r->gradient_type == CL_GRADIENT_HORIZONTAL && (border == CL_BORDER_TOP || border == CL_BORDER_BOTTOM)) + { + draw_vgradient (window, r->bordergc, style, + x1, y1, x2-x1+1, 1, + r->border_gradient.from, r->border_gradient.to); + } + else if (r->gradient_type == CL_GRADIENT_VERTICAL && (border == CL_BORDER_LEFT || border == CL_BORDER_RIGHT)) + { + draw_hgradient (window, r->bordergc, style, + x1, y1, 1, y2-y1+1, + r->border_gradient.from, r->border_gradient.to); + } + else + { + GdkColor tmp_color = cl_gc_get_foreground (r->bordergc); + + if (r->gradient_type == CL_GRADIENT_HORIZONTAL && border == CL_BORDER_LEFT || + r->gradient_type == CL_GRADIENT_VERTICAL && border == CL_BORDER_TOP) + gdk_gc_set_foreground (r->bordergc, r->border_gradient.from); + else + gdk_gc_set_foreground (r->bordergc, r->border_gradient.to); + + gdk_draw_line (window, r->bordergc, x1, y1, x2, y2); + + gdk_gc_set_foreground (r->bordergc, &tmp_color); + } +} + +static GdkColor *cl_get_gradient_corner_color (CLRectangle *r, CLCornerSide corner) +{ + GdkColor *color; + + if (r->border_gradient.from == NULL || r->border_gradient.to == NULL) + { + color = NULL; + } + else if ((r->gradient_type == CL_GRADIENT_HORIZONTAL && (corner == CL_CORNER_TOPLEFT || corner == CL_CORNER_BOTTOMLEFT)) || + (r->gradient_type == CL_GRADIENT_VERTICAL && (corner == CL_CORNER_TOPLEFT || corner == CL_CORNER_TOPRIGHT))) + { + color = r->border_gradient.from; + } + else /* no gradient or other corner */ + { + color = r->border_gradient.to; + } + + return color; +} + +static void cl_draw_corner (GdkWindow *window, GtkWidget *widget, GtkStyle *style, + int x, int y, int width, int height, + CLRectangle *r, CLCornerSide corner) +{ + GdkColor *color; + GdkColor aacolor; /* anti-aliasing color */ + GdkGCValues values; + GdkColor tmp; + GdkColor *bgcolor; + + int x1; + int y1; + + if (r->corners[corner] == CL_CORNER_NONE) + return; + + color = cl_get_gradient_corner_color (r, corner); + gdk_gc_get_values (r->bordergc, &values); + + if (color == NULL) + { + tmp = values.foreground; + gdk_colormap_query_color (gtk_widget_get_colormap(widget), values.foreground.pixel, &tmp); + color = &tmp; + } + + bgcolor = get_parent_bgcolor(widget); + + if (bgcolor == NULL) + { + bgcolor = color; + } + + blend (style->colormap, bgcolor, color, &aacolor, 70); + + if (r->corners[corner] == CL_CORNER_ROUND) + { + x1 = (corner == CL_CORNER_TOPLEFT || + corner == CL_CORNER_BOTTOMLEFT) ? x+1 : x+width - 2; + + y1 = (corner == CL_CORNER_TOPLEFT || + corner == CL_CORNER_TOPRIGHT) ? y+1 : y+height - 2; + + gdk_gc_set_foreground (r->bordergc, color); + gdk_draw_point (window, r->bordergc, x1, y1); + + gdk_gc_set_foreground (r->bordergc, &aacolor); + + x1 = (corner == CL_CORNER_TOPLEFT || + corner == CL_CORNER_BOTTOMLEFT) ? x+1 : x+width-2; + + y1 = (corner == CL_CORNER_TOPLEFT || + corner == CL_CORNER_TOPRIGHT) ? y : y+height-1; + + gdk_draw_point (window, r->bordergc, x1, y1); + + x1 = (corner == CL_CORNER_TOPLEFT || + corner == CL_CORNER_BOTTOMLEFT) ? x : x+width-1; + + y1 = (corner == CL_CORNER_TOPLEFT || + corner == CL_CORNER_TOPRIGHT) ? y+1 : y+height-2; + + gdk_draw_point (window, r->bordergc, x1, y1); + + } + else if (r->corners[corner] == CL_CORNER_NARROW) + { + x1 = (corner == CL_CORNER_TOPLEFT || + corner == CL_CORNER_BOTTOMLEFT) ? x : x+width-1; + + y1 = (corner == CL_CORNER_TOPLEFT || + corner == CL_CORNER_TOPRIGHT) ? y : y+height-1; + + gdk_gc_set_foreground (r->bordergc, &aacolor); + gdk_draw_point (window, r->bordergc, x1, y1); + } + + gdk_gc_set_foreground (r->bordergc, &values.foreground); +} + +static void cl_draw_fill (GdkWindow *window, GtkWidget *widget, GtkStyle *style, + int x, int y, int width, int height, CLRectangle *r) +{ + if (r->gradient_type == CL_GRADIENT_NONE || + r->fill_gradient.from == NULL || r->fill_gradient.to == NULL) + { + gdk_draw_rectangle (window, r->fillgc, TRUE, + x+1, y+1, width-2, height-2); + } + else if (r->gradient_type == CL_GRADIENT_HORIZONTAL) + { + draw_vgradient (window, r->fillgc, gtk_widget_get_style(widget), + x+1, y+1, width-2, height-2, + r->fill_gradient.from, r->fill_gradient.to); + } + else if (r->gradient_type == CL_GRADIENT_VERTICAL) + { + draw_hgradient (window, r->fillgc, gtk_widget_get_style(widget), + x+1, y+1, width-2, height-2, + r->fill_gradient.from, r->fill_gradient.to); + } +} + +void cl_rectangle_set_button(CLRectangle *r, GtkStyle *style, + GtkStateType state_type, gboolean has_default, + gboolean has_focus, + CLBorderType tl, CLBorderType tr, + CLBorderType bl, CLBorderType br) +{ + ClearlooksStyle *clearlooks_style = CLEARLOOKS_STYLE (style); + int my_state_type = (state_type == GTK_STATE_ACTIVE) ? 2 : 0; + GdkGC *border_gc = clearlooks_style->border_gc[CL_BORDER_UPPER+my_state_type]; + + + cl_rectangle_init (r, style->bg_gc[state_type], + clearlooks_style->border_gc[CL_BORDER_UPPER+my_state_type], + tl, tr, bl, br); + + if (state_type != GTK_STATE_INSENSITIVE && !has_default) + { + cl_rectangle_set_gradient (&r->border_gradient, + &clearlooks_style->border[CL_BORDER_UPPER+my_state_type], + &clearlooks_style->border[CL_BORDER_LOWER+my_state_type]); + } + else if (has_default) + r->bordergc = style->black_gc; + else + r->bordergc = clearlooks_style->shade_gc[4]; + + r->gradient_type = CL_GRADIENT_VERTICAL; + + r->topleft = (state_type != GTK_STATE_ACTIVE) ? style->light_gc[state_type] : clearlooks_style->shade_gc[4]; + r->bottomright = (state_type != GTK_STATE_ACTIVE) ? clearlooks_style->shade_gc[1] : NULL; + + shade (&style->bg[state_type], &r->tmp_color, 0.93); + + + cl_rectangle_set_gradient (&r->fill_gradient, + &style->bg[state_type], + &r->tmp_color); +} + +void cl_rectangle_set_entry (CLRectangle *r, GtkStyle *style, + GtkStateType state_type, + CLBorderType tl, CLBorderType tr, + CLBorderType bl, CLBorderType br, + gboolean has_focus) +{ + ClearlooksStyle *clearlooks_style = CLEARLOOKS_STYLE (style); + GdkGC *bordergc; + + if (has_focus) + bordergc = clearlooks_style->spot3_gc; + else if (state_type != GTK_STATE_INSENSITIVE) + bordergc = clearlooks_style->border_gc[CL_BORDER_LOWER]; + else + bordergc = clearlooks_style->shade_gc[3]; + + cl_rectangle_init (r, style->base_gc[state_type], bordergc, + tl, tr, bl, br); + + if (state_type != GTK_STATE_INSENSITIVE ) + r->topleft = (has_focus) ? clearlooks_style->spot1_gc + : style->bg_gc[GTK_STATE_NORMAL]; + + if (has_focus) + r->bottomright = clearlooks_style->spot1_gc; + else if (state_type == GTK_STATE_INSENSITIVE) + r->bottomright = style->base_gc[state_type]; +} + +void cl_draw_shadow(GdkWindow *window, GtkWidget *widget, GtkStyle *style, + int x, int y, int width, int height, CLRectangle *r) +{ + ClearlooksStyle *clearlooks_style = CLEARLOOKS_STYLE (style); + int x1, y1, x2, y2; + + if (r->bottomright != NULL) + { + x1 = x+1+(r->corners[CL_CORNER_BOTTOMLEFT]/2); + y1 = y2 = y+height-2; + x2 = x+width - 1 - (1+r->corners[CL_CORNER_BOTTOMRIGHT]/2); + + gdk_draw_line (window, r->bottomright, x1, y1, x2, y2); + + x1 = x2 = x+width-2; + y1 = y+1+(r->corners[CL_CORNER_TOPRIGHT]/2); + y2 = y+height - 1 - (1+r->corners[CL_CORNER_BOTTOMRIGHT]/2); + + gdk_draw_line (window, r->bottomright, x1, y1, x2, y2); + } + + if (r->topleft != NULL) + { + x1 = x+1+(r->corners[CL_CORNER_TOPLEFT]/2); + y1 = y2 = y+1; + x2 = x+width-1-(1+r->corners[CL_CORNER_TOPRIGHT]/2); + + gdk_draw_line (window, r->topleft, x1, y1, x2, y2); + + x1 = x2 = x+1; + y1 = y+1+(r->corners[CL_CORNER_TOPLEFT]/2); + y2 = y+height-1-(1+r->corners[CL_CORNER_BOTTOMLEFT]/2); + + gdk_draw_line (window, r->topleft, x1, y1, x2, y2); + } +} + +void cl_rectangle_set_color (CLGradient *g, GdkColor *color) +{ + g->from = color; + g->to = color; +} + +void cl_rectangle_set_gradient (CLGradient *g, GdkColor *from, GdkColor *to) +{ + g->from = from; + g->to = to; +} + +void cl_rectangle_init (CLRectangle *r, + GdkGC *fillgc, GdkGC *bordergc, + int tl, int tr, int bl, int br) +{ + r->gradient_type = CL_GRADIENT_NONE; + + r->border_gradient.from = r->border_gradient.to = NULL; + r->fill_gradient.from = r->fill_gradient.to = NULL; + + r->fillgc = fillgc; + r->bordergc = bordergc; + + r->topleft = NULL; + r->bottomright = NULL; + + r->corners[CL_CORNER_TOPLEFT] = tl; + r->corners[CL_CORNER_TOPRIGHT] = tr; + r->corners[CL_CORNER_BOTTOMLEFT] = bl; + r->corners[CL_CORNER_BOTTOMRIGHT] = br; +} + +void cl_rectangle_set_corners (CLRectangle *r, int tl, int tr, int bl, int br) +{ + r->corners[CL_CORNER_TOPLEFT] = tl; + r->corners[CL_CORNER_TOPRIGHT] = tr; + r->corners[CL_CORNER_BOTTOMLEFT] = bl; + r->corners[CL_CORNER_BOTTOMRIGHT] = br; +} + +void cl_set_corner_sharpness (const gchar *detail, GtkWidget *widget, CLRectangle *r) +{ + if (widget->parent && GTK_IS_COMBO_BOX_ENTRY (widget->parent) || GTK_IS_COMBO (widget->parent)) + { + gboolean rtl = get_direction (widget->parent) == GTK_TEXT_DIR_RTL; + int cl = rtl ? CL_CORNER_ROUND : CL_CORNER_NONE; + int cr = rtl ? CL_CORNER_NONE : CL_CORNER_ROUND; + + cl_rectangle_set_corners (r, cl, cr, cl, cr); + } + else if (detail && !strcmp (detail, "spinbutton_up")) + { + gboolean rtl = get_direction (widget->parent) == GTK_TEXT_DIR_RTL; + int tl = rtl ? CL_CORNER_ROUND : CL_CORNER_NONE; + int tr = rtl ? CL_CORNER_NONE : CL_CORNER_ROUND; + + cl_rectangle_set_corners (r, tl, tr, + CL_CORNER_NONE, CL_CORNER_NONE); + } + else if (detail && !strcmp (detail, "spinbutton_down")) + { + gboolean rtl = get_direction (widget->parent) == GTK_TEXT_DIR_RTL; + int bl = rtl ? CL_CORNER_ROUND : CL_CORNER_NONE; + int br = rtl ? CL_CORNER_NONE : CL_CORNER_ROUND; + + cl_rectangle_set_corners (r, CL_CORNER_NONE, CL_CORNER_NONE, + bl, br); + } + else + { + cl_rectangle_set_corners (r, CL_CORNER_ROUND, CL_CORNER_ROUND, + CL_CORNER_ROUND, CL_CORNER_ROUND); + }; +} + +void cl_rectangle_set_clip_rectangle (CLRectangle *r, GdkRectangle *area) +{ + if (area == NULL) + return; + + if (r->fillgc) + gdk_gc_set_clip_rectangle (r->fillgc, area); + + if (r->bordergc) + gdk_gc_set_clip_rectangle (r->bordergc, area); + + if (r->topleft) + gdk_gc_set_clip_rectangle (r->topleft, area); + + if (r->bottomright) + gdk_gc_set_clip_rectangle (r->bottomright, area); +} + +void cl_rectangle_reset_clip_rectangle (CLRectangle *r) +{ + if (r->fillgc) + gdk_gc_set_clip_rectangle (r->fillgc, NULL); + + if (r->bordergc) + gdk_gc_set_clip_rectangle (r->bordergc, NULL); + + if (r->topleft) + gdk_gc_set_clip_rectangle (r->topleft, NULL); + + if (r->bottomright) + gdk_gc_set_clip_rectangle (r->bottomright, NULL); +} + +void cl_rectangle_reset (CLRectangle *r, GtkStyle *style) +{ + cl_rectangle_init (r, + NULL, NULL, + CL_CORNER_ROUND, CL_CORNER_ROUND, + CL_CORNER_ROUND, CL_CORNER_ROUND); +} + +static void cl_progressbar_points_transform (GdkPoint *points, int npoints, + int offset, gboolean is_horizontal) +{ + int i; + for ( i=0; i<npoints; i++) { + if ( is_horizontal ) + points[i].x += offset; + else + points[i].y += offset; + } +} + +GdkPixmap* cl_progressbar_tile_new (GdkDrawable *drawable, GtkWidget *widget, + GtkStyle *style, gint height, gint offset) +{ + ClearlooksStyle *clearlooks_style = CLEARLOOKS_STYLE (style); + int width = height; + int line = 0; + int center = width/2; + int xdir = 1; + int trans; + + int stripe_width = height/2; + int topright = height + stripe_width; + int topright_div_2 = topright/2; + + double shift; + GdkPoint points[4]; + + GtkProgressBarOrientation orientation = gtk_progress_bar_get_orientation (GTK_PROGRESS_BAR (widget)); + gboolean is_horizontal = (orientation == GTK_PROGRESS_LEFT_TO_RIGHT || orientation == GTK_PROGRESS_RIGHT_TO_LEFT) ? 1 : 0; + + GdkPixmap *tmp = gdk_pixmap_new (widget->window, width, height, -1); + + GdkColor tmp_color; + shade (&clearlooks_style->spot2, &tmp_color, 0.90); + + if (is_horizontal) + draw_hgradient (tmp, style->black_gc, style, 0, 0, width, height, + &clearlooks_style->spot2, &tmp_color ); + else + draw_vgradient (tmp, style->black_gc, style, 0, 0, width, height, + &tmp_color, &clearlooks_style->spot2); /* TODO: swap for RTL */ + + if (orientation == GTK_PROGRESS_RIGHT_TO_LEFT || + orientation == GTK_PROGRESS_BOTTOM_TO_TOP) + { + offset = -offset; + xdir = -1; + } + + if (get_direction (widget) == GTK_TEXT_DIR_RTL) + offset = -offset; + + if (is_horizontal) + { + points[0] = (GdkPoint){xdir*(topright - stripe_width - topright_div_2), 0}; /* topleft */ + points[1] = (GdkPoint){xdir*(topright - topright_div_2), 0}; /* topright */ + points[2] = (GdkPoint){xdir*(stripe_width - topright_div_2), height}; /* bottomright */ + points[3] = (GdkPoint){xdir*(-topright_div_2), height}; /* bottomleft */ + } + else + { + points[0] = (GdkPoint){height, xdir*(topright - stripe_width - topright_div_2)}; /* topleft */ + points[1] = (GdkPoint){height, xdir*(topright - topright_div_2)}; /* topright */ + points[2] = (GdkPoint){0, xdir*(stripe_width - topright_div_2)}; /* bottomright */ + points[3] = (GdkPoint){0, xdir*(-topright_div_2)}; /* bottomleft */ + } + + + shift = (stripe_width*2)/(double)10; + cl_progressbar_points_transform (points, 4, (offset*shift), is_horizontal); + + trans = (width/2)-1-(stripe_width*2); + cl_progressbar_points_transform (points, 4, trans, is_horizontal); + gdk_draw_polygon (tmp, clearlooks_style->spot2_gc, TRUE, points, 4); + cl_progressbar_points_transform (points, 4, -trans, is_horizontal); + + trans = width/2-1; + cl_progressbar_points_transform (points, 4, trans, is_horizontal); + gdk_draw_polygon (tmp, clearlooks_style->spot2_gc, TRUE, points, 4); + cl_progressbar_points_transform (points, 4, -trans, is_horizontal); + + trans = (width/2)-1+(stripe_width*2); + cl_progressbar_points_transform (points, 4, trans, is_horizontal); + gdk_draw_polygon (tmp, clearlooks_style->spot2_gc, TRUE, points, 4); + + return tmp; +} + +/* could be improved, I think. */ +void cl_progressbar_fill (GdkDrawable *drawable, GtkWidget *widget, + GtkStyle *style, GdkGC *gc, + gint x, gint y, + gint width, gint height, + guint8 offset, GdkRectangle *area) +{ + GtkProgressBarOrientation orientation = gtk_progress_bar_get_orientation (GTK_PROGRESS_BAR (widget)); + gint size = (orientation == GTK_PROGRESS_LEFT_TO_RIGHT || orientation == GTK_PROGRESS_RIGHT_TO_LEFT) ? height : width; + GdkPixmap *tile = cl_progressbar_tile_new (widget->window, widget, style, size, offset); + + gint nx = x, + ny = y, + nwidth = height, + nheight = width; + + gdk_gc_set_clip_rectangle (gc, area); + + switch (orientation) + { + case GTK_PROGRESS_LEFT_TO_RIGHT: + { + while (nx <= x + width ) + { + if (nx + nwidth > x+width ) nwidth = (x+width) - nx; + gdk_draw_drawable (drawable, gc, tile, 0, 0, nx, y, nwidth, height); + if (height <= 1) + nx += 1; + else + nx += (height-1 + !(height % 2)); + } + break; + } + case GTK_PROGRESS_RIGHT_TO_LEFT: + { + gint src_x = 0, dst_x; + nx += width; + while (nx >= x ) + { + dst_x = nx - height; + if (dst_x < x ) + { + src_x = x - dst_x; + dst_x = x; + } + gdk_draw_drawable (drawable, gc, tile, src_x, 0, dst_x, y, nwidth, height); + if (height <= 1) + nx -= 1; + else + nx -= (height-1 + !(height % 2)); + } + break; + } + case GTK_PROGRESS_TOP_TO_BOTTOM: + { + while (ny <= y + height ) + { + if (ny + nheight > y+height ) nheight = (y+height) - ny; + gdk_draw_drawable (drawable, gc, tile, 0, 0, x, ny, width, nheight); + if (width <= 1) + ny += 1; + else + ny += (width-1 + !(width % 2)); + } + break; + } + case GTK_PROGRESS_BOTTOM_TO_TOP: + { + gint src_y = 0, dst_y; + ny += height; + while (ny >= y ) + { + dst_y = ny - width; + if (dst_y < y ) + { + src_y = y - dst_y; + dst_y = y; + } + gdk_draw_drawable (drawable, gc, tile, 0, src_y, x, dst_y, width, width); + if (width <= 1) + ny -= 1; + else + ny -= (width-1 + !(width % 2)); + } + break; + } + } + + gdk_gc_set_clip_rectangle (gc, NULL); + + g_object_unref (tile); +} + +GdkColor cl_gc_set_fg_color_shade (GdkGC *gc, GdkColormap *colormap, + GdkColor *from, gfloat s) +{ + GdkColor tmp_color; + GdkGCValues values; + + shade (from, &tmp_color, s); + gdk_gc_get_values (gc, &values); + gdk_rgb_find_color (colormap, &tmp_color); + gdk_gc_set_foreground (gc, &tmp_color); + + return values.foreground; +} + +/* #warning MOVE THIS TO SUPPORT.C/H SO THE DRAW_CORNER FUNCTION CAN USE IT. OR, MAKE DRAW_CORNER USE IT SOME OTHER WAY. */ + +static void cl_get_window_style_state (GtkWidget *widget, GtkStyle **style, GtkStateType *state_type) +{ + GtkStyle *windowstyle = NULL; + GtkWidget *tmpwidget = widget; + GtkStateType windowstate; + + if (widget && GTK_IS_ENTRY (widget)) + tmpwidget = tmpwidget->parent; + + while (tmpwidget && GTK_WIDGET_NO_WINDOW (tmpwidget) && !GTK_IS_NOTEBOOK(tmpwidget)) + { + tmpwidget = tmpwidget->parent; + } + + *style = tmpwidget->style; + *state_type = GTK_WIDGET_STATE(tmpwidget); +} + +static GdkGC *cl_get_window_bg_gc (GtkWidget *widget) +{ + GtkStyle *style; + GtkStateType state_type; + + cl_get_window_style_state (widget, &style, &state_type); + + return style->bg_gc[state_type]; +} + +/****************************************************************************** + * DRAW THE MIGHTY WIDGETS! * + ******************************************************************************/ + +void cl_draw_inset (GtkStyle *style, GdkWindow *window, GtkWidget *widget, + GdkRectangle *area, + gint x, gint y, gint width, gint height, + int tl, int tr, int bl, int br ) +{ + ClearlooksStyle *clearlooks_style = CLEARLOOKS_STYLE(style); + ClearlooksStyle *clwindowstyle; /* style of the window this widget is on */ + GtkStateType windowstate; + CLRectangle r; + + cl_rectangle_init (&r, NULL, style->black_gc, + tl, tr, bl, br); + + r.gradient_type = CL_GRADIENT_VERTICAL; + + cl_get_window_style_state(widget, (GtkStyle**)&clwindowstyle, &windowstate); + + g_assert (clwindowstyle != NULL); + + if (GTK_WIDGET_HAS_DEFAULT (widget)) + { + r.bordergc = style->mid_gc[GTK_STATE_NORMAL]; + } + else + { + cl_rectangle_set_gradient (&r.border_gradient, + &clwindowstyle->inset_dark[windowstate], + &clwindowstyle->inset_light[windowstate]); + } + cl_rectangle_set_clip_rectangle (&r, area); + cl_draw_rectangle (window, widget, style, x, y, width, height, &r); + cl_rectangle_reset_clip_rectangle (&r); +} + +/* Draw a normal (toggle)button. Not spinbuttons.*/ +void cl_draw_button(GtkStyle *style, GdkWindow *window, + GtkStateType state_type, GtkShadowType shadow_type, + GdkRectangle *area, + GtkWidget *widget, const gchar *detail, + gint x, gint y, gint width, gint height) +{ + ClearlooksStyle *clearlooks_style = CLEARLOOKS_STYLE(style); + int my_state_type = (state_type == GTK_STATE_ACTIVE) ? 2 : 0; + GdkGC *bg_gc = NULL; + gboolean is_active = FALSE; + CLRectangle r; + + /* Get the background color of the window we're on */ + bg_gc = cl_get_window_bg_gc(widget); + + cl_rectangle_set_button (&r, style, state_type, + GTK_WIDGET_HAS_DEFAULT (widget), + GTK_WIDGET_HAS_FOCUS (widget), + CL_CORNER_ROUND, CL_CORNER_ROUND, + CL_CORNER_ROUND, CL_CORNER_ROUND); + + if (state_type == GTK_STATE_ACTIVE) + is_active = TRUE; + + if (GTK_IS_TOGGLE_BUTTON(widget) && + gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(widget)) && + state_type == GTK_STATE_PRELIGHT) + { + cl_rectangle_set_gradient (&r.fill_gradient, &clearlooks_style->shade[1], &clearlooks_style->shade[1]); + r.topleft = clearlooks_style->shade_gc[3]; + r.bottomright = clearlooks_style->shade_gc[1]; + + is_active = TRUE; + } + + if (!is_active) + r.fillgc = NULL; + + if (!GTK_IS_NOTEBOOK (widget->parent)) + { + gdk_draw_rectangle (window, bg_gc, FALSE, x, y, width-1, height-1); + + /* Draw "sunken" look when border thickness is more than 2 pixels. */ + if (style->xthickness > 2 && style->ythickness > 2) + cl_draw_inset (style, window, widget, area, x, y, width, height, + CL_CORNER_ROUND, CL_CORNER_ROUND, + CL_CORNER_ROUND, CL_CORNER_ROUND); + } + + /* Draw "sunken" look when border thickness is more than 2 pixels.*/ + if (style->xthickness > 2 && style->ythickness > 2) + { + x++; + y++; + height-=2; + width-=2; + } + + /* Don't draw the normal gradient for normal buttons. */ + + cl_rectangle_set_clip_rectangle (&r, area); + cl_draw_rectangle (window, widget, style, x, y, width, height, &r); + + + if (!is_active) + { + int tmp_height = (float)height*0.25; + + gdk_gc_set_clip_rectangle (style->bg_gc[state_type], area); + + draw_hgradient (window, style->bg_gc[state_type], style, + x+2,y+2,width-4,tmp_height, + &clearlooks_style->button_g1[state_type], + &clearlooks_style->button_g2[state_type]); + + draw_hgradient (window, style->bg_gc[state_type], style, + x+2, y+2+tmp_height, width-4, height-3-tmp_height*2, + &clearlooks_style->button_g2[state_type], + &clearlooks_style->button_g3[state_type]); + + draw_hgradient (window, style->bg_gc[state_type], style, + x+2,y+height-tmp_height-1,width-4,tmp_height, + &clearlooks_style->button_g3[state_type], + &clearlooks_style->button_g4[state_type]); + + gdk_gc_set_clip_rectangle (style->bg_gc[state_type], NULL); + } + + cl_draw_shadow (window, widget, style, x, y, width, height, &r); + cl_rectangle_reset_clip_rectangle (&r); +} + +/* Draw spinbuttons. */ +void cl_draw_spinbutton(GtkStyle *style, GdkWindow *window, + GtkStateType state_type, GtkShadowType shadow_type, + GdkRectangle *area, + GtkWidget *widget, const gchar *detail, + gint x, gint y, gint width, gint height) +{ + CLRectangle r; + GdkRectangle new_area; + + int tl = CL_CORNER_NONE, tr = CL_CORNER_NONE, + bl = CL_CORNER_NONE, br = CL_CORNER_NONE; + + if (area == NULL) + { + new_area.x = x; + new_area.y = y; + new_area.width = width; + new_area.height = height; + area = &new_area; + } + + if (!strcmp (detail, "spinbutton")) /* draws the 'back' of the spinbutton */ + { + GdkGC *bg_gc = cl_get_window_bg_gc(widget); + + gdk_gc_set_clip_rectangle (bg_gc, area); + gdk_draw_rectangle (window, bg_gc, FALSE, x, y, width-1, height-1); + gdk_gc_set_clip_rectangle (bg_gc, NULL); + + if (style->xthickness > 2 && style->ythickness > 2) + cl_draw_inset (style, window, widget, area, x, y, width, height, + CL_CORNER_NONE, CL_CORNER_ROUND, + CL_CORNER_NONE, CL_CORNER_ROUND); + + return; + } + + if (!strcmp (detail, "spinbutton_up")) + { + tr = CL_CORNER_ROUND; + + (style->xthickness > 2 && style->ythickness > 2) ? y++ : height++; + } + + if (!strcmp (detail, "spinbutton_down")) + { + br = CL_CORNER_ROUND; + + if (style->xthickness > 2 && style->ythickness > 2) + height--; + } + + cl_rectangle_set_button (&r, style, state_type, + GTK_WIDGET_HAS_DEFAULT (widget), + GTK_WIDGET_HAS_FOCUS (widget), + tl, tr, + bl, br); + width--; + + cl_rectangle_set_clip_rectangle (&r, area); + cl_draw_rectangle (window, widget, style, x, y, width, height, &r); + cl_draw_shadow (window, widget, style, x, y, width, height, &r); + cl_rectangle_reset_clip_rectangle (&r); +} + +void cl_draw_combobox_entry (GtkStyle *style, GdkWindow *window, + GtkStateType state_type, GtkShadowType shadow_type, + GdkRectangle *area, + GtkWidget *widget, const gchar *detail, + gint x, gint y, gint width, gint height) +{ + CLRectangle r; + + gboolean rtl = get_direction (widget->parent) == GTK_TEXT_DIR_RTL; + gboolean has_focus = GTK_WIDGET_HAS_FOCUS (widget); + + int cl = rtl ? CL_CORNER_NONE : CL_CORNER_ROUND, + cr = rtl ? CL_CORNER_ROUND : CL_CORNER_NONE; + + GdkGC *bg_gc = cl_get_window_bg_gc(widget); + + if (rtl) + { + if (!has_focus) + { + x -= 1; + width +=1; + } + } + else + { + width += 2; + if (has_focus) width--; /* this gives us a 2px focus line at the right side. */ + } + + cl_rectangle_set_entry (&r, style, state_type, + cl, cr, cl, cr, + has_focus); + + gdk_gc_set_clip_rectangle (bg_gc, area); + gdk_draw_rectangle (window, bg_gc, FALSE, x, y, width-1, height-1); + gdk_gc_set_clip_rectangle (bg_gc, NULL); + + /* Draw "sunken" look when border thickness is more than 2 pixels. */ + if (style->xthickness > 2 && style->ythickness > 2) + { + cl_draw_inset (style, window, widget, area, x, y, width, height, + cl, cr, cl, cr); + + y++; + x++; + width-=2; + height-=2; + } + + cl_rectangle_set_clip_rectangle (&r, area); + + cl_draw_rectangle (window, widget, style, x, y, width, height, &r); + cl_draw_shadow (window, widget, style, x, y, width, height, &r); + + cl_rectangle_reset_clip_rectangle (&r); +} + +void cl_draw_combobox_button (GtkStyle *style, GdkWindow *window, + GtkStateType state_type, GtkShadowType shadow_type, + GdkRectangle *area, + GtkWidget *widget, const gchar *detail, + gint x, gint y, gint width, gint height) +{ + ClearlooksStyle *clearlooks_style = CLEARLOOKS_STYLE(style); + gboolean is_active = FALSE; + gboolean draw_inset = FALSE; + CLRectangle r; + + cl_rectangle_set_button (&r, style, state_type, + GTK_WIDGET_HAS_DEFAULT (widget), + GTK_WIDGET_HAS_FOCUS (widget), + CL_CORNER_NONE, CL_CORNER_ROUND, + CL_CORNER_NONE, CL_CORNER_ROUND); + + if (state_type == GTK_STATE_ACTIVE) + is_active = TRUE; + else + r.fillgc = NULL; + + /* Seriously, why can't non-gtk-apps at least try to be decent citizens? + Take this fscking OpenOffice.org 1.9 for example. The morons responsible + for this utter piece of crap give the clip size wrong values! :'( */ + + if (area) + { + area->x = x; + area->y = y; + area->width = width; + area->height = height; + } + + x--; + width++; + + /* Draw "sunken" look when border thickness is more than 2 pixels. */ + if (GTK_IS_COMBO(widget->parent)) + draw_inset = (widget->parent->style->xthickness > 2 && + widget->parent->style->ythickness > 2); + else + draw_inset = (style->xthickness > 2 && style->ythickness > 2); + + if (draw_inset) + { + cl_draw_inset (style, window, widget, area, x, y, width, height, + CL_CORNER_NONE, CL_CORNER_ROUND, + CL_CORNER_NONE, CL_CORNER_ROUND); + + x++; + y++; + height-=2; + width-=2; + } + else + { + x++; + width--; + } + + if (area) + cl_rectangle_set_clip_rectangle (&r, area); + + cl_draw_rectangle (window, widget, style, x, y, width, height, &r); + + if (!is_active) + { + int tmp_height = (float)height*0.25; + + gdk_gc_set_clip_rectangle (style->bg_gc[state_type], area); + + draw_hgradient (window, style->bg_gc[state_type], style, + x+2,y+2,width-4,tmp_height, + &clearlooks_style->button_g1[state_type], + &clearlooks_style->button_g2[state_type]); + + draw_hgradient (window, style->bg_gc[state_type], style, + x+2, y+2+tmp_height, width-4, height-3-tmp_height*2, + &clearlooks_style->button_g2[state_type], + &clearlooks_style->button_g3[state_type]); + + draw_hgradient (window, style->bg_gc[state_type], style, + x+2,y+height-tmp_height-1,width-4,tmp_height, + &clearlooks_style->button_g3[state_type], + &clearlooks_style->button_g4[state_type]); + + gdk_gc_set_clip_rectangle (style->bg_gc[state_type], NULL); + } + + cl_draw_shadow (window, widget, style, x, y, width, height, &r); + + if (area) + cl_rectangle_reset_clip_rectangle (&r); +} + +/* Draw text Entry */ +void cl_draw_entry (GtkStyle *style, GdkWindow *window, + GtkStateType state_type, GtkShadowType shadow_type, + GdkRectangle *area, + GtkWidget *widget, const gchar *detail, + gint x, gint y, gint width, gint height) +{ + CLRectangle r; + gboolean has_focus = GTK_WIDGET_HAS_FOCUS(widget); + GdkGC *bg_gc = cl_get_window_bg_gc(widget); + + gdk_draw_rectangle (window, bg_gc, FALSE, x, y, width-1, height-1); + + gtk_style_apply_default_background (style, window, TRUE, state_type, + area, x+1, y+1, width-2, height-2); + + + cl_rectangle_set_entry (&r, style, state_type, + CL_CORNER_ROUND, CL_CORNER_ROUND, + CL_CORNER_ROUND, CL_CORNER_ROUND, + has_focus); + + /* Draw "sunken" look when border thickness is more than 2 pixels. */ + if (style->xthickness > 2 && style->ythickness > 2) + { + cl_draw_inset (style, window, widget, area, x, y, width, height, + CL_CORNER_ROUND, CL_CORNER_ROUND, + CL_CORNER_ROUND, CL_CORNER_ROUND); + + x++; + y++; + width-=2; + height-=2; + } + + cl_rectangle_set_clip_rectangle (&r, area); + cl_draw_rectangle (window, widget, style, x, y, width, height, &r); + cl_draw_shadow (window, widget, style, x, y, width, height, &r); + cl_rectangle_reset_clip_rectangle (&r); +} + +void cl_draw_optionmenu(GtkStyle *style, GdkWindow *window, + GtkStateType state_type, GtkShadowType shadow_type, + GdkRectangle *area, GtkWidget *widget, + const gchar *detail, + gint x, gint y, gint width, gint height) +{ + ClearlooksStyle *clearlooks_style = CLEARLOOKS_STYLE(style); + GtkRequisition indicator_size; + GtkBorder indicator_spacing; + int line_pos; + + option_menu_get_props (widget, &indicator_size, &indicator_spacing); + + if (get_direction (widget) == GTK_TEXT_DIR_RTL) + line_pos = x + (indicator_size.width + indicator_spacing.left + indicator_spacing.right) + style->xthickness; + else + line_pos = x + width - (indicator_size.width + indicator_spacing.left + indicator_spacing.right) - style->xthickness; + + cl_draw_button (style, window, state_type, shadow_type, area, widget, detail, x, y, width, height); + + gdk_draw_line (window, clearlooks_style->shade_gc[3], + line_pos, y + style->ythickness - 1, line_pos, + y + height - style->ythickness); + + gdk_draw_line (window, style->light_gc[state_type], + line_pos+1, y + style->ythickness - 1, line_pos+1, + y + height - style->ythickness); +} + + +void cl_draw_menuitem_button (GdkDrawable *window, GtkWidget *widget, GtkStyle *style, + GdkRectangle *area, GtkStateType state_type, + int x, int y, int width, int height, CLRectangle *r) +{ + ClearlooksStyle *clearlooks_style = (ClearlooksStyle*)style; + gboolean menubar = (widget->parent && GTK_IS_MENU_BAR(widget->parent)) ? TRUE : FALSE; + int corner = CL_CORNER_NARROW; + GdkColor lower_color; + + shade (&style->base[GTK_STATE_SELECTED], &lower_color, 0.85); + + if (menubar) + { + height++; + corner = CL_CORNER_NONE; + r->bordergc = clearlooks_style->border_gc[CL_BORDER_UPPER]; + } + else + { + r->bordergc = clearlooks_style->spot3_gc; + } + + cl_rectangle_set_corners (r, corner, corner, corner, corner); + + cl_rectangle_set_gradient (&r->fill_gradient, + &style->base[GTK_STATE_SELECTED], &lower_color); + + r->gradient_type = CL_GRADIENT_VERTICAL; + + r->fillgc = clearlooks_style->spot2_gc; + r->topleft = clearlooks_style->spot1_gc; + + cl_rectangle_set_clip_rectangle (r, area); + cl_draw_rectangle (window, widget, style, x, y, width, height, r); + cl_draw_shadow (window, widget, style, x, y, width, height, r); + cl_rectangle_reset_clip_rectangle (r); +} + +void cl_draw_menuitem_flat (GdkDrawable *window, GtkWidget *widget, GtkStyle *style, + GdkRectangle *area, GtkStateType state_type, + int x, int y, int width, int height, CLRectangle *r) +{ + ClearlooksStyle *clearlooks_style = (ClearlooksStyle*)style; + gboolean menubar = (widget->parent && GTK_IS_MENU_BAR(widget->parent)) ? TRUE : FALSE; + GdkColor tmp; + + cl_rectangle_set_corners (r, CL_CORNER_NARROW, CL_CORNER_NARROW, + CL_CORNER_NARROW, CL_CORNER_NARROW); + + tmp = cl_gc_set_fg_color_shade (style->black_gc, style->colormap, + &style->base[GTK_STATE_PRELIGHT], 0.8); + + r->bordergc = style->black_gc; + r->fillgc = style->base_gc[GTK_STATE_PRELIGHT]; + + if (menubar) height++; + + cl_rectangle_set_clip_rectangle (r, area); + cl_draw_rectangle (window, widget, style, x, y, width, height, r); + cl_rectangle_reset_clip_rectangle (r); + + gdk_gc_set_foreground (style->black_gc, &tmp); +} + +void cl_draw_menuitem_gradient (GdkDrawable *window, GtkWidget *widget, GtkStyle *style, + GdkRectangle *area, GtkStateType state_type, + int x, int y, int width, int height, CLRectangle *r) +{ + ClearlooksStyle *clearlooks_style = (ClearlooksStyle*)style; + gboolean menubar = (widget->parent && GTK_IS_MENU_BAR(widget->parent)) ? TRUE : FALSE; + GdkColor tmp; + GdkColor lower_color; + + shade (&style->base[GTK_STATE_SELECTED], &lower_color, 0.8); + + cl_rectangle_set_corners (r, CL_CORNER_NARROW, CL_CORNER_NARROW, + CL_CORNER_NARROW, CL_CORNER_NARROW); + + cl_rectangle_set_gradient (&r->fill_gradient, + &style->base[GTK_STATE_SELECTED], &lower_color); + + r->gradient_type = CL_GRADIENT_VERTICAL; + + tmp = cl_gc_set_fg_color_shade (style->black_gc, style->colormap, + &style->base[GTK_STATE_PRELIGHT], 0.8); + + r->bordergc = style->black_gc; + r->fillgc = style->base_gc[GTK_STATE_PRELIGHT]; + + if (menubar) height++; + + cl_rectangle_set_clip_rectangle (r, area); + cl_draw_rectangle (window, widget, style, x, y, width, height, r); + cl_rectangle_reset_clip_rectangle (r); + + gdk_gc_set_foreground (style->black_gc, &tmp); +} + +void cl_draw_treeview_header (GtkStyle *style, GdkWindow *window, + GtkStateType state_type, GtkShadowType shadow_type, + GdkRectangle *area, + GtkWidget *widget, const gchar *detail, + gint x, gint y, gint width, gint height) +{ + ClearlooksStyle *clearlooks_style = CLEARLOOKS_STYLE (style); + gint columns = 0, column_index = -1, fill_width = width; + gboolean is_etree = strcmp("ETree", G_OBJECT_TYPE_NAME(widget->parent)) == 0; + gboolean resizable = TRUE; + + GdkGC *bottom = clearlooks_style->shade_gc[5]; + + if ( width < 2 || height < 2 ) + return; + + if (GTK_IS_TREE_VIEW (widget->parent)) + { + gtk_treeview_get_header_index (GTK_TREE_VIEW(widget->parent), + widget, &column_index, &columns, + &resizable); + } + else if (GTK_IS_CLIST (widget->parent)) + { + gtk_clist_get_header_index (GTK_CLIST(widget->parent), + widget, &column_index, &columns); + } + + if (area) + { + gdk_gc_set_clip_rectangle (clearlooks_style->shade_gc[0], area); + gdk_gc_set_clip_rectangle (clearlooks_style->shade_gc[4], area); + gdk_gc_set_clip_rectangle (style->bg_gc[state_type], area); + gdk_gc_set_clip_rectangle (clearlooks_style->shade_gc[5], area); + } + + if (state_type != GTK_STATE_NORMAL) + fill_width-=2; + + gdk_draw_rectangle (window, style->bg_gc[state_type], TRUE, x, y, fill_width, height-(height/3)+1); + + draw_hgradient (window, style->bg_gc[state_type], style, + x, 1+y+height-(height/3), fill_width, height/3, + &style->bg[state_type], &clearlooks_style->inset_dark[state_type]); + + if (resizable || (column_index != columns-1)) + { + gdk_draw_line (window, clearlooks_style->shade_gc[4], x+width-2, y+4, x+width-2, y+height-5); + gdk_draw_line (window, clearlooks_style->shade_gc[0], x+width-1, y+4, x+width-1, y+height-5); + } + + /* left light line */ + if (column_index == 0) + gdk_draw_line (window, clearlooks_style->shade_gc[0], x, y+1, x, y+height-2); + + /* top light line */ + gdk_draw_line (window, clearlooks_style->shade_gc[0], x, y, x+width-1, y); + + /* bottom dark line */ + if (state_type == GTK_STATE_INSENSITIVE) + bottom = clearlooks_style->shade_gc[3]; + + + gdk_draw_line (window, bottom, x, y+height-1, x+width-1, y+height-1); + + if (area) + { + gdk_gc_set_clip_rectangle (clearlooks_style->shade_gc[0], NULL); + gdk_gc_set_clip_rectangle (clearlooks_style->shade_gc[4], NULL); + gdk_gc_set_clip_rectangle (style->bg_gc[state_type], NULL); + gdk_gc_set_clip_rectangle (clearlooks_style->shade_gc[5], NULL); + } +} diff --git a/libs/clearlooks/clearlooks_draw.h b/libs/clearlooks/clearlooks_draw.h new file mode 100644 index 0000000000..a8cbb3732f --- /dev/null +++ b/libs/clearlooks/clearlooks_draw.h @@ -0,0 +1,159 @@ +#ifndef CLEARLOOKS_DRAW_H +#define CLEARLOOKS_DRAW_H + +#include <gtk/gtk.h> +#include <gdk/gdk.h> + +typedef struct +{ + GdkColor *from; + GdkColor *to; +} CLGradient; + +typedef enum +{ + CL_GRADIENT_NONE, + CL_GRADIENT_HORIZONTAL, + CL_GRADIENT_VERTICAL +} CLGradientType; + +typedef struct +{ + CLGradient fill_gradient; + CLGradient border_gradient; + + CLGradientType gradient_type; + + GdkGC *bordergc; + GdkGC *fillgc; + + guint8 corners[4]; + + GdkGC *topleft; /* top + left shadow */ + GdkGC *bottomright; /* bottom + right shadow */ + + GdkColor tmp_color; /* used for gradient */ +} CLRectangle; + +typedef enum /* DON'T CHANGE THE ORDER! */ +{ + CL_CORNER_TOPRIGHT, + CL_CORNER_BOTTOMRIGHT, + CL_CORNER_BOTTOMLEFT, + CL_CORNER_TOPLEFT +} CLCornerSide; + +typedef enum /* DON'T CHANGE THE ORDER! */ +{ + CL_BORDER_TOP, + CL_BORDER_RIGHT, + CL_BORDER_BOTTOM, + CL_BORDER_LEFT +} CLBorderType; + +typedef enum +{ + CL_CORNER_NONE = 0, + CL_CORNER_NARROW = 1, + CL_CORNER_ROUND = 2 +} CLCornerSharpness; + + + +CLRectangle *cl_rectangle_new(GdkGC *fillgc, GdkGC *bordergc, + int tl, int tr, int bl, int br); + +void cl_draw_rectangle (GdkWindow *window, GtkWidget *widget, GtkStyle *style, + int x, int y, int width, int height, CLRectangle *r); + +void cl_rectangle_set_color (CLGradient *g, GdkColor *color); +void cl_rectangle_set_gradient (CLGradient *g, GdkColor *from, GdkColor *to); + +void cl_rectangle_set_button (CLRectangle *r, GtkStyle *style, + GtkStateType state_type, gboolean hasdefault, gboolean has_focus, + CLBorderType tl, CLBorderType tr, + CLBorderType bl, CLBorderType br); + +void cl_rectangle_set_entry (CLRectangle *r, GtkStyle *style, + GtkStateType state_type, + CLBorderType tl, CLBorderType tr, + CLBorderType bl, CLBorderType br, + gboolean has_focus); + +void cl_draw_shadow(GdkWindow *window, GtkWidget *widget, GtkStyle *style, + int x, int y, int width, int height, CLRectangle *r); + +void cl_rectangle_set_clip_rectangle (CLRectangle *r, GdkRectangle *area); +void cl_rectangle_reset_clip_rectangle (CLRectangle *r); + +void cl_set_corner_sharpness (const gchar *detail, GtkWidget *widget, CLRectangle *r); + + +void cl_rectangle_set_corners (CLRectangle *r, int tl, int tr, int bl, int br); + +void cl_rectangle_init (CLRectangle *r, GdkGC *fillgc, GdkGC *bordergc, + int tl, int tr, int bl, int br); + +void cl_rectangle_reset (CLRectangle *r, GtkStyle *style); + + +GdkPixmap* cl_progressbar_tile_new (GdkDrawable *drawable, GtkWidget *widget, + GtkStyle *style, gint height, gint offset); + +void cl_progressbar_fill (GdkDrawable *drawable, GtkWidget *widget, + GtkStyle *style, GdkGC *gc, + gint x, gint y, gint width, gint height, + guint8 offset, GdkRectangle *area); + +GdkColor cl_gc_set_fg_color_shade (GdkGC *gc, GdkColormap *colormap, + GdkColor *from, gfloat s); + +void cl_draw_spinbutton(GtkStyle *style, GdkWindow *window, + GtkStateType state_type, GtkShadowType shadow_type, + GdkRectangle *area, + GtkWidget *widget, const gchar *detail, + gint x, gint y, gint width, gint height); + +void cl_draw_button(GtkStyle *style, GdkWindow *window, + GtkStateType state_type, GtkShadowType shadow_type, + GdkRectangle *area, + GtkWidget *widget, const gchar *detail, + gint x, gint y, gint width, gint height); + +void cl_draw_entry (GtkStyle *style, GdkWindow *window, + GtkStateType state_type, GtkShadowType shadow_type, + GdkRectangle *area, + GtkWidget *widget, const gchar *detail, + gint x, gint y, gint width, gint height); + +void cl_draw_combobox_entry (GtkStyle *style, GdkWindow *window, + GtkStateType state_type, GtkShadowType shadow_type, + GdkRectangle *area, + GtkWidget *widget, const gchar *detail, + gint x, gint y, gint width, gint height); + +void cl_draw_combobox_button (GtkStyle *style, GdkWindow *window, + GtkStateType state_type, GtkShadowType shadow_type, + GdkRectangle *area, + GtkWidget *widget, const gchar *detail, + gint x, gint y, gint width, gint height); + +void cl_draw_menuitem_button (GdkDrawable *window, GtkWidget *widget, GtkStyle *style, + GdkRectangle *area, GtkStateType state_type, + int x, int y, int wiidth, int height, CLRectangle *r); + +void cl_draw_menuitem_flat (GdkDrawable *window, GtkWidget *widget, GtkStyle *style, + GdkRectangle *area, GtkStateType state_type, + int x, int y, int wiidth, int height, CLRectangle *r); + +void cl_draw_menuitem_gradient (GdkDrawable *window, GtkWidget *widget, GtkStyle *style, + GdkRectangle *area, GtkStateType state_type, + int x, int y, int wiidth, int height, CLRectangle *r); + +void cl_draw_treeview_header (GtkStyle *style, GdkWindow *window, + GtkStateType state_type, GtkShadowType shadow_type, + GdkRectangle *area, + GtkWidget *widget, const gchar *detail, + gint x, gint y, gint width, gint height); + +#endif /* CLEARLOOKS_DRAW_H */ diff --git a/libs/clearlooks/clearlooks_rc_style.c b/libs/clearlooks/clearlooks_rc_style.c new file mode 100644 index 0000000000..1c5f2c495e --- /dev/null +++ b/libs/clearlooks/clearlooks_rc_style.c @@ -0,0 +1,392 @@ +/* Clearlooks theme engine + * Copyright (C) 2005 Richard Stellingwerff. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Written by Owen Taylor <otaylor@redhat.com> + * and by Alexander Larsson <alexl@redhat.com> + * Modified by Richard Stellingwerff <remenic@gmail.com> + */ + +#include "clearlooks_style.h" +#include "clearlooks_rc_style.h" + +static void clearlooks_rc_style_init (ClearlooksRcStyle *style); +static void clearlooks_rc_style_class_init (ClearlooksRcStyleClass *klass); +static GtkStyle *clearlooks_rc_style_create_style (GtkRcStyle *rc_style); +static guint clearlooks_rc_style_parse (GtkRcStyle *rc_style, + GtkSettings *settings, + GScanner *scanner); +static void clearlooks_rc_style_merge (GtkRcStyle *dest, + GtkRcStyle *src); + + +static GtkRcStyleClass *parent_class; + +GType clearlooks_type_rc_style = 0; + +enum +{ + TOKEN_SPOTCOLOR = G_TOKEN_LAST + 1, + TOKEN_CONTRAST, + TOKEN_SUNKENMENU, + TOKEN_PROGRESSBARSTYLE, + TOKEN_MENUBARSTYLE, + TOKEN_MENUITEMSTYLE, + TOKEN_LISTVIEWITEMSTYLE +}; + +static struct + { + const gchar *name; + guint token; + } +theme_symbols[] = +{ + { "spotcolor", TOKEN_SPOTCOLOR }, + { "contrast", TOKEN_CONTRAST }, + { "sunkenmenubar", TOKEN_SUNKENMENU }, + { "progressbarstyle", TOKEN_PROGRESSBARSTYLE }, + { "menubarstyle", TOKEN_MENUBARSTYLE }, + { "menuitemstyle", TOKEN_MENUITEMSTYLE }, + { "listviewitemstyle", TOKEN_LISTVIEWITEMSTYLE } +}; + + +void +clearlooks_rc_style_register_type (GTypeModule *module) +{ + static const GTypeInfo object_info = + { + sizeof (ClearlooksRcStyleClass), + (GBaseInitFunc) NULL, + (GBaseFinalizeFunc) NULL, + (GClassInitFunc) clearlooks_rc_style_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (ClearlooksRcStyle), + 0, /* n_preallocs */ + (GInstanceInitFunc) clearlooks_rc_style_init, + NULL + }; + + clearlooks_type_rc_style = g_type_module_register_type (module, + GTK_TYPE_RC_STYLE, + "ClearlooksRcStyle", + &object_info, 0); +} + +static void +clearlooks_rc_style_init (ClearlooksRcStyle *clearlooks_rc) +{ + clearlooks_rc->has_spot_color = FALSE; + clearlooks_rc->contrast = 1.0; + clearlooks_rc->sunkenmenubar = 1; + clearlooks_rc->progressbarstyle = 0; + clearlooks_rc->menubarstyle = 0; + clearlooks_rc->menuitemstyle = 1; + clearlooks_rc->listviewitemstyle = 1; +} + +static void +clearlooks_rc_style_class_init (ClearlooksRcStyleClass *klass) +{ + GtkRcStyleClass *rc_style_class = GTK_RC_STYLE_CLASS (klass); + + parent_class = g_type_class_peek_parent (klass); + + rc_style_class->parse = clearlooks_rc_style_parse; + rc_style_class->create_style = clearlooks_rc_style_create_style; + rc_style_class->merge = clearlooks_rc_style_merge; +} + +static guint +theme_parse_color(GtkSettings *settings, + GScanner *scanner, + GdkColor *color) +{ + guint token; + + /* Skip 'blah_color' */ + token = g_scanner_get_next_token(scanner); + + token = g_scanner_get_next_token(scanner); + if (token != G_TOKEN_EQUAL_SIGN) + return G_TOKEN_EQUAL_SIGN; + + return gtk_rc_parse_color (scanner, color); +} + +static guint +theme_parse_contrast(GtkSettings *settings, + GScanner *scanner, + double *contrast) +{ + guint token; + + /* Skip 'contrast' */ + token = g_scanner_get_next_token(scanner); + + token = g_scanner_get_next_token(scanner); + if (token != G_TOKEN_EQUAL_SIGN) + return G_TOKEN_EQUAL_SIGN; + + token = g_scanner_get_next_token(scanner); + if (token != G_TOKEN_FLOAT) + return G_TOKEN_FLOAT; + + *contrast = scanner->value.v_float; + + return G_TOKEN_NONE; +} + +static guint +theme_parse_sunkenmenubar(GtkSettings *settings, + GScanner *scanner, + guint8 *sunken) +{ + guint token; + + /* Skip 'sunkenmenubar' */ + token = g_scanner_get_next_token(scanner); + + token = g_scanner_get_next_token(scanner); + if (token != G_TOKEN_EQUAL_SIGN) + return G_TOKEN_EQUAL_SIGN; + + token = g_scanner_get_next_token(scanner); + if (token != G_TOKEN_INT) + return G_TOKEN_INT; + + *sunken = scanner->value.v_int; + + return G_TOKEN_NONE; +} + +static guint +theme_parse_progressbarstyle(GtkSettings *settings, + GScanner *scanner, + guint8 *progressbarstyle) +{ + guint token; + + /* Skip 'sunkenmenubar' */ + token = g_scanner_get_next_token(scanner); + + token = g_scanner_get_next_token(scanner); + if (token != G_TOKEN_EQUAL_SIGN) + return G_TOKEN_EQUAL_SIGN; + + token = g_scanner_get_next_token(scanner); + if (token != G_TOKEN_INT) + return G_TOKEN_INT; + + *progressbarstyle = scanner->value.v_int; + + return G_TOKEN_NONE; +} + +static guint +theme_parse_menubarstyle(GtkSettings *settings, + GScanner *scanner, + guint8 *menubarstyle) +{ + guint token; + + /* Skip 'menubarstyle' */ + token = g_scanner_get_next_token(scanner); + + token = g_scanner_get_next_token(scanner); + if (token != G_TOKEN_EQUAL_SIGN) + return G_TOKEN_EQUAL_SIGN; + + token = g_scanner_get_next_token(scanner); + if (token != G_TOKEN_INT) + return G_TOKEN_INT; + + *menubarstyle = scanner->value.v_int; + + return G_TOKEN_NONE; +} + +static guint +theme_parse_menuitemstyle(GtkSettings *settings, + GScanner *scanner, + guint8 *menuitemstyle) +{ + guint token; + + /* Skip 'sunkenmenubar' */ + token = g_scanner_get_next_token(scanner); + + token = g_scanner_get_next_token(scanner); + if (token != G_TOKEN_EQUAL_SIGN) + return G_TOKEN_EQUAL_SIGN; + + token = g_scanner_get_next_token(scanner); + if (token != G_TOKEN_INT) + return G_TOKEN_INT; + + *menuitemstyle = scanner->value.v_int; + + return G_TOKEN_NONE; +} + +static guint +theme_parse_listviewitemstyle(GtkSettings *settings, + GScanner *scanner, + guint8 *listviewitemstyle) +{ + guint token; + + token = g_scanner_get_next_token(scanner); + + token = g_scanner_get_next_token(scanner); + + if (token != G_TOKEN_EQUAL_SIGN) + return G_TOKEN_EQUAL_SIGN; + + token = g_scanner_get_next_token(scanner); + if (token != G_TOKEN_INT) + return G_TOKEN_INT; + + *listviewitemstyle = scanner->value.v_int; + + return G_TOKEN_NONE; +} + +static guint +clearlooks_rc_style_parse (GtkRcStyle *rc_style, + GtkSettings *settings, + GScanner *scanner) + +{ + static GQuark scope_id = 0; + ClearlooksRcStyle *clearlooks_style = CLEARLOOKS_RC_STYLE (rc_style); + + guint old_scope; + guint token; + guint i; + + /* Set up a new scope in this scanner. */ + + if (!scope_id) + scope_id = g_quark_from_string("clearlooks_theme_engine"); + + /* If we bail out due to errors, we *don't* reset the scope, so the + * error messaging code can make sense of our tokens. + */ + old_scope = g_scanner_set_scope(scanner, scope_id); + + /* Now check if we already added our symbols to this scope + * (in some previous call to clearlooks_rc_style_parse for the + * same scanner. + */ + + if (!g_scanner_lookup_symbol(scanner, theme_symbols[0].name)) + { + g_scanner_freeze_symbol_table(scanner); + for (i = 0; i < G_N_ELEMENTS (theme_symbols); i++) + g_scanner_scope_add_symbol(scanner, scope_id, + theme_symbols[i].name, + GINT_TO_POINTER(theme_symbols[i].token)); + g_scanner_thaw_symbol_table(scanner); + } + + /* We're ready to go, now parse the top level */ + + token = g_scanner_peek_next_token(scanner); + while (token != G_TOKEN_RIGHT_CURLY) + { + switch (token) + { + case TOKEN_SPOTCOLOR: + token = theme_parse_color(settings, scanner, &clearlooks_style->spot_color); + clearlooks_style->has_spot_color = TRUE; + break; + case TOKEN_CONTRAST: + token = theme_parse_contrast(settings, scanner, &clearlooks_style->contrast); + break; + case TOKEN_SUNKENMENU: + token = theme_parse_sunkenmenubar(settings, scanner, &clearlooks_style->sunkenmenubar); + break; + case TOKEN_PROGRESSBARSTYLE: + token = theme_parse_progressbarstyle(settings, scanner, &clearlooks_style->progressbarstyle); + break; + case TOKEN_MENUBARSTYLE: + token = theme_parse_menubarstyle(settings, scanner, &clearlooks_style->menubarstyle); + break; + case TOKEN_MENUITEMSTYLE: + token = theme_parse_menuitemstyle(settings, scanner, &clearlooks_style->menuitemstyle); + break; + case TOKEN_LISTVIEWITEMSTYLE: + token = theme_parse_listviewitemstyle(settings, scanner, &clearlooks_style->listviewitemstyle); + break; + default: + g_scanner_get_next_token(scanner); + token = G_TOKEN_RIGHT_CURLY; + break; + } + + if (token != G_TOKEN_NONE) + return token; + + token = g_scanner_peek_next_token(scanner); + } + + g_scanner_get_next_token(scanner); + + g_scanner_set_scope(scanner, old_scope); + + return G_TOKEN_NONE; +} + +static void +clearlooks_rc_style_merge (GtkRcStyle *dest, + GtkRcStyle *src) +{ + ClearlooksRcStyle *dest_w, *src_w; + + parent_class->merge (dest, src); + + if (!CLEARLOOKS_IS_RC_STYLE (src)) + return; + + src_w = CLEARLOOKS_RC_STYLE (src); + dest_w = CLEARLOOKS_RC_STYLE (dest); + + dest_w->contrast = src_w->contrast; + dest_w->sunkenmenubar = src_w->sunkenmenubar; + dest_w->progressbarstyle = src_w->progressbarstyle; + dest_w->menubarstyle = src_w->menubarstyle; + dest_w->menuitemstyle = src_w->menuitemstyle; + dest_w->listviewitemstyle = src_w->listviewitemstyle; + + if (src_w->has_spot_color) + { + dest_w->has_spot_color = TRUE; + dest_w->spot_color = src_w->spot_color; + } +} + + +/* Create an empty style suitable to this RC style + */ +static GtkStyle * +clearlooks_rc_style_create_style (GtkRcStyle *rc_style) +{ + return GTK_STYLE (g_object_new (CLEARLOOKS_TYPE_STYLE, NULL)); +} diff --git a/libs/clearlooks/clearlooks_rc_style.h b/libs/clearlooks/clearlooks_rc_style.h new file mode 100644 index 0000000000..bd8e0ca05d --- /dev/null +++ b/libs/clearlooks/clearlooks_rc_style.h @@ -0,0 +1,57 @@ +/* Clearlooks Theme Engine + * Copyright (C) 2005 Richard Stellingwerff. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Written by Owen Taylor <otaylor@redhat.com> + * and by Alexander Larsson <alexl@redhat.com> + * Modified by Richard Stellingwerff <remenic@gmail.com> + */ + +#include <gtk/gtkrc.h> + +typedef struct _ClearlooksRcStyle ClearlooksRcStyle; +typedef struct _ClearlooksRcStyleClass ClearlooksRcStyleClass; + +extern GType clearlooks_type_rc_style; + +#define CLEARLOOKS_TYPE_RC_STYLE clearlooks_type_rc_style +#define CLEARLOOKS_RC_STYLE(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), CLEARLOOKS_TYPE_RC_STYLE, ClearlooksRcStyle)) +#define CLEARLOOKS_RC_STYLE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), CLEARLOOKS_TYPE_RC_STYLE, ClearlooksRcStyleClass)) +#define CLEARLOOKS_IS_RC_STYLE(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), CLEARLOOKS_TYPE_RC_STYLE)) +#define CLEARLOOKS_IS_RC_STYLE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), CLEARLOOKS_TYPE_RC_STYLE)) +#define CLEARLOOKS_RC_STYLE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), CLEARLOOKS_TYPE_RC_STYLE, ClearlooksRcStyleClass)) + +struct _ClearlooksRcStyle +{ + GtkRcStyle parent_instance; + + GdkColor spot_color; + gboolean has_spot_color; + double contrast; + guint8 sunkenmenubar; + guint8 progressbarstyle; + guint8 menubarstyle; + guint8 menuitemstyle; + guint8 listviewitemstyle; +}; + +struct _ClearlooksRcStyleClass +{ + GtkRcStyleClass parent_class; +}; + +void clearlooks_rc_style_register_type (GTypeModule *module); diff --git a/libs/clearlooks/clearlooks_style.c b/libs/clearlooks/clearlooks_style.c new file mode 100644 index 0000000000..241f14c6e4 --- /dev/null +++ b/libs/clearlooks/clearlooks_style.c @@ -0,0 +1,2657 @@ +#include <gtk/gtk.h> + +#include "clearlooks_style.h" +#include "clearlooks_rc_style.h" +#include "clearlooks_draw.h" + +#include <math.h> +#include <string.h> + +#include "bits.c" +#include "support.h" +//#include "config.h" + +/* #define DEBUG 1 */ + +#define SCALE_SIZE 5 + +#define DETAIL(xx) ((detail) && (!strcmp(xx, detail))) +#define COMPARE_COLORS(a,b) (a.red == b.red && a.green == b.green && a.blue == b.blue) + +#define DRAW_ARGS GtkStyle *style, \ + GdkWindow *window, \ + GtkStateType state_type, \ + GtkShadowType shadow_type, \ + GdkRectangle *area, \ + GtkWidget *widget, \ + const gchar *detail, \ + gint x, \ + gint y, \ + gint width, \ + gint height + +static GdkGC *realize_color (GtkStyle * style, GdkColor * color); +static GtkStyleClass *parent_class; +static GList *progressbars = NULL; +static gint8 pboffset = 10; +static int timer_id = 0; + +static void cl_progressbar_remove (gpointer data) +{ + if (g_list_find (progressbars, data) == NULL) + return; + + progressbars = g_list_remove (progressbars, data); + g_object_unref (data); + + if (g_list_first(progressbars) == NULL) { + g_source_remove(timer_id); + timer_id = 0; + } +} + +static void update_progressbar (gpointer data, gpointer user_data) +{ + gfloat fraction; + + if (data == NULL) + return; + + fraction = gtk_progress_bar_get_fraction (GTK_PROGRESS_BAR (data)); + + /* update only if not filled */ + if (fraction < 1.0) + gtk_widget_queue_resize ((GtkWidget*)data); + + if (fraction >= 1.0 || GTK_PROGRESS (data)->activity_mode) + cl_progressbar_remove (data); +} + +static gboolean timer_func (gpointer data) +{ + g_list_foreach (progressbars, update_progressbar, NULL); + if (--pboffset < 0) pboffset = 9; + return (g_list_first(progressbars) != NULL); +} + +static gboolean cl_progressbar_known(gconstpointer data) +{ + return (g_list_find (progressbars, data) != NULL); +} + + +static void cl_progressbar_add (gpointer data) +{ + if (!GTK_IS_PROGRESS_BAR (data)) + return; + + progressbars = g_list_append (progressbars, data); + + g_object_ref (data); + g_signal_connect ((GObject*)data, "unrealize", G_CALLBACK (cl_progressbar_remove), data); + + if (timer_id == 0) + timer_id = g_timeout_add (100, timer_func, NULL); +} + +static GdkColor * +clearlooks_get_spot_color (ClearlooksRcStyle *clearlooks_rc) +{ + GtkRcStyle *rc = GTK_RC_STYLE (clearlooks_rc); + + if (clearlooks_rc->has_spot_color) + return &clearlooks_rc->spot_color; + else + return &rc->base[GTK_STATE_SELECTED]; +} + +/**************************************************************************/ + +/* used for optionmenus... */ +static void +draw_tab (GtkStyle *style, + GdkWindow *window, + GtkStateType state_type, + GtkShadowType shadow_type, + GdkRectangle *area, + GtkWidget *widget, + const gchar *detail, + gint x, + gint y, + gint width, + gint height) +{ +#define ARROW_SPACE 2 +#define ARROW_LINE_HEIGHT 2 +#define ARROW_LINE_WIDTH 5 + ClearlooksStyle *clearlooks_style = CLEARLOOKS_STYLE (style); + GtkRequisition indicator_size; + GtkBorder indicator_spacing; + gint arrow_height; + + option_menu_get_props (widget, &indicator_size, &indicator_spacing); + + indicator_size.width += (indicator_size.width % 2) - 1; + arrow_height = indicator_size.width / 2 + 2; + + x += (width - indicator_size.width) / 2; + y += height/2; + + if (state_type == GTK_STATE_INSENSITIVE) + { + draw_arrow (window, style->light_gc[state_type], area, + GTK_ARROW_UP, 1+x, 1+y-arrow_height, + indicator_size.width, arrow_height); + + draw_arrow (window, style->light_gc[state_type], area, + GTK_ARROW_DOWN, 1+x, 1+y+1, + indicator_size.width, arrow_height); + } + + draw_arrow (window, style->fg_gc[state_type], area, + GTK_ARROW_UP, x, y-arrow_height, + indicator_size.width, arrow_height); + + draw_arrow (window, style->fg_gc[state_type], area, + GTK_ARROW_DOWN, x, y+1, + indicator_size.width, arrow_height); +} + +static void +clearlooks_draw_arrow (GtkStyle *style, + GdkWindow *window, + GtkStateType state, + GtkShadowType shadow, + GdkRectangle *area, + GtkWidget *widget, + const gchar *detail, + GtkArrowType arrow_type, + gboolean fill, + gint x, + gint y, + gint width, + gint height) +{ + ClearlooksStyle *clearlooks_style = CLEARLOOKS_STYLE (style); + gint original_width, original_x; + GdkGC *gc; + + sanitize_size (window, &width, &height); + + if (is_combo_box (widget)) + { + width = 7; + height = 5; + x+=2; + y+=4; + if (state == GTK_STATE_INSENSITIVE) + { + draw_arrow (window, style->light_gc[state], area, + GTK_ARROW_UP, 1+x, 1+y-height, + width, height); + + draw_arrow (window, style->light_gc[state], area, + GTK_ARROW_DOWN, 1+x, 1+y+1, + width, height); + } + + draw_arrow (window, style->fg_gc[state], area, + GTK_ARROW_UP, x, y-height, + width, height); + + draw_arrow (window, style->fg_gc[state], area, + GTK_ARROW_DOWN, x, y+1, + width, height); + + return; + } + + original_width = width; + original_x = x; + + /* Make spinbutton arrows and arrows in menus + * slightly larger to get the right pixels drawn */ + if (DETAIL ("spinbutton")) + height += 1; + + if (DETAIL("menuitem")) + { + width = 6; + height = 7; + } + + /* Compensate arrow position for "sunken" look */ + if (DETAIL ("spinbutton") && arrow_type == GTK_ARROW_DOWN && + style->xthickness > 2 && style->ythickness > 2) + y -= 1; + + if (widget && widget->parent && GTK_IS_COMBO (widget->parent->parent)) + { + width -= 2; + height -=2; + x++; + } + + calculate_arrow_geometry (arrow_type, &x, &y, &width, &height); + + if (DETAIL ("menuitem")) + x = original_x + original_width - width; + + if (DETAIL ("spinbutton") && (arrow_type == GTK_ARROW_DOWN)) + y += 1; + + if (state == GTK_STATE_INSENSITIVE) + draw_arrow (window, style->light_gc[state], area, arrow_type, x + 1, y + 1, width, height); + + gc = style->fg_gc[state]; + + draw_arrow (window, gc, area, arrow_type, x, y, width, height); +} + + +static void +draw_flat_box (DRAW_ARGS) +{ + ClearlooksStyle *clearlooks_style = CLEARLOOKS_STYLE (style); + + g_return_if_fail (GTK_IS_STYLE (style)); + g_return_if_fail (window != NULL); + + sanitize_size (window, &width, &height); + + if (detail && + clearlooks_style->listviewitemstyle == 1 && + state_type == GTK_STATE_SELECTED && ( + !strncmp ("cell_even", detail, strlen ("cell_even")) || + !strncmp ("cell_odd", detail, strlen ("cell_odd")))) + { + GdkGC *gc; + GdkColor lower_color; + GdkColor *upper_color; + + if (GTK_WIDGET_HAS_FOCUS (widget)) + { + gc = style->base_gc[state_type]; + upper_color = &style->base[state_type]; + } + else + { + gc = style->base_gc[GTK_STATE_ACTIVE]; + upper_color = &style->base[GTK_STATE_ACTIVE]; + } + + if (GTK_IS_TREE_VIEW (widget) && 0) + { + GtkTreeSelection *sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (widget)); + + if (gtk_tree_selection_count_selected_rows (sel) > 1) + { + parent_class->draw_flat_box (style, window, state_type, shadow_type, + area, widget, detail, + x, y, width, height); + return; + } + } + + shade (upper_color, &lower_color, 0.8); + + if (area) + gdk_gc_set_clip_rectangle (gc, area); + + draw_hgradient (window, gc, style, + x, y, width, height, upper_color, &lower_color); + + if (area) + gdk_gc_set_clip_rectangle (gc, NULL); + } + else + { + parent_class->draw_flat_box (style, window, state_type, + shadow_type, + area, widget, detail, + x, y, width, height); + } +} +/**************************************************************************/ + +static void +draw_shadow (DRAW_ARGS) +{ + ClearlooksStyle *clearlooks_style = CLEARLOOKS_STYLE (style); + CLRectangle r; + + GdkGC *outer_gc = clearlooks_style->shade_gc[4]; + GdkGC *gc1 = NULL; + GdkGC *gc2 = NULL; + gint thickness_light; + gint thickness_dark; + gboolean interior_focus = FALSE; + +#if DEBUG + printf("draw_shadow: %s %d %d %d %d\n", detail, x, y, width, height); +#endif + + if (widget == NULL) + { + gdk_draw_rectangle (window, outer_gc, FALSE, + x, y, width - 1, height - 1); + return; + } + + if ((width == -1) && (height == -1)) + gdk_window_get_size (window, &width, &height); + else if (width == -1) + gdk_window_get_size (window, &width, NULL); + else if (height == -1) + gdk_window_get_size (window, NULL, &height); + + cl_rectangle_reset (&r, style); + + if (DETAIL ("frame") && widget->parent && + GTK_IS_STATUSBAR (widget->parent)) + { + gtk_style_apply_default_background (style, window,widget && !GTK_WIDGET_NO_WINDOW (widget), + state_type, area, x, y, width, height); + + if (area) + { + gdk_gc_set_clip_rectangle (clearlooks_style->shade_gc[3], area); + gdk_gc_set_clip_rectangle (clearlooks_style->shade_gc[0], area); + } + + gdk_draw_line (window, clearlooks_style->shade_gc[3], + x, y, x + width, y); + gdk_draw_line (window, clearlooks_style->shade_gc[0], + x, y + 1, x + width, y + 1); + + if (area) + { + gdk_gc_set_clip_rectangle (clearlooks_style->shade_gc[3], NULL); + gdk_gc_set_clip_rectangle (clearlooks_style->shade_gc[0], NULL); + } + } + else if (detail && !strcmp (detail, "entry")) + { + if ( widget->parent && (GTK_IS_COMBO_BOX_ENTRY (widget->parent) || + GTK_IS_SPIN_BUTTON(widget) || + GTK_IS_COMBO (widget->parent))) + { + cl_draw_combobox_entry (style, window, GTK_WIDGET_STATE(widget), shadow_type, area, widget, detail, x, y, width, height); + } + else + { + cl_draw_entry (style, window, GTK_WIDGET_STATE(widget), shadow_type, area, widget, detail, x, y, width, height); + } + } + else if (DETAIL ("viewport") || DETAIL ("scrolled_window")) + { + gdk_draw_rectangle (window, clearlooks_style->shade_gc[4], FALSE, + x, y, width - 1, height - 1); + } + else + { + if (DETAIL ("menuitem")) + outer_gc = clearlooks_style->spot3_gc; + else + outer_gc = clearlooks_style->shade_gc[4]; + + if (shadow_type == GTK_SHADOW_IN) + gdk_draw_rectangle (window, outer_gc, FALSE, + x, y, width - 1, height - 1); + else if (shadow_type == GTK_SHADOW_OUT) + { + gdk_draw_rectangle (window, outer_gc, FALSE, + x, y, width - 1, height - 1); + gdk_draw_line (window, style->light_gc[state_type], + x+1, y+1, x+width-2, y+1); + gdk_draw_line (window, style->light_gc[state_type], + x+1, y+1, x+1, y+height-2); + } + else if (shadow_type == GTK_SHADOW_ETCHED_IN) + { + GdkGC *a = clearlooks_style->shade_gc[(shadow_type == GTK_SHADOW_ETCHED_IN) ? 0 : 3]; + GdkGC *b = clearlooks_style->shade_gc[(shadow_type == GTK_SHADOW_ETCHED_IN) ? 3 : 0]; + + cl_rectangle_set_corners (&r, CL_CORNER_NONE, CL_CORNER_NONE, + CL_CORNER_NONE, CL_CORNER_NONE); + + r.bordergc = a; + cl_rectangle_set_clip_rectangle (&r, area); + cl_draw_rectangle (window, widget, style, x+1, y+1, width-1, height-1, &r); + cl_rectangle_reset_clip_rectangle (&r); + + r.bordergc = b; + cl_rectangle_set_clip_rectangle (&r, area); + cl_draw_rectangle (window, widget, style, x, y, width-1, height-1, &r); + cl_rectangle_reset_clip_rectangle (&r); + } + else if (shadow_type == GTK_SHADOW_ETCHED_IN) + { + GdkGC *a = clearlooks_style->shade_gc[(shadow_type == GTK_SHADOW_ETCHED_IN) ? 3 : 0]; + GdkGC *b = clearlooks_style->shade_gc[(shadow_type == GTK_SHADOW_ETCHED_IN) ? 0 : 3]; + + cl_rectangle_set_corners (&r, CL_CORNER_NONE, CL_CORNER_NONE, + CL_CORNER_NONE, CL_CORNER_NONE); + + r.bordergc = a; + cl_rectangle_set_clip_rectangle (&r, area); + cl_draw_rectangle (window, widget, style, x+1, y+1, width-1, height-1, &r); + cl_rectangle_reset_clip_rectangle (&r); + + r.bordergc = b; + cl_rectangle_set_clip_rectangle (&r, area); + cl_draw_rectangle (window, widget, style, x, y, width-1, height-1, &r); + cl_rectangle_reset_clip_rectangle (&r); + } + else + parent_class->draw_shadow (style, window, state_type, shadow_type, + area, widget, detail, + x, y, width, height); + } +} + +#define GDK_RECTANGLE_SET(rect,a,b,c,d) rect.x = a; \ + rect.y = b; \ + rect.width = c; \ + rect.height = d; + + +static void +draw_box_gap (DRAW_ARGS, + GtkPositionType gap_side, + gint gap_x, + gint gap_width) +{ + ClearlooksStyle *clearlooks_style = CLEARLOOKS_STYLE (style); + CLRectangle r; + + GdkRegion *area_region = NULL, + *gap_region = NULL; + GdkRectangle light_rect; + GdkRectangle dark_rect; + +#if DEBUG + printf("draw_box_gap: %s %d %d %d %d\n", detail, x, y, width, height); +#endif + + g_return_if_fail (GTK_IS_STYLE (style)); + g_return_if_fail (window != NULL); + + sanitize_size (window, &width, &height); + + cl_rectangle_reset (&r, style); + + r.bordergc = clearlooks_style->shade_gc[5]; + + r.topleft = style->light_gc[state_type]; + r.bottomright = clearlooks_style->shade_gc[1]; + + if (area) + area_region = gdk_region_rectangle (area); + else + { + GdkRectangle tmp = { x, y, width, height }; + area_region = gdk_region_rectangle (&tmp); + } + + switch (gap_side) + { + case GTK_POS_TOP: + { + GdkRectangle rect = { x+gap_x+1, y, gap_width-2, 2 }; + gap_region = gdk_region_rectangle (&rect); + + GDK_RECTANGLE_SET (light_rect, x+gap_x+1, y, x+gap_x+1, y+1); + GDK_RECTANGLE_SET (dark_rect, x+gap_x+gap_width-2, y, x+gap_x+gap_width-2, y); + + cl_rectangle_set_corners (&r, CL_CORNER_NONE, CL_CORNER_NONE, + CL_CORNER_ROUND, CL_CORNER_ROUND); + + break; + } + case GTK_POS_BOTTOM: + { + GdkRectangle rect = { x+gap_x+1, y+height-2, gap_width-2, 2 }; + gap_region = gdk_region_rectangle (&rect); + + GDK_RECTANGLE_SET (light_rect, x+gap_x+1, y+height-2, x+gap_x+1, y+height-1); + GDK_RECTANGLE_SET (dark_rect, x+gap_x+gap_width-2, y+height-2, x+gap_x+gap_width-2, y+height-1); + + cl_rectangle_set_corners (&r, CL_CORNER_ROUND, CL_CORNER_ROUND, + CL_CORNER_NONE, CL_CORNER_NONE); + + break; + } + case GTK_POS_LEFT: + { + GdkRectangle rect = { x, y+gap_x+1, 2, gap_width-2 }; + gap_region = gdk_region_rectangle (&rect); + + GDK_RECTANGLE_SET (light_rect, x, y+gap_x+1, x+1, y+gap_x+1); + GDK_RECTANGLE_SET (dark_rect, x, y+gap_x+gap_width-2, x, y+gap_x+gap_width-2); + + cl_rectangle_set_corners (&r, CL_CORNER_NONE, CL_CORNER_ROUND, + CL_CORNER_NONE, CL_CORNER_ROUND); + break; + } + case GTK_POS_RIGHT: + { + GdkRectangle rect = { x+width-2, y+gap_x+1, 2, gap_width-2 }; + gap_region = gdk_region_rectangle (&rect); + + GDK_RECTANGLE_SET (light_rect, x+width-2, y+gap_x+1, x+width-1, y+gap_x+1); + GDK_RECTANGLE_SET (dark_rect, x+width-2, y+gap_x+gap_width-2, x+width-1, y+gap_x+gap_width-2); + + cl_rectangle_set_corners (&r, CL_CORNER_ROUND, CL_CORNER_NONE, + CL_CORNER_ROUND, CL_CORNER_NONE); + break; + } + } + + gdk_region_subtract (area_region, gap_region); + + gdk_gc_set_clip_region (r.bordergc, area_region); + gdk_gc_set_clip_region (r.topleft, area_region); + gdk_gc_set_clip_region (r.bottomright, area_region); + + gdk_region_destroy (area_region); + gdk_region_destroy (gap_region); + + gdk_draw_rectangle (window, style->bg_gc[state_type], TRUE, x, y, width, height); + + cl_draw_rectangle (window, widget, style, x, y, width, height, &r); + + cl_draw_shadow (window, widget, style, x, y, width, height, &r); + + gdk_gc_set_clip_region (r.bordergc, NULL); + gdk_gc_set_clip_region (r.topleft, NULL); + gdk_gc_set_clip_region (r.bottomright, NULL); + + /* it's a semi hack */ + gdk_draw_line (window, style->light_gc[state_type], + light_rect.x, light_rect.y, + light_rect.width, light_rect.height); + + gdk_draw_line (window, clearlooks_style->shade_gc[1], + dark_rect.x, dark_rect.y, + dark_rect.width, dark_rect.height); +} + +/**************************************************************************/ + +static void +draw_extension (DRAW_ARGS, GtkPositionType gap_side) +{ + ClearlooksStyle *clearlooks_style = CLEARLOOKS_STYLE (style); + int my_state_type = (state_type == GTK_STATE_ACTIVE) ? 2 : 0; + CLRectangle r; + +#if DEBUG + printf("draw_extension: %s %d %d %d %d\n", detail, x, y, width, height); +#endif + + g_return_if_fail (GTK_IS_STYLE (style)); + g_return_if_fail (window != NULL); + + sanitize_size (window, &width, &height); + + if (DETAIL ("tab")) + { + GdkRectangle new_area; + GdkColor tmp_color; + + cl_rectangle_set_button (&r, style, state_type, FALSE, FALSE, + CL_CORNER_ROUND, CL_CORNER_ROUND, + CL_CORNER_ROUND, CL_CORNER_ROUND); + + if (state_type == GTK_STATE_ACTIVE) + shade (&style->bg[state_type], &tmp_color, 1.08); + else + shade (&style->bg[state_type], &tmp_color, 1.05); + + if (area) + { + new_area = *area; + } + else + { + new_area.x = x; + new_area.y = y; + new_area.width = width; + new_area.height = height; + } + + switch (gap_side) + { + case GTK_POS_BOTTOM: + height+=2; + new_area.y = y; + new_area.height = height-2; + r.gradient_type = CL_GRADIENT_VERTICAL; + cl_rectangle_set_gradient (&r.fill_gradient, &tmp_color, &style->bg[state_type]); + cl_rectangle_set_gradient (&r.border_gradient, + &clearlooks_style->border[CL_BORDER_UPPER+my_state_type], + &clearlooks_style->border[CL_BORDER_LOWER+my_state_type]); + break; + case GTK_POS_TOP: + y-=2; + height+=2; + new_area.y = y+2; + new_area.height = height; + r.gradient_type = CL_GRADIENT_VERTICAL; + cl_rectangle_set_gradient (&r.fill_gradient, &style->bg[state_type], &tmp_color); + cl_rectangle_set_gradient (&r.border_gradient, + &clearlooks_style->border[CL_BORDER_LOWER+my_state_type], + &clearlooks_style->border[CL_BORDER_UPPER+my_state_type]); + break; + case GTK_POS_LEFT: + x-=2; + width+=2; + new_area.x = x+2; + new_area.width = width; + r.gradient_type = CL_GRADIENT_HORIZONTAL; + cl_rectangle_set_gradient (&r.fill_gradient, &style->bg[state_type], &tmp_color); + cl_rectangle_set_gradient (&r.border_gradient, + &clearlooks_style->border[CL_BORDER_LOWER+my_state_type], + &clearlooks_style->border[CL_BORDER_UPPER+my_state_type]); + break; + case GTK_POS_RIGHT: + width+=2; + new_area.x = x; + new_area.width = width-2; + r.gradient_type = CL_GRADIENT_HORIZONTAL; + cl_rectangle_set_gradient (&r.fill_gradient, &tmp_color, &style->bg[state_type]); + cl_rectangle_set_gradient (&r.border_gradient, + &clearlooks_style->border[CL_BORDER_UPPER+my_state_type], + &clearlooks_style->border[CL_BORDER_LOWER+my_state_type]); + break; + } + + r.topleft = style->light_gc[state_type]; + r.bottomright = (state_type == GTK_STATE_NORMAL) ? clearlooks_style->shade_gc[1] : NULL; + + cl_rectangle_set_clip_rectangle (&r, &new_area); + cl_draw_rectangle (window, widget, style, x, y, width, height, &r); + cl_draw_shadow (window, widget, style, x, y, width, height, &r); + cl_rectangle_reset_clip_rectangle (&r); + + /* draw the selection stripe */ + if (state_type != GTK_STATE_ACTIVE) { + cl_rectangle_set_gradient (&r.fill_gradient, NULL, NULL); + r.fillgc = clearlooks_style->spot2_gc; + + switch (gap_side) + { + case GTK_POS_BOTTOM: + cl_rectangle_set_corners (&r, CL_CORNER_ROUND, CL_CORNER_ROUND, + CL_CORNER_NONE, CL_CORNER_NONE); + cl_rectangle_set_gradient (&r.border_gradient, &clearlooks_style->spot3, &clearlooks_style->spot2); + r.gradient_type = CL_GRADIENT_VERTICAL; + + cl_rectangle_set_clip_rectangle (&r, &new_area); + cl_draw_rectangle (window, widget, style, x, y, width, 3, &r); + cl_rectangle_reset_clip_rectangle (&r); + break; + case GTK_POS_TOP: + cl_rectangle_set_corners (&r, CL_CORNER_NONE, CL_CORNER_NONE, + CL_CORNER_ROUND, CL_CORNER_ROUND); + cl_rectangle_set_gradient (&r.border_gradient, &clearlooks_style->spot2, &clearlooks_style->spot3); + r.gradient_type = CL_GRADIENT_VERTICAL; + + cl_rectangle_set_clip_rectangle (&r, &new_area); + cl_draw_rectangle (window, widget, style, x, y + height - 3, width, 3, &r); + cl_rectangle_reset_clip_rectangle (&r); + break; + case GTK_POS_LEFT: + cl_rectangle_set_corners (&r, CL_CORNER_NONE, CL_CORNER_ROUND, + CL_CORNER_NONE, CL_CORNER_ROUND); + cl_rectangle_set_gradient (&r.border_gradient, &clearlooks_style->spot2, &clearlooks_style->spot3); + r.gradient_type = CL_GRADIENT_HORIZONTAL; + + cl_rectangle_set_clip_rectangle (&r, &new_area); + cl_draw_rectangle (window, widget, style, x + width - 3, y, 3, height, &r); + cl_rectangle_reset_clip_rectangle (&r); + break; + case GTK_POS_RIGHT: + cl_rectangle_set_corners (&r, CL_CORNER_ROUND, CL_CORNER_NONE, + CL_CORNER_ROUND, CL_CORNER_NONE); + cl_rectangle_set_gradient (&r.border_gradient, &clearlooks_style->spot3, &clearlooks_style->spot2); + r.gradient_type = CL_GRADIENT_HORIZONTAL; + + cl_rectangle_set_clip_rectangle (&r, &new_area); + cl_draw_rectangle (window, widget, style, x, y, 3, height, &r); + cl_rectangle_reset_clip_rectangle (&r); + break; + } + } + + + } + else + { + parent_class->draw_extension (style, window, state_type, shadow_type, area, + widget, detail, x, y, width, height, + gap_side); + } +} + + +/**************************************************************************/ + +static void +draw_handle (DRAW_ARGS, GtkOrientation orientation) +{ + ClearlooksStyle *clearlooks_style = CLEARLOOKS_STYLE (style); + gint xx, yy; + gint xthick, ythick; + GdkGC *light_gc, *dark_gc; + GdkRectangle rect; + GdkRectangle dest; + gint intersect; + gint h; + int i; + int n_lines; + int offset; + +#if DEBUG + printf("draw_handle: %s %d %d %d %d\n", detail, x, y, width, height); +#endif + + g_return_if_fail (GTK_IS_STYLE (style)); + g_return_if_fail (window != NULL); + + sanitize_size (window, &width, &height); + + if (state_type == GTK_STATE_PRELIGHT) + gtk_style_apply_default_background (style, window, + widget && !GTK_WIDGET_NO_WINDOW (widget), + state_type, area, x, y, width, height); + + /* orientation is totally bugged, but this actually works... */ + orientation = (width > height) ? GTK_ORIENTATION_HORIZONTAL : GTK_ORIENTATION_VERTICAL; + + if (!strcmp (detail, "paned")) + { + /* we want to ignore the shadow border in paned widgets */ + xthick = 0; + ythick = 0; + } + else + { + xthick = style->xthickness; + ythick = style->ythickness; + } + + if ( ((DETAIL ("handlebox") && widget && GTK_IS_HANDLE_BOX (widget)) || DETAIL ("dockitem")) && + orientation == GTK_ORIENTATION_VERTICAL ) + { + /* The line in the toolbar */ + + light_gc = style->light_gc[state_type]; + dark_gc = clearlooks_style->shade_gc[3]; + + if (area) + { + gdk_gc_set_clip_rectangle (light_gc, area); + gdk_gc_set_clip_rectangle (dark_gc, area); + } + + if (area) + { + gdk_gc_set_clip_rectangle (light_gc, NULL); + gdk_gc_set_clip_rectangle (dark_gc, NULL); + } + + if (area) + { + gdk_gc_set_clip_rectangle (clearlooks_style->shade_gc[0], area); + gdk_gc_set_clip_rectangle (clearlooks_style->shade_gc[3], area); + } + + gdk_draw_line (window, clearlooks_style->shade_gc[0], x, y, x + width, y); + gdk_draw_line (window, clearlooks_style->shade_gc[3], x, y + height - 1, x + width, y + height - 1); + + if (area) + { + gdk_gc_set_clip_rectangle (clearlooks_style->shade_gc[0], NULL); + gdk_gc_set_clip_rectangle (clearlooks_style->shade_gc[3], NULL); + } + } + + light_gc = clearlooks_style->shade_gc[0]; + dark_gc = clearlooks_style->shade_gc[4]; + + rect.x = x + xthick; + rect.y = y + ythick; + rect.width = width - (xthick * 2); + rect.height = height - (ythick * 2); + + if (area) + intersect = gdk_rectangle_intersect (area, &rect, &dest); + else + { + intersect = TRUE; + dest = rect; + } + + if (!intersect) + return; + + gdk_gc_set_clip_rectangle (light_gc, &dest); + gdk_gc_set_clip_rectangle (dark_gc, &dest); + + n_lines = (!strcmp (detail, "paned")) ? 21 : 11; + + if (orientation == GTK_ORIENTATION_VERTICAL) + { + h = width - 2 * xthick; + h = MAX (3, h - 6); + + xx = x + (width - h) / 2; + offset = (height - 2*ythick - 2*n_lines)/2 + 1; + if (offset < 0) + offset = 0; + + for (i = 0, yy = y + ythick + offset; yy <= (y + height - ythick - 1) && i < n_lines; yy += 2, i++) + { + gdk_draw_line (window, dark_gc, xx, yy, xx + h, yy); + gdk_draw_line (window, light_gc, xx, yy + 1, xx + h, yy + 1); + } + } + else + { + h = height - 2 * ythick; + h = MAX (3, h - 6); + + yy = y + (height - h) / 2; + offset = (width - 2*xthick - 2*n_lines)/2 + 1; + if (offset < 0) + offset = 0; + + for (i = 0, xx = x + xthick + offset; i < n_lines; xx += 2, i++) + { + gdk_draw_line (window, dark_gc, xx, yy, xx, yy + h); + gdk_draw_line (window, light_gc, xx + 1, yy, xx + 1, yy + h); + } + } + + gdk_gc_set_clip_rectangle (light_gc, NULL); + gdk_gc_set_clip_rectangle (dark_gc, NULL); +} + +/**************************************************************************/ + +static void +draw_box (DRAW_ARGS) +{ + ClearlooksStyle *clearlooks_style = CLEARLOOKS_STYLE (style); + CLRectangle r; + gboolean false_size = FALSE; + +#ifdef DEBUG + printf("draw_box: %s %d %d %d %d\n", detail, x, y, width, height); +#endif + + g_return_if_fail (style != NULL); + g_return_if_fail (window != NULL); + + if (width == -1 || height == -1) + false_size = TRUE; + + if ((width == -1) && (height == -1)) + gdk_window_get_size (window, &width, &height); + else if (width == -1) + gdk_window_get_size (window, &width, NULL); + else if (height == -1) + gdk_window_get_size (window, NULL, &height); + + cl_rectangle_reset (&r, style); + + if (widget == NULL) + return; + + /* listview headers */ + if (widget && DETAIL ("button") && widget->parent && + (GTK_IS_TREE_VIEW(widget->parent) || + GTK_IS_CLIST (widget->parent) || + strcmp(G_OBJECT_TYPE_NAME (widget->parent), "ETree") == 0)) + { + cl_draw_treeview_header (style, window, state_type, shadow_type, + area, widget, detail, x, y, width, height); + } + else if (detail && (!strcmp (detail, "button") || + !strcmp (detail, "buttondefault"))) + { + if (GTK_IS_COMBO_BOX_ENTRY(widget->parent) || GTK_IS_COMBO(widget->parent)) + { + cl_draw_combobox_button (style, window, state_type, shadow_type, + area, widget, + detail, x, y, width, height); + } + else + { + cl_draw_button (style, window, state_type, shadow_type, area, widget, + detail, x, y, width, height); + } + } + else if (detail && ( + !strcmp (detail, "spinbutton_up") || + !strcmp (detail, "spinbutton_down") || + !strcmp (detail, "spinbutton"))) + { + cl_draw_spinbutton (style, window, state_type, shadow_type, area, + widget, detail, x, y, width, height); + } + else if (detail && ( + !strcmp (detail, "hscale") || !strcmp (detail, "vscale"))) + { + cl_rectangle_set_button (&r, style, state_type, + GTK_WIDGET_HAS_DEFAULT (widget), GTK_WIDGET_HAS_FOCUS (widget), + CL_CORNER_ROUND, CL_CORNER_ROUND, + CL_CORNER_ROUND, CL_CORNER_ROUND); + + if (!strcmp (detail, "hscale") || !strcmp (detail, "vscale")) + { + r.fill_gradient.to = &clearlooks_style->shade[2]; + r.bottomright = clearlooks_style->shade_gc[2]; + } + + cl_set_corner_sharpness (detail, widget, &r); + + if (!strcmp (detail, "spinbutton_up")) + { + r.border_gradient.to = r.border_gradient.from; + height++; + gtk_style_apply_default_background (style, window, FALSE, state_type, + area, x, y, width, height); + } + else if (!strcmp (detail, "spinbutton_down")) + { + r.border_gradient.to = r.border_gradient.from; + gtk_style_apply_default_background (style, window, FALSE, state_type, + area, x, y, width, height); + } + + cl_rectangle_set_clip_rectangle (&r, area); + cl_draw_rectangle (window, widget, style, x+1, y+1, width-2, height-2, &r); + cl_draw_shadow (window, widget, style, x+1, y+1, width-2, height-2, &r); + cl_rectangle_reset_clip_rectangle (&r); + } + else if (DETAIL ("trough") && GTK_IS_PROGRESS_BAR (widget)) + { + GdkPoint points[4] = { {x,y}, {x+width-1,y}, {x,y+height-1}, {x+width-1,y+height-1} }; + + gdk_draw_points (window, style->bg_gc[state_type], points, 4); + + r.bordergc = clearlooks_style->shade_gc[5]; + r.fillgc = clearlooks_style->shade_gc[2]; + + cl_rectangle_set_corners (&r, CL_CORNER_NARROW, CL_CORNER_NARROW, + CL_CORNER_NARROW, CL_CORNER_NARROW); + + cl_rectangle_set_clip_rectangle (&r, area); + cl_draw_rectangle (window, widget, style, x, y, width, height, &r); + cl_rectangle_reset_clip_rectangle (&r); + } + else if (DETAIL ("trough") && + (GTK_IS_VSCALE (widget) || GTK_IS_HSCALE (widget))) + { + GdkGC *inner = clearlooks_style->shade_gc[3], + *outer = clearlooks_style->shade_gc[5], + *shadow = clearlooks_style->shade_gc[4]; + GdkColor upper_color = *clearlooks_get_spot_color (CLEARLOOKS_RC_STYLE (style->rc_style)), + lower_color; + + GtkAdjustment *adjustment = gtk_range_get_adjustment (GTK_RANGE (widget)); + + GtkOrientation orientation = GTK_RANGE (widget)->orientation; + + gint fill_size = (orientation ? height : width) * + (1 / ((adjustment->upper - adjustment->lower) / + (adjustment->value - adjustment->lower))); + + if (orientation == GTK_ORIENTATION_HORIZONTAL) + { + y += (height - SCALE_SIZE) / 2; + height = SCALE_SIZE; + } + else + { + x += (width - SCALE_SIZE) / 2; + width = SCALE_SIZE; + } + + if (state_type == GTK_STATE_INSENSITIVE) + { + outer = clearlooks_style->shade_gc[4]; + inner = clearlooks_style->shade_gc[2]; + shadow = clearlooks_style->shade_gc[3]; + } + + cl_rectangle_init (&r, inner, outer, CL_CORNER_NONE, CL_CORNER_NONE, + CL_CORNER_NONE, CL_CORNER_NONE ); + + r.topleft = shadow; + + cl_rectangle_set_clip_rectangle (&r, area); + cl_draw_rectangle (window, widget, style, x, y, width, height, &r); + cl_draw_shadow (window, widget, style, x, y, width, height, &r); + cl_rectangle_reset_clip_rectangle (&r); + + /* DRAW FILL */ + shade (&upper_color, &lower_color, 1.3); + + r.bordergc = clearlooks_style->spot3_gc; + r.fillgc = style->bg_gc[state_type]; + + r.gradient_type = (orientation == GTK_ORIENTATION_HORIZONTAL ) ? CL_GRADIENT_VERTICAL + : CL_GRADIENT_HORIZONTAL; + + cl_rectangle_set_gradient (&r.fill_gradient, &upper_color, &lower_color); + + cl_rectangle_set_clip_rectangle (&r, area); + if (orientation == GTK_ORIENTATION_HORIZONTAL && fill_size > 1) + { + if (gtk_range_get_inverted(GTK_RANGE(widget)) != (get_direction(widget) == GTK_TEXT_DIR_RTL)) + cl_draw_rectangle (window, widget, style, x+width-fill_size, y, fill_size, height, &r); + else + cl_draw_rectangle (window, widget, style, x, y, fill_size, height, &r); + } + else if (fill_size > 1) + { + if (gtk_range_get_inverted (GTK_RANGE (widget))) + cl_draw_rectangle (window, widget, style, x, y+height-fill_size, width, fill_size, &r); + else + cl_draw_rectangle (window, widget, style, x, y, width, fill_size, &r); + } + cl_rectangle_reset_clip_rectangle (&r); + } + else if (DETAIL ("trough")) + { + GdkGC *inner = clearlooks_style->shade_gc[3], + *outer = clearlooks_style->shade_gc[5]; + + cl_rectangle_init (&r, inner, outer, CL_CORNER_NONE, CL_CORNER_NONE, + CL_CORNER_NONE, CL_CORNER_NONE ); + + if (GTK_RANGE (widget)->orientation == GTK_ORIENTATION_VERTICAL) + { + y+=1; + height-=2; + } + else + { + x+=1; + width-=2; + } + + cl_rectangle_set_clip_rectangle (&r, area); + cl_draw_rectangle (window, widget, style, x, y, width, height, &r); + cl_rectangle_reset_clip_rectangle (&r); + } + else if (detail && (!strcmp (detail, "vscrollbar") || + !strcmp (detail, "hscrollbar") || + !strcmp (detail, "stepper"))) + { + ClScrollButtonType button_type = CL_SCROLLBUTTON_OTHER; + gboolean horizontal = TRUE; + + if (GTK_IS_VSCROLLBAR(widget)) + { + if (y == widget->allocation.y) + button_type = CL_SCROLLBUTTON_BEGIN; + else if (y+height == widget->allocation.y+widget->allocation.height) + button_type = CL_SCROLLBUTTON_END; + + horizontal = FALSE; + } + else if (GTK_IS_HSCROLLBAR(widget)) + { + if (x == widget->allocation.x) + button_type = CL_SCROLLBUTTON_BEGIN; + else if (x+width == widget->allocation.x+widget->allocation.width) + button_type = CL_SCROLLBUTTON_END; + } + + cl_rectangle_set_button (&r, style, state_type, FALSE, FALSE, 0,0,0,0); + + cl_rectangle_set_gradient (&r.fill_gradient, NULL, NULL); + cl_rectangle_set_gradient (&r.fill_gradient, &clearlooks_style->inset_light[state_type], + &clearlooks_style->inset_dark[state_type]); + + + r.gradient_type = horizontal ? CL_GRADIENT_VERTICAL + : CL_GRADIENT_HORIZONTAL; + + r.bottomright = clearlooks_style->shade_gc[1]; + r.border_gradient.to = r.border_gradient.from; + + if (button_type == CL_SCROLLBUTTON_OTHER) + { + cl_rectangle_set_corners (&r, CL_CORNER_NONE, CL_CORNER_NONE, + CL_CORNER_NONE, CL_CORNER_NONE); + } + else if (button_type == CL_SCROLLBUTTON_BEGIN) + { + if (horizontal) + cl_rectangle_set_corners (&r, CL_CORNER_ROUND, CL_CORNER_NONE, + CL_CORNER_ROUND, CL_CORNER_NONE); + else + cl_rectangle_set_corners (&r, CL_CORNER_ROUND, CL_CORNER_ROUND, + CL_CORNER_NONE, CL_CORNER_NONE); + } + else + { + if (horizontal) + cl_rectangle_set_corners (&r, CL_CORNER_NONE, CL_CORNER_ROUND, + CL_CORNER_NONE, CL_CORNER_ROUND); + else + cl_rectangle_set_corners (&r, CL_CORNER_NONE, CL_CORNER_NONE, + CL_CORNER_ROUND, CL_CORNER_ROUND); + } + + cl_rectangle_set_clip_rectangle (&r, area); + cl_draw_rectangle (window, widget, style, x, y, width, height, &r); + cl_draw_shadow (window, widget, style, x, y, width, height, &r); + cl_rectangle_reset_clip_rectangle (&r); + + } + else if (DETAIL ("slider")) + { + if (DETAIL("slider") && widget && GTK_IS_RANGE (widget)) + { + GtkAdjustment *adj = GTK_RANGE (widget)->adjustment; + + if (adj->value <= adj->lower && + (GTK_RANGE (widget)->has_stepper_a || GTK_RANGE (widget)->has_stepper_b)) + { + if (GTK_IS_VSCROLLBAR (widget)) + { + y-=1; + height+=1; + } + else if (GTK_IS_HSCROLLBAR (widget)) + { + x-=1; + width+=1; + } + } + if (adj->value >= adj->upper - adj->page_size && + (GTK_RANGE (widget)->has_stepper_c || GTK_RANGE (widget)->has_stepper_d)) + { + if (GTK_IS_VSCROLLBAR (widget)) + height+=1; + else if (GTK_IS_HSCROLLBAR (widget)) + width+=1; + } + } + + cl_rectangle_set_button (&r, style, state_type, FALSE, GTK_WIDGET_HAS_FOCUS (widget), + CL_CORNER_NONE, CL_CORNER_NONE, + CL_CORNER_NONE, CL_CORNER_NONE); + + r.gradient_type = GTK_IS_HSCROLLBAR (widget) ? CL_GRADIENT_VERTICAL + : CL_GRADIENT_HORIZONTAL; + + cl_rectangle_set_gradient (&r.fill_gradient, &clearlooks_style->inset_light[state_type], + &clearlooks_style->inset_dark[state_type]); + + r.bottomright = clearlooks_style->shade_gc[1]; + r.border_gradient.to = r.border_gradient.from; + + cl_rectangle_set_clip_rectangle (&r, area); + cl_draw_rectangle (window, widget, style, x, y, width, height, &r); + cl_draw_shadow (window, widget, style, x, y, width, height, &r); + cl_rectangle_reset_clip_rectangle (&r); + } + else if (detail && !strcmp (detail, "optionmenu")) /* supporting deprecated */ + { + cl_draw_optionmenu(style, window, state_type, shadow_type, area, widget, detail, x, y, width, height); + } + else if (DETAIL ("menuitem")) + { + if (clearlooks_style->menuitemstyle == 0) + { + cl_draw_menuitem_flat (window, widget, style, area, state_type, + x, y, width, height, &r); + } + else if (clearlooks_style->menuitemstyle == 1) + { + cl_draw_menuitem_gradient (window, widget, style, area, state_type, + x, y, width, height, &r); + } + else + { + cl_draw_menuitem_button (window, widget, style, area, state_type, + x, y, width, height, &r); + } + } + else if (DETAIL ("menubar") && (clearlooks_style->sunkenmenubar || clearlooks_style->menubarstyle > 0)) + { + GdkGC *dark = clearlooks_style->shade_gc[2]; + GdkColor upper_color, lower_color; + + /* don't draw sunken menubar on gnome panel + IT'S A HACK! HORRIBLE HACK! HIDEOUS HACK! + BUT IT WORKS FOR ME(tm)! */ + if (widget->parent && + strcmp(G_OBJECT_TYPE_NAME (widget->parent), "PanelWidget") == 0) + return; + + shade(&style->bg[state_type], &upper_color, 1.0); + shade(&style->bg[state_type], &lower_color, 0.95); + + cl_rectangle_set_corners (&r, CL_CORNER_NONE, CL_CORNER_NONE, + CL_CORNER_NONE, CL_CORNER_NONE); + + r.fillgc = style->bg_gc[state_type]; + r.bordergc = clearlooks_style->shade_gc[2]; + r.gradient_type = CL_GRADIENT_VERTICAL; + + cl_rectangle_set_gradient (&r.border_gradient, &clearlooks_style->shade[2], + &clearlooks_style->shade[3]); + cl_rectangle_set_gradient (&r.fill_gradient, &upper_color, &lower_color); + + /* make vertical and top borders invisible for style 2 */ + if (clearlooks_style->menubarstyle == 2) { + x--; width+=2; + y--; height+=1; + } + + cl_rectangle_set_clip_rectangle (&r, area); + cl_draw_rectangle (window, widget, style, x, y, width, height, &r); + cl_rectangle_reset_clip_rectangle (&r); + } + else if (DETAIL ("menu") && widget->parent && + GDK_IS_WINDOW (widget->parent->window)) + { + cl_rectangle_set_corners (&r, CL_CORNER_NONE, CL_CORNER_NONE, + CL_CORNER_NONE, CL_CORNER_NONE); + + r.bordergc = clearlooks_style->border_gc[CL_BORDER_UPPER]; + r.topleft = style->light_gc[state_type]; + r.bottomright = clearlooks_style->shade_gc[1]; + + cl_rectangle_set_clip_rectangle (&r, area); + cl_draw_rectangle (window, widget, style, x, y, width, height, &r); + cl_draw_shadow (window, widget, style, x, y, width, height, &r); + cl_rectangle_reset_clip_rectangle (&r); + + return; + } + else if (DETAIL ("bar") && widget && GTK_IS_PROGRESS_BAR (widget)) + { + GdkColor upper_color = *clearlooks_get_spot_color (CLEARLOOKS_RC_STYLE (style->rc_style)), + lower_color, + prev_foreground; + gboolean activity_mode = GTK_PROGRESS (widget)->activity_mode; + +#ifdef HAVE_ANIMATION + if (!activity_mode && gtk_progress_bar_get_fraction (widget) != 1.0 && + !cl_progressbar_known((gconstpointer)widget)) + { + cl_progressbar_add ((gpointer)widget); + } +#endif + cl_progressbar_fill (window, widget, style, style->black_gc, + x, y, width, height, +#ifdef HAVE_ANIMATION + activity_mode ? 0 : pboffset, +#else + 0, +#endif + area); + + cl_rectangle_set_corners (&r, CL_CORNER_NONE, CL_CORNER_NONE, + CL_CORNER_NONE, CL_CORNER_NONE); + + r.bordergc = clearlooks_style->spot3_gc; + r.topleft = clearlooks_style->spot2_gc; + + prev_foreground = cl_gc_set_fg_color_shade (clearlooks_style->spot2_gc, + style->colormap, + &clearlooks_style->spot2, + 1.2); + + cl_rectangle_set_clip_rectangle (&r, area); + cl_draw_rectangle (window, widget, style, x, y, width, height, &r); + cl_draw_shadow (window, widget, style, x, y, width, height, &r); + cl_rectangle_reset_clip_rectangle (&r); + + gdk_gc_set_foreground (clearlooks_style->spot2_gc, &prev_foreground); + } + + else if ( widget && (DETAIL ("menubar") || DETAIL ("toolbar") || DETAIL ("dockitem_bin") || DETAIL ("handlebox_bin")) && shadow_type != GTK_SHADOW_NONE) /* Toolbars and menus */ + { + if (area) + { + gdk_gc_set_clip_rectangle (clearlooks_style->shade_gc[0], area); + gdk_gc_set_clip_rectangle (clearlooks_style->shade_gc[3], area); + } + + gtk_style_apply_default_background (style, window, + widget && !GTK_WIDGET_NO_WINDOW (widget), + state_type, area, x, y, width, height); + + /* we only want the borders on horizontal toolbars */ + if ( DETAIL ("menubar") || height < 2*width ) { + if (!DETAIL ("menubar")) + gdk_draw_line (window, clearlooks_style->shade_gc[0], + x, y, x + width, y); /* top */ + + gdk_draw_line (window, clearlooks_style->shade_gc[3], + x, y + height - 1, x + width, y + height - 1); /* bottom */ + } + + if (area) + { + gdk_gc_set_clip_rectangle (clearlooks_style->shade_gc[0], NULL); + gdk_gc_set_clip_rectangle (clearlooks_style->shade_gc[3], NULL); + } + } + else + { + parent_class->draw_box (style, window, state_type, shadow_type, area, + widget, detail, x, y, width, height); + } +} + +/**************************************************************************/ + +static void +ensure_check_pixmaps (GtkStyle *style, + GtkStateType state, + GdkScreen *screen, + gboolean treeview) +{ + ClearlooksStyle *clearlooks_style = CLEARLOOKS_STYLE (style); + ClearlooksRcStyle *clearlooks_rc = CLEARLOOKS_RC_STYLE (style->rc_style); + GdkPixbuf *check, *base, *inconsistent, *composite; + GdkColor *spot_color = clearlooks_get_spot_color (clearlooks_rc); + + if (clearlooks_style->check_pixmap_nonactive[state] != NULL) + return; + + if (state == GTK_STATE_ACTIVE || state == GTK_STATE_SELECTED) { + check = generate_bit (check_alpha, &style->text[GTK_STATE_NORMAL], 1.0); + inconsistent = generate_bit (check_inconsistent_alpha, &style->text[GTK_STATE_NORMAL], 1.0); + } else { + check = generate_bit (check_alpha, &style->text[state], 1.0); + inconsistent = generate_bit (check_inconsistent_alpha, &style->text[state], 1.0); + } + + if (state == GTK_STATE_ACTIVE && !treeview) + base = generate_bit (check_base_alpha, &style->bg[state], 1.0); + else + base = generate_bit (check_base_alpha, &style->base[GTK_STATE_NORMAL], 1.0); + + if (treeview) + composite = generate_bit (NULL, &clearlooks_style->shade[6], 1.0); + else + composite = generate_bit (NULL, &clearlooks_style->shade[5], 1.0); + + gdk_pixbuf_composite (base, composite, + 0, 0, RADIO_SIZE, RADIO_SIZE, 0, 0, + 1.0, 1.0, GDK_INTERP_NEAREST, 255); + + clearlooks_style->check_pixmap_nonactive[state] = + pixbuf_to_pixmap (style, composite, screen); + + gdk_pixbuf_composite (check, composite, + 0, 0, RADIO_SIZE, RADIO_SIZE, 0, 0, + 1.0, 1.0, GDK_INTERP_NEAREST, 255); + + clearlooks_style->check_pixmap_active[state] = + pixbuf_to_pixmap (style, composite, screen); + + g_object_unref (composite); + + composite = generate_bit (NULL, &clearlooks_style->shade[6], 1.0); + + gdk_pixbuf_composite (base, composite, + 0, 0, RADIO_SIZE, RADIO_SIZE, 0, 0, + 1.0, 1.0, GDK_INTERP_NEAREST, 255); + + gdk_pixbuf_composite (inconsistent, composite, + 0, 0, RADIO_SIZE, RADIO_SIZE, 0, 0, + 1.0, 1.0, GDK_INTERP_NEAREST, 255); + + clearlooks_style->check_pixmap_inconsistent[state] = + pixbuf_to_pixmap (style, composite, screen); + + g_object_unref (composite); + g_object_unref (base); + g_object_unref (check); + g_object_unref (inconsistent); +} + +static void +draw_check (DRAW_ARGS) +{ + ClearlooksStyle *clearlooks_style = CLEARLOOKS_STYLE (style); + GdkGC *gc = style->base_gc[state_type]; + GdkPixmap *pixmap; + gboolean treeview; + + if (DETAIL ("check")) /* Menu item */ + { + parent_class->draw_check (style, window, state_type, shadow_type, area, + widget, detail, x, y, width, height); + return; + } + + treeview = widget && GTK_IS_TREE_VIEW(widget); + ensure_check_pixmaps (style, state_type, gtk_widget_get_screen (widget), treeview); + + if (area) + gdk_gc_set_clip_rectangle (gc, area); + + if (shadow_type == GTK_SHADOW_IN) + pixmap = clearlooks_style->check_pixmap_active[state_type]; + else if (shadow_type == GTK_SHADOW_ETCHED_IN) /* inconsistent */ + pixmap = clearlooks_style->check_pixmap_inconsistent[state_type]; + else + pixmap = clearlooks_style->check_pixmap_nonactive[state_type]; + + x += (width - CHECK_SIZE)/2; + y += (height - CHECK_SIZE)/2; + + gdk_draw_drawable (window, gc, pixmap, 0, 0, x, y, CHECK_SIZE, CHECK_SIZE); + + if (area) + gdk_gc_set_clip_rectangle (gc, NULL); +} + +/**************************************************************************/ +static void +draw_slider (DRAW_ARGS, GtkOrientation orientation) +{ + ClearlooksStyle *clearlooks_style = CLEARLOOKS_STYLE (style); + GdkGC *shade_gc = clearlooks_style->shade_gc[4]; + GdkGC *white_gc = clearlooks_style->shade_gc[0]; + int x1, y1; + +#if DEBUG + printf("draw_slider: %s %d %d %d %d\n", detail, x, y, width, height); +#endif + + g_return_if_fail (GTK_IS_STYLE (style)); + g_return_if_fail (window != NULL); + + sanitize_size (window, &width, &height); + + gtk_paint_box (style, window, state_type, shadow_type, + area, widget, detail, x, y, width, height); + + if ((orientation == GTK_ORIENTATION_VERTICAL && height < 20) || + (orientation == GTK_ORIENTATION_HORIZONTAL && width < 20)) + return; + + if (detail && strcmp ("slider", detail) == 0) + { + if (area) + { + gdk_gc_set_clip_rectangle (shade_gc, area); + gdk_gc_set_clip_rectangle (white_gc, area); + } + if (orientation == GTK_ORIENTATION_HORIZONTAL) + { + x1 = x + width / 2 - 4; + y1 = y + (height - 6) / 2; + gdk_draw_line (window, shade_gc, x1, y1, x1, y1 + 6); + gdk_draw_line (window, white_gc, x1 + 1, y1, x1 + 1, y1 + 6); + gdk_draw_line (window, shade_gc, x1 + 3, y1, x1 + 3, y1 + 6); + gdk_draw_line (window, white_gc, x1 + 3 + 1, y1, x1 + 3 + 1, y1 + 6); + gdk_draw_line (window, shade_gc, x1 + 3*2, y1, x1 + 3*2, y1 + 6); + gdk_draw_line (window, white_gc, x1 + 3*2 + 1, y1, x1 + 3*2 + 1, y1 + 6); + } + else + { + x1 = x + (width - 6) / 2; + y1 = y + height / 2 - 4; + gdk_draw_line (window, shade_gc, x1 + 6, y1, x1, y1); + gdk_draw_line (window, white_gc, x1 + 6, y1 + 1, x1, y1 + 1); + gdk_draw_line (window, shade_gc, x1 + 6, y1 + 3, x1, y1 + 3); + gdk_draw_line (window, white_gc, x1 + 6, y1 + 3 + 1, x1, y1 + 3 + 1); + gdk_draw_line (window, shade_gc, x1 + 6, y1 + 3*2, x1, y1 + 3*2); + gdk_draw_line (window, white_gc, x1 + 6, y1 + 3*2 + 1, x1, y1 + 3*2 + 1); + } + if (area) + { + gdk_gc_set_clip_rectangle (shade_gc, NULL); + gdk_gc_set_clip_rectangle (white_gc, NULL); + } + } + else if (detail && (strcmp ("hscale", detail) == 0 || strcmp ("vscale", detail) == 0)) + { + if (area) + { + gdk_gc_set_clip_rectangle (shade_gc, area); + gdk_gc_set_clip_rectangle (white_gc, area); + } + + if (orientation == GTK_ORIENTATION_HORIZONTAL) + { + x1 = x + width / 2 - 3; + y1 = y + (height - 7) / 2; + gdk_draw_line (window, shade_gc, x1 + 0, y1 + 5, x1 + 0, y1 + 1); + gdk_draw_line (window, white_gc, x1 + 1, y1 + 5, x1 + 1, y1 + 1); + gdk_draw_line (window, shade_gc, x1 + 3, y1 + 5, x1 + 3, y1 + 1); + gdk_draw_line (window, white_gc, x1 + 4, y1 + 5, x1 + 4, y1 + 1); + gdk_draw_line (window, shade_gc, x1 + 6, y1 + 5, x1 + 6, y1 + 1); + gdk_draw_line (window, white_gc, x1 + 7, y1 + 5, x1 + 7, y1 + 1); + } + else + { + x1 = x + (width - 7) / 2; + y1 = y + height / 2 - 3; + gdk_draw_line (window, shade_gc, x1 + 5, y1 + 0, x1 + 1, y1 + 0); + gdk_draw_line (window, white_gc, x1 + 5, y1 + 1, x1 + 1, y1 + 1); + gdk_draw_line (window, shade_gc, x1 + 5, y1 + 3, x1 + 1, y1 + 3); + gdk_draw_line (window, white_gc, x1 + 5, y1 + 4, x1 + 1, y1 + 4); + gdk_draw_line (window, shade_gc, x1 + 5, y1 + 6, x1 + 1, y1 + 6); + gdk_draw_line (window, white_gc, x1 + 5, y1 + 7, x1 + 1, y1 + 7); + } + if (area) + { + gdk_gc_set_clip_rectangle (shade_gc, NULL); + gdk_gc_set_clip_rectangle (white_gc, NULL); + } + } +} + +/**************************************************************************/ +static void +ensure_radio_pixmaps (GtkStyle *style, + GtkStateType state, + GdkScreen *screen) +{ + ClearlooksStyle *clearlooks_style = CLEARLOOKS_STYLE (style); + ClearlooksRcStyle *clearlooks_rc = CLEARLOOKS_RC_STYLE (style->rc_style); + GdkPixbuf *dot, *circle, *outline, *inconsistent, *composite; + GdkColor *spot_color = clearlooks_get_spot_color (clearlooks_rc); + GdkColor *composite_color; + + if (clearlooks_style->radio_pixmap_nonactive[state] != NULL) + return; + + if (state == GTK_STATE_ACTIVE || state == GTK_STATE_SELECTED) { + dot = colorize_bit (dot_intensity, dot_alpha, &style->text[GTK_STATE_NORMAL]); + inconsistent = generate_bit (inconsistent_alpha, &style->text[GTK_STATE_NORMAL], 1.0); + } else { + dot = colorize_bit (dot_intensity, dot_alpha, &style->text[state]); + inconsistent = generate_bit (inconsistent_alpha, &style->text[state], 1.0); + } + + outline = generate_bit (outline_alpha, &clearlooks_style->shade[5], 1.0); + + if (clearlooks_style->radio_pixmap_mask == NULL) + { + gdk_pixbuf_render_pixmap_and_mask (outline, + NULL, + &clearlooks_style->radio_pixmap_mask, + 1); + } + + if (state == GTK_STATE_ACTIVE) + { + composite_color = &style->bg[GTK_STATE_PRELIGHT]; + circle = generate_bit (circle_alpha, &style->bg[state], 1.0); + } + else + { + composite_color = &style->bg[state]; + circle = generate_bit (circle_alpha, &style->base[GTK_STATE_NORMAL], 1.0); + } + + composite = generate_bit (NULL, composite_color, 1.0); + + gdk_pixbuf_composite (outline, composite, + 0, 0, RADIO_SIZE, RADIO_SIZE, 0, 0, + 1.0, 1.0, GDK_INTERP_NEAREST, 255); + + gdk_pixbuf_composite (circle, composite, + 0, 0, RADIO_SIZE, RADIO_SIZE, 0, 0, + 1.0, 1.0, GDK_INTERP_NEAREST, 255); + + clearlooks_style->radio_pixmap_nonactive[state] = + pixbuf_to_pixmap (style, composite, screen); + + gdk_pixbuf_composite (dot, composite, + 0, 0, RADIO_SIZE, RADIO_SIZE, 0, 0, + 1.0, 1.0, GDK_INTERP_NEAREST, 255); + + clearlooks_style->radio_pixmap_active[state] = + pixbuf_to_pixmap (style, composite, screen); + + g_object_unref (composite); + + composite = generate_bit (NULL, composite_color,1.0); + + gdk_pixbuf_composite (outline, composite, + 0, 0, RADIO_SIZE, RADIO_SIZE, 0, 0, + 1.0, 1.0, GDK_INTERP_NEAREST, 255); + gdk_pixbuf_composite (circle, composite, + 0, 0, RADIO_SIZE, RADIO_SIZE, 0, 0, + 1.0, 1.0, GDK_INTERP_NEAREST, 255); + gdk_pixbuf_composite (inconsistent, composite, + 0, 0, RADIO_SIZE, RADIO_SIZE, 0, 0, + 1.0, 1.0, GDK_INTERP_NEAREST, 255); + + clearlooks_style->radio_pixmap_inconsistent[state] = + pixbuf_to_pixmap (style, composite, screen); + + g_object_unref (composite); + g_object_unref (circle); + g_object_unref (dot); + g_object_unref (inconsistent); + g_object_unref (outline); +} + +static void +draw_option (DRAW_ARGS) +{ + ClearlooksStyle *clearlooks_style = CLEARLOOKS_STYLE (style); + GdkGC *gc = style->base_gc[state_type]; + GdkPixmap *pixmap; + + if (DETAIL ("option")) /* Menu item */ + { + parent_class->draw_option (style, window, state_type, shadow_type, + area, widget, detail, x, y, width, height); + return; + } + + ensure_radio_pixmaps (style, state_type, gtk_widget_get_screen (widget)); + + if (area) + gdk_gc_set_clip_rectangle (gc, area); + + if (shadow_type == GTK_SHADOW_IN) + pixmap = clearlooks_style->radio_pixmap_active[state_type]; + else if (shadow_type == GTK_SHADOW_ETCHED_IN) /* inconsistent */ + pixmap = clearlooks_style->radio_pixmap_inconsistent[state_type]; + else + pixmap = clearlooks_style->radio_pixmap_nonactive[state_type]; + + x += (width - RADIO_SIZE)/2; + y += (height - RADIO_SIZE)/2; + + gdk_gc_set_clip_mask (gc, clearlooks_style->radio_pixmap_mask); + gdk_gc_set_clip_origin (gc, x, y); + + gdk_draw_drawable (window, gc, pixmap, 0, 0, x, y, + RADIO_SIZE, RADIO_SIZE); + + gdk_gc_set_clip_origin (gc, 0, 0); + gdk_gc_set_clip_mask (gc, NULL); + + if (area) + gdk_gc_set_clip_rectangle (gc, NULL); +} + +/**************************************************************************/ + +static void +draw_shadow_gap (DRAW_ARGS, + GtkPositionType gap_side, + gint gap_x, + gint gap_width) +{ + /* I need to improve this function. */ + ClearlooksStyle *clearlooks_style = CLEARLOOKS_STYLE (style); + CLRectangle r; + GdkRegion *area_region = NULL, + *gap_region = NULL; + +#if DEBUG + printf("draw_shadow_gap: %s %d %d %d %d\n", detail, x, y, width, height); +#endif + + g_return_if_fail (GTK_IS_STYLE (style)); + g_return_if_fail (window != NULL); + + sanitize_size (window, &width, &height); + + cl_rectangle_reset (&r, style); + cl_rectangle_set_corners (&r, CL_CORNER_NONE, CL_CORNER_NONE, + CL_CORNER_NONE, CL_CORNER_NONE); + + if (area) + { + area_region = gdk_region_rectangle (area); + + switch (gap_side) + { + case GTK_POS_TOP: + { + GdkRectangle rect = { x+gap_x, y, gap_width, 2 }; + gap_region = gdk_region_rectangle (&rect); + break; + } + case GTK_POS_BOTTOM: + { + GdkRectangle rect = { x+gap_x, y+height-2, gap_width, 2 }; + gap_region = gdk_region_rectangle (&rect); + break; + } + case GTK_POS_LEFT: + { + GdkRectangle rect = { x, y+gap_x, 2, gap_width }; + gap_region = gdk_region_rectangle (&rect); + break; + } + case GTK_POS_RIGHT: + { + GdkRectangle rect = { x+width-2, y+gap_x, 2, gap_width }; + gap_region = gdk_region_rectangle (&rect); + break; + } + } + + gdk_region_subtract (area_region, gap_region); + } + + if (shadow_type == GTK_SHADOW_ETCHED_IN || + shadow_type == GTK_SHADOW_ETCHED_OUT) + { + GdkGC *a; + GdkGC *b; + + if (shadow_type == GTK_SHADOW_ETCHED_IN) + { + a = style->light_gc[state_type]; + b = clearlooks_style->shade_gc[3]; + } + else + { + a = clearlooks_style->shade_gc[3]; + b = style->light_gc[state_type]; + } + + gdk_gc_set_clip_region (a, area_region); + gdk_gc_set_clip_region (b, area_region); + + r.bordergc = a; + cl_draw_rectangle (window, widget, style, x+1, y+1, width-1, height-1, &r); + + r.bordergc = b; + cl_draw_rectangle (window, widget, style, x, y, width-1, height-1, &r); + + gdk_gc_set_clip_region (a, NULL); + gdk_gc_set_clip_region (b, NULL); + } + else if (shadow_type == GTK_SHADOW_IN || shadow_type == GTK_SHADOW_OUT) + { + r.topleft = (shadow_type == GTK_SHADOW_OUT) ? style->light_gc[state_type] : clearlooks_style->shade_gc[1]; + r.bottomright = (shadow_type == GTK_SHADOW_OUT) ? clearlooks_style->shade_gc[1] : style->light_gc[state_type]; + r.bordergc = clearlooks_style->shade_gc[5]; + + gdk_gc_set_clip_region (r.bordergc, area_region); + gdk_gc_set_clip_region (r.topleft, area_region); + gdk_gc_set_clip_region (r.bottomright, area_region); + + cl_draw_rectangle (window, widget, style, x, y, width, height, &r); + + cl_draw_shadow (window, widget, style, x, y, width, height, &r); + + gdk_gc_set_clip_region (r.bordergc, NULL); + gdk_gc_set_clip_region (r.topleft, NULL); + gdk_gc_set_clip_region (r.bottomright, NULL); + } + + if (area_region) + gdk_region_destroy (area_region); +} + +/**************************************************************************/ +static void +draw_hline (GtkStyle *style, + GdkWindow *window, + GtkStateType state_type, + GdkRectangle *area, + GtkWidget *widget, + const gchar *detail, + gint x1, + gint x2, + gint y) +{ + ClearlooksStyle *clearlooks_style = CLEARLOOKS_STYLE (style); + +#if DEBUG + printf("draw_hline\n"); +#endif + + g_return_if_fail (GTK_IS_STYLE (style)); + g_return_if_fail (window != NULL); + + if (area) + gdk_gc_set_clip_rectangle (clearlooks_style->shade_gc[2], area); + + if (detail && !strcmp (detail, "label")) + { + if (state_type == GTK_STATE_INSENSITIVE) + gdk_draw_line (window, style->light_gc[state_type], x1 + 1, y + 1, x2 + 1, y + 1); + + gdk_draw_line (window, style->fg_gc[state_type], x1, y, x2, y); + } + else + { + gdk_draw_line (window, clearlooks_style->shade_gc[2], x1, y, x2, y); + + /* if (DETAIL ("menuitem")) */ + gdk_draw_line (window, clearlooks_style->shade_gc[0], x1, y+1, x2, y+1); + } + + if (area) + gdk_gc_set_clip_rectangle (clearlooks_style->shade_gc[2], NULL); +} + +/**************************************************************************/ +static void +draw_vline (GtkStyle *style, + GdkWindow *window, + GtkStateType state_type, + GdkRectangle *area, + GtkWidget *widget, + const gchar *detail, + gint y1, + gint y2, + gint x) +{ + ClearlooksStyle *clearlooks_style = CLEARLOOKS_STYLE (style); + gint thickness_light; + gint thickness_dark; + +#if DEBUG + printf("draw_vline\n"); +#endif + + g_return_if_fail (GTK_IS_STYLE (style)); + g_return_if_fail (window != NULL); + + thickness_light = style->xthickness / 2; + thickness_dark = style->xthickness - thickness_light; + + if (area) + gdk_gc_set_clip_rectangle (clearlooks_style->shade_gc[2], area); + + gdk_draw_line (window, clearlooks_style->shade_gc[2], x, y1, x, y2 - 1); + gdk_draw_line (window, clearlooks_style->shade_gc[0], x+1, y1, x+1, y2 - 1); + + if (area) + gdk_gc_set_clip_rectangle (clearlooks_style->shade_gc[2], NULL); +} + +/**************************************************************************/ +static void +draw_focus (GtkStyle *style, + GdkWindow *window, + GtkStateType state_type, + GdkRectangle *area, + GtkWidget *widget, + const gchar *detail, + gint x, + gint y, + gint width, + gint height) +{ + ClearlooksStyle *clearlooks_style = CLEARLOOKS_STYLE (style); + GdkPoint points[5]; + GdkGC *gc; + gboolean free_dash_list = FALSE; + gint line_width = 1; + gchar *dash_list = "\1\1"; + gint dash_len; + +#if DEBUG + printf("draw_focus: %s %d %d %d %d\n", detail, x, y, width, height); +#endif + + gc = clearlooks_style->shade_gc[6]; + + if (widget) + { + gtk_widget_style_get (widget, + "focus-line-width", &line_width, + "focus-line-pattern", (gchar *)&dash_list, + NULL); + + free_dash_list = TRUE; + } + + sanitize_size (window, &width, &height); + + if (area) + gdk_gc_set_clip_rectangle (gc, area); + + gdk_gc_set_line_attributes (gc, line_width, + dash_list[0] ? GDK_LINE_ON_OFF_DASH : GDK_LINE_SOLID, + GDK_CAP_BUTT, GDK_JOIN_MITER); + + + if (detail && !strcmp (detail, "add-mode")) + { + if (free_dash_list) + g_free (dash_list); + + dash_list = "\4\4"; + free_dash_list = FALSE; + } + + points[0].x = x + line_width / 2; + points[0].y = y + line_width / 2; + points[1].x = x + width - line_width + line_width / 2; + points[1].y = y + line_width / 2; + points[2].x = x + width - line_width + line_width / 2; + points[2].y = y + height - line_width + line_width / 2; + points[3].x = x + line_width / 2; + points[3].y = y + height - line_width + line_width / 2; + points[4] = points[0]; + + if (!dash_list[0]) + { + gdk_draw_lines (window, gc, points, 5); + } + else + { + dash_len = strlen (dash_list); + + if (dash_list[0]) + gdk_gc_set_dashes (gc, 0, dash_list, dash_len); + + gdk_draw_lines (window, gc, points, 3); + + points[2].x += 1; + + if (dash_list[0]) + { + gint dash_pixels = 0; + gint i; + + /* Adjust the dash offset for the bottom and left so we + * match up at the upper left. + */ + for (i = 0; i < dash_len; i++) + dash_pixels += dash_list[i]; + + if (dash_len % 2 == 1) + dash_pixels *= 2; + + gdk_gc_set_dashes (gc, + dash_pixels - (width + height - 2 * line_width) % dash_pixels, + dash_list, dash_len); + } + + gdk_draw_lines (window, gc, points + 2, 3); + } + + gdk_gc_set_line_attributes (gc, 0, GDK_LINE_SOLID, GDK_CAP_BUTT, GDK_JOIN_MITER); + + if (area) + gdk_gc_set_clip_rectangle (gc, NULL); + + if (free_dash_list) + g_free (dash_list); +} + +static void +draw_layout(GtkStyle * style, + GdkWindow * window, + GtkStateType state_type, + gboolean use_text, + GdkRectangle * area, + GtkWidget * widget, + const gchar * detail, gint x, gint y, PangoLayout * layout) +{ + ClearlooksStyle *clearlooks_style = CLEARLOOKS_STYLE (style); + + g_return_if_fail(GTK_IS_STYLE (style)); + g_return_if_fail(window != NULL); + + parent_class->draw_layout(style, window, state_type, use_text, + area, widget, detail, x, y, layout); + + +} + +/**************************************************************************/ +static void +draw_resize_grip (GtkStyle *style, + GdkWindow *window, + GtkStateType state_type, + GdkRectangle *area, + GtkWidget *widget, + const gchar *detail, + GdkWindowEdge edge, + gint x, + gint y, + gint width, + gint height) +{ + ClearlooksStyle *clearlooks_style = CLEARLOOKS_STYLE (style); + g_return_if_fail (GTK_IS_STYLE (style)); + g_return_if_fail (window != NULL); + + if (area) + { + gdk_gc_set_clip_rectangle (style->light_gc[state_type], area); + gdk_gc_set_clip_rectangle (style->dark_gc[state_type], area); + gdk_gc_set_clip_rectangle (style->bg_gc[state_type], area); + } + + switch (edge) + { + case GDK_WINDOW_EDGE_NORTH_WEST: + /* make it square */ + if (width < height) + { + height = width; + } + else if (height < width) + { + width = height; + } + break; + case GDK_WINDOW_EDGE_NORTH: + if (width < height) + { + height = width; + } + break; + case GDK_WINDOW_EDGE_NORTH_EAST: + /* make it square, aligning to top right */ + if (width < height) + { + height = width; + } + else if (height < width) + { + x += (width - height); + width = height; + } + break; + case GDK_WINDOW_EDGE_WEST: + if (height < width) + { + width = height; + } + break; + case GDK_WINDOW_EDGE_EAST: + /* aligning to right */ + if (height < width) + { + x += (width - height); + width = height; + } + break; + case GDK_WINDOW_EDGE_SOUTH_WEST: + /* make it square, aligning to bottom left */ + if (width < height) + { + y += (height - width); + height = width; + } + else if (height < width) + { + width = height; + } + break; + case GDK_WINDOW_EDGE_SOUTH: + /* align to bottom */ + if (width < height) + { + y += (height - width); + height = width; + } + break; + case GDK_WINDOW_EDGE_SOUTH_EAST: + /* make it square, aligning to bottom right */ + if (width < height) + { + y += (height - width); + height = width; + } + else if (height < width) + { + x += (width - height); + width = height; + } + break; + default: + g_assert_not_reached (); + } + + /* Clear background */ + gtk_style_apply_default_background (style, window, FALSE, + state_type, area, + x, y, width, height); + + switch (edge) + { + case GDK_WINDOW_EDGE_WEST: + case GDK_WINDOW_EDGE_EAST: + { + gint xi; + + xi = x; + + while (xi < x + width) + { + gdk_draw_line (window, + style->light_gc[state_type], + xi, y, + xi, y + height); + + xi++; + gdk_draw_line (window, + clearlooks_style->shade_gc[4], + xi, y, + xi, y + height); + + xi += 2; + } + } + break; + case GDK_WINDOW_EDGE_NORTH: + case GDK_WINDOW_EDGE_SOUTH: + { + gint yi; + + yi = y; + + while (yi < y + height) + { + gdk_draw_line (window, + style->light_gc[state_type], + x, yi, + x + width, yi); + + yi++; + gdk_draw_line (window, + clearlooks_style->shade_gc[4], + x, yi, + x + width, yi); + + yi+= 2; + } + } + break; + case GDK_WINDOW_EDGE_NORTH_WEST: + { + gint xi, yi; + + xi = x + width; + yi = y + height; + + while (xi > x + 3) + { + gdk_draw_line (window, + clearlooks_style->shade_gc[4], + xi, y, + x, yi); + + --xi; + --yi; + + gdk_draw_line (window, + style->light_gc[state_type], + xi, y, + x, yi); + + xi -= 3; + yi -= 3; + + } + } + break; + case GDK_WINDOW_EDGE_NORTH_EAST: + { + gint xi, yi; + + xi = x; + yi = y + height; + + while (xi < (x + width - 3)) + { + gdk_draw_line (window, + style->light_gc[state_type], + xi, y, + x + width, yi); + + ++xi; + --yi; + + gdk_draw_line (window, + clearlooks_style->shade_gc[4], + xi, y, + x + width, yi); + + xi += 3; + yi -= 3; + } + } + break; + case GDK_WINDOW_EDGE_SOUTH_WEST: + { + gint xi, yi; + + xi = x + width; + yi = y; + + while (xi > x + 3) + { + gdk_draw_line (window, + clearlooks_style->shade_gc[4], + x, yi, + xi, y + height); + + --xi; + ++yi; + + gdk_draw_line (window, + style->light_gc[state_type], + x, yi, + xi, y + height); + + xi -= 3; + yi += 3; + + } + } + break; + + case GDK_WINDOW_EDGE_SOUTH_EAST: + { + gint xi, yi; + + xi = x; + yi = y; + + while (xi < (x + width - 3)) + { + gdk_draw_line (window, + style->light_gc[state_type], + xi, y + height, + x + width, yi); + + ++xi; + ++yi; + + gdk_draw_line (window, + clearlooks_style->shade_gc[4], + xi, y + height, + x + width, yi); + + xi += 3; + yi += 3; + } + } + break; + default: + g_assert_not_reached (); + break; + } + + if (area) + { + gdk_gc_set_clip_rectangle (style->light_gc[state_type], NULL); + gdk_gc_set_clip_rectangle (style->dark_gc[state_type], NULL); + gdk_gc_set_clip_rectangle (style->bg_gc[state_type], NULL); + } +} + +/**************************************************************************/ + +static void +clearlooks_style_init_from_rc (GtkStyle * style, + GtkRcStyle * rc_style) +{ + ClearlooksStyle *clearlooks_style = CLEARLOOKS_STYLE (style); + GdkColor *spot_color; + double shades[] = {1.065, 0.93, 0.896, 0.85, 0.768, 0.665, 0.4, 0.205}; + int i; + double contrast; + + parent_class->init_from_rc (style, rc_style); + + contrast = CLEARLOOKS_RC_STYLE (rc_style)->contrast; + + clearlooks_style->sunkenmenubar = CLEARLOOKS_RC_STYLE (rc_style)->sunkenmenubar; + clearlooks_style->progressbarstyle = CLEARLOOKS_RC_STYLE (rc_style)->progressbarstyle; + clearlooks_style->menubarstyle = CLEARLOOKS_RC_STYLE (rc_style)->menubarstyle; + clearlooks_style->menuitemstyle = CLEARLOOKS_RC_STYLE (rc_style)->menuitemstyle; + clearlooks_style->listviewitemstyle = CLEARLOOKS_RC_STYLE (rc_style)->listviewitemstyle; + + /* Lighter to darker */ + for (i = 0; i < 8; i++) + { + shade (&style->bg[GTK_STATE_NORMAL], &clearlooks_style->shade[i], + (shades[i]-0.7) * contrast + 0.7); + } + + spot_color = clearlooks_get_spot_color (CLEARLOOKS_RC_STYLE (rc_style)); + + clearlooks_style->spot_color = *spot_color; + shade (&clearlooks_style->spot_color, &clearlooks_style->spot1, 1.42); + shade (&clearlooks_style->spot_color, &clearlooks_style->spot2, 1.05); + shade (&clearlooks_style->spot_color, &clearlooks_style->spot3, 0.65); + + shade (&style->bg[GTK_STATE_NORMAL], &clearlooks_style->border[CL_BORDER_UPPER], 0.5); + shade (&style->bg[GTK_STATE_NORMAL], &clearlooks_style->border[CL_BORDER_LOWER], 0.62); + shade (&style->bg[GTK_STATE_ACTIVE], &clearlooks_style->border[CL_BORDER_UPPER_ACTIVE], 0.5); + shade (&style->bg[GTK_STATE_ACTIVE], &clearlooks_style->border[CL_BORDER_LOWER_ACTIVE], 0.55); +} + +static GdkGC * +realize_color (GtkStyle * style, + GdkColor * color) +{ + GdkGCValues gc_values; + + gdk_colormap_alloc_color (style->colormap, color, FALSE, TRUE); + + gc_values.foreground = *color; + + return gtk_gc_get (style->depth, style->colormap, &gc_values, GDK_GC_FOREGROUND); +} + +static void +clearlooks_style_realize (GtkStyle * style) +{ + ClearlooksStyle *clearlooks_style = CLEARLOOKS_STYLE (style); + int i; + + parent_class->realize (style); + + for (i = 0; i < 8; i++) + clearlooks_style->shade_gc[i] = realize_color (style, &clearlooks_style->shade[i]); + + for (i=0; i < CL_BORDER_COUNT; i++) + clearlooks_style->border_gc[i] = realize_color (style, &clearlooks_style->border[i]); + + clearlooks_style->spot1_gc = realize_color (style, &clearlooks_style->spot1); + clearlooks_style->spot2_gc = realize_color (style, &clearlooks_style->spot2); + clearlooks_style->spot3_gc = realize_color (style, &clearlooks_style->spot3); + + /* set light inset color */ + for (i=0; i<5; i++) + { + shade (&style->bg[i], &clearlooks_style->inset_dark[i], 0.93); + gdk_rgb_find_color (style->colormap, &clearlooks_style->inset_dark[i]); + + shade (&style->bg[i], &clearlooks_style->inset_light[i], 1.055); + gdk_rgb_find_color (style->colormap, &clearlooks_style->inset_light[i]); + + shade (&style->bg[i], &clearlooks_style->listview_bg[i], 1.015); + gdk_rgb_find_color (style->colormap, &clearlooks_style->listview_bg[i]); + + /* CREATE GRADIENT FOR BUTTONS */ + shade (&style->bg[i], &clearlooks_style->button_g1[i], 1.055); + gdk_rgb_find_color (style->colormap, &clearlooks_style->button_g1[i]); + + shade (&style->bg[i], &clearlooks_style->button_g2[i], 1.005); + gdk_rgb_find_color (style->colormap, &clearlooks_style->button_g2[i]); + + shade (&style->bg[i], &clearlooks_style->button_g3[i], 0.98); + gdk_rgb_find_color (style->colormap, &clearlooks_style->button_g3[i]); + + shade (&style->bg[i], &clearlooks_style->button_g4[i], 0.91); + gdk_rgb_find_color (style->colormap, &clearlooks_style->button_g4[i]); + } + +} + +static void +clearlooks_style_unrealize (GtkStyle * style) +{ + ClearlooksStyle *clearlooks_style = CLEARLOOKS_STYLE (style); + int i; + + /* We don't free the colors, because we don't know if + * gtk_gc_release() actually freed the GC. FIXME - need + * a way of ref'ing colors explicitely so GtkGC can + * handle things properly. + */ + for (i=0; i < 8; i++) + gtk_gc_release (clearlooks_style->shade_gc[i]); + + gtk_gc_release (clearlooks_style->spot1_gc); + gtk_gc_release (clearlooks_style->spot2_gc); + gtk_gc_release (clearlooks_style->spot3_gc); + + for (i = 0; i < 5; i++) + { + if (clearlooks_style->radio_pixmap_nonactive[i] != NULL) + { + g_object_unref (clearlooks_style->radio_pixmap_nonactive[i]); + clearlooks_style->radio_pixmap_nonactive[i] = NULL; + g_object_unref (clearlooks_style->radio_pixmap_active[i]); + clearlooks_style->radio_pixmap_active[i] = NULL; + g_object_unref (clearlooks_style->radio_pixmap_inconsistent[i]); + clearlooks_style->radio_pixmap_inconsistent[i] = NULL; + } + + if (clearlooks_style->check_pixmap_nonactive[i] != NULL) + { + g_object_unref (clearlooks_style->check_pixmap_nonactive[i]); + clearlooks_style->check_pixmap_nonactive[i] = NULL; + g_object_unref (clearlooks_style->check_pixmap_active[i]); + clearlooks_style->check_pixmap_active[i] = NULL; + g_object_unref (clearlooks_style->check_pixmap_inconsistent[i]); + clearlooks_style->check_pixmap_inconsistent[i] = NULL; + } + } + + if (clearlooks_style->radio_pixmap_mask != NULL) + g_object_unref (clearlooks_style->radio_pixmap_mask); + + clearlooks_style->radio_pixmap_mask = NULL; + + while (progressbars = g_list_first (progressbars)) + cl_progressbar_remove (progressbars->data); + + if (timer_id != 0) + { + g_source_remove(timer_id); + timer_id = 0; + } + + parent_class->unrealize (style); +} + +static GdkPixbuf * +set_transparency (const GdkPixbuf *pixbuf, gdouble alpha_percent) +{ + GdkPixbuf *target; + guchar *data, *current; + guint x, y, rowstride, height, width; + + g_return_val_if_fail (pixbuf != NULL, NULL); + g_return_val_if_fail (GDK_IS_PIXBUF (pixbuf), NULL); + + /* Returns a copy of pixbuf with it's non-completely-transparent pixels to + have an alpha level "alpha_percent" of their original value. */ + + target = gdk_pixbuf_add_alpha (pixbuf, FALSE, 0, 0, 0); + + if (alpha_percent == 1.0) + return target; + width = gdk_pixbuf_get_width (target); + height = gdk_pixbuf_get_height (target); + rowstride = gdk_pixbuf_get_rowstride (target); + data = gdk_pixbuf_get_pixels (target); + + for (y = 0; y < height; y++) { + for (x = 0; x < width; x++) { + /* The "4" is the number of chars per pixel, in this case, RGBA, + the 3 means "skip to the alpha" */ + current = data + (y * rowstride) + (x * 4) + 3; + *(current) = (guchar) (*(current) * alpha_percent); + } + } + + return target; +} + +static GdkPixbuf* +scale_or_ref (GdkPixbuf *src, + int width, + int height) +{ + if (width == gdk_pixbuf_get_width (src) && + height == gdk_pixbuf_get_height (src)) { + return g_object_ref (src); + } else { + return gdk_pixbuf_scale_simple (src, + width, height, + GDK_INTERP_BILINEAR); + } +} + +static GdkPixbuf * +render_icon (GtkStyle *style, + const GtkIconSource *source, + GtkTextDirection direction, + GtkStateType state, + GtkIconSize size, + GtkWidget *widget, + const char *detail) +{ + int width = 1; + int height = 1; + GdkPixbuf *scaled; + GdkPixbuf *stated; + GdkPixbuf *base_pixbuf; + GdkScreen *screen; + GtkSettings *settings; + + /* Oddly, style can be NULL in this function, because + * GtkIconSet can be used without a style and if so + * it uses this function. + */ + + base_pixbuf = gtk_icon_source_get_pixbuf (source); + + g_return_val_if_fail (base_pixbuf != NULL, NULL); + + if (widget && gtk_widget_has_screen (widget)) { + screen = gtk_widget_get_screen (widget); + settings = gtk_settings_get_for_screen (screen); + } else if (style->colormap) { + screen = gdk_colormap_get_screen (style->colormap); + settings = gtk_settings_get_for_screen (screen); + } else { + settings = gtk_settings_get_default (); + GTK_NOTE (MULTIHEAD, + g_warning ("Using the default screen for gtk_default_render_icon()")); + } + + + if (size != (GtkIconSize) -1 && !gtk_icon_size_lookup_for_settings (settings, size, &width, &height)) { + g_warning (G_STRLOC ": invalid icon size '%d'", size); + return NULL; + } + + /* If the size was wildcarded, and we're allowed to scale, then scale; otherwise, + * leave it alone. + */ + if (size != (GtkIconSize)-1 && gtk_icon_source_get_size_wildcarded (source)) + scaled = scale_or_ref (base_pixbuf, width, height); + else + scaled = g_object_ref (base_pixbuf); + + /* If the state was wildcarded, then generate a state. */ + if (gtk_icon_source_get_state_wildcarded (source)) { + if (state == GTK_STATE_INSENSITIVE) { + stated = set_transparency (scaled, 0.3); +#if 0 + stated = + gdk_pixbuf_composite_color_simple (scaled, + gdk_pixbuf_get_width (scaled), + gdk_pixbuf_get_height (scaled), + GDK_INTERP_BILINEAR, 128, + gdk_pixbuf_get_width (scaled), + style->bg[state].pixel, + style->bg[state].pixel); +#endif + gdk_pixbuf_saturate_and_pixelate (stated, stated, + 0.1, FALSE); + + g_object_unref (scaled); + } else if (state == GTK_STATE_PRELIGHT) { + stated = gdk_pixbuf_copy (scaled); + + gdk_pixbuf_saturate_and_pixelate (scaled, stated, + 1.2, FALSE); + + g_object_unref (scaled); + } else { + stated = scaled; + } + } + else + stated = scaled; + + return stated; +} + +static void +clearlooks_style_init (ClearlooksStyle * style) +{ +} + +static void +clearlooks_style_class_init (ClearlooksStyleClass * klass) +{ + GtkStyleClass *style_class = GTK_STYLE_CLASS (klass); + + parent_class = g_type_class_peek_parent (klass); + + style_class->realize = clearlooks_style_realize; + style_class->unrealize = clearlooks_style_unrealize; + style_class->init_from_rc = clearlooks_style_init_from_rc; + style_class->draw_focus = draw_focus; + style_class->draw_resize_grip = draw_resize_grip; + style_class->draw_handle = draw_handle; + style_class->draw_vline = draw_vline; + style_class->draw_hline = draw_hline; + style_class->draw_slider = draw_slider; + style_class->draw_shadow_gap = draw_shadow_gap; + style_class->draw_arrow = clearlooks_draw_arrow; + style_class->draw_check = draw_check; + style_class->draw_tab = draw_tab; + style_class->draw_box = draw_box; + style_class->draw_shadow = draw_shadow; + style_class->draw_box_gap = draw_box_gap; + style_class->draw_extension = draw_extension; + style_class->draw_option = draw_option; + style_class->draw_layout = draw_layout; + style_class->render_icon = render_icon; + style_class->draw_flat_box = draw_flat_box; +} + +GType clearlooks_type_style = 0; + +void +clearlooks_style_register_type (GTypeModule * module) +{ + static const GTypeInfo object_info = + { + sizeof (ClearlooksStyleClass), + (GBaseInitFunc) NULL, + (GBaseFinalizeFunc) NULL, + (GClassInitFunc) clearlooks_style_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (ClearlooksStyle), + 0, /* n_preallocs */ + (GInstanceInitFunc) clearlooks_style_init, + NULL + }; + + clearlooks_type_style = g_type_module_register_type (module, + GTK_TYPE_STYLE, + "ClearlooksStyle", + &object_info, 0); +} diff --git a/libs/clearlooks/clearlooks_style.h b/libs/clearlooks/clearlooks_style.h new file mode 100644 index 0000000000..1e07877bf7 --- /dev/null +++ b/libs/clearlooks/clearlooks_style.h @@ -0,0 +1,108 @@ +/* Clearlooks Engine + * Copyright (C) 2005 Richard Stellingwerff. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Written by Owen Taylor <otaylor@redhat.com> + * and by Alexander Larsson <alexl@redhat.com> + * Modified by Richard Stellingwerff <remenic@gmail.com> + */ +#include <gtk/gtkstyle.h> + +#include "clearlooks_draw.h" + +typedef struct _ClearlooksStyle ClearlooksStyle; +typedef struct _ClearlooksStyleClass ClearlooksStyleClass; + +extern GType clearlooks_type_style; + +#define CLEARLOOKS_TYPE_STYLE clearlooks_type_style +#define CLEARLOOKS_STYLE(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), CLEARLOOKS_TYPE_STYLE, ClearlooksStyle)) +#define CLEARLOOKS_STYLE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), CLEARLOOKS_TYPE_STYLE, ClearlooksStyleClass)) +#define CLEARLOOKS_IS_STYLE(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), CLEARLOOKS_TYPE_STYLE)) +#define CLEARLOOKS_IS_STYLE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), CLEARLOOKS_TYPE_STYLE)) +#define CLEARLOOKS_STYLE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), CLEARLOOKS_TYPE_STYLE, ClearlooksStyleClass)) + +typedef enum +{ + CL_BORDER_UPPER = 0, + CL_BORDER_LOWER, + CL_BORDER_UPPER_ACTIVE, + CL_BORDER_LOWER_ACTIVE, + CL_BORDER_COUNT +} ClBorderColorType; + +typedef enum +{ + CL_SCROLLBUTTON_BEGIN = 0, + CL_SCROLLBUTTON_END, + CL_SCROLLBUTTON_OTHER +} ClScrollButtonType; + +struct _ClearlooksStyle +{ + GtkStyle parent_instance; + + GdkColor shade[9]; + + GdkColor spot_color; + GdkColor spot1; + GdkColor spot2; + GdkColor spot3; + + GdkColor border[CL_BORDER_COUNT]; + + /* from light to dark */ + GdkGC *shade_gc[9]; + GdkGC *border_gc[CL_BORDER_COUNT]; + + GdkGC *spot1_gc; + GdkGC *spot2_gc; + GdkGC *spot3_gc; + + GdkColor inset_light[5]; + GdkColor inset_dark[5]; + + GdkColor button_g1[5]; + GdkColor button_g2[5]; + GdkColor button_g3[5]; + GdkColor button_g4[5]; + + GdkColor listview_bg[5]; + + GdkPixmap *radio_pixmap_nonactive[5]; + GdkPixmap *radio_pixmap_active[5]; + GdkPixmap *radio_pixmap_inconsistent[5]; + GdkBitmap *radio_pixmap_mask; /* All masks are the same */ + + GdkPixmap *check_pixmap_nonactive[5]; + GdkPixmap *check_pixmap_active[5]; + GdkPixmap *check_pixmap_inconsistent[5]; + + gboolean sunkenmenubar:1; + + guint8 progressbarstyle; + guint8 menubarstyle; + guint8 menuitemstyle; + guint8 listviewitemstyle; +}; + +struct _ClearlooksStyleClass +{ + GtkStyleClass parent_class; +}; + +void clearlooks_style_register_type (GTypeModule *module); diff --git a/libs/clearlooks/clearlooks_theme_main.c b/libs/clearlooks/clearlooks_theme_main.c new file mode 100644 index 0000000000..d30d4dd0b7 --- /dev/null +++ b/libs/clearlooks/clearlooks_theme_main.c @@ -0,0 +1,37 @@ +#include <gmodule.h> +#include <gtk/gtk.h> + +#include "clearlooks_style.h" +#include "clearlooks_rc_style.h" + +G_MODULE_EXPORT void +theme_init (GTypeModule *module) +{ + clearlooks_rc_style_register_type (module); + clearlooks_style_register_type (module); + printf("theme_init() called from internal clearlooks engine!\n"); +} + +G_MODULE_EXPORT void +theme_exit (void) +{ +} + +G_MODULE_EXPORT GtkRcStyle * +theme_create_rc_style (void) +{ + return GTK_RC_STYLE (g_object_new (CLEARLOOKS_TYPE_RC_STYLE, NULL)); +} + +/* The following function will be called by GTK+ when the module + * is loaded and checks to see if we are compatible with the + * version of GTK+ that loads us. + */ +G_MODULE_EXPORT const gchar* g_module_check_init (GModule *module); +const gchar* +g_module_check_init (GModule *module) +{ + return gtk_check_version (GTK_MAJOR_VERSION, + GTK_MINOR_VERSION, + GTK_MICRO_VERSION - GTK_INTERFACE_AGE); +} diff --git a/libs/clearlooks/cpdll.sh b/libs/clearlooks/cpdll.sh new file mode 100755 index 0000000000..fb101d52a0 --- /dev/null +++ b/libs/clearlooks/cpdll.sh @@ -0,0 +1,2 @@ +mkdir engines +cp libclearlooks.so engines diff --git a/libs/clearlooks/support.c b/libs/clearlooks/support.c new file mode 100644 index 0000000000..358c7f43fb --- /dev/null +++ b/libs/clearlooks/support.c @@ -0,0 +1,981 @@ +#include "support.h" + +/* #define ALWAYS_DITHER_GRADIENTS */ + +GtkTextDirection +get_direction (GtkWidget *widget) +{ + GtkTextDirection dir; + + if (widget) + dir = gtk_widget_get_direction (widget); + else + dir = GTK_TEXT_DIR_LTR; + + return dir; +} + +GdkPixbuf * +generate_bit (unsigned char alpha[], GdkColor *color, double mult) +{ + guint r, g, b; + GdkPixbuf *pixbuf; + unsigned char *pixels; + int w, h, rs; + int x, y; + + r = (color->red >> 8) * mult; + r = MIN(r, 255); + g = (color->green >> 8) * mult; + g = MIN(g, 255); + b = (color->blue >> 8) * mult; + b = MIN(b, 255); + + pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, TRUE, 8, RADIO_SIZE, RADIO_SIZE); + + w = gdk_pixbuf_get_width (pixbuf); + h = gdk_pixbuf_get_height (pixbuf); + rs = gdk_pixbuf_get_rowstride (pixbuf); + pixels = gdk_pixbuf_get_pixels (pixbuf); + + + for (y=0; y < h; y++) + { + for (x=0; x < w; x++) + { + pixels[y*rs + x*4 + 0] = r; + pixels[y*rs + x*4 + 1] = g; + pixels[y*rs + x*4 + 2] = b; + if (alpha) + pixels[y*rs + x*4 + 3] = alpha[y*w + x]; + else + pixels[y*rs + x*4 + 3] = 255; + } + } + + return pixbuf; +} + +#define CLAMP_UCHAR(v) ((guchar) (CLAMP (((int)v), (int)0, (int)255))) + +GdkPixbuf * +colorize_bit (unsigned char *bit, + unsigned char *alpha, + GdkColor *new_color) +{ + GdkPixbuf *pixbuf; + double intensity; + int x, y; + const guchar *src, *asrc; + guchar *dest; + int dest_rowstride; + int width, height; + guchar *dest_pixels; + + pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, TRUE, 8, RADIO_SIZE, RADIO_SIZE); + + if (pixbuf == NULL) + return NULL; + + dest_rowstride = gdk_pixbuf_get_rowstride (pixbuf); + width = gdk_pixbuf_get_width (pixbuf); + height = gdk_pixbuf_get_height (pixbuf); + dest_pixels = gdk_pixbuf_get_pixels (pixbuf); + + for (y = 0; y < RADIO_SIZE; y++) + { + src = bit + y * RADIO_SIZE; + asrc = alpha + y * RADIO_SIZE; + dest = dest_pixels + y * dest_rowstride; + + for (x = 0; x < RADIO_SIZE; x++) + { + double dr, dg, db; + + intensity = (src[x] + 0 )/ 255.0; + + if (intensity <= 0.5) + { + /* Go from black at intensity = 0.0 to new_color at intensity = 0.5 */ + dr = (new_color->red * intensity * 2.0) / 65535.0; + dg = (new_color->green * intensity * 2.0) / 65535.0; + db = (new_color->blue * intensity * 2.0) / 65535.0; + } + else + { + /* Go from new_color at intensity = 0.5 to white at intensity = 1.0 */ + dr = (new_color->red + (65535 - new_color->red) * (intensity - 0.5) * 2.0) / 65535.0; + dg = (new_color->green + (65535 - new_color->green) * (intensity - 0.5) * 2.0) / 65535.0; + db = (new_color->blue + (65535 - new_color->blue) * (intensity - 0.5) * 2.0) / 65535.0; + } + + dest[0] = CLAMP_UCHAR (255 * dr); + dest[1] = CLAMP_UCHAR (255 * dg); + dest[2] = CLAMP_UCHAR (255 * db); + + dest[3] = asrc[x]; + dest += 4; + } + } + + return pixbuf; +} + +GdkPixmap * +pixbuf_to_pixmap (GtkStyle *style, + GdkPixbuf *pixbuf, + GdkScreen *screen) +{ + GdkGC *tmp_gc; + GdkPixmap *pixmap; + + pixmap = gdk_pixmap_new (gdk_screen_get_root_window (screen), + gdk_pixbuf_get_width (pixbuf), + gdk_pixbuf_get_height (pixbuf), + style->depth); + + gdk_drawable_set_colormap (pixmap, style->colormap); + + tmp_gc = gdk_gc_new (pixmap); + + gdk_pixbuf_render_to_drawable (pixbuf, pixmap, tmp_gc, 0, 0, 0, 0, + gdk_pixbuf_get_width (pixbuf), + gdk_pixbuf_get_height (pixbuf), + GDK_RGB_DITHER_NORMAL, 0, 0); + + gdk_gc_unref (tmp_gc); + + return pixmap; +} + + +void +rgb_to_hls (gdouble *r, + gdouble *g, + gdouble *b) +{ + gdouble min; + gdouble max; + gdouble red; + gdouble green; + gdouble blue; + gdouble h, l, s; + gdouble delta; + + red = *r; + green = *g; + blue = *b; + + if (red > green) + { + if (red > blue) + max = red; + else + max = blue; + + if (green < blue) + min = green; + else + min = blue; + } + else + { + if (green > blue) + max = green; + else + max = blue; + + if (red < blue) + min = red; + else + min = blue; + } + + l = (max + min) / 2; + s = 0; + h = 0; + + if (max != min) + { + if (l <= 0.5) + s = (max - min) / (max + min); + else + s = (max - min) / (2 - max - min); + + delta = max -min; + if (red == max) + h = (green - blue) / delta; + else if (green == max) + h = 2 + (blue - red) / delta; + else if (blue == max) + h = 4 + (red - green) / delta; + + h *= 60; + if (h < 0.0) + h += 360; + } + + *r = h; + *g = l; + *b = s; +} + +void +hls_to_rgb (gdouble *h, + gdouble *l, + gdouble *s) +{ + gdouble hue; + gdouble lightness; + gdouble saturation; + gdouble m1, m2; + gdouble r, g, b; + + lightness = *l; + saturation = *s; + + if (lightness <= 0.5) + m2 = lightness * (1 + saturation); + else + m2 = lightness + saturation - lightness * saturation; + + m1 = 2 * lightness - m2; + + if (saturation == 0) + { + *h = lightness; + *l = lightness; + *s = lightness; + } + else + { + hue = *h + 120; + while (hue > 360) + hue -= 360; + while (hue < 0) + hue += 360; + + if (hue < 60) + r = m1 + (m2 - m1) * hue / 60; + else if (hue < 180) + r = m2; + else if (hue < 240) + r = m1 + (m2 - m1) * (240 - hue) / 60; + else + r = m1; + + hue = *h; + while (hue > 360) + hue -= 360; + while (hue < 0) + hue += 360; + + if (hue < 60) + g = m1 + (m2 - m1) * hue / 60; + else if (hue < 180) + g = m2; + else if (hue < 240) + g = m1 + (m2 - m1) * (240 - hue) / 60; + else + g = m1; + + hue = *h - 120; + while (hue > 360) + hue -= 360; + while (hue < 0) + hue += 360; + + if (hue < 60) + b = m1 + (m2 - m1) * hue / 60; + else if (hue < 180) + b = m2; + else if (hue < 240) + b = m1 + (m2 - m1) * (240 - hue) / 60; + else + b = m1; + + *h = r; + *l = g; + *s = b; + } +} + +void +shade (GdkColor * a, GdkColor * b, float k) +{ + gdouble red; + gdouble green; + gdouble blue; + + red = (gdouble) a->red / 65535.0; + green = (gdouble) a->green / 65535.0; + blue = (gdouble) a->blue / 65535.0; + + rgb_to_hls (&red, &green, &blue); + + green *= k; + if (green > 1.0) + green = 1.0; + else if (green < 0.0) + green = 0.0; + + blue *= k; + if (blue > 1.0) + blue = 1.0; + else if (blue < 0.0) + blue = 0.0; + + hls_to_rgb (&red, &green, &blue); + + b->red = red * 65535.0; + b->green = green * 65535.0; + b->blue = blue * 65535.0; +} + + +/**************************************************************************/ + +void +arrow_draw_hline (GdkWindow *window, + GdkGC *gc, + int x1, + int x2, + int y, + gboolean last) +{ + if (x2 - x1 < 7 && !last) /* 7 to get garretts pixels, otherwise 6 */ + { + gdk_draw_line (window, gc, x1, y, x2, y); + } + else if (last) + { + /* we don't draw "spikes" for very small arrows */ + if (x2 - x1 <= 9) + { + /*gdk_draw_line (window, gc, x1+1, y, x1+1, y); + gdk_draw_line (window, gc, x2-1, y, x2-1, y);*/ + } + else + { + gdk_draw_line (window, gc, x1+2, y, x1+2, y); + gdk_draw_line (window, gc, x2-2, y, x2-2, y); + } + } + else + { + gdk_draw_line (window, gc, x1, y, x1+2, y); + gdk_draw_line (window, gc, x2-2, y, x2, y); + } +} + +void +arrow_draw_vline (GdkWindow *window, + GdkGC *gc, + int y1, + int y2, + int x, + gboolean last) +{ + if (y2 - y1 < 7 && !last) /* 7 to get garretts pixels */ + gdk_draw_line (window, gc, x, y1, x, y2); + else if (last) + { + /* we don't draw "spikes" for very small arrows */ + if (y2 - y1 > 9) { + gdk_draw_line (window, gc, x, y1+2, x, y1+2); + gdk_draw_line (window, gc, x, y2-2, x, y2-2); + } + } + else + { + gdk_draw_line (window, gc, x, y1, x, y1+2); + gdk_draw_line (window, gc, x, y2-2, x, y2); + } +} + + + +void +draw_arrow (GdkWindow *window, + GdkGC *gc, + GdkRectangle *area, + GtkArrowType arrow_type, + gint x, + gint y, + gint width, + gint height) +{ + gint i, j; + + if (area) + gdk_gc_set_clip_rectangle (gc, area); + + if (arrow_type == GTK_ARROW_DOWN) + { + for (i = 0, j = -1; i < height; i++, j++) + arrow_draw_hline (window, gc, x + j, x + width - j - 1, y + i, i == 0); + + } + else if (arrow_type == GTK_ARROW_UP) + { + for (i = height - 1, j = -1; i >= 0; i--, j++) + arrow_draw_hline (window, gc, x + j, x + width - j - 1, y + i, i == height - 1); + } + else if (arrow_type == GTK_ARROW_LEFT) + { + for (i = width - 1, j = -1; i >= 0; i--, j++) + arrow_draw_vline (window, gc, y + j, y + height - j - 1, x + i, i == width - 1); + } + else if (arrow_type == GTK_ARROW_RIGHT) + { + for (i = 0, j = -1; i < width; i++, j++) + arrow_draw_vline (window, gc, y + j, y + height - j - 1, x + i, i == 0); + } + + if (area) + gdk_gc_set_clip_rectangle (gc, NULL); +} + +void +calculate_arrow_geometry (GtkArrowType arrow_type, + gint *x, + gint *y, + gint *width, + gint *height) +{ + gint w = *width; + gint h = *height; + + switch (arrow_type) + { + case GTK_ARROW_UP: + case GTK_ARROW_DOWN: + w += (w % 2) - 1; + h = (w / 2 + 1) + 1; + + if (h > *height) + { + h = *height; + w = 2 * (h - 1) - 1; + } + + if (arrow_type == GTK_ARROW_DOWN) + { + if (*height % 2 == 1 || h % 2 == 0) + *height += 1; + } + else + { + if (*height % 2 == 0 || h % 2 == 0) + *height -= 1; + } + break; + + case GTK_ARROW_RIGHT: + case GTK_ARROW_LEFT: + h += (h % 2) - 1; + w = (h / 2 + 1) + 1; + + if (w > *width) + { + w = *width; + h = 2 * (w - 1) - 1; + } + + if (arrow_type == GTK_ARROW_RIGHT) + { + if (*width % 2 == 1 || w % 2 == 0) + *width += 1; + } + else + { + if (*width % 2 == 0 || w % 2 == 0) + *width -= 1; + } + break; + + default: + /* should not be reached */ + break; + } + + *x += (*width - w) / 2; + *y += (*height - h) / 2; + *height = h; + *width = w; +} + + +void gtk_treeview_get_header_index (GtkTreeView *tv, GtkWidget *header, + gint *column_index, gint *columns, +gboolean *resizable) +{ + GList *list; + *column_index = *columns = 0; + list = gtk_tree_view_get_columns (tv); + + do + { + GtkTreeViewColumn *column = GTK_TREE_VIEW_COLUMN(list->data); + if ( column->button == header ) + { + *column_index = *columns; + *resizable = column->resizable; + } + if ( column->visible ) + (*columns)++; + } while ((list = g_list_next(list))); +} + +void gtk_clist_get_header_index (GtkCList *clist, GtkWidget *button, + gint *column_index, gint *columns) +{ + *columns = clist->columns; + int i; + + for (i=0; i<*columns; i++) + { + if (clist->column[i].button == button) + { + *column_index = i; + break; + } + } +} + +gboolean +sanitize_size (GdkWindow *window, + gint *width, + gint *height) +{ + gboolean set_bg = FALSE; + + if ((*width == -1) && (*height == -1)) + { + set_bg = GDK_IS_WINDOW (window); + gdk_window_get_size (window, width, height); + } + else if (*width == -1) + gdk_window_get_size (window, width, NULL); + else if (*height == -1) + gdk_window_get_size (window, NULL, height); + + return set_bg; +} + +static GtkRequisition default_option_indicator_size = { 7, 13 }; +static GtkBorder default_option_indicator_spacing = { 7, 5, 2, 2 }; + +void +option_menu_get_props (GtkWidget *widget, + GtkRequisition *indicator_size, + GtkBorder *indicator_spacing) +{ + GtkRequisition *tmp_size = NULL; + GtkBorder *tmp_spacing = NULL; + + if (widget) + gtk_widget_style_get (widget, "indicator_size", &tmp_size, + "indicator_spacing", &tmp_spacing, NULL); + + if (tmp_size) + { + *indicator_size = *tmp_size; + g_free (tmp_size); + } + else + *indicator_size = default_option_indicator_size; + + if (tmp_spacing) + { + *indicator_spacing = *tmp_spacing; + g_free (tmp_spacing); + } + else + *indicator_spacing = default_option_indicator_spacing; +} + +GtkWidget *special_get_ancestor(GtkWidget * widget, + GType widget_type) +{ + g_return_val_if_fail(GTK_IS_WIDGET(widget), NULL); + + while (widget && widget->parent + && !g_type_is_a(GTK_WIDGET_TYPE(widget->parent), + widget_type)) + widget = widget->parent; + + if (! + (widget && widget->parent + && g_type_is_a(GTK_WIDGET_TYPE(widget->parent), widget_type))) + return NULL; + + return widget; +} + +/* Dithered Gradient Buffers */ +static void +internel_image_buffer_free_pixels (guchar *pixels, gpointer data) +{ + g_free (pixels); +} + +static GdkPixbuf* +internal_image_buffer_new (gint width, gint height) +{ + guchar *buf; + int rowstride; + + g_return_val_if_fail (width > 0, NULL); + g_return_val_if_fail (height > 0, NULL); + + rowstride = width * 3; + + buf = g_try_malloc (height * rowstride); + + if (!buf) + return NULL; + + return gdk_pixbuf_new_from_data(buf, GDK_COLORSPACE_RGB, + FALSE, 8, + width, height, rowstride, + internel_image_buffer_free_pixels, NULL); +} + +static void +internal_color_get_as_uchars(GdkColor *color, + guchar *red, + guchar *green, + guchar *blue) +{ + *red = (guchar) (color->red / 256.0); + *green = (guchar) (color->green / 256.0); + *blue = (guchar) (color->blue / 256.0); +} + +static GdkPixbuf* +internal_create_horizontal_gradient_image_buffer (gint width, gint height, + GdkColor *from, + GdkColor *to) +{ + int i; + long r, g, b, dr, dg, db; + GdkPixbuf* buffer; + guchar *ptr; + guchar *pixels; + guchar r0, g0, b0; + guchar rf, gf, bf; + int rowstride; + + buffer = internal_image_buffer_new (width, height); + + if (buffer == NULL) + return NULL; + + pixels = gdk_pixbuf_get_pixels (buffer); + ptr = pixels; + rowstride = gdk_pixbuf_get_rowstride (buffer); + + internal_color_get_as_uchars(from, &r0, &g0, &b0); + internal_color_get_as_uchars(to, &rf, &gf, &bf); + + r = r0 << 16; + g = g0 << 16; + b = b0 << 16; + + dr = ((rf-r0)<<16)/width; + dg = ((gf-g0)<<16)/width; + db = ((bf-b0)<<16)/width; + + /* render the first line */ + for (i=0; i<width; i++) + { + *(ptr++) = (guchar)(r>>16); + *(ptr++) = (guchar)(g>>16); + *(ptr++) = (guchar)(b>>16); + + r += dr; + g += dg; + b += db; + } + + /* copy the first line to the other lines */ + for (i=1; i<height; i++) + { + memcpy (&(pixels[i*rowstride]), pixels, rowstride); + } + + return buffer; +} + +static GdkPixbuf* +internal_create_vertical_gradient_image_buffer (gint width, gint height, + GdkColor *from, + GdkColor *to) +{ + gint i, j, max_block, last_block; + long r, g, b, dr, dg, db; + GdkPixbuf *buffer; + + guchar *ptr; + guchar point[4]; + + guchar r0, g0, b0; + guchar rf, gf, bf; + + gint rowstride; + guchar *pixels; + + buffer = internal_image_buffer_new (width, height); + + if (buffer == NULL) + return NULL; + + pixels = gdk_pixbuf_get_pixels (buffer); + rowstride = gdk_pixbuf_get_rowstride (buffer); + + internal_color_get_as_uchars(from, &r0, &g0, &b0); + internal_color_get_as_uchars(to, &rf, &gf, &bf); + + r = r0<<16; + g = g0<<16; + b = b0<<16; + + dr = ((rf-r0)<<16)/height; + dg = ((gf-g0)<<16)/height; + db = ((bf-b0)<<16)/height; + + max_block = width/2; + + for (i=0; i < height; i++) + { + ptr = pixels + i * rowstride; + + ptr[0] = r>>16; + ptr[1] = g>>16; + ptr[2] = b>>16; + + if (width > 1) + { + last_block = 0; + + for (j=1; j <= max_block; j *= 2) + { + memcpy (&(ptr[j*3]), ptr, j*3); + + if ((j*2) >= max_block) + { + last_block = j*2; + } + } + + if ((last_block < width) && (last_block > 0)) + { + memcpy (&(ptr[last_block*3]), ptr, (width - last_block)*3); + } + } + + r += dr; + g += dg; + b += db; + } + + return buffer; +} + +void +draw_vgradient (GdkDrawable *drawable, GdkGC *gc, GtkStyle *style, + int x, int y, int width, int height, + GdkColor *left_color, GdkColor *right_color) +{ + #ifndef ALWAYS_DITHER_GRADIENTS + gboolean dither = ((style->depth > 0) && (style->depth <= 16)); + #endif + + if ((width <= 0) || (height <= 0)) + return; + + if ( left_color == NULL || right_color == NULL ) + { + gdk_draw_rectangle (drawable, gc, TRUE, x, y, width, height); + return; + } + + #ifndef ALWAYS_DITHER_GRADIENTS + if (dither) + #endif + { + GdkPixbuf *image_buffer = NULL; + + image_buffer = internal_create_horizontal_gradient_image_buffer (width, height, left_color, right_color); + + if (image_buffer) + { + gdk_draw_pixbuf(drawable, gc, image_buffer, 0, 0, x, y, width, height, GDK_RGB_DITHER_MAX, 0, 0); + + g_object_unref(image_buffer); + } + } + #ifndef ALWAYS_DITHER_GRADIENTS + else + { + int i; + GdkColor col; + int dr, dg, db; + GdkGCValues old_values; + + gdk_gc_get_values (gc, &old_values); + + if (left_color == right_color ) + { + col = *left_color; + gdk_rgb_find_color (style->colormap, &col); + gdk_gc_set_foreground (gc, &col); + gdk_draw_rectangle (drawable, gc, TRUE, x, y, width, height); + gdk_gc_set_foreground (gc, &old_values.foreground); + return; + } + + col = *left_color; + dr = (right_color->red - left_color->red) / width; + dg = (right_color->green - left_color->green) / width; + db = (right_color->blue - left_color->blue) / width; + + for (i = 0; i < width; i++) + { + gdk_rgb_find_color (style->colormap, &col); + + gdk_gc_set_foreground (gc, &col); + gdk_draw_line (drawable, gc, x + i, y, x + i, y + height - 1); + + col.red += dr; + col.green += dg; + col.blue += db; + } + + gdk_gc_set_foreground (gc, &old_values.foreground); + } + #endif +} + +void +draw_hgradient (GdkDrawable *drawable, GdkGC *gc, GtkStyle *style, + int x, int y, int width, int height, + GdkColor *top_color, GdkColor *bottom_color) +{ + #ifndef ALWAYS_DITHER_GRADIENTS + gboolean dither = ((style->depth > 0) && (style->depth <= 16)); + #endif + + if ((width <= 0) || (height <= 0)) + return; + + #ifndef ALWAYS_DITHER_GRADIENTS + if (dither) + #endif + { + GdkPixbuf *image_buffer = NULL; + + image_buffer = internal_create_vertical_gradient_image_buffer (width, height, top_color, bottom_color); + + if (image_buffer) + { + gdk_draw_pixbuf(drawable, gc, image_buffer, 0, 0, x, y, width, height, GDK_RGB_DITHER_MAX, 0, 0); + + g_object_unref(image_buffer); + } + } + #ifndef ALWAYS_DITHER_GRADIENTS + else + { + int i; + GdkColor col; + int dr, dg, db; + GdkGCValues old_values; + + gdk_gc_get_values (gc, &old_values); + + if (top_color == bottom_color ) + { + col = *top_color; + gdk_rgb_find_color (style->colormap, &col); + gdk_gc_set_foreground (gc, &col); + gdk_draw_rectangle (drawable, gc, TRUE, x, y, width, height); + gdk_gc_set_foreground (gc, &old_values.foreground); + return; + } + + col = *top_color; + dr = (bottom_color->red - top_color->red) / height; + dg = (bottom_color->green - top_color->green) / height; + db = (bottom_color->blue - top_color->blue) / height; + + for (i = 0; i < height; i++) + { + gdk_rgb_find_color (style->colormap, &col); + + gdk_gc_set_foreground (gc, &col); + gdk_draw_line (drawable, gc, x, y + i, x + width - 1, y + i); + + col.red += dr; + col.green += dg; + col.blue += db; + } + + gdk_gc_set_foreground (gc, &old_values.foreground); + } + #endif +} + +void blend (GdkColormap *colormap, + GdkColor *a, GdkColor *b, GdkColor *c, int alpha) +{ + int inAlpha = 100-alpha; + c->red = (a->red * alpha + b->red * inAlpha) / 100; + c->green = (a->green * alpha + b->green * inAlpha) / 100; + c->blue = (a->blue * alpha + b->blue * inAlpha) / 100; + + gdk_rgb_find_color (colormap, c); +} + +GtkWidget *get_parent_window (GtkWidget *widget) +{ + GtkWidget *parent = widget->parent; + + while (parent && GTK_WIDGET_NO_WINDOW (parent)) + parent = parent->parent; + + return parent; +} + +GdkColor *get_parent_bgcolor (GtkWidget *widget) +{ + GtkWidget *parent = get_parent_window (widget); + + if (parent && parent->style) + return &parent->style->bg[GTK_STATE_NORMAL]; + + return NULL; +} + +GtkWidget * +find_combo_box_widget (GtkWidget * widget) +{ + GtkWidget *result = NULL; + + if (widget && !GTK_IS_COMBO_BOX_ENTRY (widget)) + { + if (GTK_IS_COMBO_BOX (widget)) + result = widget; + else + result = find_combo_box_widget(widget->parent); + } + + return result; +} + +gboolean +is_combo_box (GtkWidget * widget) +{ + return (find_combo_box_widget(widget) != NULL); +} diff --git a/libs/clearlooks/support.h b/libs/clearlooks/support.h new file mode 100644 index 0000000000..a1430b40d0 --- /dev/null +++ b/libs/clearlooks/support.h @@ -0,0 +1,110 @@ +#include <gtk/gtk.h> +#include <math.h> +#include <string.h> + +/* GTK 2.2 compatibility */ +#ifndef GTK_IS_COMBO_BOX_ENTRY + #define GTK_IS_COMBO_BOX_ENTRY(x) 0 +#endif +#ifndef GTK_IS_COMBO_BOX + #define GTK_IS_COMBO_BOX(x) 0 +#endif + +#define RADIO_SIZE 13 +#define CHECK_SIZE 13 + +GtkTextDirection +get_direction (GtkWidget *widget); + +GdkPixbuf * +generate_bit (unsigned char alpha[], + GdkColor *color, + double mult); + +GdkPixbuf * +colorize_bit (unsigned char *bit, + unsigned char *alpha, + GdkColor *new_color); + +GdkPixmap * +pixbuf_to_pixmap (GtkStyle *style, + GdkPixbuf *pixbuf, + GdkScreen *screen); + +gboolean +sanitize_size (GdkWindow *window, + gint *width, + gint *height); + +void +rgb_to_hls (gdouble *r, + gdouble *g, + gdouble *b); + +void +hls_to_rgb (gdouble *h, + gdouble *l, + gdouble *s); + +void +shade (GdkColor * a, GdkColor * b, float k); + +void +draw_hgradient (GdkDrawable *drawable, GdkGC *gc, GtkStyle *style, + int x, int y, int width, int height, + GdkColor *top_color, GdkColor *bottom_color); + +void +draw_vgradient (GdkDrawable *drawable, GdkGC *gc, GtkStyle *style, + int x, int y, int width, int height, + GdkColor *left_color, GdkColor *right_color); + +void +arrow_draw_hline (GdkWindow *window, + GdkGC *gc, + int x1, + int x2, + int y, + gboolean last); + +void +arrow_draw_vline (GdkWindow *window, + GdkGC *gc, + int y1, + int y2, + int x, + gboolean last); + +void +draw_arrow (GdkWindow *window, + GdkGC *gc, + GdkRectangle *area, + GtkArrowType arrow_type, + gint x, + gint y, + gint width, + gint height); + +void +calculate_arrow_geometry (GtkArrowType arrow_type, + gint *x, + gint *y, + gint *width, + gint *height); + +GtkWidget *special_get_ancestor(GtkWidget * widget, + GType widget_type); + +void blend (GdkColormap *colormap, + GdkColor *a, GdkColor *b, GdkColor *c, int alpha); + +GtkWidget *get_parent_window (GtkWidget *widget); + +GdkColor *get_parent_bgcolor (GtkWidget *widget); + +gboolean is_combo_box (GtkWidget * widget); + +GtkWidget *find_combo_box_widget (GtkWidget * widget); + +void gtk_clist_get_header_index (GtkCList *clist, GtkWidget *button, + gint *column_index, gint *columns); diff --git a/libs/fst/SConscript b/libs/fst/SConscript index 2cbfb94a9f..771de86dc8 100644 --- a/libs/fst/SConscript +++ b/libs/fst/SConscript @@ -2,6 +2,7 @@ import os import os.path +import sys import glob fst_src = glob.glob('*.c') @@ -22,7 +23,12 @@ c = fst.Object ('vstwin', 'vstwin.c') d = fst.Object ('vsti', 'vsti.c') if fst['VST']: - Default([hackSDK,a,b,c,d]) + if os.access ('vst/aeffectx.h', os.F_OK): + Default([hackSDK,a,b,c,d]) + else: + print 'You have not installed the VST SDK in the correct location.' + print 'Please see http://ardour.org/building_vst_support for more information' + sys.exit (1) env.Alias('tarball', env.Distribute (env['DISTTREE'], fst_src + ['SConscript', diff --git a/libs/gtkmm2ext/SConscript b/libs/gtkmm2ext/SConscript index cf513eb5a1..e654b6cb52 100644 --- a/libs/gtkmm2ext/SConscript +++ b/libs/gtkmm2ext/SConscript @@ -55,7 +55,7 @@ utils.cc version.cc """) -gtkmm2ext.VersionBuild(['version.cc','gtkmm2ext/version.h'], 'SConscript') +gtkmm2ext.VersionBuild(['version.cc','gtkmm2ext/version.h'], []) gtkmm2ext.Append(CCFLAGS="-D_REENTRANT") gtkmm2ext.Append(CCFLAGS="-DLOCALEDIR=\\\""+final_prefix+"/share/locale\\\"") diff --git a/libs/gtkmm2ext/barcontroller.cc b/libs/gtkmm2ext/barcontroller.cc index eefe6ca843..734c4b77e2 100644 --- a/libs/gtkmm2ext/barcontroller.cc +++ b/libs/gtkmm2ext/barcontroller.cc @@ -423,6 +423,7 @@ BarController::switch_to_spinner () remove (); add (spinner); spinner.show (); + spinner.select_region (0, spinner.get_text_length()); spinner.grab_focus (); switching = false; diff --git a/libs/gtkmm2ext/click_box.cc b/libs/gtkmm2ext/click_box.cc index efce988c29..3ab7ea883c 100644 --- a/libs/gtkmm2ext/click_box.cc +++ b/libs/gtkmm2ext/click_box.cc @@ -38,17 +38,18 @@ ClickBox::ClickBox (Gtk::Adjustment *adjp, const string &name, bool round_to_ste twidth = 0; theight = 0; - set_name (name); + add_events (Gdk::BUTTON_RELEASE_MASK| Gdk::BUTTON_PRESS_MASK| Gdk::ENTER_NOTIFY_MASK| Gdk::LEAVE_NOTIFY_MASK); - set_label (); get_adjustment().signal_value_changed().connect (mem_fun (*this, &ClickBox::set_label)); - + signal_style_changed().connect (mem_fun (*this, &ClickBox::style_changed)); signal_button_press_event().connect (mem_fun (*this, &ClickBox::button_press_handler)); signal_button_release_event().connect (mem_fun (*this, &ClickBox::button_release_handler)); + set_name (name); + set_label (); } ClickBox::~ClickBox () @@ -102,6 +103,14 @@ ClickBox::set_label () queue_draw (); } +void +ClickBox::style_changed (const Glib::RefPtr<Gtk::Style>& ignored) +{ + + layout->context_changed (); + layout->get_pixel_size (twidth, theight); +} + bool ClickBox::on_expose_event (GdkEventExpose *ev) { @@ -136,7 +145,7 @@ ClickBox::on_expose_event (GdkEventExpose *ev) win->draw_rectangle (bg_gc, true, draw_rect.x, draw_rect.y, draw_rect.width, draw_rect.height); if (twidth && theight) { - win->draw_layout (fg_gc, width - (twidth + 2), (height - theight) + 2, layout); + win->draw_layout (fg_gc, (width - twidth) / 2, (height - theight) / 2, layout); } } diff --git a/libs/gtkmm2ext/gtkmm2ext/click_box.h b/libs/gtkmm2ext/gtkmm2ext/click_box.h index c6f2922f3f..e4aee36ebe 100644 --- a/libs/gtkmm2ext/gtkmm2ext/click_box.h +++ b/libs/gtkmm2ext/gtkmm2ext/click_box.h @@ -54,6 +54,7 @@ class ClickBox : public Gtk::DrawingArea, public AutoSpin int theight; void set_label (); + void style_changed (const Glib::RefPtr<Gtk::Style> &); bool button_press_handler (GdkEventButton *); bool button_release_handler (GdkEventButton *); diff --git a/libs/gtkmm2ext/gtkmm2ext/gtk_ui.h b/libs/gtkmm2ext/gtkmm2ext/gtk_ui.h index 14af137680..a692e64c9c 100644 --- a/libs/gtkmm2ext/gtkmm2ext/gtk_ui.h +++ b/libs/gtkmm2ext/gtkmm2ext/gtk_ui.h @@ -101,6 +101,8 @@ class UI : public Receiver, public AbstractUI<UIRequest> bool caller_is_ui_thread (); + static pthread_t thread_id() { return gui_thread; } + /* Gtk-UI specific interfaces */ bool running (); diff --git a/libs/gtkmm2ext/tearoff.cc b/libs/gtkmm2ext/tearoff.cc index 529cca15e3..e4a9207195 100644 --- a/libs/gtkmm2ext/tearoff.cc +++ b/libs/gtkmm2ext/tearoff.cc @@ -109,7 +109,7 @@ TearOff::tearoff_click (GdkEventButton* ev) own_window.show_all (); hide (); Detach (); - return TRUE; + return true; } gint @@ -121,19 +121,25 @@ TearOff::close_click (GdkEventButton* ev) own_window.hide (); show_all (); Attach (); - return TRUE; + return true; } gint TearOff::window_button_press (GdkEventButton* ev) { + if (dragging) { + dragging = false; + own_window.remove_modal_grab(); + return true; + } + dragging = true; drag_x = ev->x_root; drag_y = ev->y_root; own_window.add_modal_grab(); - return TRUE; + return true; } gint @@ -141,7 +147,7 @@ TearOff::window_button_release (GdkEventButton* ev) { dragging = false; own_window.remove_modal_grab(); - return TRUE; + return true; } gint @@ -163,7 +169,7 @@ TearOff::window_motion (GdkEventMotion* ev) own_window.get_pointer (mx, my); if (!dragging) { - return TRUE; + return true; } x_delta = ev->x_root - drag_x; @@ -175,7 +181,7 @@ TearOff::window_motion (GdkEventMotion* ev) drag_x = ev->x_root; drag_y = ev->y_root; - return TRUE; + return true; } bool diff --git a/libs/libsndfile/SConscript b/libs/libsndfile/SConscript index b1c29e5487..f8e9fc5ecb 100644 --- a/libs/libsndfile/SConscript +++ b/libs/libsndfile/SConscript @@ -25,7 +25,7 @@ if conf.CheckCHeader('/System/Library/Frameworks/CoreServices.framework/Headers/ sndfile = conf.Finish() -libsndfile = sndfile.SharedLibrary('sndfile', sndfile_files) +libsndfile = sndfile.SharedLibrary('sndfile-ardour', sndfile_files) sndfile_h = sndfile.Command('src/sndfile.h', ['src/sndfile.h.in'], 'cd libs/libsndfile && ./configure && cd -', ENV=os.environ) diff --git a/libs/midi++2/SConscript b/libs/midi++2/SConscript index 65d0882dce..477d49c6ca 100644 --- a/libs/midi++2/SConscript +++ b/libs/midi++2/SConscript @@ -51,7 +51,7 @@ elif env['SYSMIDI'] == 'CoreMIDI': midi2.Append(CCFLAGS="-D_REENTRANT -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE") midi2.Append(CCFLAGS="-DLIBSIGC_DISABLE_DEPRECATED") -midi2.VersionBuild(['version.cc','midi++/version.h'], 'SConscript') +midi2.VersionBuild(['version.cc','midi++/version.h'], []) libmidi2 = midi2.SharedLibrary('midi++', [ sources, sysdep_src ]) diff --git a/libs/midi++2/midi++/factory.h b/libs/midi++2/midi++/factory.h index e29d7543f8..1d5c7e0b30 100644 --- a/libs/midi++2/midi++/factory.h +++ b/libs/midi++2/midi++/factory.h @@ -30,9 +30,8 @@ namespace MIDI { class PortFactory { public: Port *create_port (PortRequest &req, void* data); - - static void add_port_request (std::vector<PortRequest *> &reqs, - const std::string &reqstr); + + static bool ignore_duplicate_devices (Port::Type); }; } // namespace MIDI diff --git a/libs/midi++2/midifactory.cc b/libs/midi++2/midifactory.cc index d8119e362e..de4a246bcf 100644 --- a/libs/midi++2/midifactory.cc +++ b/libs/midi++2/midifactory.cc @@ -89,20 +89,28 @@ PortFactory::create_port (PortRequest &req, void* data) return port; } -void -PortFactory::add_port_request (vector<PortRequest *> &reqs, - const string &str) - +bool +PortFactory::ignore_duplicate_devices (Port::Type type) { - PortRequest *req; + bool ret = false; - req = new PortRequest; - req->devname = strdup (str.c_str()); - req->tagname = strdup (str.c_str()); + switch (type) { +#ifdef WITH_ALSA + case Port::ALSA_Sequencer: + ret = true; + break; +#endif // WITH_ALSA - req->mode = O_RDWR; - req->type = Port::ALSA_RawMidi; +#if WITH_COREMIDI + case Port::CoreMidi_MidiPort: + ret = true; + break; +#endif // WITH_COREMIDI + + default: + break; + } - reqs.push_back (req); + return ret; } diff --git a/libs/midi++2/midimanager.cc b/libs/midi++2/midimanager.cc index bfe8f147b6..970674232d 100644 --- a/libs/midi++2/midimanager.cc +++ b/libs/midi++2/midimanager.cc @@ -66,41 +66,43 @@ Manager::add_port (PortRequest &req) PortMap::iterator existing; pair<string, Port *> newpair; - if ((existing = ports_by_device.find (req.devname)) != - ports_by_device.end()) { - - port = (*existing).second; - if (port->mode() == req.mode) { + if (!PortFactory::ignore_duplicate_devices (req.type)) { + + if ((existing = ports_by_device.find (req.devname)) != ports_by_device.end()) { + + port = (*existing).second; + + if (port->mode() == req.mode) { + + /* Same mode - reuse the port, and just + create a new tag entry. + */ + + newpair.first = req.tagname; + newpair.second = port; + + ports_by_tag.insert (newpair); + return port; + } - /* Same mode - reuse the port, and just - create a new tag entry. + /* If the existing is duplex, and this request + is not, then fail, because most drivers won't + allow opening twice with duplex and non-duplex + operation. */ - - newpair.first = req.tagname; - newpair.second = port; - - ports_by_tag.insert (newpair); - return port; - } - - /* If the existing is duplex, and this request - is not, then fail, because most drivers won't - allow opening twice with duplex and non-duplex - operation. - */ - - if ((req.mode == O_RDWR && port->mode() != O_RDWR) || - (req.mode != O_RDWR && port->mode() == O_RDWR)) { - error << "MIDIManager: port tagged \"" - << req.tagname - << "\" cannot be opened duplex and non-duplex" - << endmsg; - return 0; + + if ((req.mode == O_RDWR && port->mode() != O_RDWR) || + (req.mode != O_RDWR && port->mode() == O_RDWR)) { + error << "MIDIManager: port tagged \"" + << req.tagname + << "\" cannot be opened duplex and non-duplex" + << endmsg; + return 0; + } + + /* modes must be different or complementary */ } - - /* modes must be different or complementary */ } - port = factory.create_port (req, api_data); if (port == 0) { diff --git a/libs/pbd/SConscript b/libs/pbd/SConscript index 4b15dd70d1..f474834fd8 100644 --- a/libs/pbd/SConscript +++ b/libs/pbd/SConscript @@ -55,7 +55,7 @@ pbd.Merge ([ libraries['sigc2'], libraries['glibmm2'], libraries['glib2'] ]) -pbd.VersionBuild(['version.cc','pbd/version.h'], 'SConscript') +pbd.VersionBuild(['version.cc','pbd/version.h'], []) libpbd = pbd.SharedLibrary('pbd', pbd_files) Default(libpbd) diff --git a/libs/pbd/controllable.cc b/libs/pbd/controllable.cc index 80c6811e6a..2264a955ae 100644 --- a/libs/pbd/controllable.cc +++ b/libs/pbd/controllable.cc @@ -6,7 +6,7 @@ using namespace PBD; -sigc::signal<void,Controllable*> Controllable::GoingAway; +sigc::signal<void,Controllable*> Controllable::Destroyed; sigc::signal<bool,Controllable*> Controllable::StartLearning; sigc::signal<void,Controllable*> Controllable::StopLearning; diff --git a/libs/pbd/convert.cc b/libs/pbd/convert.cc index 60d39c91e2..832c54acd8 100644 --- a/libs/pbd/convert.cc +++ b/libs/pbd/convert.cc @@ -19,6 +19,10 @@ #include <cmath> #include <stdint.h> +#ifndef __STDC_FORMAT_MACROS +#define __STDC_FORMAT_MACROS +#endif +#include <inttypes.h> #include "pbd/convert.h" @@ -106,12 +110,12 @@ atof (const string& s) } vector<string> -internationalize (const char **array) +internationalize (const char *package_name, const char **array) { vector<string> v; for (uint32_t i = 0; array[i]; ++i) { - v.push_back (_(array[i])); + v.push_back (dgettext(package_name, array[i])); } return v; @@ -190,23 +194,44 @@ url_decode (string& url) } } +#if 0 string length2string (const int32_t frames, const float sample_rate) { - int secs = (int) (frames / sample_rate); - int hrs = secs / 3600; + int32_t secs = (int32_t) (frames / sample_rate); + int32_t hrs = secs / 3600; secs -= (hrs * 3600); - int mins = secs / 60; + int32_t mins = secs / 60; secs -= (mins * 60); - int total_secs = (hrs * 3600) + (mins * 60) + secs; - int frames_remaining = (int) floor (frames - (total_secs * sample_rate)); + int32_t total_secs = (hrs * 3600) + (mins * 60) + secs; + int32_t frames_remaining = (int) floor (frames - (total_secs * sample_rate)); float fractional_secs = (float) frames_remaining / sample_rate; char duration_str[32]; - sprintf (duration_str, "%02d:%02d:%05.2f", hrs, mins, (float) secs + fractional_secs); + sprintf (duration_str, "%02" PRIi32 ":%02" PRIi32 ":%05.2f", hrs, mins, (float) secs + fractional_secs); return duration_str; } +#endif + +string +length2string (const int64_t frames, const double sample_rate) +{ + int64_t secs = (int64_t) floor (frames / sample_rate); + int64_t hrs = secs / 3600LL; + secs -= (hrs * 3600LL); + int64_t mins = secs / 60LL; + secs -= (mins * 60LL); + + int64_t total_secs = (hrs * 3600LL) + (mins * 60LL) + secs; + int64_t frames_remaining = (int64_t) floor (frames - (total_secs * sample_rate)); + float fractional_secs = (float) frames_remaining / sample_rate; + + char duration_str[64]; + sprintf (duration_str, "%02" PRIi64 ":%02" PRIi64 ":%05.2f", hrs, mins, (float) secs + fractional_secs); + + return duration_str; +} } // namespace PBD diff --git a/libs/pbd/pbd/command.h b/libs/pbd/pbd/command.h index 7c367e7462..8044b51a83 100644 --- a/libs/pbd/pbd/command.h +++ b/libs/pbd/pbd/command.h @@ -21,10 +21,9 @@ #ifndef __lib_pbd_command_h__ #define __lib_pbd_command_h__ -#include <pbd/stateful.h> -#include <pbd/destructible.h> +#include <pbd/statefuldestructible.h> -class Command : public Stateful, public PBD::Destructible +class Command : public PBD::StatefulDestructible { public: virtual ~Command() {} diff --git a/libs/pbd/pbd/controllable.h b/libs/pbd/pbd/controllable.h index ff8f8a9b52..c88eb298bc 100644 --- a/libs/pbd/pbd/controllable.h +++ b/libs/pbd/pbd/controllable.h @@ -6,17 +6,16 @@ #include <sigc++/trackable.h> #include <sigc++/signal.h> -#include <pbd/stateful.h> -#include <pbd/id.h> +#include <pbd/statefuldestructible.h> class XMLNode; namespace PBD { -class Controllable : public virtual sigc::trackable, public Stateful { +class Controllable : public PBD::StatefulDestructible { public: Controllable (std::string name); - virtual ~Controllable() { GoingAway (this); } + virtual ~Controllable() { Destroyed (this); } virtual void set_value (float) = 0; virtual float get_value (void) const = 0; @@ -25,11 +24,11 @@ class Controllable : public virtual sigc::trackable, public Stateful { sigc::signal<void> LearningFinished; - static sigc::signal<void,Controllable*> GoingAway; - static sigc::signal<bool,PBD::Controllable*> StartLearning; static sigc::signal<void,PBD::Controllable*> StopLearning; + static sigc::signal<void,Controllable*> Destroyed; + sigc::signal<void> Changed; int set_state (const XMLNode&); diff --git a/libs/pbd/pbd/convert.h b/libs/pbd/pbd/convert.h index 12e63ba6fc..55006529ae 100644 --- a/libs/pbd/pbd/convert.h +++ b/libs/pbd/pbd/convert.h @@ -31,9 +31,10 @@ int atoi (const std::string&); double atof (const std::string&); void url_decode (std::string&); -std::string length2string (const int32_t frames, const float sample_rate); +// std::string length2string (const int32_t frames, const float sample_rate); +std::string length2string (const int64_t frames, const double sample_rate); -std::vector<std::string> internationalize (const char **); +std::vector<std::string> internationalize (const char *, const char **); } //namespace PBD diff --git a/libs/pbd/pbd/crossthread.h b/libs/pbd/pbd/crossthread.h new file mode 100644 index 0000000000..413dea024e --- /dev/null +++ b/libs/pbd/pbd/crossthread.h @@ -0,0 +1,38 @@ +#ifndef __pbd__crossthread_h__ +#define __pbd__crossthread_h__ + +#include <pbd/abstract_ui.h> +#include <sigc++/sigc++.h> +#include <pthread.h> + +template<class RequestType> +void +call_slot_from_thread_or_dispatch_it (pthread_t thread_id, AbstractUI<RequestType>& ui, sigc::slot<void> theSlot) +{ + /* when called, this function will determine whether the calling thread + is the same as thread specified by the first argument. if it is, + the we execute the slot. if not, we ask the interface given by the second + argument to call the slot. + */ + + if (pthread_self() == thread_id) { + theSlot (); + } else { + ui.call_slot (theSlot); + } +} + +template<class RequestType> +sigc::slot<void> +crossthread_safe (pthread_t thread_id, AbstractUI<RequestType>& ui, sigc::slot<void> theSlot) +{ + /* this function returns a slot that will ensure that theSlot is either + called by the specified thread or passed to the interface via + AbstractUI::call_slot(). + */ + + return sigc::bind (sigc::ptr_fun (call_slot_from_thread_or_dispatch_it<RequestType>), + thread_id, ui, theSlot); +} + +#endif /* __pbd__crossthread_h__ */ diff --git a/libs/pbd/pbd/destructible.h b/libs/pbd/pbd/destructible.h index 6692ff564c..7c50806334 100644 --- a/libs/pbd/pbd/destructible.h +++ b/libs/pbd/pbd/destructible.h @@ -5,14 +5,22 @@ namespace PBD { -class Destructible : public virtual sigc::trackable { - public: - Destructible() {} - virtual ~Destructible () {} +/* be very very careful using this class. it does not inherit from sigc::trackable and thus + should only be used in multiple-inheritance situations involving another type + that does inherit from sigc::trackable (or sigc::trackable itself) +*/ +class ThingWithGoingAway { + public: + virtual ~ThingWithGoingAway () {} sigc::signal<void> GoingAway; +}; +class Destructible : public sigc::trackable, public ThingWithGoingAway { + public: + virtual ~Destructible () {} void drop_references () const { GoingAway(); } + }; } diff --git a/libs/pbd/pbd/memento_command.h b/libs/pbd/pbd/memento_command.h index d42972d546..fe1aa8e7d0 100644 --- a/libs/pbd/pbd/memento_command.h +++ b/libs/pbd/pbd/memento_command.h @@ -28,19 +28,11 @@ using std::endl; #include <pbd/command.h> #include <pbd/stacktrace.h> #include <pbd/xml++.h> +#include <pbd/shiva.h> + #include <sigc++/slot.h> #include <typeinfo> -/* grrr, strict C++ says that static member functions are not C functions, but we also want - to be able to pack this into a sigc::ptr_fun and not sigc::mem_fun, so we have to make - it a genuine function rather than a member. -*/ - -static void object_death (Command* mc) { - cerr << "\n\n\n---> OBJECT DEATH FIRED FOR " << mc << endl; - delete mc; -} - /** This command class is initialized with before and after mementos * (from Stateful::get_state()), so undo becomes restoring the before * memento, and redo is restoring the after memento. @@ -55,8 +47,8 @@ class MementoCommand : public Command XMLNode *after ) : obj(object), before(before), after(after) { - cerr << "MC @ " << this << " is a " << typeid (obj_T).name() << endl; - obj.GoingAway.connect (sigc::bind (sigc::ptr_fun (object_death), static_cast<Command*>(this))); + /* catch destruction of the object */ + new PBD::Shiva<obj_T,MementoCommand<obj_T> > (object, *this); } ~MementoCommand () { diff --git a/libs/pbd/pbd/rcu.h b/libs/pbd/pbd/rcu.h index e81db8ba87..a8f3cdd5bc 100644 --- a/libs/pbd/pbd/rcu.h +++ b/libs/pbd/pbd/rcu.h @@ -17,7 +17,7 @@ class RCUManager virtual ~RCUManager() { delete m_rcu_value; } - boost::shared_ptr<T> reader () const { return *((boost::shared_ptr<T> *) g_atomic_pointer_get (&m_rcu_value)); } + boost::shared_ptr<T> reader () const { return *((boost::shared_ptr<T> *) g_atomic_pointer_get (the_pointer())); } virtual boost::shared_ptr<T> write_copy () = 0; virtual bool update (boost::shared_ptr<T> new_value) = 0; diff --git a/libs/pbd/pbd/shiva.h b/libs/pbd/pbd/shiva.h index 5110f48332..53b613ea2b 100644 --- a/libs/pbd/pbd/shiva.h +++ b/libs/pbd/pbd/shiva.h @@ -5,28 +5,96 @@ namespace PBD { -template<typename ObjectWithGoingAway, typename ObjectToBeDestroyed> - /* named after the Hindu god Shiva, The Destroyer */ +template<typename ObjectWithGoingAway, typename ObjectToBeDestroyed> class Shiva { public: Shiva (ObjectWithGoingAway& emitter, ObjectToBeDestroyed& receiver) { /* if the emitter goes away, destroy the receiver */ - _connection1 = emitter.GoingAway.connect + _connection = emitter.GoingAway.connect (sigc::bind (sigc::mem_fun (*this, &Shiva<ObjectWithGoingAway,ObjectToBeDestroyed>::destroy), &receiver)); + } + + ~Shiva() { + forget (); + } + + private: + sigc::connection _connection; + + void destroy (ObjectToBeDestroyed* obj) { + delete obj; + forget (); + } + + void forget () { + _connection.disconnect (); + } + +}; + +template<typename ObjectWithGoingAway, typename ObjectToBeDestroyed> +class ProxyShiva { + public: + ProxyShiva (ObjectWithGoingAway& emitter, ObjectToBeDestroyed& receiver, void (*callback)(ObjectToBeDestroyed*, ObjectWithGoingAway*)) { + + /* if the emitter goes away, destroy the receiver */ + + _callback = callback; + _callback_argument1 = &receiver; + _callback_argument2 = &emitter; + + _connection = emitter.GoingAway.connect + (sigc::bind (sigc::mem_fun + (*this, &ProxyShiva<ObjectWithGoingAway,ObjectToBeDestroyed>::destroy), + &receiver)); + } + + ~ProxyShiva() { + forget (); + } + + private: + sigc::connection _connection; + void (*_callback) (ObjectToBeDestroyed*, ObjectWithGoingAway*); + ObjectToBeDestroyed* _callback_argument1; + ObjectWithGoingAway* _callback_argument2; + + void destroy (ObjectToBeDestroyed* obj) { + /* callback must destroy obj if appropriate, not done here */ + _callback (obj, _callback_argument2); + forget (); + } + + void forget () { + _connection.disconnect (); + } +}; + +template<typename ObjectWithGoingAway, typename ObjectToBeDestroyed> +class PairedShiva { + public: + PairedShiva (ObjectWithGoingAway& emitter, ObjectToBeDestroyed& receiver) { + + /* if the emitter goes away, destroy the receiver */ + + _connection1 = emitter.GoingAway.connect + (sigc::bind (sigc::mem_fun + (*this, &PairedShiva<ObjectWithGoingAway,ObjectToBeDestroyed>::destroy), + &receiver)); /* if the receiver goes away, forget all this nonsense */ _connection2 = receiver.GoingAway.connect - (sigc::mem_fun (*this, &Shiva<ObjectWithGoingAway,ObjectToBeDestroyed>::forget)); + (sigc::mem_fun (*this, &PairedShiva<ObjectWithGoingAway,ObjectToBeDestroyed>::forget)); } - ~Shiva() { + ~PairedShiva() { forget (); } diff --git a/libs/pbd/pbd/statefuldestructible.h b/libs/pbd/pbd/statefuldestructible.h index e78cc4bdaa..708c10fc8e 100644 --- a/libs/pbd/pbd/statefuldestructible.h +++ b/libs/pbd/pbd/statefuldestructible.h @@ -5,9 +5,21 @@ #include <pbd/destructible.h> namespace PBD { + class StatefulDestructible : public Stateful, public Destructible { }; + +/* be very very careful using this class. it does not inherit from sigc::trackable and thus + should only be used in multiple-inheritance situations involving another type + that does inherit from sigc::trackable (or sigc::trackable itself) +*/ + +class StatefulThingWithGoingAway : public Stateful, public ThingWithGoingAway +{ +}; + } + #endif /* __pbd_stateful_destructible_h__ */ diff --git a/libs/pbd/pbd/undo.h b/libs/pbd/pbd/undo.h index 943c115af2..eb46750e4f 100644 --- a/libs/pbd/pbd/undo.h +++ b/libs/pbd/pbd/undo.h @@ -70,9 +70,11 @@ class UndoTransaction : public Command struct timeval _timestamp; std::string _name; bool _clearing; + + friend void command_death (UndoTransaction*, Command *); }; -class UndoHistory +class UndoHistory : public sigc::trackable { public: UndoHistory(); @@ -95,6 +97,8 @@ class UndoHistory XMLNode &get_state(); void save_state(); + sigc::signal<void> Changed; + private: bool _clearing; std::list<UndoTransaction*> UndoList; diff --git a/libs/pbd/pbd/xml++.h b/libs/pbd/pbd/xml++.h index 5dcb4f084a..70e231e717 100644 --- a/libs/pbd/pbd/xml++.h +++ b/libs/pbd/pbd/xml++.h @@ -87,9 +87,10 @@ public: const string & set_content (const string &); XMLNode *add_content(const string & = string()); - const XMLNodeList & children (const string & = string()) const; + const XMLNodeList & children (const string& str = string()) const; XMLNode *add_child (const char *); XMLNode *add_child_copy (const XMLNode&); + XMLNode *child (const char*) const; void add_child_nocopy (XMLNode&); const XMLPropertyList & properties() const { return _proplist; }; diff --git a/libs/pbd/undo.cc b/libs/pbd/undo.cc index af408a24a4..277b83bfce 100644 --- a/libs/pbd/undo.cc +++ b/libs/pbd/undo.cc @@ -24,31 +24,13 @@ #include <pbd/undo.h> #include <pbd/xml++.h> +#include <pbd/shiva.h> #include <sigc++/bind.h> using namespace std; using namespace sigc; -/* grrr, strict C++ says that static member functions are not C functions, but we also want - to be able to pack this into a sigc::ptr_fun and not sigc::mem_fun, so we have to make - it a genuine function rather than a member. -*/ - -static void command_death (UndoTransaction* ut, Command* c) -{ - if (ut->clearing()) { - return; - } - - ut->remove_command (c); - - if (ut->empty()) { - delete ut; - } -} - - UndoTransaction::UndoTransaction () { _clearing = false; @@ -68,6 +50,20 @@ UndoTransaction::~UndoTransaction () clear (); } +void +command_death (UndoTransaction* ut, Command* c) +{ + if (ut->clearing()) { + return; + } + + ut->remove_command (c); + + if (ut->empty()) { + delete ut; + } +} + UndoTransaction& UndoTransaction::operator= (const UndoTransaction& rhs) { @@ -81,7 +77,8 @@ UndoTransaction::operator= (const UndoTransaction& rhs) void UndoTransaction::add_command (Command *const action) { - action->GoingAway.connect (bind (sigc::ptr_fun (command_death), this, const_cast<Command*>(action))); + /* catch death */ + new PBD::ProxyShiva<Command,UndoTransaction> (*action, *this, &command_death); actions.push_back (action); } @@ -160,6 +157,8 @@ UndoHistory::add (UndoTransaction* const ut) UndoList.push_back (ut); /* we are now owners of the transaction */ + + Changed (); /* EMIT SIGNAL */ } void @@ -171,6 +170,8 @@ UndoHistory::remove (UndoTransaction* const ut) UndoList.remove (ut); RedoList.remove (ut); + + Changed (); /* EMIT SIGNAL */ } void @@ -185,6 +186,8 @@ UndoHistory::undo (unsigned int n) ut->undo (); RedoList.push_back (ut); } + + Changed (); /* EMIT SIGNAL */ } void @@ -199,6 +202,8 @@ UndoHistory::redo (unsigned int n) ut->redo (); UndoList.push_back (ut); } + + Changed (); /* EMIT SIGNAL */ } void @@ -207,6 +212,9 @@ UndoHistory::clear_redo () _clearing = true; RedoList.clear (); _clearing = false; + + Changed (); /* EMIT SIGNAL */ + } void @@ -215,6 +223,8 @@ UndoHistory::clear_undo () _clearing = true; UndoList.clear (); _clearing = false; + + Changed (); /* EMIT SIGNAL */ } void @@ -222,6 +232,8 @@ UndoHistory::clear () { clear_undo (); clear_redo (); + + Changed (); /* EMIT SIGNAL */ } XMLNode & UndoHistory::get_state() diff --git a/libs/pbd/whitespace.cc b/libs/pbd/whitespace.cc index e35a8a8c0e..53616133ad 100644 --- a/libs/pbd/whitespace.cc +++ b/libs/pbd/whitespace.cc @@ -11,6 +11,10 @@ strip_whitespace_edges (string& str) len = str.length(); + if (len == 1) { + return; + } + /* strip front */ for (i = 0; i < len; ++i) { @@ -19,12 +23,21 @@ strip_whitespace_edges (string& str) } } + if (i == len) { + /* its all whitespace, not much we can do */ + return; + } + /* strip back */ if (len > 1) { s = i; i = len - 1; + + if (s == i) { + return; + } do { if (isgraph (str[i]) || i == 0) { diff --git a/libs/pbd/xml++.cc b/libs/pbd/xml++.cc index 03fa116279..8d783d59f2 100644 --- a/libs/pbd/xml++.cc +++ b/libs/pbd/xml++.cc @@ -110,7 +110,7 @@ XMLTree::write(void) const doc = xmlNewDoc((xmlChar *) "1.0"); xmlSetDocCompressMode(doc, _compression); writenode(doc, _root, doc->children, 1); - result = xmlSaveFormatFile(_filename.c_str(), doc, 1); + result = xmlSaveFormatFileEnc(_filename.c_str(), doc, "UTF-8", 1); xmlFreeDoc(doc); if (result == -1) { @@ -216,13 +216,35 @@ XMLNode::set_content(const string & c) return _content; } +XMLNode* +XMLNode::child (const char *name) const +{ + /* returns first child matching name */ + + XMLNodeConstIterator cur; + + if (name == 0) { + return 0; + } + + for (cur = _children.begin(); cur != _children.end(); ++cur) { + if ((*cur)->name() == name) { + return *cur; + } + } + + return 0; +} + const XMLNodeList & -XMLNode::children(const string & n) const +XMLNode::children(const string& n) const { + /* returns all children matching name */ + static XMLNodeList retval; XMLNodeConstIterator cur; - if (n.length() == 0) { + if (n.empty()) { return _children; } diff --git a/libs/surfaces/control_protocol/SConscript b/libs/surfaces/control_protocol/SConscript index ce59b1c67c..88aeeda376 100644 --- a/libs/surfaces/control_protocol/SConscript +++ b/libs/surfaces/control_protocol/SConscript @@ -33,6 +33,7 @@ cp.Append(CXXFLAGS="-DLOCALEDIR=\\\""+final_prefix+"/share/locale\\\"") cp.Merge ([ libraries['ardour'], + libraries['sndfile-ardour'], libraries['sigc2'], libraries['pbd'], libraries['midi++2'], diff --git a/libs/surfaces/control_protocol/basic_ui.cc b/libs/surfaces/control_protocol/basic_ui.cc index 07e000ab20..e6642d3394 100644 --- a/libs/surfaces/control_protocol/basic_ui.cc +++ b/libs/surfaces/control_protocol/basic_ui.cc @@ -55,7 +55,7 @@ BasicUI::register_thread (std::string name) void BasicUI::loop_toggle () { - if (Config->get_auto_loop()) { + if (session->get_play_loop()) { session->request_play_loop (false); } else { session->request_play_loop (true); @@ -107,7 +107,7 @@ BasicUI::transport_play (bool from_last_start) { bool rolling = session->transport_rolling (); - if (Config->get_auto_loop()) { + if (session->get_play_loop()) { session->request_play_loop (false); } diff --git a/libs/surfaces/tranzport/tranzport_control_protocol.cc b/libs/surfaces/tranzport/tranzport_control_protocol.cc index 2e2d943244..ea85a32a77 100644 --- a/libs/surfaces/tranzport/tranzport_control_protocol.cc +++ b/libs/surfaces/tranzport/tranzport_control_protocol.cc @@ -718,7 +718,7 @@ TranzportControlProtocol::update_state () /* global */ - if (Config->get_auto_loop()) { + if (session->get_play_loop()) { pending_lights[LightLoop] = true; } else { pending_lights[LightLoop] = false; @@ -760,6 +760,14 @@ TranzportControlProtocol::update_state () } } + if (pending_lights[LightTrackrec] != lights[LightTrackrec]) { + if (pending_lights[LightTrackrec]) { + light_on (LightTrackrec); + } else { + light_off (LightTrackrec); + } + } + if (pending_lights[LightTrackmute] != lights[LightTrackmute]) { if (pending_lights[LightTrackmute]) { light_on (LightTrackmute); diff --git a/svn_revision.h b/svn_revision.h new file mode 100644 index 0000000000..77f72965cd --- /dev/null +++ b/svn_revision.h @@ -0,0 +1,4 @@ +#ifndef __ardour_svn_revision_h__ +#define __ardour_svn_revision_h__ +static const char* ardour_svn_revision = "1137"; +#endif diff --git a/tools/osx_packaging/ardour2_mac_ui.rc b/tools/osx_packaging/ardour2_mac_ui.rc index fb739a94b7..4731120349 100644 --- a/tools/osx_packaging/ardour2_mac_ui.rc +++ b/tools/osx_packaging/ardour2_mac_ui.rc @@ -85,6 +85,8 @@ style "default_base" = "medium_text" GtkButton::default_outside_border = { 0, 0, 0, 0 } GtkTreeView::vertical-padding = 0 GtkTreeView::horizontal-padding = 0 + GtkTreeView::even-row-color = { 0, 0, 0.12 } + GtkTreeView::odd-row-color = { 0, 0, 0 } fg[NORMAL] = { 0.80, 0.80, 0.80 } fg[ACTIVE] = { 0.80, 0.80, 0.80 } @@ -92,8 +94,8 @@ style "default_base" = "medium_text" fg[INSENSITIVE] = { 0.80, 0.80, 0.80 } fg[SELECTED] = { 0.80, 0.80, 0.80 } - bg[NORMAL] = { 0.40, 0.40, 0.40 } - bg[ACTIVE] = { 0.40, 0.40, 0.40 } + bg[NORMAL] = { 0.35, 0.35, 0.40 } + bg[ACTIVE] = { 0.35, 0.35, 0.40 } bg[PRELIGHT] = "#565690" bg[INSENSITIVE] = { 0.10, 0.10, 0.10 } bg[SELECTED] = { 0, 0.40, 0.60 } @@ -104,24 +106,25 @@ style "default_base" = "medium_text" text[INSENSITIVE] = { 0.80, 0.80, 0.80} text[SELECTED] = { 1.0, 1.0, 1.0 } - base[ACTIVE] = "#2f272f" - base[NORMAL] = "#1c1e21" + base[ACTIVE] = "#272a2f" + base[NORMAL] = "#1a1e20" base[PRELIGHT] = { 0.20, 0.20, 0.20 } base[INSENSITIVE] = "#4c5159" base[SELECTED] = { 0.25, 0.25, 0.25 } - - engine "clearlooks" { + + engine "clearlooks" + { menubarstyle = 2 # 0 = flat, 1 = sunken, 2 = flat gradient menuitemstyle = 1 # 0 = flat, 1 = 3d-ish (gradient), 2 = 3d-ish (button) listviewitemstyle = 1 # 0 = flat, 1 = 3d-ish (gradient) - progressbarstyle = 0 # 0 = candy bar, 1 = flat + progressbarstyle = 1 # 0 = candy bar, 1 = fancy candy bar, 2 = flat } } style "base_frame" { fg[NORMAL] = { 0.80, 0.80, 0.80 } - bg[NORMAL] = { 0.40, 0.40, 0.40 } + bg[NORMAL] = { 0.35, 0.35, 0.40 } } style "transport_base" = "medium_bold_text" @@ -145,11 +148,11 @@ style "default_buttons_menus" font_name = "sans 11" fg[ACTIVE] = { 1.0, 1.0, 1.0 } - bg[NORMAL] = { 0.35, 0.35, 0.35 } + bg[NORMAL] = { 0.30, 0.30, 0.35 } bg[ACTIVE] = "#565690" - bg[PRELIGHT] = { 0.20, 0.20, 0.20 } - bg[INSENSITIVE] = { 0.20, 0.20, 0.20 } - bg[SELECTED] = { 0.20, 0.20, 0.20 } + bg[PRELIGHT] = { 0.15, 0.15, 0.20 } + bg[INSENSITIVE] = { 0.15, 0.15, 0.20 } + bg[SELECTED] = { 0.15, 0.15, 0.20 } } style "very_small_button" = "default_buttons_menus" @@ -218,6 +221,15 @@ style "mute_button" = "small_button" bg[ACTIVE] = { 1.0, 0.98, 0.53 } fg[PRELIGHT] = { 0, 0, 0 } + fg[ACTIVE] = { 0, 0, 0 } +} + + +style "multiline_combo" = "small_button" +{ + font_name = "sans 8" + xthickness = 0 + ythickness = 0 } style "mixer_mute_button" = "mute_button" @@ -239,8 +251,8 @@ style "mixer_red_active_button" = "very_small_button" fg[ACTIVE] = { 0, 1.0, 1.0 } bg[ACTIVE] = { 0.7, 0, 0 } - base[INSENSITIVE] = { 0.21, 0.21, 0.21 } - bg[INSENSITIVE] = { 0.21, 0.21, 0.21 } + base[INSENSITIVE] = { 0.16, 0.16, 0.21 } + bg[INSENSITIVE] = { 0.16, 0.16, 0.21 } } style "time_button" = "default_buttons_menus" @@ -274,9 +286,9 @@ style "shuttle_control" = "very_small_text" fg[SELECTED] = { 0.85, 0.92, 0.98 } fg[INSENSITIVE] = { 0.85, 0.92, 0.98 } - bg[NORMAL] = { 0.31, 0.31, 0.31 } - bg[PRELIGHT] = { 0.31, 0.31, 0.31 } - bg[INSENSITIVE] = { 0.31, 0.31, 0.31 } + bg[NORMAL] = { 0.26, 0.26, 0.31 } + bg[PRELIGHT] = { 0.26, 0.26, 0.31 } + bg[INSENSITIVE] = { 0.26, 0.26, 0.31 } bg[ACTIVE] = { 0.50, 1.0, 0.50 } bg[SELECTED] = { 1.0, 0.04, 0.04 } } @@ -306,16 +318,16 @@ style "option_entry" = "default_base" fg[ACTIVE] = { 0.50, 1.0, 1.0 } fg[INSENSITIVE] = { 0.80, 0.80, 0.80 } - base[INSENSITIVE] = { 0.12, 0.12, 0.12 } + base[INSENSITIVE] = { 0.07, 0.07, 0.12 } - bg[NORMAL] = { 0.40, 0.40, 0.40 } - bg[ACTIVE] = { 0.40, 0.40, 0.40 } + bg[NORMAL] = { 0.35, 0.35, 0.40 } + bg[ACTIVE] = { 0.35, 0.35, 0.40 } } style "red_when_active" = "medium_text" { fg[NORMAL] = { 0.80, 0.80, 0.80 } - bg[NORMAL] = { 0.31, 0.31, 0.31 } + bg[NORMAL] = { 0.26, 0.26, 0.31 } fg[ACTIVE] = { 0.80, 0.80, 0.80 } bg[ACTIVE] = { 1.0, 0, 0} @@ -335,13 +347,13 @@ style "xrun_warn" bg[ACTIVE] = { 0.09, 1.0, 0.46 } } -style "menu_bar_base" +style "menu_bar_base" = "default_base" { - bg[NORMAL] = { 0, 0, 0 } - bg[ACTIVE] = { 0, 0, 0 } - bg[PRELIGHT] = { 0, 0, 0 } - bg[INSENSITIVE] = { 0, 0, 0 } - bg[SELECTED] = { 0, 0, 0 } + bg[NORMAL] = { 0.2, 0.2, 0.3 } + bg[ACTIVE] = { 0, 0, 0 } + bg[PRELIGHT] = { 0, 0, 0 } + bg[INSENSITIVE] = { 0, 0, 0 } + bg[SELECTED] = { 0, 0, 0 } } style "fatal_message" = "medium_text" @@ -390,7 +402,7 @@ style "medium_entry" = "medium_text" fg[ACTIVE] = { 0.50, 1.0, 1.0 } fg[SELECTED] = { 0.50, 1.0, 0.50 } - bg[NORMAL] = { 0.40, 0.40, 0.40 } + bg[NORMAL] = { 0.35, 0.35, 0.40 } base[NORMAL] = { 0, 0, 0 } base[ACTIVE] = { 0, 0, 0 } @@ -412,7 +424,7 @@ style "medium_bold_entry" = "medium_bold_text" fg[NORMAL] = { 0.50, 1.0, 1.0 } fg[ACTIVE] = { 0.50, 1.0, 1.0 } - bg[NORMAL] = { 0.40, 0.40, 0.40 } + bg[NORMAL] = { 0.35, 0.35, 0.40 } base[NORMAL] = { 0, 0, 0 } base[ACTIVE] = { 0, 0, 0 } @@ -441,7 +453,7 @@ style "small_bold_entry" = "small_bold_text" fg[NORMAL] = { 0.50, 1.0, 1.0 } fg[ACTIVE] = { 0.50, 1.0, 1.0 } - bg[NORMAL] = { 0.40, 0.40, 0.40 } + bg[NORMAL] = { 0.35, 0.35, 0.40 } base[NORMAL] = { 0, 0, 0 } base[ACTIVE] = { 0, 0, 0 } @@ -513,7 +525,7 @@ style "audio_track_base" = "default_base" { font_name = "sans 8" fg[NORMAL] = { 0.77, 0.77, 0.72 } - bg[NORMAL] = { 0.18, 0.18, 0.22 } + bg[NORMAL] = { 0.18, 0.19, 0.22 } bg[ACTIVE] = { 0.20, 0.20, 0.20 } bg[PRELIGHT] = { 0.20, 0.20, 0.20 } bg[INSENSITIVE] = { 0.20, 0.20, 0.20 } @@ -526,7 +538,7 @@ style "audio_bus_base" fg[NORMAL] = { 0.77, 0.77, 0.72 } fg[NORMAL] = { 0.7, 0.8, 0.2 } #bg[NORMAL] = {0, 0.36, 0.40 } - bg[NORMAL] = "#464666" + bg[NORMAL] = "#444466" } style "track_name_display" @@ -550,7 +562,7 @@ style "active_track_name_display" style "track_separator" { - bg[NORMAL] = { 0.40, 0.40, 0.40 } + bg[NORMAL] = { 0.35, 0.35, 0.40 } } # @@ -618,11 +630,11 @@ style "region_list_display" = "small_bold_text" style "main_canvas_area" { - bg[NORMAL] = { 0.38, 0.38, 0.38 } - bg[ACTIVE] = { 0.38, 0.38, 0.38 } - bg[INSENSITIVE] = { 0.38, 0.38, 0.38 } - bg[SELECTED] = { 0.38, 0.38, 0.38 } - bg[PRELIGHT] = { 0.38, 0.38, 0.38 } + bg[NORMAL] = { 0.32, 0.32, 0.36 } + bg[ACTIVE] = { 0.38, 0.38, 0.42 } + bg[INSENSITIVE] = { 0.38, 0.38, 0.42 } + bg[SELECTED] = { 0.38, 0.38, 0.42 } + bg[PRELIGHT] = { 0.38, 0.38, 0.42 } } style "track_controls_inactive" @@ -665,7 +677,7 @@ style "plugin_slider" fg[NORMAL] = { 0.37, 0.43, 0.52 } fg[ACTIVE] = { 0.37, 0.43, 0.52 } - fg[INSENSITIVE] = {0.40, 0.40, 0.40 } # matches default_base + fg[INSENSITIVE] = {0.35, 0.35, 0.40 } # matches default_base fg[SELECTED] = { 0.37, 0.43, 0.52 } fg[PRELIGHT] = { 0.37, 0.43, 0.52 } @@ -748,12 +760,6 @@ style "pan_zone" = "default_base" fg[ACTIVE] = { 0.95, 0.48, 0.11 } } -style "wall_clock" = "medium_bold_text" -{ - fg[NORMAL] = { 1.0, 1.0, 1.0 } - bg[NORMAL] = { 0, 0, 0 } -} - style "paler_red_when_active" = "medium_text" { fg[NORMAL] = { 0.80, 0.80, 0.80 } @@ -792,26 +798,78 @@ style "selected_strip_frame" style "flashing_alert" = "very_small_text" { fg[NORMAL] = { 0.80, 0.80, 0.80 } - bg[NORMAL] = { 0.31, 0.31, 0.31 } + bg[NORMAL] = { 0.26, 0.26, 0.31 } fg[ACTIVE] = { 0.80, 0.80, 0.80 } bg[ACTIVE] = { 1.0, 0, 0} } -style "selected_io_selector_port_list" = "medium_text" +style "selected_io_selector_port_list" = "medium_bold_text" { - fg[NORMAL] = { 0.50, 1.0, 1.0 } - fg[SELECTED] = { 0.50, 1.0, 1.0 } - base[NORMAL] = { 0, 0, 0 } - base[SELECTED] = { 0, 0, 0 } + GtkTreeView::even-row-color = { 0.64, 0.68, 0.54 } + GtkTreeView::odd-row-color = { 0.64, 0.68, 0.54 } + +# fg is used to color the fg (text) of the column header button + + fg[NORMAL] = { 0.80, 0.80, 0.70 } + fg[SELECTED] = { 0.80, 0.80, 0.70 } + fg[ACTIVE] = { 0.80, 0.80, 0.70 } + fg[PRELIGHT] = { 0.80, 0.80, 0.70 } + fg[INSENSITIVE] = { 0.80, 0.80, 0.70 } + +# bg is used used to color the background of the column header button + + bg[NORMAL] = { 0.30, 0.30, 0.35 } + bg[ACTIVE] = { 0.30, 0.30, 0.35 } + bg[PRELIGHT] = { 0.30, 0.30, 0.35 } + bg[INSENSITIVE] = { 0.30, 0.30, 0.35 } + bg[SELECTED] = { 0.30, 0.30, 0.35 } + +# text is used to color the treeview row text + + text[NORMAL] = { 0.80, 0.80, 0.70 } + text[SELECTED] = { 0.80, 0.80, 0.70 } + +# base is used to color a treeview with no rows + + base[NORMAL] = { 0.64, 0.68, 0.54 } + base[ACTIVE] = { 0.64, 0.68, 0.54 } + base[PRELIGHT] = { 0.64, 0.68, 0.54 } + base[INSENSITIVE] = { 0.64, 0.68, 0.54 } + base[SELECTED] = { 0.64, 0.68, 0.54 } } style "io_selector_port_list" = "medium_text" { - fg[NORMAL] = {0.80, 0.80, 0.70 } - fg[SELECTED] = {0.80, 0.80, 0.70 } - base[NORMAL] = { 0.26, 0.26, 0.26 } - base[SELECTED] = { 0.26, 0.26, 0.26 } + +# fg is used to color the fg (text) of the column header button + + fg[NORMAL] = { 0.80, 0.80, 0.70 } + fg[SELECTED] = { 0.80, 0.80, 0.70 } + fg[ACTIVE] = { 0.80, 0.80, 0.70 } + fg[PRELIGHT] = { 0.80, 0.80, 0.70 } + fg[INSENSITIVE] = { 0.80, 0.80, 0.70 } + +# bg is used used to color the background of the column header button + + bg[NORMAL] = { 0.30, 0.30, 0.35 } + bg[ACTIVE] = { 0.30, 0.30, 0.35 } + bg[PRELIGHT] = { 0.30, 0.30, 0.35 } + bg[INSENSITIVE] = { 0.30, 0.30, 0.35 } + bg[SELECTED] = { 0.30, 0.30, 0.35 } + +# text is used to color the treeview row text + + text[NORMAL] = { 0.80, 0.80, 0.70 } + text[SELECTED] = { 0.80, 0.80, 0.70 } + +# base is used to color a treeview with no rows + + base[NORMAL] = { 0, 0, 0 } + base[ACTIVE] = { 0, 0, 0 } + base[PRELIGHT] = { 0, 0, 0 } + base[INSENSITIVE] = { 0, 0, 0 } + base[SELECTED] = { 0, 0, 0 } } style "io_selector_notebook" = "default_base" @@ -945,6 +1003,7 @@ widget "*TrackRecordEnableButton" style "track_rec_enable_button" widget "*TrackRecordEnableButton*" style "track_rec_enable_button" widget "*TrackMuteButton*" style "mute_button" widget "*TrackLoopButton*" style "track_loop_button" +widget "*PanAutomationLineSelector*" style "multiline_combo" widget "*EditorTimeButton*" style "time_button" widget "*EditorMixerButton*" style "default_buttons_menus" widget "*SoloButton*" style "solo_button" @@ -1089,8 +1148,6 @@ widget "*MixerTrackDisplayList" style "track_list_display" widget "*MixerSnapshotDisplayList" style "track_list_display" widget "*MixerAuxDisplayList" style "track_list_display" widget "*MixerGroupList" style "track_list_display" -widget "*WallClock" style "wall_clock" -widget "*CPULoad" style "wall_clock" widget "*RegionEditorLabel" style "medium_text" widget "*RegionEditorSmallLabel" style "small_text" widget "*RegionEditorEntry" style "medium_entry" @@ -1124,7 +1181,9 @@ widget "*IOSelectorButton" style "default_buttons_menus" widget "*IOSelectorButton*" style "default_buttons_menus" widget "*IOSelectorList" style "medium_entry_noselection_fg" widget "*IOSelectorPortList" style "io_selector_port_list" +widget "*IOSelectorPortList.*" style "io_selector_port_list" widget "*IOSelectorPortListSelected" style "selected_io_selector_port_list" +widget "*IOSelectorPortListSelected.*" style "selected_io_selector_port_list" widget "*IOSelectorNotebook" style "io_selector_notebook" widget "*IOSelectorNotebookTab" style "io_selector_notebook" widget "*IOSelectorFrame" style "base_frame" diff --git a/vst/SConscript b/vst/SConscript index 988a386de3..2a4d492f8a 100644 --- a/vst/SConscript +++ b/vst/SConscript @@ -35,7 +35,7 @@ ardour_vst.Merge ([ libraries['libgnomecanvas2'], libraries['libgnomecanvasmm'], libraries['sysmidi'], - libraries['sndfile'], + libraries['sndfile-ardour'], libraries['flac'], libraries['lrdf'], libraries['glibmm2'], diff --git a/vst/ardevst b/vst/ardevst index 286f951b00..093c4b72da 100755 --- a/vst/ardevst +++ b/vst/ardevst @@ -1,4 +1,5 @@ #!/bin/sh -export ARDOUR_PATH=../gtk2_ardour/glade:../gtk2_ardour/pixmaps:../gtk2_ardour +export ARDOUR_PATH=../gtk2_ardour/icons:../gtk2_ardour/pixmaps:../gtk2_ardour export LD_LIBRARY_PATH=../gtk2_ardour:../libs/surfaces/control_protocol:../libs/ardour:../libs/midi++2:../libs/pbd:../libs/soundtouch:../libs/gtkmm2ext:../libs/sigc++2:../libs/glibmm2:../libs/gtkmm2/atk:../libs/gtkmm2/pango:../libs/gtkmm2/gdk:../libs/gtkmm2/gtk:../libs/libgnomecanvasmm:../libs/libsndfile:../libs/appleutility:$$LD_LIBRARY_PATH +export GTK_PATH=$PWD/../libs/clearlooks:~/.ardour2 exec wine ./ardour_vst.exe.so "$@" |