summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--DOCUMENTATION/TRANSLATORS1
-rw-r--r--SConstruct156
-rw-r--r--ardour.rc.in3
-rw-r--r--ardour_system.rc2
-rw-r--r--gtk2_ardour/SConscript6
-rw-r--r--gtk2_ardour/about.cc21
-rw-r--r--gtk2_ardour/actions.cc27
-rw-r--r--gtk2_ardour/add_route_dialog.cc22
-rwxr-xr-xgtk2_ardour/ardev_common.sh6
-rw-r--r--gtk2_ardour/ardour.bindings8
-rw-r--r--gtk2_ardour/ardour.colors20
-rw-r--r--gtk2_ardour/ardour.menus29
-rw-r--r--gtk2_ardour/ardour.sh.in2
-rw-r--r--gtk2_ardour/ardour2_ui.rc239
-rw-r--r--gtk2_ardour/ardour_ui.cc87
-rw-r--r--gtk2_ardour/ardour_ui.h35
-rw-r--r--gtk2_ardour/ardour_ui2.cc2
-rw-r--r--gtk2_ardour/ardour_ui_options.cc4
-rw-r--r--gtk2_ardour/audio_clock.cc2
-rw-r--r--gtk2_ardour/audio_region_editor.cc506
-rw-r--r--gtk2_ardour/audio_region_editor.h73
-rw-r--r--gtk2_ardour/audio_region_view.cc52
-rw-r--r--gtk2_ardour/audio_region_view.h6
-rw-r--r--gtk2_ardour/automation_line.cc96
-rw-r--r--gtk2_ardour/automation_line.h10
-rw-r--r--gtk2_ardour/automation_time_axis.cc20
-rw-r--r--gtk2_ardour/canvas-waveview.c79
-rw-r--r--gtk2_ardour/editing.cc56
-rw-r--r--gtk2_ardour/editing.h42
-rw-r--r--gtk2_ardour/editor.cc366
-rw-r--r--gtk2_ardour/editor.h97
-rw-r--r--gtk2_ardour/editor_actions.cc265
-rw-r--r--gtk2_ardour/editor_audio_import.cc12
-rw-r--r--gtk2_ardour/editor_canvas.cc41
-rw-r--r--gtk2_ardour/editor_markers.cc2
-rw-r--r--gtk2_ardour/editor_mixer.cc7
-rw-r--r--gtk2_ardour/editor_mouse.cc28
-rw-r--r--gtk2_ardour/editor_ops.cc129
-rw-r--r--gtk2_ardour/editor_region_list.cc15
-rw-r--r--gtk2_ardour/editor_route_list.cc4
-rw-r--r--gtk2_ardour/editor_rulers.cc73
-rw-r--r--gtk2_ardour/editor_tempodisplay.cc16
-rw-r--r--gtk2_ardour/export_dialog.cc16
-rw-r--r--gtk2_ardour/export_region_dialog.cc2
-rw-r--r--gtk2_ardour/fft_graph.cc28
-rw-r--r--gtk2_ardour/gain_automation_time_axis.cc8
-rw-r--r--gtk2_ardour/gui_thread.h5
-rw-r--r--gtk2_ardour/i18n.h2
-rw-r--r--gtk2_ardour/icons/hide.pngbin0 -> 523 bytes
-rw-r--r--gtk2_ardour/icons/record_normal_red.pngbin0 -> 489 bytes
-rw-r--r--gtk2_ardour/icons/record_tape_red.pngbin0 -> 613 bytes
-rw-r--r--gtk2_ardour/icons/strip_width.pngbin0 -> 256 bytes
-rw-r--r--gtk2_ardour/io_selector.cc231
-rw-r--r--gtk2_ardour/io_selector.h4
-rw-r--r--gtk2_ardour/keyboard.cc2
-rw-r--r--gtk2_ardour/location_ui.cc2
-rw-r--r--gtk2_ardour/main.cc14
-rw-r--r--gtk2_ardour/marker_time_axis_view.cc2
-rw-r--r--gtk2_ardour/mixer_strip.cc164
-rw-r--r--gtk2_ardour/mixer_strip.h2
-rw-r--r--gtk2_ardour/mixer_ui.cc60
-rw-r--r--gtk2_ardour/new_session_dialog.cc1
-rw-r--r--gtk2_ardour/option_editor.cc42
-rw-r--r--gtk2_ardour/option_editor.h6
-rw-r--r--gtk2_ardour/plugin_ui.cc9
-rw-r--r--gtk2_ardour/po/SConscript51
-rw-r--r--gtk2_ardour/po/ru_RU.po5229
-rw-r--r--gtk2_ardour/po/sv_SE.po5865
-rw-r--r--gtk2_ardour/public_editor.h6
-rw-r--r--gtk2_ardour/redirect_box.cc63
-rw-r--r--gtk2_ardour/redirect_box.h14
-rw-r--r--gtk2_ardour/region_gain_line.cc26
-rw-r--r--gtk2_ardour/region_selection.cc12
-rw-r--r--gtk2_ardour/region_view.cc3
-rw-r--r--gtk2_ardour/route_time_axis.cc224
-rw-r--r--gtk2_ardour/route_time_axis.h25
-rw-r--r--gtk2_ardour/route_ui.cc32
-rw-r--r--gtk2_ardour/route_ui.h2
-rw-r--r--gtk2_ardour/selection.h1
-rw-r--r--gtk2_ardour/sfdb_ui.cc40
-rw-r--r--gtk2_ardour/sfdb_ui.h1
-rw-r--r--gtk2_ardour/streamview.cc2
-rw-r--r--gtk2_ardour/time_axis_view.cc59
-rw-r--r--gtk2_ardour/utils.cc35
-rw-r--r--gtk2_ardour/visual_time_axis.cc5
-rw-r--r--libs/ardour/SConscript13
-rw-r--r--libs/ardour/ardour/audio_diskstream.h2
-rw-r--r--libs/ardour/ardour/audio_track.h5
-rw-r--r--libs/ardour/ardour/audio_unit.h2
-rw-r--r--libs/ardour/ardour/audiofilesource.h13
-rw-r--r--libs/ardour/ardour/audioregion.h14
-rw-r--r--libs/ardour/ardour/audiosource.h2
-rw-r--r--libs/ardour/ardour/automation_event.h33
-rw-r--r--libs/ardour/ardour/configuration_vars.h1
-rw-r--r--libs/ardour/ardour/coreaudiosource.h4
-rw-r--r--libs/ardour/ardour/curve.h11
-rw-r--r--libs/ardour/ardour/destructive_filesource.h4
-rw-r--r--libs/ardour/ardour/diskstream.h6
-rw-r--r--libs/ardour/ardour/insert.h16
-rw-r--r--libs/ardour/ardour/io.h40
-rw-r--r--libs/ardour/ardour/location.h16
-rw-r--r--libs/ardour/ardour/midi_diskstream.h2
-rw-r--r--libs/ardour/ardour/midi_region.h3
-rw-r--r--libs/ardour/ardour/midi_track.h2
-rw-r--r--libs/ardour/ardour/panner.h43
-rw-r--r--libs/ardour/ardour/playlist.h17
-rw-r--r--libs/ardour/ardour/redirect.h22
-rw-r--r--libs/ardour/ardour/region.h13
-rw-r--r--libs/ardour/ardour/route.h12
-rw-r--r--libs/ardour/ardour/session.h32
-rw-r--r--libs/ardour/ardour/sndfilesource.h41
-rw-r--r--libs/ardour/ardour/source.h18
-rw-r--r--libs/ardour/ardour/state_manager.h56
-rw-r--r--libs/ardour/ardour/tempo.h27
-rw-r--r--libs/ardour/ardour/track.h9
-rw-r--r--libs/ardour/ardour/types.h6
-rw-r--r--libs/ardour/ardour/vst_plugin.h1
-rw-r--r--libs/ardour/audio_diskstream.cc89
-rw-r--r--libs/ardour/audio_playlist.cc23
-rw-r--r--libs/ardour/audio_track.cc70
-rw-r--r--libs/ardour/audioengine.cc1
-rw-r--r--libs/ardour/audiofilesource.cc107
-rw-r--r--libs/ardour/audioregion.cc122
-rw-r--r--libs/ardour/audiosource.cc25
-rw-r--r--libs/ardour/automation_event.cc389
-rw-r--r--libs/ardour/control_protocol_manager.cc22
-rw-r--r--libs/ardour/coreaudiosource.cc56
-rw-r--r--libs/ardour/curve.cc42
-rw-r--r--libs/ardour/destructive_filesource.cc19
-rw-r--r--libs/ardour/diskstream.cc16
-rw-r--r--libs/ardour/globals.cc2
-rw-r--r--libs/ardour/i18n.h2
-rw-r--r--libs/ardour/insert.cc65
-rw-r--r--libs/ardour/io.cc450
-rw-r--r--libs/ardour/location.cc87
-rw-r--r--libs/ardour/midi_diskstream.cc3
-rw-r--r--libs/ardour/midi_region.cc1
-rw-r--r--libs/ardour/midi_track.cc19
-rw-r--r--libs/ardour/panner.cc288
-rw-r--r--libs/ardour/playlist.cc38
-rw-r--r--libs/ardour/plugin_manager.cc3
-rw-r--r--libs/ardour/po/sv_SE.po2025
-rw-r--r--libs/ardour/redirect.cc300
-rw-r--r--libs/ardour/region.cc65
-rw-r--r--libs/ardour/route.cc127
-rw-r--r--libs/ardour/send.cc11
-rw-r--r--libs/ardour/session.cc101
-rw-r--r--libs/ardour/session_click.cc2
-rw-r--r--libs/ardour/session_command.cc40
-rw-r--r--libs/ardour/session_state.cc132
-rw-r--r--libs/ardour/session_transport.cc5
-rw-r--r--libs/ardour/sndfile_helpers.cc4
-rw-r--r--libs/ardour/sndfilesource.cc476
-rw-r--r--libs/ardour/source.cc24
-rw-r--r--libs/ardour/source_factory.cc9
-rw-r--r--libs/ardour/sse_functions_64bit.s5
-rw-r--r--libs/ardour/state_manager.cc91
-rw-r--r--libs/ardour/tempo.cc141
-rw-r--r--libs/ardour/track.cc16
-rw-r--r--libs/ardour/utils.cc84
-rw-r--r--libs/ardour/vst_plugin.cc10
-rw-r--r--libs/clearlooks/SConscript23
-rw-r--r--libs/clearlooks/bits.c121
-rw-r--r--libs/clearlooks/clearlooks_draw.c1293
-rw-r--r--libs/clearlooks/clearlooks_draw.h159
-rw-r--r--libs/clearlooks/clearlooks_rc_style.c392
-rw-r--r--libs/clearlooks/clearlooks_rc_style.h57
-rw-r--r--libs/clearlooks/clearlooks_style.c2657
-rw-r--r--libs/clearlooks/clearlooks_style.h108
-rw-r--r--libs/clearlooks/clearlooks_theme_main.c37
-rwxr-xr-xlibs/clearlooks/cpdll.sh2
-rw-r--r--libs/clearlooks/support.c981
-rw-r--r--libs/clearlooks/support.h110
-rw-r--r--libs/fst/SConscript8
-rw-r--r--libs/gtkmm2ext/SConscript2
-rw-r--r--libs/gtkmm2ext/barcontroller.cc1
-rw-r--r--libs/gtkmm2ext/click_box.cc17
-rw-r--r--libs/gtkmm2ext/gtkmm2ext/click_box.h1
-rw-r--r--libs/gtkmm2ext/gtkmm2ext/gtk_ui.h2
-rw-r--r--libs/gtkmm2ext/tearoff.cc18
-rw-r--r--libs/libsndfile/SConscript2
-rw-r--r--libs/midi++2/SConscript2
-rw-r--r--libs/midi++2/midi++/factory.h5
-rw-r--r--libs/midi++2/midifactory.cc30
-rw-r--r--libs/midi++2/midimanager.cc64
-rw-r--r--libs/pbd/SConscript2
-rw-r--r--libs/pbd/controllable.cc2
-rw-r--r--libs/pbd/convert.cc41
-rw-r--r--libs/pbd/pbd/command.h5
-rw-r--r--libs/pbd/pbd/controllable.h11
-rw-r--r--libs/pbd/pbd/convert.h5
-rw-r--r--libs/pbd/pbd/crossthread.h38
-rw-r--r--libs/pbd/pbd/destructible.h16
-rw-r--r--libs/pbd/pbd/memento_command.h16
-rw-r--r--libs/pbd/pbd/rcu.h2
-rw-r--r--libs/pbd/pbd/shiva.h78
-rw-r--r--libs/pbd/pbd/statefuldestructible.h12
-rw-r--r--libs/pbd/pbd/undo.h6
-rw-r--r--libs/pbd/pbd/xml++.h3
-rw-r--r--libs/pbd/undo.cc52
-rw-r--r--libs/pbd/whitespace.cc13
-rw-r--r--libs/pbd/xml++.cc28
-rw-r--r--libs/surfaces/control_protocol/SConscript1
-rw-r--r--libs/surfaces/control_protocol/basic_ui.cc4
-rw-r--r--libs/surfaces/tranzport/tranzport_control_protocol.cc10
-rw-r--r--svn_revision.h4
-rw-r--r--tools/osx_packaging/ardour2_mac_ui.rc173
-rw-r--r--vst/SConscript2
-rwxr-xr-xvst/ardevst3
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 &region_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 &region_after = audio_region()->get_state();
+ trackview.session().add_command (new MementoCommand<AudioRegion>(*(audio_region().get()), &region_before, &region_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
new file mode 100644
index 0000000000..2db8173101
--- /dev/null
+++ b/gtk2_ardour/icons/hide.png
Binary files differ
diff --git a/gtk2_ardour/icons/record_normal_red.png b/gtk2_ardour/icons/record_normal_red.png
new file mode 100644
index 0000000000..c4bbaff0b0
--- /dev/null
+++ b/gtk2_ardour/icons/record_normal_red.png
Binary files differ
diff --git a/gtk2_ardour/icons/record_tape_red.png b/gtk2_ardour/icons/record_tape_red.png
new file mode 100644
index 0000000000..f9e231381a
--- /dev/null
+++ b/gtk2_ardour/icons/record_tape_red.png
Binary files differ
diff --git a/gtk2_ardour/icons/strip_width.png b/gtk2_ardour/icons/strip_width.png
new file mode 100644
index 0000000000..99a0e72797
--- /dev/null
+++ b/gtk2_ardour/icons/strip_width.png
Binary files differ
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 &region_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 &region_after = rv.audio_region()->get_state();
+ trackview.session().add_command(new MementoCommand<AudioRegion>(*(rv.audio_region().get()), &region_before, &region_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, &param) != 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 "$@"