languages:
French: Alain Fr�hel <alain.frehel@free.fr>
+ Christophe Combelles <ccomb@free.fr>
German: Karsten Petersen <kapet@kapet.de>
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 = { }
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)
)
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})
#
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."
#
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":
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)
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()
# 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'])
gtk_subdirs = [
# 'libs/flowcanvas',
'libs/gtkmm2ext',
- 'gtk2_ardour'
+ 'gtk2_ardour',
+ 'libs/clearlooks'
]
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',
'libs/gtkmm2/gtk',
'libs/libgnomecanvasmm',
# 'libs/flowcanvas',
- 'libs/gtkmm2ext',
- 'gtk2_ardour'
+ 'libs/gtkmm2ext',
+ 'gtk2_ardour',
+ 'libs/clearlooks'
]
#
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."
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'))
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',
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']))))
-<?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"/>
<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"/>
-<?xml version="1.0"?>
+<?xml version="1.0" encoding="UTF-8"?>
<Ardour>
<Config>
<Option name="minimum-disk-io-bytes" value="262144"/>
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')
libraries['libgnomecanvas2'],
libraries['libgnomecanvasmm'],
libraries['sysmidi'],
- libraries['sndfile'],
+ libraries['sndfile-ardour'],
libraries['flac'],
libraries['lrdf'],
libraries['glibmm2'],
gtkardour.Append(CXXFLAGS=versionflag)
-gtkardour.VersionBuild(['version.cc','version.h'], 'SConscript')
-
executable = 'ardour.bin'
ardour = gtkardour.Program(target = executable, source = gtkardour_files + extra_sources)
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'],
#include "utils.h"
#include "version.h"
+#include "svn_revision.h"
#include "about.h"
#include "rgb_macros.h"
#include "ardour_ui.h"
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"),
"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);
}
}
-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>
-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)
{
return act;
}
-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)
{
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
};
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");
#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
(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")
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
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
<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'/>
<menuitem action='ToggleOptionsEditor'/>
<menuitem action='ToggleSoundFileBrowser'/>
<menuitem action='ToggleInspector'/>
- <menuitem action='ToggleConnections'/>
<menuitem action='ToggleLocations'/>
<menuitem action='ToggleColorManager'/>
<menuitem action='ToggleBigClock'/>
<menuitem action='FileHeaderFormatCAF'/>
</menu>
</menu>
- <menu action='SMPTE'>
+ <menu action='Timecode'>
<menuitem action='Smpte23976'/>
<menuitem action='Smpte24'/>
<menuitem action='Smpte24976'/>
#!/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
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 }
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 }
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"
/*
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"
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"
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"
}
+style "mixer_safe_solo_button" = "safe_solo_button"
+{
+ font_name = "sans 7"
+ xthickness = 0
+ ythickness = 0
+
+}
+
style "mute_button" = "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"
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 }
}
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}
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"
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"
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 }
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 }
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 }
{
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 }
{
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"
style "track_separator"
{
- bg[NORMAL] = { 0.40, 0.40, 0.40 }
+ bg[NORMAL] = { 0.35, 0.35, 0.40 }
}
#
{
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 }
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"
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 }
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 }
# 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"
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 }
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"
}
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"
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"
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"
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"
}
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();
}
}
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);
return;
}
- if (Config->get_auto_loop()) {
+ if (session->get_play_loop ()) {
session->request_play_loop (false);
}
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);
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) {
ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, true);
}
-
void
ARDOUR_UI::engine_running ()
{
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);
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:
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();
} else {
- _session_is_new = true;
-
if (session_name.empty()) {
response = Gtk::RESPONSE_NONE;
continue;
} 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()) {
} while (response == Gtk::RESPONSE_NONE);
+ done:
show();
new_session_dialog->get_window()->set_cursor();
new_session_dialog->hide();
Config->set_current_owner (ConfigVariableBase::Interface);
session_loaded = true;
+
+ goto_editor_window ();
+
return 0;
}
shown_flag = true;
}
-
- if (about) {
- about->present ();
- }
}
void
{
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
_("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\
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; }
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 *);
void toggle_click ();
void toggle_session_auto_loop ();
- void toggle_session_punch_in ();
void toggle_options_window ();
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 ();
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 ();
void use_config ();
- void clear_meters ();
-
static gint _blink (void *);
void blink ();
gint blink_timeout_tag;
void control_methods_adjusted ();
void mmc_device_id_adjusted ();
+ void about_signal_response(int response);
+
private:
Gtk::VBox top_packer;
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 {
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);
void build_menu_bar ();
void build_control_surface_menu ();
- void pack_toplevel_controls();
Gtk::Label wall_clock_label;
Gtk::EventBox wall_clock_box;
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);
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 *);
void snapshot_session ();
- void map_record_state ();
- void queue_map_record_state ();
-
Mixer_UI *mixer;
int create_mixer ();
/* route dialog */
AddRouteDialog *add_route_dialog;
- void add_route_dialog_done (int status);
/* SoundFile Browser */
SoundFileBrowser *sfdb;
/* 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;
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;
void toggle_StopTransportAtEndOfSession();
void toggle_GainReduceFastTransport();
void toggle_LatchedSolo();
- void toggle_SoloViaBus();
void toggle_LatchedRecordEnable ();
void mtc_port_changed ();
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);
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 {
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")) {
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)));
$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>
_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);
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);
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);
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));
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
return FALSE;
}
-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);
}
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
}
}
-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 ()
{
}
}
-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)
{
}
}
-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)
{
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;
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;
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 ();
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)());
#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"
reset_fade_out_shape ();
}
+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
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;
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
trackview.session().begin_reversible_command (_("add gain control point"));
XMLNode &before = audio_region()->envelope().get_state();
-
if (!audio_region()->envelope_active()) {
- XMLNode &before = audio_region()->get_state();
+ XMLNode ®ion_before = audio_region()->get_state();
audio_region()->set_envelope_active(true);
- XMLNode &after = audio_region()->get_state();
- trackview.session().add_command (new MementoCommand<AudioRegion>(*(audio_region().get()), &before, &after));
+ XMLNode ®ion_after = audio_region()->get_state();
+ trackview.session().add_command (new MementoCommand<AudioRegion>(*(audio_region().get()), ®ion_before, ®ion_after));
}
audio_region()->envelope().add (fx, y);
#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"
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 ();
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);
}
}
}
-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 ()
{
_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 ();
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 ();
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;
*/
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;
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());
// 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 ();
}
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),
}
}
-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);
}
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&);
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;
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*);
void reset_line_coords (ControlPoint&);
void update_line ();
+ double control_point_box_size ();
+
struct ModelRepresentation {
ARDOUR::AutomationList::iterator start;
ARDOUR::AutomationList::iterator end;
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");
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
- /*
+/*
Copyright (C) 2000-2002 Paul Davis
This program is free software; you can redistribute it and/or modify
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,
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) {
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;
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 ()
}
#define DEBUG_CACHE 0
+#undef CACHE_MEMMOVE_OPTIMIZATION
static gint32
gnome_canvas_waveview_ensure_cache (GnomeCanvasWaveView *waveview, gulong start_sample, gulong end_sample)
gulong copied;
GnomeCanvasWaveViewCache *cache;
float* gain;
+#ifdef CACHE_MEMMOVE_OPTIMIZATION
+ gulong present_frames;
+ gulong present_entries;
+#endif
cache = waveview->cache;
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 */
#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,
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
#include "editing.h"
+#include "i18n.h"
+
using namespace std;
// This involves some cpp magic. --taybin
#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*/
#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;}
#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*/
#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*/
#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*/
#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
+
#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 &);
#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 &);
#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 &);
#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 &);
#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 &);
#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 &);
#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 &);
#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"
#include "editor_xpms"
-static const gchar *snap_type_strings[] = {
+static const gchar *_snap_type_strings[] = {
N_("None"),
N_("CD Frames"),
N_("SMPTE Frames"),
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"),
minsec_label (_("Mins:Secs")),
bbt_label (_("Bars:Beats")),
- smpte_label (_("SMPTE")),
+ smpte_label (_("Timecode")),
frame_label (_("Frames")),
tempo_label (_("Tempo")),
meter_label (_("Meter")),
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;
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;
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];
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 ());
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));
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);
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,
}
MenuList& items (fade_context_menu.items());
- AudioRegion& ar (*arv->audio_region().get()); // FIXME
items.clear ();
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:
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()")
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)));
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) {
/* 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 */
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.
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());
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));
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 ();
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 ();
}
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"));
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"));
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);
}
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:
}
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;
}
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 */
}
}
}
-
} else {
-
- /* no active group, or no group */
-
- relevant_tracks.insert (&base);
+ relevant_tracks.insert (atv);
}
-
}
}
{
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);
}
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);
case Selection::Extend:
selection->add (all_equivalent_regions);
break;
+ case Selection::Add:
+ selection->add (all_equivalent_regions);
+ break;
}
commit_reversible_command () ;
}
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
void
Editor::snap_type_selection_done ()
{
- if (session == 0) {
- return;
- }
-
string choice = snap_type_selector.get_active_text();
SnapType snaptype = SnapToFrame;
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;
} 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
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;
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;
}
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
/* undo related */
- void set_edit_menu (Gtk::Menu&);
-
nframes_t unit_to_frame (double unit) {
return (nframes_t) rint (unit * frames_per_unit);
}
void export_session();
void export_selection();
- /* this is what actually does it */
-
- void export_audiofile (ARDOUR::AudioExportSpecification&);
-
- /* */
void add_toplevel_controls (Gtk::Container&);
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;
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 */
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);
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;
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;
void update_current_screen ();
- gint show_track_context_menu (GdkEventButton *);
- void hide_track_context_menu ();
-
void session_going_away ();
nframes_t cut_buffer_start;
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 ();
void reset_point_selection ();
void toggle_region_mute ();
+ void toggle_region_lock ();
void toggle_region_opaque ();
void raise_region ();
void raise_region_to_top ();
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 ();
void keyboard_paste ();
void keyboard_duplicate_region ();
void keyboard_duplicate_selection ();
- void keyboard_nudge ();
void keyboard_insert_region_list_selection ();
void region_from_selection ();
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&);
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);
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*);
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);
void handle_new_duration ();
void initialize_canvas ();
void reset_scrolling_region (Gtk::Allocation* alloc = 0);
- void scroll_canvas ();
/* display control */
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();
void track_selection_changed ();
void region_selection_changed ();
void point_selection_changed ();
- void audio_track_selection_changed ();
- void line_selection_changed ();
enum SelectionOp {
CreateSelection,
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;
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 ();
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 ();
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);
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*);
/* 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 ();
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 ();
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__ */
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"));
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));
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"));
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 */
}
}
+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)
{
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);
}
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";
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);
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
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());
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;
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;
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:
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:
}
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);
}
}
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);
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;
}
return;
}
- if (selected > 0) {
+ if (selected) {
list<boost::shared_ptr<Region> > r;
for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) {
}
session->destroy_regions (r);
-
- } else if (clicked_regionview) {
- session->destroy_region (clicked_regionview->region());
}
}
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;
case Selection::Extend:
/* not defined yet */
break;
+ case Selection::Add:
+ selection->add (touched);
+ break;
}
}
}
begin_reversible_command (_("select all"));
switch (op) {
+ case Selection::Add:
case Selection::Toggle:
selection->add (touched);
break;
begin_reversible_command (_("select all within"));
switch (op) {
+ case Selection::Add:
case Selection::Toggle:
cerr << "toggle\n";
selection->add (touched);
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 {
session->request_locate (session->current_start_frame(), true);
}
+void
+Editor::play_from_edit_cursor ()
+{
+ session->request_locate (edit_cursor->current_frame, true);
+}
+
void
Editor::play_selection ()
{
}
}
-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 ()
{
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 ();
}
}
+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);
+ }
+ }
}
}
{
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);
+ }
+ }
}
}
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
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);
}
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;
}
/* 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) {
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);
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;
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;
}
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;
*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;
/* Add the tick marks */
- if (we_need_ticks && (*i).type != TempoMap::Bar) {
+ if (we_need_ticks && (*i).type == TempoMap::Beat) {
/* Find the next beat */
/* 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) {
}
}
}
- } 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) {
}
}
}
- } 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) {
}
}
} 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) {
}
}
}
- return nmarks;
+ return n;
}
}
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
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;
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.
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());
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();
}
_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);
}
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);
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;;
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 ();
}
#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()) {\
return;\
}
+#define GTK_SAFE(theSlot) crossthread_safe (Gtkmm2ext::UI::instance()->thread_id(),\
+ *Gtkmm2ext::UI::instance(), \
+ (theSlot))
+
#endif /* __ardour_gtk_gui_thread_h__ */
#define __i18n_h__
#include <pbd/compose.h>
+#include <pbd/convert.h>
#include "gettext.h"
#include <vector>
#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__
{
}
+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)
{
gint current_page;
vector<string> rowdata;
+ page_selection_connection.disconnect ();
+
current_page = notebook.get_current_page ();
+
pages.clear ();
/* get relevant current JACK ports */
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);
}
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 ();
}
{
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();
} 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;
}
/* 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;
}
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());
selected_port_tview = tview;
}
}
-
+
} else {
-
+
if (io->output_maximum().get(t) == 1) {
selected_port = port;
selected_port_tview = tview;
}
}
}
-
+
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);
}
}
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 {
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
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
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);
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") {
*/
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
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;
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*);
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)) {
the row spacing, so make it insensitive (paul).
*/
- if (location->is_end()) {
+ if (location->is_end() || location->is_start()) {
remove_button.set_sensitive (false);
}
#include <gtkmm2ext/popup.h>
#include <gtkmm2ext/utils.h>
+#include "svn_revision.h"
#include "version.h"
#include "ardour_ui.h"
#include "opts.h"
ARDOUR_UI * ui = (ARDOUR_UI *) arg;
ui->hide_splash();
- ui->show ();
return FALSE;
}
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 */
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()) {
cout << _("Ardour/GTK ")
<< VERSIONSTRING
<< _("\n (built using ")
- << ARDOUR::get_ardour_revision ()
+ << ardour_svn_revision
#ifdef __GNUC__
<< _(" and GCC version ") << __VERSION__
#endif
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;
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)
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);
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);
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");
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*"));
}
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*"));
}
citems.push_back (SeparatorElem());
_session.foreach_connection (this, &MixerStrip::add_connection_to_output_menu);
-
+
output_menu.popup (1, ev->time);
break;
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;
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 ()
{
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);
comment_window->show();
comment_window->present();
-
}
void
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");
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
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
Gtk::TextView* comment_area;
Gtk::Button comment_button;
+ void comment_editor_done_editing();
void setup_comment_editor ();
void comment_button_clicked ();
void engine_running();
void engine_stopped();
+ static int scrollbar_height;
};
#endif /* __ardour_mixer_strip__ */
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);
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);
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;
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) {
(*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;
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);
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());
}
}
}
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);
}
}
-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
}
}
-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
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*);
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
+++ /dev/null
-# -*- 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')))
+# 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"
"\"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"
"\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"
"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"
"Необходимо сохранить сессию и\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"
"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"
"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"
"Последующая очистка корзины освободит\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"
"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"
"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"
"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 "УСТАНОВИТЬ"
+
+#: gtk2_ardour/ardour_ui2.cc:883 gtk2_ardour/ardour_ui2.cc:906
+#, fuzzy
+msgid "stop"
+msgstr "Стоп"
-#: ardour_ui2.cc:867 ardour_ui2.cc:890 ardour_ui2.cc:907
-msgid "stopped"
-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 ""
-
-#. 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 "Метроном"
+msgstr "В конец"
-#: ardour_ui_ed.cc:281
-#, fuzzy
-msgid ""
-"Auto\n"
-"input"
-msgstr ""
-"авто\n"
-"вход"
-
-#: ardour_ui_ed.cc:284
-#, fuzzy
-msgid ""
-"Auto\n"
-"play"
-msgstr ""
-"авто\n"
-"воспр."
+#: gtk2_ardour/ardour_ui_ed.cc:279
+msgid "Auto Play"
+msgstr "Автовоспроизведение"
-#: 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 "пан."
-
-#: audio_time_axis.cc:1410 editor.cc:1483 selection.cc:634
-msgid "programming error: "
-msgstr "ошибка в программе: "
+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 "усил."
+
+#: gtk2_ardour/audio_time_axis.cc:371
+msgid "pan"
+msgstr "пан."
-#: automation_line.cc:884
+#: 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 "выделять"
-
-#: editor.cc:217
-msgid "object"
-msgstr "объект"
-
-#: editor.cc:219
-msgid "zoom"
-msgstr "масштаб"
-
-#: editor.cc:220
-msgid "timefx"
-msgstr "эффект"
+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 "Увеличить"
+
+#: 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 "Показать всё"
+
+#: gtk2_ardour/editor.cc:2663
+msgid ""
+"Current Zoom Range\n"
+"(Width of visible area)"
+msgstr ""
-#: editor.cc:2747
-msgid "End:"
-msgstr "Конец:"
+#: gtk2_ardour/editor.cc:2682
+msgid "Unit to snap cursors and ranges to"
+msgstr ""
-#: editor.cc:3362 editor.cc:3402
+#: 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 "Уменьшить"
+#: gtk2_ardour/editor_actions.cc:149
+msgid "Scroll Tracks Up"
+msgstr "Прокрутить дорожки вверх"
+
+#: gtk2_ardour/editor_actions.cc:151
+msgid "Scroll Tracks Down"
+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
-msgid "Scroll Tracks Up"
-msgstr "Заполнить трек"
-
-#: editor_actions.cc:149
-msgid "Scroll Tracks Down"
-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"
"Выбранный аудиофайл имеет частоту дискретизации данных\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!"
"ошибка в программе: 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)"
"Последнюю запись будет удалена. Вы уверены?\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"
"\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"
"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 "��удио-библиотека"
+msgstr "��уть к звуковым файлам"
-#: option_editor.cc:254
-#, fuzzy
-msgid "Paths"
-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"
" -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 ""
-
-#: panner_ui.cc:335
-#, c-format
-msgid "panner for channel %lu"
-msgstr ""
+msgstr "L"
-#: panner_ui.cc:337
+#: gtk2_ardour/panner_ui.cc:328
#, c-format
-msgid "panner for channel %u"
+msgid "panner for channel %zu"
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"
"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"
"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"
"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"
"Вы действительно хотите удалить трек \"%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"
"Вы действительно хотите удалить трек \"%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"
"Вы действительно хотите удалить трек \"%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)"
"Вы действительно хотите удалить шину \"%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)"
"Вы действительно хотите удалить трек \"%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 "ФОРМАТ"
-
-#, 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"
+#: gtk2_ardour/connection_editor.cc:51
+msgid "ardour: connections"
+msgstr "ardour: соединения"
-#~ msgid "Name for new edit group"
-#~ msgstr "Имя новой группы"
+#: gtk2_ardour/connection_editor.cc:52
+msgid "Input Connections"
+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 "неверное определение связи - пропущено"
-
-#~ msgid "ardour: soundfile selector"
-#~ msgstr "ardour: выбор файлов"
-
-#~ msgid "Add to Library..."
-#~ msgstr ""
-#~ "Добавить\n"
-#~ "в библиотеку..."
-
-#~ msgid "Remove..."
-#~ msgstr "Удалить..."
-
-#~ msgid "Find..."
-#~ msgstr "Найти..."
-
-#~ msgid "Add Folder"
-#~ msgstr ""
-#~ "Создать\n"
-#~ "папку"
-
-#~ msgid "Add audio file or directory"
-#~ msgstr "Добавить аудиофайл или каталог"
-
-#~ msgid "Importing"
-#~ 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 группы"
+#: gtk2_ardour/connection_editor.cc:53
+msgid "Output Connections"
+msgstr "Выходные соединения"
-#~ msgid "Create"
-#~ msgstr "Создать"
+#: gtk2_ardour/connection_editor.cc:54
+msgid "New Input"
+msgstr "Новый вход"
-#~ msgid "use control outs"
-#~ msgstr "использовать контрольные выходы"
+#: gtk2_ardour/connection_editor.cc:55
+msgid "New Output"
+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 "Прочее"
+#: gtk2_ardour/connection_editor.cc:58 gtk2_ardour/connection_editor.cc:101
+msgid "Add Port"
+msgstr "Добавить порт"
-#~ msgid "Display"
-#~ msgstr "Экран"
+#: gtk2_ardour/connection_editor.cc:106
+msgid "Available Ports"
+msgstr "Доступные порты"
-#~ msgid "Broadcast WAVE/floating point"
-#~ msgstr "Broadcast WAVE/плавающая точка"
+#: gtk2_ardour/connection_editor.cc:501
+msgid "Connection \""
+msgstr "Соединение \""
-#~ 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 "Минуты:Секунды"
+#: gtk2_ardour/connection_editor.cc:503
+msgid "\""
+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$ не найдены"
-
-#~ msgid "No pixmaps found to match vslider[0-9]*.xpm$"
-#~ msgstr "Файлы изображений vslider[0-9]*.xpm$ не найдены"
-
-#~ msgid "Trace MIDI Input"
-#~ msgstr "Трассировка входа MIDI"
-
-#~ msgid "Trace MIDI Output"
-#~ msgstr "Трассировка выхода MIDI"
-
-#~ msgid "MTC Port"
-#~ msgstr "MTC порт"
-
-#~ msgid "attempt to timestretch a non-audio track!"
-#~ msgstr "попытка применить timestretch-эффект к неаудиотреку"
-
-#~ msgid "cannot create timestretch thread - operation not carried out"
-#~ msgstr "cannot create timestretch thread - operation not carried out"
+#: gtk2_ardour/connection_editor.cc:532
+#, c-format
+msgid "in %d"
+msgstr "вх %d"
-#~ msgid "ardour: tempo editor"
-#~ msgstr "ardour: редактор ритма"
+#: gtk2_ardour/connection_editor.cc:534
+#, c-format
+msgid "out %d"
+msgstr "вых %d"
-#~ msgid "ardour_add_track_bus"
-#~ msgstr "ardour_add_track_bus"
+#: gtk2_ardour/connection_editor.cc:658
+msgid "Name for new connection:"
+msgstr "Имя нового соединения: "
-#~ msgid "ok"
-#~ msgstr "ок"
+#: gtk2_ardour/analysis_window.cc:46
+msgid "analysis window"
+msgstr "Окно анализа"
-#, fuzzy
-#~ msgid "apply"
-#~ msgstr "авоспр"
+#: gtk2_ardour/analysis_window.cc:48
+msgid "Signal source"
+msgstr "Источник сигнала"
-#, fuzzy
-#~ msgid "fade"
-#~ msgstr "Затухание"
+#: gtk2_ardour/analysis_window.cc:49
+msgid "Selected ranges"
+msgstr "Выбранные диапазоны"
-#, fuzzy
-#~ msgid "Edit left"
-#~ msgstr "Режим редактирования"
+#: gtk2_ardour/analysis_window.cc:50
+msgid "Selected regions"
+msgstr "Выделенные области"
-#, fuzzy
-#~ msgid "Edit right"
-#~ msgstr "Редактировать сочетание"
+#: gtk2_ardour/analysis_window.cc:52
+msgid "Display model"
+msgstr "Модель отображения"
-#, fuzzy
-#~ msgid "Edit fade"
-#~ msgstr "Режим редактирования"
+#: gtk2_ardour/analysis_window.cc:53
+msgid "Composite graphs for each track"
+msgstr "Составной график для каждой дорожки"
-#~ msgid "clear connections"
-#~ msgstr "очистить соед."
+#: gtk2_ardour/analysis_window.cc:54
+msgid "Composite graph of all tracks"
+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 "Скрыть трек"
--- /dev/null
+# 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"
#include "editing.h"
#include "keyboard_target.h"
#include "canvas.h"
+#include "selection.h"
namespace ARDOUR {
class Session;
class ImageFrameTimeAxis;
class MarkerView;
-class PublicEditor : public Gtk::Window, public PBD::StatefulDestructible {
+class PublicEditor : public Gtk::Window, public PBD::StatefulThingWithGoingAway {
public:
PublicEditor();
virtual ~PublicEditor();
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;
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;
if ((insert = boost::dynamic_pointer_cast<Insert> (redirect)) == 0) {
- /* its a send */
+ /* it's a send */
if (!_session.engine().connected()) {
return;
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());
/* 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 */
ActionManager::plugin_selection_sensitive_actions.push_back(act);
ActionManager::add_action_group (popup_act_grp);
+
+
}
void
_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);
+}
+
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:
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__ */
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
model_representation (cp, mr);
trackview.editor.current_session()->begin_reversible_command (_("remove control point"));
- XMLNode &before = get_state();
+ XMLNode &before = alist.get_state();
if (!rv.audio_region()->envelope_active()) {
- XMLNode &before = rv.audio_region()->get_state();
+ XMLNode ®ion_before = rv.audio_region()->get_state();
rv.audio_region()->set_envelope_active(true);
- XMLNode &after = rv.audio_region()->get_state();
- trackview.session().add_command(new MementoCommand<AudioRegion>(*(rv.audio_region().get()), &before, &after));
- }
-
+ XMLNode ®ion_after = rv.audio_region()->get_state();
+ trackview.session().add_command(new MementoCommand<AudioRegion>(*(rv.audio_region().get()), ®ion_before, ®ion_after));
+ }
+
alist.erase (mr.start, mr.end);
- trackview.editor.current_session()->add_command (new MementoCommand<AudioRegionGainLine>(*this, &before, &get_state()));
+ trackview.editor.current_session()->add_command (new MementoCommand<AutomationList>(alist, &before, &alist.get_state()));
trackview.editor.current_session()->commit_reversible_command ();
trackview.editor.current_session()->set_dirty ();
}
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();
-}
{
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;
}
{
in_destructor = true;
- RegionViewGoingAway (this); /* EMIT_SIGNAL */
-
for (vector<GhostRegion*>::iterator g = ghosts.begin(); g != ghosts.end(); ++g) {
delete *g;
}
set_item_name (str, this);
set_name_text (str);
+ reset_width_dependent_items (_pixel_width);
}
void
#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>
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));
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);
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));
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 ();
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 ()
{
// 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);
}
*/
build_display_menu ();
}
+ editor.set_selected_track (*this, Selection::Add);
automation_action_menu->popup (1, 0);
}
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());
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)
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
if (name.length()) {
ds->use_copy_playlist ();
- pl->set_name (name);
+ ds->playlist()->set_name (name);
}
}
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);
if (name.length()) {
ds->use_new_playlist ();
- pl->set_name (name);
+ ds->playlist()->set_name (name);
}
}
case Selection::Extend:
/* not defined yet */
break;
+
+ case Selection::Add:
+ editor.get_selection().add (*tracks);
+ break;
}
delete tracks;
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>
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());
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
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>);
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*);
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 ();
void visual_click ();
void hide_click ();
- gint when_displayed (GdkEventAny*);
void speed_changed ();
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;
#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>
_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);
_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 ();
build_mute_menu();
}
- mute_menu->popup(0,0);
+ mute_menu->popup(0,ev->time);
} else {
if (!Keyboard::modifier_state_equals (ev->state, Keyboard::ModifierMask (Keyboard::Control))) {
wait_for_release = true;
+ } else {
+ return false;
}
}
build_solo_menu ();
}
- solo_menu->popup (1, 0);
+ solo_menu->popup (1, ev->time);
} else {
if (!Keyboard::modifier_state_equals (ev->state, Keyboard::ModifierMask (Keyboard::Control))) {
wait_for_release = true;
+ } else {
+ return false;
}
}
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)) {
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)));
}
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)));
}
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__ */
enum Operation {
Set,
+ Add,
Toggle,
Extend
};
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);
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 ();
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;
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
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,
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);
Gtk::Label format;
Gtk::Label channels;
Gtk::Label samplerate;
+ Gtk::Label timecode;
Gtk::TreeView field_view;
Glib::RefPtr<Gtk::ListStore> fields;
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)
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);
}
}
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
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 ();
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 */
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;
}
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:
/* 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;
}
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);
}
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)
meter.cc
amp.cc
panner.cc
+destructive_filesource.cc
audiofilesource.cc
audiofilter.cc
audioregion.cc
curve.cc
cycle_timer.cc
default_click.cc
-destructive_filesource.cc
gain.cc
gdither.cc
globals.cc
sndfilesource.cc
source.cc
source_factory.cc
-state_manager.cc
tempo.cc
utils.cc
version.cc
ardour.Merge ([
libraries['core'],
libraries['xml'],
- libraries['sndfile'],
+ libraries['sndfile-ardour'],
libraries['raptor'],
libraries['lrdf'],
libraries['samplerate'],
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
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 +
}
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;
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);
protected:
XMLNode& state (bool full);
+
+ int _set_state (const XMLNode&, bool call_base);
private:
int set_diskstream (boost::shared_ptr<AudioDiskstream>, void *);
/*
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
uint16_t channels;
int64_t length;
std::string format_name;
+ int64_t timecode;
};
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);
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.
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;
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);
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;
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 ();
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;
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 */
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;
#include <pbd/statefuldestructible.h>
#include <ardour/ardour.h>
-#include <ardour/state_manager.h>
namespace ARDOUR {
};
- 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&);
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);
(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; }
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;
double min_yval;
double max_yval;
double default_value;
- bool no_state;
iterator rt_insertion_point;
double rt_pos;
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
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)
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; }
mutable nframes_t tmpbufsize;
mutable Glib::Mutex _tmpbuf_lock;
- void init (const string &str);
+ void init (string str);
};
}; /* namespace ARDOUR */
~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);
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__ */
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);
void init ();
nframes_t crossfade (Sample* data, nframes_t cnt, int dir);
- void set_timeline_position (nframes_t);
+ void set_timeline_position (int64_t);
};
}
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; }
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;
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;
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:
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);
nframes_t latency();
void transport_stopped (nframes_t now);
-
- protected:
- void store_state (PluginInsertState&) const;
+ void automation_snapshot (nframes_t now);
private:
#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>
* 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:
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();
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; }
XMLNode& get_state (void);
int set_state (const XMLNode&);
- virtual UndoAction get_memento() const;
-
-
static int disable_connecting (void);
static int enable_connecting (void);
/* 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 {
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; }
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;
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);
#include <pbd/statefuldestructible.h>
#include <ardour/ardour.h>
-#include <ardour/state_manager.h>
using std::string;
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;
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);
(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
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;
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,
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);
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;
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);
Curve& automation() { return _automation; }
+ /* old school automation loading */
+
+ int load (istream&, string path, uint32_t&);
+
protected:
float left;
float right;
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;
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 ();
/// 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);
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&);
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;
LinkDirection _link_direction;
static float current_automation_version_number;
+
+ /* old school automation handling */
+
+ std::string automation_path;
+ void set_name (std::string);
};
} // namespace ARDOUR
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; }
bool hidden() const { return _hidden; }
bool empty() const;
+ uint32_t n_regions() const;
nframes_t get_maximum_extent () const;
layer_t top_layer() const;
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>));
class Session;
-struct RedirectState : public StateManager::State {
- RedirectState (string why)
- : StateManager::State (why) {}
- ~RedirectState () {}
-
- bool active;
-};
-
class Redirect : public IO
{
public:
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; }
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; }
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
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);
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(); }
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);
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;
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; }
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; }
return _mute_control;
}
+ void automation_snapshot (nframes_t now);
void protect_automation ();
void set_remote_control_id (uint32_t id);
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 ();
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); }
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);
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 */
/* 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);
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
{
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;
void reverse_diskstream_buffers ();
- UndoHistory history;
+ UndoHistory _history;
UndoTransaction* current_trans;
GlobalRouteBooleanState get_global_route_boolean (bool (Route::*method)(void) const);
void* ptr,
float opt);
- /* number of hardware audio ports we're using,
+ /* number of hardware ports we're using,
based on max (requested,available)
*/
/* 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 */
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 ();
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
#define __ardour_source_h__
#include <string>
+#include <set>
#include <sigc++/signal.h>
namespace ARDOUR {
class Session;
+class Playlist;
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;
};
}
+++ /dev/null
-#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__ */
#include <sigc++/signal.h>
#include <ardour/ardour.h>
-#include <ardour/state_manager.h>
class XMLNode;
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:
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.
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;
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 */
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;
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);
void set_meter_point (MeterPoint, void* src);
- sigc::signal<void> ModeChanged;
sigc::signal<void> DiskstreamChanged;
sigc::signal<void> FreezeChange;
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
#include <sigc++/signal.h>
#include <pbd/stateful.h>
#include <jack/types.h>
-#include <ardour/plugin_state.h>
#include <ardour/plugin.h>
using std::string;
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.
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;
(*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 */
} 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
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);
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;
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);
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;
+}
}
thaw ();
- in_set_state++;
+ in_set_state--;
return 0;
}
{
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) {
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(); ) {
AudioTrack::AudioTrack (Session& sess, const XMLNode& node)
: Track (sess, node)
{
- set_state (node);
+ _set_state (node, false);
}
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 ()
{
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);
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) {
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;
}
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;
}
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 */
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);
#include <unistd.h>
#include <cerrno>
#include <vector>
+#include <exception>
#include <glibmm/timer.h>
#include <pbd/pthread_utils.h>
#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>
: 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 ();
: 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 ();
}
}
+bool
+AudioFileSource::determine_embeddedness (std::string path)
+{
+ return (path.find("/") == 0);
+}
+
bool
AudioFileSource::removable () const
{
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&
}
+ 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;
}
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()) {
/* 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) {
}
void
-AudioFileSource::set_timeline_position (nframes_t pos)
+AudioFileSource::set_timeline_position (int64_t pos)
{
timeline_position = pos;
}
set_default_fades ();
set_default_envelope ();
- _envelope.StateChanged.connect (mem_fun (*this, &AudioRegion::envelope_changed));
+ listen_to_my_curves ();
}
/* Basic AudioRegion constructor (one channel) */
set_default_fades ();
set_default_envelope ();
- _envelope.StateChanged.connect (mem_fun (*this, &AudioRegion::envelope_changed));
+ listen_to_my_curves ();
}
/* Basic AudioRegion constructor (many channels) */
set_default_fades ();
set_default_envelope ();
- _envelope.StateChanged.connect (mem_fun (*this, &AudioRegion::envelope_changed));
+ listen_to_my_curves ();
}
_scale_amplitude = other->_scale_amplitude;
- _envelope.StateChanged.connect (mem_fun (*this, &AudioRegion::envelope_changed));
+ listen_to_my_curves ();
assert(_type == DataType::AUDIO);
}
_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);
}
throw failed_constructor();
}
- _envelope.StateChanged.connect (mem_fun (*this, &AudioRegion::envelope_changed));
+ listen_to_my_curves ();
assert(_type == DataType::AUDIO);
}
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
if (chan_n >= _sources.size()) {
return 0;
}
-
+
if (audio_source(chan_n)->read_peaks (buf, npeaks, offset, cnt, samples_per_unit)) {
return 0;
} else {
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"));
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"));
}
// 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) {
if (default_env) {
child->add_property ("default", "yes");
} else {
- _envelope.store_state (*child);
+ child->add_child_nocopy (_envelope.get_state ());
}
} else {
_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);
- }
+ }
}
}
}
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);
}
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);
}
}
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 ();
}
#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"
}
#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"
lookup_cache.left = -1;
lookup_cache.range.first = events.end();
- if (!no_state) {
- save_state (_("initial"));
- }
-
AutomationListCreated(this);
}
_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();
_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();
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);
}
}
if (_frozen) {
changed_when_thawed = true;
} else {
- StateChanged (Change (0));
+ StateChanged ();
}
}
{
Glib::Mutex::Lock lm (lock);
events.clear ();
- if (!no_state) {
- save_state (_("cleared"));
- }
mark_dirty ();
}
(*i)->when = floor ((*i)->when * factor);
}
- save_state ("x-scaled");
mark_dirty ();
}
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);
}
mark_dirty ();
-
- if (!no_state && !for_loading) {
- save_state (_("added event"));
- }
}
- if (!for_loading) {
- maybe_signal_changed ();
- }
+ maybe_signal_changed ();
}
void
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 ();
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 ();
reset = true;
- if (!no_state) {
- save_state (_("removed range"));
- }
-
mark_dirty ();
}
}
events.erase (s, e);
reposition_for_rt_add (0);
erased = true;
- if (!no_state) {
- save_state (_("removed range"));
- }
mark_dirty ();
}
++start;
}
- if (!no_state) {
- save_state (_("event range adjusted"));
- }
-
mark_dirty ();
}
Glib::Mutex::Lock lm (lock);
(*iter)->when = when;
(*iter)->value = val;
- if (!no_state) {
- save_state (_("event adjusted"));
- }
-
mark_dirty ();
}
{
_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)
{
double last_val;
if (events.empty()) {
- fatal << _("programming error:")
- << "AutomationList::truncate_end() called on an empty list"
- << endmsg;
- /*NOTREACHED*/
return;
}
if (changed) {
reposition_for_rt_add (0);
- if (!no_state) {
- save_state (_("cut/copy/clear"));
- }
}
mark_dirty ();
x = tmp;
}
-
- if (!no_state) {
- save_state (_("copy"));
- }
}
return nal;
}
reposition_for_rt_add (0);
-
- if (!no_state) {
- save_state (_("paste"));
- }
-
mark_dirty ();
}
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;
}
}
control_protocols.clear ();
+
+
+ for (list<ControlProtocolInfo*>::iterator p = control_protocol_info.begin(); p != control_protocol_info.end(); ++p) {
+ delete (*p);
+ }
+
+ control_protocol_info.clear();
}
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();
}
}
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;
}
}
}
void
-CoreAudioSource::init (const string& idstr)
+CoreAudioSource::init (string idstr)
{
string::size_type pos;
error << string_compose ("CoreAudioSource: %1 (%2)", cax.mOperation, name()) << endmsg;
throw failed_constructor ();
}
-
- if (_build_peakfiles) {
- _need_peakfile = true;
- }
}
CoreAudioSource::~CoreAudioSource ()
{
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;
+
+}
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)
{
min_yval = other.min_yval;
max_yval = other.max_yval;
- CurveCreated(this);
}
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 ()
void
Curve::solve ()
{
- size_t npoints;
+ uint32_t npoints;
if (!_dirty) {
return;
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) {
}
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);
}
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) {
*/
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);
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;
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);
}
#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"
_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;
} 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;
}
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);
+}
+
}
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);
}
+
}
MIDI::Manager::instance()->add_port (request);
+
+ nports++;
}
if (nports > 1) {
#define __i18n_h__
#include <pbd/compose.h>
+#include <pbd/convert.h>
#include "gettext.h"
#include <vector>
#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__
init ();
- save_state (_("initial state"));
-
{
Glib::Mutex::Lock em (_session.engine().process_lock());
IO::MoreChannels (max(input_streams(), output_streams()));
set_automatable ();
- save_state (_("initial state"));
-
_plugins[0]->ParameterChanged.connect (mem_fun (*this, &PluginInsert::parameter_changed));
{
init ();
- save_state (_("initial state"));
-
RedirectCreated (this); /* EMIT SIGNAL */
}
/* leave remaining channel buffers alone */
}
+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)
{
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 ()
{
: Insert (s, p, 1, -1, 1, -1)
{
init ();
- save_state (_("initial state"));
RedirectCreated (this); /* EMIT SIGNAL */
}
: Insert (other._session, other.placement(), 1, -1, 1, -1)
{
init ();
- save_state (_("initial state"));
RedirectCreated (this); /* EMIT SIGNAL */
}
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);
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
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;
apply_gain_automation = false;
+ last_automation_snapshot = 0;
+
_gain_automation_state = Off;
_gain_automation_style = Absolute;
// 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 ()
/* 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)
{
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) {
_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)) {
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)
{
return 0;
}
-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)
{
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()
{
_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 ()
{
if (state != _gain_automation_curve.automation_state()) {
changed = true;
+ last_automation_snapshot = 0;
_gain_automation_curve.set_automation_state (state);
if (state != Off) {
}
+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)
{
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.
*/
{
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
{
{
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 */
}
}
}
- save_state (_("clear markers"));
-
changed (); /* EMIT SIGNAL */
}
current_location = 0;
}
- save_state (_("clear ranges"));
-
changed (); /* EMIT SIGNAL */
current_changed (0); /* EMIT SIGNAL */
}
}
}
- save_state (_("add"));
-
added (loc); /* EMIT SIGNAL */
if (make_current) {
}
if (was_removed) {
- save_state (_("remove"));
-
- removed (loc); /* EMIT SIGNAL */
+
+ removed (loc); /* EMIT SIGNAL */
if (was_current) {
current_changed (0); /* EMIT SIGNAL */
void
Locations::location_changed (Location* loc)
{
- save_state (X_("location changed"));
changed (); /* EMIT SIGNAL */
}
}
nlist = node.children();
-
+
+ locations.clear ();
+ current_location = 0;
+
{
Glib::Mutex::Lock lm (lock);
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
{
/** Overloaded from parent to die horribly
*/
-void
+int
MidiDiskstream::set_destructive (bool yn)
{
assert( ! destructive());
assert( ! yn);
+ return -1;
}
void
MidiRegion::~MidiRegion ()
{
- GoingAway (); /* EMIT SIGNAL */
}
jack_nframes_t
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;
}
{
_muted = false;
+ parent.session().add_controllable (&_control);
+
x = 0.5;
y = 0.5;
z = 0.5;
_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));
}
}
}
}
-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)
{
_automation.clear ();
while (in.getline (line, sizeof (line), '\n')) {
- nframes_t when;
+ jack_nframes_t when;
double value;
++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;
}
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;
EqualPowerStereoPanner::set_state (const XMLNode& node)
{
const XMLProperty* prop;
- int x;
float pos;
LocaleGuard lg (X_("POSIX"));
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;
}
return 0;
}
-int
-Multi2dPanner::save (ostream& out) const
-{
- return 0;
-}
-
XMLNode&
Multi2dPanner::get_state (void)
{
root->add_property (X_("y"), buf);
root->add_property (X_("type"), Multi2dPanner::name);
+ /* XXX no meaningful automation yet */
+
return *root;
}
: _session (s)
{
set_name (name);
+
_linked = false;
_link_direction = SameDirection;
_bypassed = false;
}
}
-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)
{
uint32_t n;
bool changed = false;
-
if (nouts < 2 || (nouts == outputs.size() && npans == size())) {
return;
}
_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;
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);
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;
}
}
- /* 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")))) {
}
}
+/* 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;
+}
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)
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
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();
}
return;
}
+
/* this makes a virtual call to the right kind of playlist ... */
region_changed (what_changed, region);
boost::shared_ptr<Region> ret;
nframes_t closest = max_frames;
+
for (RegionList::iterator i = regions.begin(); i != regions.end(); ++i) {
nframes_t distance;
switch (dir) {
case 1: /* forwards */
- if (pos > frame) {
+ if (pos >= frame) {
if ((distance = pos - frame) < closest) {
closest = distance;
ret = r;
default: /* backwards */
- if (pos < frame) {
+ if (pos <= frame) {
if ((distance = frame - pos) < closest) {
closest = distance;
ret = r;
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 ();
}
do {
newname = Playlist::bump_name_once (newname);
- } while (session.playlist_by_name(newname)!=NULL);
+ } while (session.playlist_by_name (newname)!=NULL);
return newname;
}
}
refresh ();
-
if (_manager == 0) {
_manager = this;
}
_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);
--- /dev/null
+# 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 ""
}
}
+/* NODE STRUCTURE
+
+ <Automation [optionally with visible="...." ]>
+ <parameter-N>
+ <AutomationList id=N>
+ <events>
+ X1 Y1
+ X2 Y2
+ ....
+ </events>
+ </parameter-N>
+ <Automation>
+*/
+
int
-Redirect::load_automation (string path)
-{
- string fullpath;
+Redirect::set_automation_state (const XMLNode& node)
+{
+ Glib::Mutex::Lock lm (_automation_lock);
- if (path[0] == '/') { // legacy
- fullpath = path;
- } else {
- fullpath = _session.automation_dir();
- fullpath += path;
- }
- ifstream in (fullpath.c_str());
+ parameter_automation.clear ();
- if (!in) {
- warning << string_compose(_("%1: cannot open %2 to load automation data (%3)"), _name, fullpath, strerror (errno)) << endmsg;
- return 1;
- }
+ XMLNodeList nlist = node.children();
+ XMLNodeIterator niter;
- Glib::Mutex::Lock lm (_automation_lock);
- set<uint32_t> tosave;
- parameter_automation.clear ();
+ for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
+ uint32_t param;
- while (in) {
- double when;
- double value;
- uint32_t port;
+ if (sscanf ((*niter)->name().c_str(), "parameter-%" PRIu32, ¶m) != 1) {
+ error << string_compose (_("%2: badly formatted node name in XML automation state, ignored"), _name) << endmsg;
+ continue;
+ }
- in >> port; if (!in) break;
- in >> when; if (!in) goto bad;
- in >> value; if (!in) goto bad;
-
- AutomationList& al = automation_list (port);
- al.add (when, value);
- tosave.insert (port);
- }
-
- for (set<uint32_t>::iterator i = tosave.begin(); i != tosave.end(); ++i) {
- automation_list (*i).save_state (_("loaded from disk"));
+ AutomationList& al = automation_list (param);
+ if (al.set_state (*(*niter)->children().front())) {
+ goto bad;
+ }
}
-
+
return 0;
bad:
- error << string_compose(_("%1: cannot load automation data from %2"), _name, fullpath) << endmsg;
+ error << string_compose(_("%1: cannot load automation data from XML"), _name) << endmsg;
parameter_automation.clear ();
return -1;
}
-int
-Redirect::save_automation (string path)
+XMLNode&
+Redirect::get_automation_state ()
{
Glib::Mutex::Lock lm (_automation_lock);
+ XMLNode* node = new XMLNode (X_("Automation"));
string fullpath;
if (parameter_automation.empty()) {
- return 1;
- }
-
- fullpath = _session.automation_dir();
- fullpath += path;
-
- ofstream out (fullpath.c_str());
-
- if (!out) {
- error << string_compose(_("%1: cannot open %2 to store automation data (%3)"), _name, fullpath, strerror (errno)) << endmsg;
- return -1;
+ return *node;
}
- AutomationList::const_iterator i;
map<uint32_t,AutomationList*>::iterator li;
for (li = parameter_automation.begin(); li != parameter_automation.end(); ++li) {
- for (i = (*li).second->begin(); i != (*li).second->end(); ++i) {
-
- out << (*li).first << ' ' << (*i)->when << ' ' << (*i)->value << endl;
-
- if (!out) {
- break;
- }
- }
+
+ XMLNode* child;
- if (i != (*li).second->end()) {
- unlink (fullpath.c_str());
- error << string_compose(_("%1: could not save automation state to %2"), _name, fullpath) << endmsg;
- return -1;
- }
- }
-
- if (li != parameter_automation.end()) {
- unlink (fullpath.c_str());
- error << string_compose(_("%1: could not save automation state to %2"), _name, fullpath) << endmsg;
- return -1;
+ char buf[64];
+ stringstream str;
+ snprintf (buf, sizeof (buf), "parameter-%" PRIu32, li->first);
+ child = new XMLNode (buf);
+ child->add_child_nocopy (li->second->get_state ());
}
- return 0;
+ return *node;
}
XMLNode&
XMLNode&
Redirect::state (bool full_state)
{
- char buf[64];
XMLNode* node = new XMLNode (state_node_name);
stringstream sstr;
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)
{
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) {
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)
{
return next_event.when != max_frames;
}
-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 ();
}
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
}
}
+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)
{
}
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>();
}
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
Route::state(bool full_state)
{
XMLNode *node = new XMLNode("Route");
- XMLNode *aevents;
RedirectList:: iterator i;
char buf[32];
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));
}
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;
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);
_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 */
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 */
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;
}
}
- if ((prop = node.property ("order-keys")) != 0) {
+ if ((prop = node.property (X_("order-keys"))) != 0) {
long n;
delete deferred_state;
}
- deferred_state = new XMLNode("deferred state");
+ deferred_state = new XMLNode(X_("deferred state"));
/* set parent class properties before anything else */
child = *niter;
- if (child->name() == IO::state_node_name) {
+ if (child->name() == IO::state_node_name && call_base) {
IO::set_state (*child);
break;
child = *niter;
- if (child->name() == "Send") {
+ if (child->name() == X_("Send")) {
if (!IO::ports_legal) {
add_redirect_from_xml (*child);
}
- } else if (child->name() == "Insert") {
+ } else if (child->name() == X_("Insert")) {
if (!IO::ports_legal) {
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]");
_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;
{
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) {
_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)
{
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;
}
}
+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)
{
: Redirect (s, s.next_send_name(), p)
{
_metering = false;
- save_state (_("initial state"));
RedirectCreated (this); /* EMIT SIGNAL */
}
throw failed_constructor();
}
- save_state (_("initial state"));
RedirectCreated (this); /* EMIT SIGNAL */
}
: Redirect (other._session, other._session.next_send_name(), other.placement())
{
_metering = false;
- save_state (_("initial state"));
RedirectCreated (this); /* EMIT SIGNAL */
}
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;
}
{
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));
}
}
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 ();
}
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 ();
/* 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 */
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();
<< 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)) {
}
}
- 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 = "";
{
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.
}
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;
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
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";
}
}
PlaylistAdded (playlist); /* EMIT SIGNAL */
}
+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)
{
}
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;
}
+
break;
}
}
-
+
run_clicks:
memset (buf, 0, sizeof (Sample) * nframes);
#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"
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;
}
{
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
/* 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;
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));
_state_of_the_state = Clean;
if (save_state (_current_snapshot_name)) {
- save_history (_current_snapshot_name);
return -1;
}
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;
+ }
}
}
}
}
- 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");
{
return -1;
}
- StateManager::prohibit_save ();
-
if ((prop = node.property ("name")) != 0) {
_name = prop->value ();
}
Path
extra
Options/Config
+ Locations
Sources
AudioRegions
AudioDiskstreams
Connections
- Locations
Routes
EditGroups
MixGroups
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;
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;
_state_of_the_state = Clean;
- StateManager::allow_save (_("initial state"), true);
-
if (state_was_pending) {
save_state (_current_snapshot_name);
remove_pending_capture_state ();
return 0;
out:
- /* we failed, re-enable state saving but don't actually save internal state */
- StateManager::allow_save (X_("ignored"), false);
return ret;
}
gettimeofday (&now, 0);
current_trans->set_timestamp (now);
- history.add (current_trans);
+ _history.add (current_trans);
}
Session::GlobalRouteBooleanState
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);
/* dump the history list */
- history.clear ();
+ _history.clear ();
/* save state so we don't end up a session file
referring to non-existent sources.
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;
* 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;
}
/* replace history */
- history.clear();
+ _history.clear();
for (XMLNodeConstIterator it = tree.root()->children().begin(); it != tree.root()->children().end(); it++) {
}
}
- history.add (ut);
+ _history.add (ut);
}
return 0;
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")) {
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);
}
}
}
}
}
-
- //FIXME
- //deliver_mmc (MIDI::MachineControl::cmdLocate, _transport_frame);
#ifdef LEAVE_TRANSPORT_UNADJUSTED
}
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) {
#include <glibmm/miscutils.h>
#include <ardour/sndfilesource.h>
+#include <ardour/sndfile_helpers.h>
+#include <ardour/utils.h>
#include "i18n.h"
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)
{
}
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,
*/
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
_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()) {
if (_broadcast_info) {
delete _broadcast_info;
}
+
+ if (xfade_buf) {
+ delete [] xfade_buf;
+ }
}
float
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;
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)
{
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;
}
{
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;
+}
#include <pbd/pthread_utils.h>
#include <ardour/source.h>
+#include <ardour/playlist.h>
#include "i18n.h"
_name = name;
_timestamp = 0;
_length = 0;
+ _in_use = 0;
}
Source::Source (Session& s, const XMLNode& node)
{
_timestamp = 0;
_length = 0;
+ _in_use = 0;
if (set_state (node) || _type == DataType::NIL) {
throw failed_constructor();
}
}
+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();
+}
return ret;
}
-
+
return boost::shared_ptr<Source>();
}
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));
return ret;
}
-
+
return boost::shared_ptr<Source>();
}
} 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);
}
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) {
.size x86_sse_compute_peak, .-x86_sse_compute_peak
#; end proc
+
+#ifdef __ELF__
+.section .note.GNU-stack,"",%progbits
+#endif
+
+++ /dev/null
-#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);
-}
_frame_rate = fr;
last_bbt_valid = false;
BBT_Time start;
- in_set_state = false;
start.bars = 1;
start.beats = 1;
metrics->push_back (t);
metrics->push_back (m);
-
- save_state (_("initial"));
}
TempoMap::~TempoMap ()
section.set_start (corrected);
metrics->sort (cmp);
timestamp_metrics ();
- save_state (_("move metric"));
return 0;
}
TempoMap::move_tempo (TempoSection& tempo, const BBT_Time& when)
{
if (move_metric_section (tempo, when) == 0) {
- send_state_changed (Change (0));
+ StateChanged (Change (0));
}
}
TempoMap::move_meter (MeterSection& meter, const BBT_Time& when)
{
if (move_metric_section (meter, when) == 0) {
- send_state_changed (Change (0));
+ StateChanged (Change (0));
}
}
}
if (removed) {
- send_state_changed (Change (0));
+ StateChanged (Change (0));
}
}
}
}
}
-
- if (removed) {
- save_state (_("metric removed"));
- }
}
if (removed) {
- send_state_changed (Change (0));
+ StateChanged (Change (0));
}
}
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
break;
}
}
-
- if (replaced) {
- save_state (_("replace tempo"));
- }
}
if (replaced) {
- send_state_changed (Change (0));
+ StateChanged (Change (0));
}
}
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
break;
}
}
-
- if (replaced) {
- save_state (_("replaced meter"));
- }
}
if (replaced) {
- send_state_changed (Change (0));
+ StateChanged (Change (0));
}
}
double beat_frame;
double beat_frames;
double frames_per_bar;
+ double delta_bars;
+ double delta_beats;
+ double dummy;
nframes_t limit;
meter = &first_meter ();
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;
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()) {
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;
}
XMLNodeConstIterator niter;
Metrics old_metrics (*metrics);
- in_set_state = true;
-
metrics->clear();
nlist = node.children();
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;
}
}
}
-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);
- }
-}
}
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;
_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)
{
#endif
#include <pbd/error.h>
+#include <pbd/stacktrace.h>
#include <pbd/xml++.h>
#include <ardour/utils.h>
/* 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])))) {
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);
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); }
+}
activate ();
}
-void
-VSTPlugin::store_state (PluginState& state)
-{
-}
-
-void
-VSTPlugin::restore_state (PluginState& state)
-{
-}
-
float
VSTPlugin::default_value (uint32_t port)
{
--- /dev/null
+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))
--- /dev/null
+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,
+};
--- /dev/null
+#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);
+ }
+}
--- /dev/null
+#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 */
--- /dev/null
+/* 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));
+}
--- /dev/null
+/* 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);
--- /dev/null
+#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);
+}
--- /dev/null
+/* 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);
--- /dev/null
+#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);
+}
--- /dev/null
+mkdir engines
+cp libclearlooks.so engines
--- /dev/null
+#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);
+}
--- /dev/null
+#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);
import os
import os.path
+import sys
import glob
fst_src = glob.glob('*.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',
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\\\"")
remove ();
add (spinner);
spinner.show ();
+ spinner.select_region (0, spinner.get_text_length());
spinner.grab_focus ();
switching = false;
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 ()
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)
{
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);
}
}
int theight;
void set_label ();
+ void style_changed (const Glib::RefPtr<Gtk::Style> &);
bool button_press_handler (GdkEventButton *);
bool button_release_handler (GdkEventButton *);
bool caller_is_ui_thread ();
+ static pthread_t thread_id() { return gui_thread; }
+
/* Gtk-UI specific interfaces */
bool running ();
own_window.show_all ();
hide ();
Detach ();
- return TRUE;
+ return true;
}
gint
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
{
dragging = false;
own_window.remove_modal_grab();
- return TRUE;
+ return true;
}
gint
own_window.get_pointer (mx, my);
if (!dragging) {
- return TRUE;
+ return true;
}
x_delta = ev->x_root - drag_x;
drag_x = ev->x_root;
drag_y = ev->y_root;
- return TRUE;
+ return true;
}
bool
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)
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 ])
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
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;
}
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) {
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)
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;
#include <cmath>
#include <stdint.h>
+#ifndef __STDC_FORMAT_MACROS
+#define __STDC_FORMAT_MACROS
+#endif
+#include <inttypes.h>
#include "pbd/convert.h"
}
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;
}
}
+#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
#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() {}
#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;
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&);
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
--- /dev/null
+#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__ */
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(); }
+
};
}
#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.
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 () {
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;
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 ();
}
#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__ */
struct timeval _timestamp;
std::string _name;
bool _clearing;
+
+ friend void command_death (UndoTransaction*, Command *);
};
-class UndoHistory
+class UndoHistory : public sigc::trackable
{
public:
UndoHistory();
XMLNode &get_state();
void save_state();
+ sigc::signal<void> Changed;
+
private:
bool _clearing;
std::list<UndoTransaction*> UndoList;
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; };
#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;
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)
{
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);
}
UndoList.push_back (ut);
/* we are now owners of the transaction */
+
+ Changed (); /* EMIT SIGNAL */
}
void
UndoList.remove (ut);
RedoList.remove (ut);
+
+ Changed (); /* EMIT SIGNAL */
}
void
ut->undo ();
RedoList.push_back (ut);
}
+
+ Changed (); /* EMIT SIGNAL */
}
void
ut->redo ();
UndoList.push_back (ut);
}
+
+ Changed (); /* EMIT SIGNAL */
}
void
_clearing = true;
RedoList.clear ();
_clearing = false;
+
+ Changed (); /* EMIT SIGNAL */
+
}
void
_clearing = true;
UndoList.clear ();
_clearing = false;
+
+ Changed (); /* EMIT SIGNAL */
}
void
{
clear_undo ();
clear_redo ();
+
+ Changed (); /* EMIT SIGNAL */
}
XMLNode & UndoHistory::get_state()
len = str.length();
+ if (len == 1) {
+ return;
+ }
+
/* strip front */
for (i = 0; i < len; ++i) {
}
}
+ 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) {
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) {
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;
}
cp.Merge ([
libraries['ardour'],
+ libraries['sndfile-ardour'],
libraries['sigc2'],
libraries['pbd'],
libraries['midi++2'],
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);
{
bool rolling = session->transport_rolling ();
- if (Config->get_auto_loop()) {
+ if (session->get_play_loop()) {
session->request_play_loop (false);
}
/* global */
- if (Config->get_auto_loop()) {
+ if (session->get_play_loop()) {
pending_lights[LightLoop] = true;
} else {
pending_lights[LightLoop] = false;
}
}
+ 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);
--- /dev/null
+#ifndef __ardour_svn_revision_h__
+#define __ardour_svn_revision_h__
+static const char* ardour_svn_revision = "1137";
+#endif
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 }
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 }
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"
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"
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"
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"
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 }
}
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}
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"
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 }
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 }
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 }
{
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 }
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"
style "track_separator"
{
- bg[NORMAL] = { 0.40, 0.40, 0.40 }
+ bg[NORMAL] = { 0.35, 0.35, 0.40 }
}
#
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"
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 }
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 }
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"
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"
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"
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"
libraries['libgnomecanvas2'],
libraries['libgnomecanvasmm'],
libraries['sysmidi'],
- libraries['sndfile'],
+ libraries['sndfile-ardour'],
libraries['flac'],
libraries['lrdf'],
libraries['glibmm2'],
#!/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 "$@"